Bootstrap

CornerNet快速入门

论文:《CornerNet: Detecting Objects as Paired Keypoints》

地址:https://openaccess.thecvf.com/content_ECCV_2018/papers/Hei_Law_CornerNet_Detecting_Objects_ECCV_2018_paper.pdf

一、方法介绍

动机:单阶段探测器取得良好效果的前提是Anchor boxes足够多以确保和ground truth充分重叠,会造成正负boxes不平衡,减缓训练速度。另一方面,anchor boxes需要很多超参数:boxes的数量、尺寸、长宽比,如果和多尺度体系结构相结合会变得十分复杂。

方法:提出一种新的one-stage目标检测方法。将目标检测视为一组关键点,即左上角和右下角。具体的来说,就是先检测到单个图像中所有对象的左上角和右下角,并对所有检测到的角预测一个嵌入向量。这时候有个问题:为什么要预测嵌入向量呢?因为检测出的点无法知道判断是否是属于同一对象的,可以根据预测到的嵌入向量之间的距离对角进行分组,把同一个物体的角放在一组。

步骤一:backbone-hourglass

hourglss是在《Stacked Hourglass Networks for Human Pose Estimation》中提出的一种针对姿态估计的网络结构。动机是高层卷积网络得到的feature会造成信息丢失,利用多尺度来识别,特别的,上一个hourglass学习预测的关节点之间的联系可以为下一级所用(比如知道了双肩就可以更好的预测肘)

同样为利用多尺度信息,这里和FPN进行一下对比:

FPN包括两个过程,第一个过程是自底向上下采样的过程,按照特征图的大小划分为不同的stage,并将每个stage的最后一层特征选为相应级别的特征,即C2,C3,C4,C5,第二个过程是通过上采样(最近邻值实现)将顶层的小特征图放大到上一个stage一样的大小(利用高层语义特征+高分辨率易于定位),将上一层经过上采样后的特征和当前层分辨率一致的特征通过相加进行融合

 

步骤二:Detecting Corners。预测两组heatmaps,每组heatmap的大小为H×W×C,没有背景通道,每个通道都是一个二进制mask指示一个类的角位置。对于每个角,都有一个真实的positive location,剩下的都是negative location。在训练期间,对positive location某半径内的negative location减少惩罚,因为这些角可以和真实box有很大重叠。如下图所示,真实的box为红色框。橙色的圈为positive location,绿色框的角在橙色圈的范围内。

半径的选择通过对象的大小来确定,确保半径内的一对点可以生成至少t IOU的边界框(本文中的t为0.7)

pcij为在预测的heatmap中位置(i,j)属于类别c的得分,ycij为非归一化高斯增强的真实heatmap

将heatmap重新映射到输入图像会丢失一些精度,影响iou,针对这个问题对角位置的偏移进行预测以便重新映射时调整角位置

 

这里补充一下smoothloss的公式:

步骤三:Grouping Corners

为每个检测出来的角预测embedding,embedding的值具体是多少并不重要,重要的其实是距离,距离越近,属于同一对象的可能性越大。使用pull loss使得同一组角更接近,push loss使不属于同一组的角更远

步骤四:Corner Pooling

没有局部的视觉证据表明corners的存在,要确定一个像素是否为左上角

本文的做法是从右到左进行最大池化水平扫描,从下到上进行最大池化垂直扫描,然后将两个最大池化特征图相加

如下图所示,使用corner pooling模块替换掉残差块中的第一个卷积模块,经过上文所提到的合并操作后,输入到3*3的BN层中。残差块之后跟着三个卷积层分别生成heatmaps、embeddings、offsets

二、源码分析

input:(batch_size,3,511,511)

经过hourglass之后的输出(batch_size,256,128,128)

然后传入两个预测模型中,分别预测左上角和右下角,左上角和右下角的模型不共享参数

corner pooling的中间灰色的大小为(batch_size,256,128,128)

heatmaps(batch_size,num_class,128,128)

embedding(batch_size,1,128,128)

offsets(batch_size,2,128,128)

计算半径->计算e值(半径内的label值)

最后计算loss

测试流程:测试图片输入,对网络输出的heatmap进行NMS(对heatmap进行3*3最大池化,与原始heatmap对比,值改变了的就是非极大值,置0),选出左上角和右下角位置,进行offset调整,位置配对,计算embedding距离,去除不同类别的,距离大于阈值的,右下角小于左上角的,选取得分最高的,按类别选取得分最高的为最终结果

;