您的位置:首页 > 移动开发 > Objective-C

【论文笔记】:CornerNet: Detecting Objects as Paired Keypoints

2019-07-18 15:17 2251 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_41375609/article/details/96356508

&Title:

&Summary

CornerNet,一种新的物体检测方法,文章使用单个卷积神经网络将目标边界框(bounding box)检测转化为一对关键点对(paired keypoints)的检测,这一对关键点对即待检测目标的左上角点(top-left corner)和右下角点(bottom-right corner)。通过将对象检测转化为成对关键点检测,使得不再需要专门设计anchor boxes,而这之前在one-stage类型的检测器中经常要用到。 除了提出新的算法形式外,文章还引入了一种新的池化方法——corner pooling,它可以帮助网络更好地定位corner。
检测大致过程: cornerNet分别输出左上角预测模块和右下角预测模块的Heatmaps、Embeddings和Offsets后。首先利用各自的Heatmaps计算出xy坐标,然后利用各自的Offsets修正xy坐标。接着利用各自的Embeddings信息收集同一bbox的左上角点和右下角点。

实验表明,CornerNet在MS COCO数据集上达到了42.1% AP,优于所有现有的one-stage类型的检测器。

&Research Objective

不使用Anchor的情况下,引入了关键点检测的思路,对物体进行检测。

&Problem Statement

目前的检测算法主要思路还是设置大量Anchor+分配正负样本+训练的一个思路,Anchor的本质是目标的候选框,因为目标的形状和位置的多种可能性,Anchor的数量往往非常庞大,否则会出现遗漏的情况,这种情况对于one-stage的检测算法更加突出。因此会带来两个问题:

  1. 大量的Anchor中只有少部分和gt的重合比较大,可以作为正样本训练,其它都是负样本,换而言之,正负样本均衡问题,这几乎是所有检测算法都要考虑的问题,不同算法往往也会有不同的策略。
  2. Anchor的设置本身也是需要超参数的(形状、个数怎么设置),在multi-scale的时候会更加明显,YOLOv2曾经用5个anchor达到了faster rcnn中9个anchor的效果,说明这方面确实也是有很多可以做的地方。

基于上述两点原因,再加上keypoint问题的启发,作者就想到用关键点检测的思路来处理detection问题,只要找到top-left和Bottom-right两个点,就可以准确框出一个目标了

&Method(s)

本文给出了CornerNet的解决方案,放弃anchor boxes,直接检测目标的左上角点和右下角点。

CornerNet算法检测流程:

文章将对象检测看作为一对边界框角点的检测。 卷积网络为所有左上角输出heatmap,为所有右下角输出heatmap,并为每个检测到的角点输出一个嵌入矢量。 属于同一目标的两个角点的嵌入矢量是相似的,通过训练网络判断相似性,找到属于同一目标的两个角点,即检测到了目标。

详细流程:摘自文章
1.首先1个7×7的卷积层将输入图像尺寸缩小为原来的1/4(论文中输入图像大小是511×511,缩小后得到128×128大小的输出)。
2.然后经过特征提取网络(backbone network)提取特征,该网络采用hourglass network,该网络通过串联多个hourglass module组成(Figure4中的hourglass network由2个hourglass module组成),每个hourglass module都是先通过一系列的降采样操作缩小输入的大小,然后通过上采样恢复到输入图像大小,因此该部分的输出特征图大小还是128×128,整个hourglass network的深度是104层。
3.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就是用来输出这些误差信息。

CornerNet网络概览


需要注意的几个地方:

  • 基础网络也就是Backbone使用的是Hourglass网络,这也是从人体姿态估计处借用来的灵感。顾名思义,这个网络的形状非常像沙漏,网络前半 3ff7 部分通过下采样不断减少feature map,后面则通过上采样增大feature map,并且中间还有类似fpn那样将前后网络相加的操作。沙漏网络在关键点检测上已经证明了其有效性。
  • 网络有两个分支,一个分支预测Top-left Corners,另一个预测Bottom-right corners。每个分支有三个线路,heatmaps预测哪些点最有可能是Corners点,embeddings主要预测每个点所属的目标,最后的offsets用于对点的位置进行修正。

注:在notes处将详细介绍heatmaps、embeddings、offsets和corner pooling。

预测模块的详细结构

下图是该结构包括corner pooling模块和预测输出模块两部分,corner pooling模块采用了类似residual block的形式,有一个skip connection,虚线框部分执行的就是corner pooling操作。

模型测试时候的几个细节:

  • 在得到预测角点后,会对这些角点做NMS操作,选择前100个左上角角点和100个右下角角点。
  • 计算左上角和右下角角点的embedding vector的距离时采用L1范数,距离大于0.5或者两个点来自不同类别的目标的都不能构成一对。
  • 测试图像采用0值填充方式得到指定大小作为网络的输入,而不是采用resize,另外同时测试图像的水平翻转图并融合二者的结果。
  • 最后通过soft-nms操作去除冗余框,只保留前100个预测框。

&Evaluation

Ablation Study

Corner Pooling Corner Pooling是CornerNet的关键组成部分。 为了理解它对性能的贡献,作者训练了另一个具有相同数量参数但没有corner Pooling的网络。

表1 MS COCO消除corner Pooling验证

表1显示添加corner Pooling有着显着改善:AP为2.0%,AP50 为2.1%,AP75 为2.2%。 我们还看到corner Pooling对中型和大型目标特别有用,它们的AP分别提高了2.4%和3.7%。 这是预料中的,因为中型和大型目标的最顶部,最底部,最左边,最右边得边界可能更远离角点位置。

减少对负位置的惩罚 我们减少对正位置周围目标半径范围内的负位置给出的惩罚(第3.2节)。 为了理解这对训练CornerNet有多大帮助,我们训练一个没有减少惩罚的网络和另一个固定半径为2.5的网络。 我们在验证集上将它们与CornerNet进行比较。

表2 减少对正位置附近的负位置的惩罚有助于显着改善网络的性能

我们看到减少惩罚特别有利于大中型目标

误差分析 CornerNet同时输出热图,偏移和嵌入,所有这些都会影响检测性能。 如果错过任何一个角,都将会丢失一个目标;需要精确的偏移来生成紧密的边界框;不正确的嵌入将导致许多错误的边界框。 为了理解每个部件如何影响最终误差,我们通过将预测的热图和偏移替换为ground-truth,并在验证集上评估性能,以此来执行误差分析。

表3.误差分析。 我们用ground-truth替换预测的热图和偏移。 单独使用ground-truth的热图可以将AP从38.5%提高到74.0%,这表明CornerNet的主要瓶颈是检测角点。


这表明尽管在检测和分组角点方面仍有很大的改进空间,但主要的瓶颈是检测角点。 图8显示了预测角点的两个定性示例。

与最先进的检测器进行比较

在MS COCO数据集上进行了实验,CornerNet打败了所有之间的one-stage检测算法,取得了和最好的two-stage检测算法可匹敌的性能

&Conclusion

作者提出了CornerNet,一种新的目标检测方法,检测边界框的一对角点。在MS COCO上评估了CornerNet,证明了其很好的结果。

&Notes

本文的贡献

  1. 设计了一个针对top-left和bottom-rightheatmap,找出那些最有可能是top-left和bottom-right的点,并使用一个分支输出embedding vector,帮助判断top-left与bottom-right之间的匹配关系
  2. 提出了Corner Pooling,因为检测任务的变化,传统的Pooling方法并不是非常适用该网络框架。

corner pooling


如上图所示通常目标包围框的左上和右下角点并没有特殊的局部信息可以捕捉(在左上角和右下角的点周围没有关于物体的局部信息),所以本文发明了corner pooling池化方法,可以有效的从目标区域整体捕捉到左上和右下角点的位置信息

那corner pooling是如何捕捉目标区域的左上和右下点的位置信息呢?


上两图是以top-left corner pooling 为例的corner pooling示意图,对于每一个通道,从一个分离的特征图在水平从右到左垂直从下到上两个方向找到最大值( 比如最上排的(2,1,3,0,2),从右到左取max,第一个数是2,第二个数是max(0,2)=2,然后再max(3,2)=3,max(1,3)=3,max(2,3)=3。所以输出为(2,2,3,3,3)),并把这两个值相加,得到corner pooling的输出。

Heatmaps与Reduce penalty策略

每个Heatmaps都有C个Channels,其中C是类别数量,不含BG类。理论上讲,Heatmaps的收敛目标应该是一个binary mask,其中非零点代表是Corners,零点代表不是Corners点,但这样会带来一个问题。以下图为例:

绿色点是gt,橙色是检测到的corners,红色代表检测出来的框;那么,如果heatmap是binary mask,很明显红色框的结果并不好,因为corners和gt的位置并不吻合,这很明显违背我们的认知。退一步考虑,如果此时,有一个框出了整个图片的超级错误的框,在heatmap上,它和红色框是一样的,都属于错误的框。
所以正确的思路应该是:heatmap在gt位置处的值最大,其它位置,越靠近gt值越大,换而言之,用和gt位置的距离来代替是否处于gt位置上
(可以看出这个预测框的两个角点和ground truth并不重合,但是该预测框基本框住了目标,因此是有用的预测框,所以要有一定权重的损失返回,这就是为什么要对不同负样本点的损失函数采取不同权重值的原因。)

围绕这个思路,作者提出了reduce penalty策略,基本思想就是构造高斯函数,中心就是gt位置,离这个中心越远衰减得越厉害,即:


怎么确定高斯函数的参数作者也给出了方法,有兴趣的可以去论文里查找。最后是heatmap这条路线的loss函数计算:

其中p是预测值,y是真实值,函数整体上是改良版的focal loss

几个参数的含义:摘自文章
pcij表示预测的heatmaps在第c个通道(类别c)的(i,j)位置的值,ycij表示对应位置的ground truth,N表示目标的数量。ycij=1时候的损失函数容易理解,就是focal loss,α参数用来控制难易分类样本的损失权重;ycij等于其他值时表示(i,j)点不是类别c的目标角点,照理说此时ycij应该是0(大部分算法都是这样处理的),但是这里ycij不是0,而是用基于ground truth角点的高斯分布计算得到,因此距离ground truth比较近的(i,j)点的ycij值接近1,这部分通过β参数控制权重,这是和focal loss的差别。为什么对不同的负样本点用不同权重的损失函数呢?这是因为靠近ground truth的误检角点组成的预测框仍会和ground truth有较大的重叠面积。

Heatmaps:摘自文章
Heatmaps的大小是128*128,通道为80(coco数据,80类),所以Heatmaps是一个大小为128*128*80的张量。以Top-left corners模块中的Heatmaps为例,其每个通道代表coco数据中的80个类别,每个通道的128*128网格中的每个点的输出表示该点是一个左上角点的概率。并且该通道预测出来的所有左上角点对应的所有bbox的物体类别都一样。举个例子,假设在通道编号为10(假设物体类别是dog)的128*128热图里面,预测出了3个左上角点,也就是有3个bbox,那么这3个bbox的物体类别都是dog。

embeddings

这个分支的主要作用是用来group corners,作者使用的是1维的embeddings。换言之,给不同的目标分配不同的id,比如1,2,3……然后在预测的时候,如果top-left的corner和bottom-right的corner的embedding值特别接近,比如一个是1.2另一个是1.3,那么这两个很有可能属于一个目标;如果是1.2和2.3这样差距很大的,则一般就是两个不同的目标。要想实现这样的预测,必须做到两点:

  • 同一个目标的两个corners预测出来的embedding值应当尽可能地接近
  • 不同目标预测出来的embedding值应当尽可能地

和类内最小、类间最大的原则其实有一些相似,基于这个原因,作者设计了如下loss:

其中etk和ebk是top-left和bottom-right两个分支预测出来的embeddings,ek是两者的平均值。Lpull起到的作用就是把同一个目标的预测值拉近,而Lpush起到的作用就是把不同目标的embeddings值推远

Embedding:摘自文章
Embedding大小为128*128,通道为1。这个Embedding的作用是什么呢?现在假设两个预测模块已经分别预测出了100个左上角点,和100个右下角点。那么有个问题,怎么知道哪一个左上角点和哪一个右上角点是属于同一个bbox呢?解决方法就是使用这个Embedding。Top-left预测模块和Bottom-right预测模块都有一个128*128的Embedding,简单来说,这两个Embedding中的每个值相当于一个标签。假设在Top-left预测模块里的Embedding的(50,50)位置的值是10(这个值是多少无所谓),那么其表示Top-left位置为(50,50)的左上角点的标签是10。如果,在Bottom-right预测模块里的Embedding的(100,100)位置的值也是10。那么就认为左上角坐标(50,50)和右下角坐标(100,100)属于同一个bbox。在实际应用中,属于同一个bbox的左上角和右下角的embedding值一般不会完全一样(到后面的Emdedding学习就可以知道为啥了),所以论文在判断左上角点和右上角点是否属于同一bbox的时是通过判断两个点所对应的embedding值的距离。

offsets

作者预测出来的featmap和原图的输入尺寸是不同的,假设下采样因子是n,那么原来的位置(x, y)到feature map上对应的位置是([x/n], [y/n]),其中[ ]代表取整操作,在remap回原图位置时候,无疑会产生一定误差,offsets路线正是在这个基础上修正位置的,收敛目标表示为:

损失函数为:

Offsets:摘自文章
Offsets大小为128*128,通道为2(分别为边角点x,y的偏移量)。由于用热图来表示某一点的xy坐标,会损失精度。因此cornerNet还对每个边角点预测其真实位置的偏移量。举个例子,假设通过热图预测出某一左上角点的坐标是(50,50),该坐标的对应尺度是热图的128*128,而真实的坐标从网络的输入尺度511*511,映射到128*128时是(50.2,50.6)这样就损失了精度了。现在cornerNet为(50,50)预测了偏移量为(0.3,0.5),那么可以计算出网络最终的预测坐标为(50.3,50.5)。尽管比真正的坐标(50.2,50.6)差了一点,但比(50,50)还是精确了许多。

CornerNet的方法为什么比基于anchor box的方法更好?

  1. 预测anchor box的中心点坐标要考虑四个方向的因素,左、右、上和下。而cornerNet在定位边角点时< 8000 strong>只要考虑两个方向的因素,比如要定位左上边角点,我们只需要观察物体的最上边点边界和最左边的边界。
  2. 用边界点来表示bbox,会更高效:因为只使用O(wh)量级的边角点,就可以表示
    O(w2h2)量级的anchor box。

anchor boxes两大缺点

  1. 通常数量极大,训练时,DSSD算法用了40K个,RetinaNet算法用了100K个,大量的anchor boxes是不与目标区域重合,这造成了极大的正负样本不平衡,也减慢了训练速度。
  2. 引入了许多超参数和设计选择,包括需要生成多少个box、大小多少、长宽比如何等,再考虑到往往要支持多尺度检测,使得问题更加复杂。

参考

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐