Anchor-Free算法-CornerNet

CornerNet是2018年ECCV的文章,使用人体关键点检测的思想完成目标检测任务。
使用卷积神经网络进行目标检测任务已经取得了显著的效果。而目标检测中最常使用的一种机制就是锚框机制。不论是单阶段还是双阶段方法都应用了锚框机制。我个人理解呢,双阶段的锚框,如Faster-RCNN,使用不同大小、比例的锚框对图像进行遍历,判断出前后背景,并根据GT对锚框的位置进行回归;单阶段在不同缩放比例的特征图上放置锚框,对框的位置进行回归。
但使用锚框存在多个问题,1.用不同的锚框对图像遍历,会产生非常非常多的锚框,这显著地增加了计算量;2.产生的大量锚框,包含目标的是少数,绝大多数是不含目标的背景框,这使得前后样本数量极不平衡;3.锚框的参数,如尺寸、比例是手工计算的,这就使得不同数据集下的参数需要重新设计。
由此作者提出了无锚框的算法CornerNet,通过检测左上和右下两个点的坐标确定检测框。使用卷积网络预测同一类别中所有实例的左上坐标点热图、右下坐标点热图和和每个检测点的编码向量。编码向量的作用是对同一目标的一对检测点进行预测。这种方法极大地简化了网络的输出,且不需要对锚框进行设计。
在这里插入图片描述
上图就是整体流程图。
CornerNet的另一个创新是Corner池化。这是一种新的池化技术,可以帮助卷积网络更好地定位位置框。回归框的Corner通常不在物体内部,这种情况下无法通过自身的信息确认Corner的位置。要确定其是否是目标的左上像素,我们需要从该点水平向右看,确定其是否为目标在竖直方向的最高坐标;还需要从该点向下看,确认是否为最左侧坐标。这激发我们设计出Corner池化:它的输入为两个特征图,对第一个特征图的每个像素点,其值为从该点至右边界的最大值(如果值减小了,说明走到了最大值的点);对第二个特征图,其值为向下的最大值。最后将这两个结果相加。流程图如下。
在这里插入图片描述
作者对使用Corner预测边框的好处进行了分析:1.Corner仅需要两个坐标就能预测四条边,而用锚框需要中心的坐标和长宽,要预测四条边的位置,这比两个点麻烦;2.wh个Corner比 w 2 h 2 w^2h^2 w2h2个锚框计算简单。
相关工作就将一些Anchor-Free的方法:
PLN是单阶段的Anchor-Free方法,它预测的是框的四个角和中心点的位置。它在四个角分别预测图像的中心点位置,同样的它在中心点预测图像的四个角的位置。最后将四个角和中心点的预测结合,生成目标框。CornerNet与PLN十分不同,CornerNet通过编码向量对角点进行分组,而PLN通过四个角和中心来估计像素位置。其次CornerNet使用CornerPooling来更好的对角点进行定位。
作者也提出,本文是受人体关键点检测的启发。通过对每个关键生成一个嵌入向量,再根据向量间的距离进行分组。
下面讲方法:
网络生成左上和右下两个点,和一个编码向量,同一目标的一对点之间的编码向量应当很接近。为了生成更贴近物体的框,网络还预测了偏移。根据预测的热图,编码向量和偏移,使用一种简单的后处理算法就能获得目标框。
下图是CornerNet的概图,使用沙漏网络,网络后是两个预测模块,一个预测左上、一个预测右下。每个模块都有一个CornerPooling,在预测热图、编码向量和偏移之前,提取沙漏网络输出中的特征。不同于别的目标检测算法使用不同尺度进行预测,该算法只对沙漏网络的输出使用这一个模块。
在这里插入图片描述
两张热图,分别对应左上和右下两个点,其通道数是C,为类别数,长和宽分别为H和W,C中不包含背景通道。每个通道都是二进制的掩码,用来预测每个类的焦点位置。
对于每个角,只有一个像素点是真值,其他全是负样本,在训练中,作者不是对所有的负样本计算损失,而是以正样本点为半径,对离正样本越近的负样本点逐步减小损失。这是因为就算两个角点发生了一定的偏移,仍能产生与真实框大部分重合的目标框。作者通过确保角点生成的框与真实框的IOU至少要达到t,来确定半径的大小。(这有些疑惑,确保IOU的下界,这与半径和目标的大小都有关,要保证IOU,则对每张图的半径都要计算,因为目标大小不同,要是一次计算完就是对数据先预处理)。乘法的衰减量是一个二维高斯。
在这里插入图片描述
σ \sigma σ是半径的三分之一。
p c ( i , j ) p_c(i,j) pc(i,j)是特征图(i,j)位置对第c类目标的得分, y c ( i , j ) y_c(i,j) yc(i,j)是使用了非正态高斯得出的ground truth热力图。作者设计了一种适用于本算法的Focal Loss:
在这里插入图片描述
离GT越近的点,其 y c i j y_cij ycij越接近于1,其损失项(1- y c i j y_cij ycij)也越小。
之前的方法经常会使用下采样降低特征图的分辨率,这就使得原本在(x,y)位置的点在下采样后的热力图上位于( ⌊ x n ⌋ \lfloor \frac xn \rfloor nx, ⌊ y n ⌋ \lfloor \frac yn \rfloor ny),当再把热力图映射到原图时就会产生偏差,这会极大的影响IOU及边界框的准确性。为了解决这个问题,作者在重新映射回输入分辨率前调整角点的位置: o k = ( x n − ⌊ x n ⌋ , y n − ⌊ y n ⌋ ) o_k = (\frac xn -\lfloor \frac xn \rfloor,\frac yn -\lfloor \frac yn \rfloor) ok=(nxnx,nyny)
图像中可能出现多个目标,因此可能出现多个左上和右下的角点。这是需要确定左上和右下角点是否来自同一目标。受到人体姿态检测的启发,作者为每个检测到的角点预测一个嵌入向量,如果两个角点来自同一个目标,那么它们嵌入向量见的距离应当很近。这样将角点按对组合就可以了,角点的值具体是多少并不重要。
作者使用一维向量编辑嵌入向量,提出了pull损失和push损失:
在这里插入图片描述
其中etk代表左上角点,ebk代表右下角点。ek是etk和ebk的平均值, Δ \Delta Δ设置为1。
CornerPooling具体怎么做的,下图一看便知:
在这里插入图片描述
在这里插入图片描述
在CornerPooling模块之前的是修改过的残差模块。
剩下的就是沙漏网络,还是觉得把代码再过一遍。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值