热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

目标检测:CornerNet论文阅读

CornerNet:DetectingObjectsasPairedKeypoints摘要我们研究了一种新的目标检测代码,我们检测物体框是使用一系列关键点完成的,左上角、右下角,用

CornerNet: Detecting Objects as Paired Keypoints


摘要

我们研究了一种新的目标检测代码,我们检测物体框是使用一系列关键点完成的,左上角、右下角,用一个单一的神经网络。通过一对一对的点来检测物体,我们还消除了设计一些被广泛运用到 single-stage detectors的anchor boxes的需要。 除了新奇的想法之外,我哦们还要介绍我们的corener poolng一种新的pooling 层,来帮助更好地定位corners的做法。

1.介绍

大部分STOA的目标检测方法都是anchor boxes,即基于不同尺寸和比例的候选框来进一步进行操作的。anchor box后来就被拓展到了one-stage detectors,效果可以与two-stage媲美但是更快。one-stage的检测器在整个图片中密密麻麻地分布了anchor box,然后通过给anchor box打分和回归直接生成最终的box predictions。

但是问题就是需要大量的候选框(不再举论文中的例子),这是因为检测器需要被训练来分类哪个框和gt box重合度最高。结果最后只有一小部分被选中;这导致了一个巨大的正负样本不平衡的问题,并且减速了训练。

第二,anchor box的使用添加了许多超参数和各种各样的设计选择,这些包括有多少box,什么size,什么比例。这些选择很影响最后结果,那么就很麻烦。

这里我们介绍Corner Net, 一个新的one-stage的方法。我们用一个单一的神经网络来为所有的实例预测一个左上角的热力图,同样为右下角也预测一个热力图。还有为每个检测到的corner预测一个embedding的向量。 Embeddings是用来把属于同一物体的corners放在一组,网络最终会被训练地为同一物体的corner预测相似的embeddings. 我们的方法简化了网络的输出并且消除了设计不同anchor box的需要。下图介绍了整体的pipeline:
目标检测:Corner Net论文阅读
另一个骚操作是corner pooling, 一种新的pooling层,来帮助神经网络更加方便地定位bounding box的corner的。一个Bbox的corner经常是在物体的外部的(想想一个圆形的物体就很好理解)。在这种情况下一个corner不能根据当前的信息直接很好地定位。取而代之的是为了确定该像素位置是不是有一个top-left corner, 我们需要横向往右看过去看这个物体的边界,同时也要竖直往下看物体的最左面的边界。这激发我们做出了corner pooling:接受两个特征图;在每个像素点的位置都要往右看过去对这个向量做max pool,再用另外一个图向下做max pool,然后把两个 pooled result加起来,示意图如下:
目标检测:Corner Net论文阅读
我们提出两个解释为什么检测corners 比检测bbox 的center或者proposal更好的原因:
第一是因为box的center很难被定位因为它依赖于物体的四条边,但是定位corners只依赖于两条边,所以该方法更简单,加上corner pooling,考虑到了周围的信息,因此更加简单;第二是用corner可以用比anchor box更小的复杂度覆盖相同的范围。

我们测试了在MS COCO的结果,达到了42.2%AP,超过了当下(论文发布时的)所有one-stage检测器。

2.相关工作

2.1 two-stage detectors

介绍了RCNN、Faster RCNN、R-FCN等结构

2.2 one-stage detectors

介绍了YOLO、SSD等网络。
这里提到了王兴刚、刘文予老师等人的Point Linking Net,指出它第一次预测一个bbox的四角点和中心点来预测一个框。不过Corner Net和PLN很不一样,第一,CornerNet通过embedding vectors来讲corners分组,但是PLN则是使用预测像素点的方法。Corner Net使用pooling来更好地定位。

我们的方法还受到了 Associative Embedding在多人姿态估计任务中使用的影响,在这里,不同关节点通过embedding vector的距离来分类为不同人的关节。蓝儿我们好像是最早把这思想用在目标检测的,我们的corner pooling也很新奇,我们还改变了沙漏型的网络结果并且添加了自己的focal loss.

3.Corner Net

3.1 总览

在corner net中,我们把物体视为一对又一对的左上角和右下角的关键点组合。一个神经网络来预测两个热力图来表示不同物体的corners的位置,一个图是左上角的,一个图是右下角的。网络同样为每个检测出来的corner预测一个embedding vector,并且让来自同一个物体的点的距离很短。为了生成更加密集的bboxes,网络同样还预测一些偏置(offset)来轻微调整corners的位置。用来预测出来的热力图、embeddings、offsets,我们再加上一个简单的后处理就获得最后的bbox.下图给出了Corner Net的总览:
目标检测:Corner Net论文阅读
我们使用了hourglass的网络作为backbone,紧随其后的是两个预测的模块,一个是为了左上角corner预测的模块,另外一个则是为了右下角的corner预测的。每一个module都有自己的corner pooling来把从hourglass提取得到的特征图进行corner pooling,为预测热力图、offsets、embeddings做准备。不像其他一些检测器,我们不用不同size的特征图来预测不同size的物体。我们只是把两个模块应用在hourglass得到的结果上而已。

3.2 检测corners

我们预测了两组heatmaps,一个给左上角的corner,一个给右下角的corner。每个热力图有C个channels,C是物体的总类别数(不含背景),heatmap的size是H * W,每个通道的这一整张H * W 的值是一个掩膜,每一个点的值代表这个点属于该分类的分数。(论文说是二值的,应该打错了)
对于每一个corer,都只有一个gt positive location,其他的locations都是负的。在训练期间,我们并不同等地惩罚所有的负样本,我们在positive location某一半径内的negative locations减少惩罚。这是因为一组错误的corner detections,如果他们和本来对应的gt locations,那么实际上仍然可以产生一各与gt bbox覆盖度很大的bbox。如下图:
目标检测:Corner Net论文阅读
我们这样决定这个半径:如果预测的点在这个半径内,那么最后生成的一对点再生成的bbox和gt box的IoU要大于某一值t,这里设置t为0.3 (论文中所有试验都采取了0.3)。给出半径之后,惩罚的下降规则由一个 unnormalized 2D Gaussian给出:
目标检测:Corner Net论文阅读
其中gauss的中心点为positive location, σ \sigma σ是半径的三分之一倍。

P c i j P_{cij} Pcij 为在位置(i,j)处对于类别c的得分,让 y c i j y_{cij} ycij为gt 的heatmap,并且用unnormalized来拓宽它的定义。基于此设计了如下的focal loss:
目标检测:Corner Net论文阅读
其中N是一张图中的物体个数, α \alpha α β \beta β是两个超参数,他们来控制每个点的权重,实验中将这两个参数分别设置为2和4. 由于高斯凸点定义在 y c i j y_{cij} ycij中,于是 ( 1 − y c i j ) (1-y_{cij}) (1ycij)就减少了对周围的点的惩罚。

许多网络结构包括了降采样的层来获取全局信息,并且借此降低计算量。当他们对整个卷积使用这个策略时,通常会使输出的size小于image的size。因此,一个标注(x,y)就最后被映射到了热力图中的([x/n],[y/n]),n是降采样的倍数。当重新将这些位置映射到原图时,就会丢失一些精度,尤其对小物体影响较大。为了解决这个物体,我们在将特征图上的点重新映射到原图时预测了位置的偏置来调整corner的位置。
目标检测:Corner Net论文阅读
其中xk和yk是第k个corner的坐标,特别地,我们预测一组offset,这组offset对所有类别的top-left corners通用,为了训练,我们采用了smooth L1 Loss
目标检测:Corner Net论文阅读

3.3Grouping Corners

多个物体可能出现在一个图像中,因此多个top-left corners和bottom-right corners可能被检测出来。我们需要检测一组top-left corner和bottom-right corner是否是来自于同一个bbox。我们的方法从Associative Embedding中获得灵感。

网络为每个检测出来的corner预测一个embedding, 这样如果两个点同属于一个bbox,那么他们之间的距离应该非常小。我们可以根据top-left corner和bottom-right corner的embedding距离来分组。实际的embedding会映射到什么值我们不关心,重要的其实是距离。

我们这里选择生成一个一维的embedding, 那么其实就是给每个corner分配一个id而已。让 e t k e_{t_k} etk是top-left corner的embedding, e b k e_{b_k} ebk为bottom-right corner的embedding,k代表第k个corner,我们使用"pull"loss来让同一组的corners更接近,用"push" loss来拉远不属于同一组的点
目标检测:Corner Net论文阅读
其中 e k e_k ek e b k e_{b_k} ebk e t k e_{t_k} etk的平均值,让 Δ \Delta Δ为1与offset的loss相似,我们只对在gt location的点施加这个loss。

3.4 Corner Pooling

如下图所示,经常没有当前位置的信息来决定corner的出现与否:
目标检测:Corner Net论文阅读
为了确定一个pixel是不是top-left corner,我们需要横向往右水平看,并且竖直往下看。于是提出了corner pooling.

假设我们想要确定一个(i,j)的点是不是top-left corner,那么我们让ft和fl为输入到top-left corner pooling层的特征图,让 f t i j ft_{ij} ftij f l i j fl_{ij} flij为(i,j)处在ft和fl中的向量。有看HW的特征图,pooling层首先对所有ft中在(i,j)与(i,H)之间的特征向量进行max-pooling形成 t i j t_{ij} tij,让对在fl中所有在(i,j)与(W,j)中的向量进行max-pooling,形成向量 l i j l_{ij} lij,最后把 t i j t_{ij} tij l i j l_{ij} lij相加这个计算可以以下表达式展示:
目标检测:Corner Net论文阅读
效果还是挺棒的。形象直观的pooling过程如下:
目标检测:Corner Net论文阅读
我们对bottom-right corner的pooling采取类似的措施.
corner pooling层在预测的模块中使用,为之后预测heatmap、offset、embedding打基础。整体的预测模块如下:
目标检测:Corner Net论文阅读
第一部分是一个被修改过后的残差块,将第一个3
3的卷积模块换成一个corner pooling的木刻,我们先用33的卷积处理了来自于backbone的特征图(128 channels)然后使用corner pooling 层。紧接着是一个残差块,然后将pooled features送给33的Conv-BN层(256 channels),然后加上projection shortcut。 修改过后的残差块后面跟着一个3*3的卷积模块(256channels),然后3个 Conv-RELU-Conv 层来产生heatmaps,offsets,embeddings.

3.5 HourglassNetwork

我们使用沙漏型网络作为backbone,这个想法最开始是在人体姿态估计中使用的。它是一个泉涓涓的神经网络,有一个或者多个沙漏型的结构。一个沙漏型的结构首先对输入的特征通过一系列的卷积网络和max pooling层进行降采样,然后再在通过一系列的上采样和卷积侧层还原到原来的分辨率。由于在max pooling层中丢失了一些信息,skip layers被加入网络,将信息加入到上采样之后的特征图中。沙漏型结构同时照顾了局部信息和全局信息。当多个沙漏结构在一个网络中连续使用时,网络能够捕捉较为高级别的信息。这些特性使得它挺好用~~

我们的沙漏型结构包括了两个沙漏,并且做了一些改变。我们用步长为2的卷积代替maxpooling来降低分辨率,我们降低分辨率5次,并且增加特征的通道数(256,384,384,384,512)当我们再上采样时我们用两个残差块并且跟着使用最邻近插值。每个skip connections同样包括了两个残差块。在沙漏结构的中间总共有4个512 channels的残差块,我们用7*7、stride = 2、128channels的卷积,同时后面跟着一个stride = 2、256channels的残差块来降低分辨率4次。

我们同样在训练过程中加入了监督。但是我们不加入中间层的预测,又因为发现影响性能。我们对第一个沙漏块的输入和输出都使用1*1的Conv-BN模块然后把他们合并起来,合并时通过element-wise addition,其后跟着一个ReLU层和一个256channels的残差块,结果被送入第二个沙漏块。沙漏网络的总深度为104.不想其他许多一些STOA的检测器,我们只有最后层的特征来做预测,而不用中间层的。

实验结果部分略


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
author-avatar
十九世纪末的伦敦_371
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有