CornerNet 学习笔记

《CornerNet: Detecting Objects as Paired Keypoints》ECCV 2018

将对象检测为成对的关键点

论文链接:https://arxiv.org/abs/1808.01244
代码链接: https://github.com/umich-vl/CornerNet

摘要

  1. 将目标检测问题当作关键点检测问题来解决,也就是通过检测目标框的左上角和右下角两个关键点得到预测框,因此CornerNet算法中没有anchor的概念,这种做法在目标检测领域是比较创新的而且能够取得不错效果是很难的。
  2. 整个检测网络的训练是从头开始的,并不基于预训练的分类模型,这使得用户能够自由设计特征提取网络,不用受预训练模型的限制。

目标检测算法概述

从RCNN、SPPNet到fast RCNN,再到Faster RCNN,目标检测的三个步骤(区域选择,特征提取,分类回归)被统一到一个深度网络框架之内,大大提高了运行速度。FCN,FPN, RoI Align, Mask Branch等技术把Faster R-CNN往前极大的推进。之后又出现了FCN, IoU, NMS,ION,FPN, RoI Align和Mask Branch等技术渊源和YOLO, SSD, AttratioNet, G-CNN, R-FCN, Mask R-CNN, Mask ^X R-CNN等的进化关系!

one-stage检测算法,其不需要region proposal阶段,直接产生物体的类别概率和位置坐标值,经过单次检测即可直接得到最终的检测结果,因此有着更快的检测速度,比较典型的算法如YOLO,SSD,Retina-Net。YOLO 使用了分治思想,将输入图片分为 SxS 的网格,不同网格用性能优良的分类器去分类。SSD 将 YOLO 和 Anchor 思想融合起来,并创新使用 Feature Pyramid 结构。YOLO, YOLO-v2, YOLO-v3, SSD、DSSD等实时模型的推出, 让目标检测变得更快。

1 Motivation

在state-of-the-art的目标检测算法中,都用到了设置anchor-box的方法。anchor-box的使用使得one-stage的算法性能能够挑战two-stage。但是使用anchor-box会有两个缺点:

  1. anchor-box的数量需要设置很多 (DSSD: more than40k, RetinaNet: more than 100k) 。其中只有一小部分和ground truth重合,生成了大量的负例,造成正负样本不平衡,降低了训练效率。

  2. anchor-box的使用引入了很多超参数,如anchor的数量,大小,长宽比。增加了算法的设计难度。

本文提出一种新的检测方法,使用一对关键点:框的左上角和右下角来代替bounding box。

2 Contribution

  1. 用一对corner代替了anchor box,并提出了一种新的one-stage检测方法。

  2. 提出了一种新的池化方法:corner pooling。

3 Framework

3.1 overview

在这里插入图片描述
图1 overview of CornerNet

CornerNet是一种one-stage检测方法,其框架如图1所示。主干网采用了Hourglass Network。主干网后紧跟两个prediction modules,其中一个检测top-left corners ,另一个检测bottom-right corners,最后对两组corner进行筛选,组合,修正得到object的一对corners,从而定位object的box。

经过特征提取网络(backbone network)提取特征,该网络采用hourglass network。输出特征图大小是128×128,整个hourglass network的深度是104层。hourglass module后会有两个输出分支模块,分别表示左上角点预测分支和右下角点预测分支,每个分支模块包含一个corner pooling层和3个输出:heatmaps、embeddings和offsets

  • heatmaps输出预测角点信息,可以用维度为CHW的特征图表示,其中C表示目标的类别(注意:没有背景类),这个特征图的每个通道都是一个mask,mask的每个值(范围为0到1,论文中写的该mask是binary mask,也就是0或1,个人感觉是笔误,预测值应该是0到1,否则后面公式1计算损失函数时就没有意思了)表示该点是角点的分数
  • embeddings用来对预测的corner点做group,也就是找到属于同一个目标的左上角角点和右下角角点;
  • offsets用来对预测框做微调,这是因为从输入图像中的点映射到特征图时有量化误差,offsets就是用来输出这些误差信息。

在这里插入图片描述
图2 Heatmaps和Embeddings

Heatmaps和Embeddings都是prediction modules最后生成出来的特征图,top-left corners 和bottom-right corners各有一组。Heatmaps预测哪些点最有可能是Corners点,Embeddings用于表征属于相同对象的corner的相似度。它们的通道数都为C,C是object的类别数 (不包括background) 。最后的Offsets用于对corner的位置进行修正。每个corner修正前的坐标位置就是该corner在feature maps上的坐标点映射回原图的位置。

从图2中我们可以看出,绿框中两个corner对应位置的Embedding的features分布相似度高,所以代表这对corner属于同一个object,黄框同理。

3.2 Backbone: Hourglass Network

Hourglass Network出自论文:Stacked Hourglass Networks for Human Pose Estimation。这里不再阐述具体结构,原作者也只用了很小的篇幅描述这部分内容。
在这里插入图片描述
图3 Hourglass Network结构

一个Hourglass Network由若干个Hourglass组成,Hourglass的具体结构如图4。
在这里插入图片描述
图4 A single Hourglass

Hourglass先由卷积和池化将feature maps下采样到一个很小的尺度,之后再用nearest neighbor upsampling的方法进行上采样,将feature maps还原到最开始的尺度。不难看出,下采样和上采样是对称的,并且在每个upsampling层都有一个skip connection,skip connection上是一个residual modules。

使用这种沙漏结构的目的是为了反复获取不同尺度下图片所包含的信息。例如一些局部信息,包括脸部和手部信息。人体姿态估计也需要对整个人体做一个理解,也就是一些全局信息,包括人体的方位,肢体的动作以及相邻关节点的关系。最后通过上采样和残差结构将局部信息和全局信息组合起来。

CornerNet采用了2个Hourglass组成的Hourglass Network,作者在使用Hourglass时做了一些小调整,包括:

  1. Hourglass在下采样时不再进行max-pooling,而是在卷积时通过stride=2进行下采样。下采样的卷积进行5次,输出feature maps的通道数分别为(256, 384, 384, 384, 512)

  2. 在每个skip connection,有两个residual modules。

  3. 图片进入Hourglass前,进行了2次下采样。使用一个kernel size=7*7,stride=2,channel=128的卷积和一个stride=2,channel=256的residual block,将width和height缩小为以前的1/4。

3.3 prediction modules

在这里插入图片描述
图5 prediction modules (Top-left)

Top-left和bottom-right的prediction modules结构相同,我们以Top-left为例,如图5所示。Prediction modules的前半部分类似残差结构。Backbone中的feature maps进入prediction modules后分成三条支路:上面两条支路经过3 * 3的卷积后,进行corner pooling,相加汇集成1路,随后再进行3x3的卷积和batch normalization;最下面的支路进行1 * 1的卷积和batch normalization 后,与上路相加后送入到Relu函数中。随后,再对feature maps进行3 * 3的卷积,接着分三路3 * 3的卷积+Relu后产生了Heatmaps, Embeddings, Offsets三组feature maps。(在最后一层,原作者给的图和其文字描述不一致)

3.4 Corner pooling

首先看看为什么要引入corner pooling,如图Figure2所示。因为CornerNet是预测左上角和右下角两个角点,但是这两个角点在不同目标上没有相同规律可循,如果采用普通池化操作,那么在训练预测角点支路时会比较困难。考虑到左上角角点的右边有目标顶端的特征信息(第一张图的头顶),左上角角点的下边有目标左侧的特征信息(第一张图的手),因此如果左上角角点经过池化操作后能有这两个信息,那么就有利于该点的预测,这就有了corner pooling。
在这里插入图片描述
Figure3是针对左上角点做corner pooling的示意图,该层有2个输入特征图,特征图的宽高分别用W和H表示,假设接下来要对图中红色点(坐标假设是(i,j))做corner pooling,那么就计算(i,j)到(i,H)的最大值(对应Figure3上面第二个图),类似于找到Figure2中第一张图的左侧手信息;同时计算(i,j)到(W,j)的最大值(对应Figure3下面第二个图),类似于找到Figure2中第一张图的头顶信息,然后将这两个最大值相加得到(i,j)点的值(对应Figure3最后一个图的蓝色点)。右下角点的corner pooling操作类似,只不过计算最大值变成从(0,j)到(i,j)和从(i,0)到(i,j)。
在这里插入图片描述
Figure6也是针对左上角点做corner pooling的示意图,是Figure3的具体数值计算例子,该图一共计算了4个点的corner pooling结果。第二列的数值计算和Figure3介绍的一样,比如第一行第一个图中的0值点,计算该点的最大值时是计算该点和其右侧的值为2的点的最大值,因此得到的就是2。
在这里插入图片描述

图6 corner pooling (Top-left)

Corner pooling是作者在CornerNet中提出的一种新的池化方式,用在prediction modules中。如果读者们仔细思考这种池化方式,会发现Corner pooling设计得十分精妙。

池化方法如图6所示(以Top-left为例,Bottom-right与其方向相反)。对于第1组feature maps,对每行feature scores按从右向左的顺序选择已滑动过范围的最大值,对于第2组feature maps,对每列feature scores按从下向上的顺序选择已滑动过范围的最大值。

那么,作者提出corner pooling的动机是什么呢?其实为了更好地适应corner的检测。在目标检测的任务中,object的corner往往在object之外,所以corner的检测不能根据局部的特征,而是应该对该点所在行的所有特征与列的所有特征进行扫描。

举个例子,如果我们能在某行和某列检测到同一个object的边界特征,那么这行和这列的交点就是corner,这是一种间接且有效的找corner的方法。

还有一点值得注意的是,池化时不能直接对整行或整列进行max pooling,当一张图上有多个目标时,这样会导致误检。

4 Train

4.1 Loss function

对于Heatmaps, Embeddings, Offsets三组feature maps,都各自用于一种loss计算。

Heatmaps: detecting corners
在这里插入图片描述
该loss是Focal loss的变体,其中,pcij代表类别C的predicted corner在位置 (i, j) 处的得分,得分越高就越可能是corner。ycij表示ground truth的Heatmaps,由Gaussian公式算出,在这里插入图片描述中心点是ground truth的位置,N表示目标的数量。ycij=1时候的损失函数容易理解,就是focal loss。α=1/3,是一个超参数,α参数用来控制难易分类样本的损失权重。ycij等于其他值时表示(i,j)点不是类别c的目标角点,照理说此时ycij应该是0(大部分算法都是这样处理的),但是这里ycij不是0,而是用基于ground truth角点的高斯分布计算得到,因此距离ground truth比较近的(i,j)点的ycij值接近1,这部分通过β参数控制权重,这是和focal loss的差别。(1-ycij)可以理解predicted corner到gt corner的距离,只是这个距离被Gaussian非线性化了,使得负样本的惩罚减少了。

为什么对不同的负样本点用不同权重的损失函数呢?这是因为靠近ground truth的误检角点组成的预测框仍会和ground truth有较大的重叠面积。
在这里插入图片描述
Figure5是关于对不同负样本点的损失函数采取不同权重值的原因。红色实线框是ground truth;橘色圆圈是根据ground truth的左上角角点、右下角角点和设定的半径值画出来的,半径是根据圆圈内的角点组成的框和ground truth的IOU值大于0.7而设定的,圆圈内的点的数值是以圆心往外呈二维的高斯分布;白色虚线是一个预测框,可以看出这个预测框的两个角点和ground truth并不重合,但是该预测框基本框住了目标,因此是有用的预测框,所以要有一定权重的损失返回,这就是为什么要对不同负样本点的损失函数采取不同权重值的原因。

Embeddings: grouping corners

embedding,对应文章中group corner的内容。前面介绍了关于角点的检测,在那部分中对角点的预测都是独立的,不涉及一个目标的一对角点的概念,因此如何找到一个目标的两个角点就是第三个输出embedding做的工作。这部分是受associative embedding那篇文章的启发,简而言之就是基于不同角点的embedding vector之间的距离找到每个目标的一对角点,如果一个左上角角点和一个右下角角点属于同一个目标,那么二者的embedding vector之间的距离应该很小

embedding这部分的训练是通过两个损失函数实现的,etk表示第k个目标的左上角角点的embedding vector,ebk表示第k个目标的右下角角点的embedding vector,ek表示etk和ebk的均值。公式4用来缩小属于同一个目标(第k个目标)的两个角点的embedding vector(etk和ebk)距离。公式5用来扩大不属于同一个目标的两个角点的embedding vector距离。
在这里插入图片描述
其中,etk是object左上角的embedding得分,ebk是object右下角的embedding得分,ek代表etk和ebk的均值。N代表gt中的object数量。

Pull loss越小,则同一object的左上角和右下角的embedding得分距离越小;Push loss越小,则不同object的左上角和右下角的embedding得分距离越大。

Offsets: correcting corners’ position

offset,这个值和目标检测算法中预测的offset类似却完全不一样,说类似是因为都是偏置信息,说不一样是因为在目标检测算法中预测的offset是表示预测框和anchor之间的偏置,而这里的offset是表示在取整计算时丢失的精度信息,也就是下面公式所表达的内容
在这里插入图片描述
我们知道从输入图像到特征图之间会有尺寸缩小,假设缩小倍数是n,那么输入图像上的(x,y)点对应到特征图上就如下式子在这里插入图片描述
式子中的符号是向下取整,取整会带来精度丢失,这尤其影响小尺寸目标的回归,Faster RCNN中的 ROI Pooling也是有类似的精度丢失问题。所以通过上面的公式计算offset,然后通过smooth L1损失函数监督学习该参数,和常见的目标检测算法中的回归支路类似。
在这里插入图片描述
在这里插入图片描述代表Offsets的predicted offset;Ok代表gt的offset;N代表gt中的object数量。

我们得到total loss
在这里插入图片描述
其中,α, β, γ是超参数,分别取0.1, 0.1, 1。

4.2 Training details

  1. 随机初始化的,没有在任何外部数据集上进行预训练。

  2. 遵循Focal loss for dense object detection中的方法设置预测Heatmaps的卷积层的biases。

  3. 网络的输入分辨率是511×511, 输出分辨率为128×128。

  4. 为了减少过拟合,我们采用了标准的data augmentation,包括随机水平翻转、随机缩放、随机裁剪和随机色彩抖动,其中包括调整图像的亮度,饱和度和对比度。

  5. 使用PCA分析图像数据。

  6. 使用Adam优化训练损失

5 Test

测试时,使用simple post-processing算法从Heatmaps, Embeddings, Offsets生成边界框。首先在heatmaps上使用3*3的max pooling进行非极大值抑制(NMS)。然后从Heatmaps中选择scores前100的top-left corners和前100的bottom-right corners,corner的位置由Offsets上相应的scores调整。 最后,计算top-left corners和bottom-right corners所对应的Embeddings的L1距离。距离大于0.5或包含不同类别的corners pairs将被剔除。配对上的top-left corners和bottom-right corners以Heatmaps的平均得分用作检测分数。

作者没有使用resize的方法保持输入图像的原始分辨率一致,而是维持原分辨率,用0填充缺失和超出的部分。 原始图像和翻转图像都参与测试,并应用soft-nms来抑制冗余检测。 仅记录前100个检测项。 Titan X(PASCAL)GPU上的每个图像的平均检测时间为244ms。使用检测速度top100的测试图片,计算出CornerNet在TitanX(PASCAL)GPU上的平均推断时间为每张图片224ms。

6 性能对比

在这里插入图片描述

7 总结

这篇文章提出了一种全新的one-stage目标检测算法,让人耳目一新。不过虽说是one-stage算法,其速度还是比较慢的。文章里面还有好多细节可以抠,比如说Heatmaps, Embeddings, Offsets的输出按理都应该是0~1之间的一个数,可是作者在这里并没有阐明是怎么处理的,只有撸完代码再回过头来看了。

参考(感谢)
https://www.cnblogs.com/yumoye/p/10964916.html
https://zhuanlan.zhihu.com/p/41825737
https://blog.csdn.net/u014380165/article/details/83032273?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162427792216780274132226%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162427792216780274132226&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-83032273.first_rank_v2_pc_rank_v29&utm_term=CornerNet&spm=1018.2226.3001.4187

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值