热门标签 | 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的检测器,我们只有最后层的特征来做预测,而不用中间层的。

实验结果部分略


推荐阅读
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • 理工科男女不容错过的神奇资源网站
    十一长假即将结束,你的假期学习计划进展如何?无论你是在家中、思念家乡,还是身处异国他乡,理工科学生都不容错过一些神奇的资源网站。这些网站提供了丰富的学术资料、实验数据和技术文档,能够帮助你在假期中高效学习和提升专业技能。 ... [详细]
  • 本文介绍了几种常用的图像相似度对比方法,包括直方图方法、图像模板匹配、PSNR峰值信噪比、SSIM结构相似性和感知哈希算法。每种方法都有其优缺点,适用于不同的应用场景。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤
    开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • Python错误重试让多少开发者头疼?高效解决方案出炉
    ### 优化后的摘要在处理 Python 开发中的错误重试问题时,许多开发者常常感到困扰。为了应对这一挑战,`tenacity` 库提供了一种高效的解决方案。首先,通过 `pip install tenacity` 安装该库。使用时,可以通过简单的规则配置重试策略。例如,可以设置多个重试条件,使用 `|`(或)和 `&`(与)操作符组合不同的参数,从而实现灵活的错误重试机制。此外,`tenacity` 还支持自定义等待时间、重试次数和异常处理,为开发者提供了强大的工具来提高代码的健壮性和可靠性。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 从2019年AI顶级会议最佳论文,探索深度学习的理论根基与前沿进展 ... [详细]
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社区 版权所有