【目标检测】CornerNet: Detecting Objects as Paired Keypoints

CornerNet: Detecting Objects as Paired Keypoints

文中首先指出使用anchor的缺点在于:

  1. anchor boxes数量巨大,使得正负例不平衡,一般采取的方法有设置IOU阈值上下限,并给定正负例比例(比如1:3),或者难负例挖掘;
  2. 引入了超参数,比如anchor的scale,aspect ratio,确定这些超参数是一个较为复杂的工作。

 

论文大体思路:本文提出一个方法CornerNet,就是使用检测物体的左上角和右下角来预测bbox。

  1. 如下图所示,输入image经过一个ConvNet(用于生成feature map)后,分上下两个分支,上面分支module负责预测左上角corner,下面分支module负责预测右下角corner。
  2. 以上面分支为例,将主干网络ConvNet的输出作为这个module的输入,而它输出是热图(heatmaps),预测某个location是否是左上角。这样上下两个分支分别预测出左上角corners和右下角corners。
  3. 如何确定哪一对左上角和右下角属于同一个目标,从下图可见,每个分支还为corner生成embedding vector(嵌入向量),这个嵌入向量与NLP中的词嵌入向量类似,在NLP中将每个word映射到向量空间某一点。这里类似地,将每个corner映射到向量空间某一点,且如果某个top-left corner与bottom-right corner属于同一个目标,那么可以人为设计让这两个corner在向量空间靠的很近,即对应embedding vector 差的L1范数很小,这样在检测阶段,使用一个阈值,当某个top-left corner与 bottom-right corner的embedding vector的差的L1范数小于这个阈值时,就可以认为这一对top-left corner与bottom-right norner可以组成一个目标的bbox。

1、概述。

CornerNet概述:

  1. 使用一个卷积网络ConvNet生成两组heat maps来预测不同分类下的corners,其中一组负责预测左上角,另一组负责预测右下角
  2. ConvNet为每个corner预测embedding vector,用于判断某左上角和右下角是否同属一个目标.
  3. 为了使得通过预测左上角和右下角corner得到的bbox更加紧贴目标,ConvNet还预测了corner的location偏差offset

网络结构:

  1. backbone使用hourglass network,后接两个预测模块(top-left和bottom-right),每个模块有自己的corner pooling层,预测heatmap,embedding和offset三个部分。

2、Detecting Corners(角点检测)

1)两组heatmaps分别负责预测top-left cornersbottom-right corners。每组heatmap有C个channel,其中C是类别数量,heatmap的size为H×W 。

2)背景类没有对应的channel,因为预测为corner的则为正location,否则为负location,某个location的所有channel上的值预测可以均为负,表示这个location是背景,所以没有必要为背景类增加单独的channel。每个channel就是一个binary mask(二元掩模),表示location是否为这个分类下的corner。

3)对于某个corner,仅有一个gt positive location,其他location相对于这个corner均为negative。训练阶段,损失函数中对negative location的惩罚不是一视同仁的,因为即使一对错误的corner检测(左上和右下),如果足够靠近 gt(ground truth) corner locations,那么生成的box与 gt box 有很大的IOU,如图5。

4)所以在以gt corner location为中心的某个圆内,应该降低对negative location的惩罚比较合理,随着negative location远离圆中心,逐渐增大惩罚。记为gt heatmap的值,当(i,j)位置是正确的corner且对应分类为c时, =1表示positive,其余情况表示negative,现在既然在正确corner对应分类c下对一定几何范围内的negative location 降低惩罚,不如将修改为:

其中x,y表示negative location与gt corner location(圆中心)的坐标相对值,注意y与没有关系,它们表示的是两个变量,r是圆的半径(后面讨论如何计算得到),,这个值控制惩罚降低的变化速度,值越大,随着negative location远离圆中心,值下降的越慢(高斯函数曲线越扁平)。

经过这个修改后,=1依然表示positive,而<1表示negative,对negative location的惩罚降低因子就与 保持一致,即随着距离增大,两者的增减性一致,于是在原来的惩罚项上增加一个惩罚因子为,表示降低惩罚。使用focal loss,并考虑进这个惩罚因子,损失函数为:

3、Offset
由于下采样,ConvNet的输出分辨率较输入image的小,假设下采样率为 n,image上位置(x,y)映射到heatmap上位置为 ,当在heatmap上预测出一个corner后,映射回image时坐标精度有所损失,在小目标的情况下,这将会显著影响IOU。为此作者增加一个坐标偏差的预测,gt 的坐标偏差为:

其中为第 k 个gt corner 在image上的坐标。记预测坐标偏差为,训练阶段使用smooth L1 损失,

测试阶段:则根据预测的坐标偏差修改坐标,设heatmap上位置(x,y)预测为corner,预测的offset为,那么在原image上corner的坐标为:

4、Grouping Corners(分组角点)

两组heatmaps中将会分别预测出很多左上角corners和右下角corners,如何确定某个左上角corner和右下角corner(组成一对corners)是否来自同一目标?作者使用embedding方法,为每个corner生成embedding vector,如果一对corners来自于同一目标,那么对应的两个embedding vector应该很接近,一个衡量接近的指标是vector的差的L1范数足够小。
训练阶段:ConvNet分别生成top-left embedding feature和bottom-right embedding feature,如图4最右端,embedding feature map尺寸为h×w×l,其中h,w是输出size,与heatmap 的size相同,l是embedding vector的长度,作者实验中为了简便选择l=1,即embedding是标量。这个embedding没有target value,作者引入pull损失和push损失来学习embedding的预测,令是第k个目标的左上corner的embedding,是第k个目标的右下corner的embedding,那么两种损失分别为:

两个损失的作用分别为:

1)是为了将同一目标的两个embedding拉的更近,同一目标的两个角点的embedding越接近,pull损失越小。使用这个损失学习,更偏向于将同一目标的两个角点的embedding生成的更接近。

2)则使不同目标的均值embedding尽可能互相“推开”/分离,因为一个目标本身就有左上corner和右下corner的两个embedding,所以push中取的均值,互相推开的程度由△来量化,当两个不同目标的均值embedding的差的L1范数超过△时,我们认为可以足够区分corner是来自不同的目标,此时push损失为0,而不超过 时,会导致判断(将corner归并同一目标)错误,需要对这样的embedding作惩罚,这就构成了push损失。

总之,embedding本身没有target value(事实上也很难去给出一个绝对的值),embedding是人为设计出来的一套自洽系统或者说一个空间,只要corner的embedding遵循一定的规则,就可以,所以使用pull和push损失学习,可以看成是为了让生成的embedding遵守规则,这样在Test阶段,就可以基于这些规则然后根据embedding值对corner进行同目标归并。

结合上面三个式子得到:

测试阶段:假设分别从两组heatmap上得到K个top-left corners和K个bottom-right corners,那么共有对组合(一个top-left与一个bottom-right corner组成一个对),对每对组合计算,如果超过一个阈值(0.5),则忽略这对组合,即这对组合不能生成object box。实际上从源码中可以看出对对组合,还有其他一些筛选条件,比如得分(来自于heatmap),坐标值范围检测,每队组合中top-left与bottom-right两个corner的分类是否一致等。筛选之后还要(对每个分类分别)使用soft nms等方法,才得到最终的检测结果。具体请阅读源码。

corner pooling

本文另一个创新点是使用了corner pooling,即图1中上下两个分支分别使用了corner pooling,这个layer有助于更好地定位bbox的corner。如图2,一个目标的bbox的corner往往位于目标之外,所以要确定一个location是不是corner,仅凭location附近的局部信息是不够的。

作者认为,要确定一个location是不是top-left corner,需要从这个location水平向右看,才能知道其是不是目标的top-most边界,同理,从这个location垂直向下看,才能知道是不是目标的left-most边界。这就是corner pooling层,如图3,以两个feature map作为输入,在每个location位置,从其中一个feature map上max-pool所有位于这个location右边的位置的feature vectors,从另外一个feature map上max-pool所有位于这个location下边的位置的feature vectors,然后将得到的两个vector相加,最终得到这个location的vector,为什么是一个vector呢?因为每个类别独立进行,所以是一个vector,其长度为类别数量。所有location的vector就组成heatmap。

作者还解释了为什么使用检测corner的方法。首先,比起检测bbox的中心,corner仅依赖于object 的两条边,而center则依赖四条边,所以检测corner显得更简单些,并且corner pooling层运用了corner的先验知识(即corner的定义,比如左上角corner是由topmost边界和leftmost边界确定),使得检测更加简单;其次,比起使用region proposal的检测方法,corner在离散化bbox空间更加高效,比如 (h,w)的feature map,corner总共有w×h种可能性,而anchor box则有:

 种可能性,所以可以说使用了的corners 来表征的anchor boxes(之前sota方法中也是固定一组anchor 的scale和aspect ratio,使得每个location有A个anchor,从而降低anchor的可能性

Corner Pooling:下面讲下具体的做法,以top-left为例,假设位置 (i,j) 是一个top-left corner,记corner pooling层的输入feature maps分别为 ,feature map的size均为H×W ,记 (i,j) 处的feature vector分别为 ,首先max-pool位于 (i,j) 到(i,W) 之间所有location的feature vector,得到(i,j)处的响应向量,vector长度为分类数量,表示每个分类独立进行,然后max-pool位于(i,j)到(W,j)之间所有location的feature vector,得到(i,j)处的响应向量,这就是向右看和向下看,找出最大值,作为当前位置的响应,(对于bottom-right则是类似的,但是方向反过来)

观察上两式,发现这其实是一个递归的计算式,可以反过来计算提高效率,计算过程如图6:

Corner Pooling模块(包含了前后的conv+bn+relu等层)如图7所示,

Hourglass Network

CornerNet的backbone使用Hourglass网络,这个网络在人体姿态估计任务中首次被引入。Hourglass网络是全卷积网络,包含一个或多个hourglass模块。

输入image 的size为,经过一个pre的模块,其中包含一个 conv( ),以及一个residual(其中conv层的kernel为 ), 所以此时feature size为这个feature 作为hourglass网络的输入。

在hourglass模块中首先使用一些conv层和max pooling层对输入特征进行下采样,然后再上采样使feature分辨率回到原来大小,由于max-pooling层会丢失细节,所以增加skip层将low level信息带到upsampled feature,于是hourglass模块结合了local特征和global 特征生成新的特征,当堆叠(stack)多个hourglass模块时,就可以重复这个过程,从而捕获更加higher-level的信息。

显然这个结构是嵌套的(总共5层嵌套,第5层嵌套没有up1),可以使用递归构造,从上图中可见,low1具有下采样率2,而low3+up2则具有上采样率2(最近邻插值),所以结构对称,并且经过low1 ,channel可能会增大,而经过low3+up2,channel可能会减小

实验

为了避免过拟合,采样了随机水平翻转、在image上随机crop(保证crop中心位于 image中心的一定范围内)以及颜色抖动(调整对比度,亮度和饱和度)。

训练损失为

超参数的值为:

测试阶段:

  1. 如何判断location是corner?首先进行nms,对得到的两组heatmaps(回顾一下,heatmap是location属于某个分类的corner的概率/得分)应用3x3大小 stride=1,pad=1的max-pooling,不改变feature 大小,保留值保持不变,值改变了的则全部置为0;然后选择top N,这个操作是在所有分类下(分类不独立)进行,记住,选择top N的时候同时保持这些corners的对应分类。
  2. 左上corners和右下corners的配对?参考前文Grouping Corners部分的分析,更加具体的操作移步源码。
  3. 再次选择top K的corner pairs,并进行坐标精度调整,就得到bbox。

 

参考:https://zhuanlan.zhihu.com/p/66406815

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值