论文笔记之CornerNet

1. 摘要

本文是一个Anchor-free的方法,是预测物体的左上角和右下角来替代anchor。本文是一个一阶段目标检测方法。思想来源于人体关键点检测。

本文主要贡献有两点:

  • 预测物体的左上角和右下角这一对角点
  • 引入CornerPooling,使定位corner更加精确

2. 使用Anchor的坏处:

  • 要想达到差不多的性能,需要大量的anchor,而这会导致正负样本间的不平衡。
  • 设置Anchor引入了一些超参数,例如大小、数量、宽高比等。这些设置比较繁琐,尤其是使用了多尺度之后。

3. 本文解决办法(技术细节)

3.1 网络结构

论文笔记之CornerNet
本文基础网络是Hourglass Network。 基础网络之后是两个预测模块。 一个模块用于左上角,而另一个模块用于右下角。 每个模块都有自己的corner pooling模块,在预测热图、嵌入向量和偏移之前,池化来自基础网络的特征。 与许多其他物体探测器不同,本文不使用不同尺度的特征来检测不同大小的物体,而是只将两个模块应用于基础网络的输出。

3.2 预测corner

本文是预测同一物体类别的所有实例的左上角热图(heatmap)和右下角热图,以及一个每个检测到的角点(corner)的嵌入向量(embedding vector)。嵌入向量里是用于对属于同一目标的一对角点进行分组——训练网络以预测它们的相似嵌入(两个嵌入向量简单的计算(例如余弦函数)就可以得到他们的相关性)。
论文笔记之CornerNet
预测两组热图,一组用于左上角,另一组用于右下角。 每组热图具有C个通道,其中C是分类的数量(不包括背景类),大小为H×W。 每个通道都是一个二进制掩码,用于表示该类的角点位置。

对于每个角点,有一个ground-truth正位置,除此之外其他所有的位置都是负位置。 在训练期间,对不同负样本点的损失函数采取不同权重值(减少对正位置半径内的负位置给予的惩罚)。 这是因为如果一对假角点检测器靠近它们各自的ground-truth位置,它仍然可以产生一个与ground-truth充分重叠的边界框,如下图:
论文笔记之CornerNet

可以通过确保半径内的一对点生成的边界框与ground-truth的IoU ≥ t(本文在所有实验中将t设置为0.7)来确定物体的大小,从而确定半径。 给定半径,惩罚的减少量由非标准化的2D高斯论文笔记之CornerNet

给出,其中心位于正位置,其σ是半径的1/3。

损失函数

损失函数是focal loss的变体,具体如下:
论文笔记之CornerNet
其中,论文笔记之CornerNet是预测热图中C类位置(i,j)的得分(预测值),论文笔记之CornerNet是用非标准化高斯增强的“ground-truth”热图(距离ground truth比较近的(i,j)点的ycij值接近1,这部分通过β参数控制权重,这是和focal loss的差别,ycij=1时就是focal loss),N是图像中目标的数量,α和β是控制每个点的贡献的超参数(在所有实验中本文将α设置为2,β设置为4)。

预测offset

当我们将热图中的位置重新映射到输入图像时,可能会丢失一些精度(向下取整损失了精度),这会极大地影响小边界框与ground-truth之间的IoU。 为了解决这个问题,本文添加了预测位置偏移,以稍微调整角位置,然后再将它们重新映射到输入分辨率。
论文笔记之CornerNet
其中O_k是偏移量,x_k和y_k是角点k的x和y坐标,n是下采样因子。本文预测两组偏移量,所有类别的左上角共享一组偏移,另一组由右下角共享。 对于训练,在ground-truth角点位置应用Smooth L1损失:
论文笔记之CornerNet

3.3 分组corner(嵌入向量)

本文的分组方法灵感来源于关联嵌入(Associative Embedding)。网络预测每个检测到的corner的嵌入向量,使得若两个corner属于同一个目标,则他们的嵌入向量之间的距离应该小。本文就是根据两个corner的嵌入向量的距离来分组的。
嵌入向量的实际值并不重要,仅仅使用嵌入向量之间的距离来对corner分组。

这部分的训练是通过两个损失函数实现的:
论文笔记之CornerNet
e_tk表示第k个目标的左上角角点的embedding vector,e_bk表示第k个目标的右下角角点的embedding vector,e_k表示e_tk和e_bk的均值。第一个式子用来缩小属于同一个目标(第k个目标)的两个角点的embedding vector(e_tk和e_bk)距离。第二个式子用来扩大不属于同一个目标的两个角点的embedding vector距离。与偏移损失类似,仅在ground-truth角点位置应用损失。

3.4 Corner pooling

这是一种新型的池化层,可帮助卷积网络更好地定位边界框的角点。 边界框的一角通常在目标之外,参考下图中的例子:
论文笔记之CornerNet
在这种情况下,角点不能根据当前的信息进行定位。相反,为了确定像素位置是否有左上角,需要水平地向右看目标的最上面边界,垂直地向底部看物体的最左边边界。 这个思路就产生了corner pooling layer:它包含两个特征图,在每个像素位置,一是最大池化特征映射到最下面的所有特征向量,二是最大池化特征映射到最右边的所有特征向量,然后将两个池化结果相加,如下图所示:
论文笔记之CornerNet
具体来说,该层有2个输入特征图,特征图的宽高分别用W和H表示,假设接下来要对图中红色点(坐标假设是(i,j))做corner pooling,那么就计算(i,j)到(i,H)的最大值(对应上图的第一行),类似于找到左侧边信息;同时计算(i,j)到(W,j)的最大值(对应上图的第二行),类似于找到顶部边信息,然后将这两个最大值相加得到(i,j)点的值(对应上图最后一个图的蓝色点)。右下角点的corner pooling操作类似,只不过计算最大值变成从(0,j)到(i,j)和从(i,0)到(i,j)。

公式表示:
论文笔记之CornerNet
示例:
论文笔记之CornerNet
基于残差模块修改的Corner pooling:

论文笔记之CornerNet

3.5 Hourglass Network

沙漏网络是一个完全卷积神经网络,由一个或多个沙漏模块组成。沙漏模块实际上就是一系列卷积加最大池化进行下采样,一系列上采样和卷积放大到原来的分辨率大小。由于细节在最大池化层中丢失,因此添加了跳过层用来将细节带回到上采样的特征。这个网络是主要用于人体姿态估计。本文使用的沙漏网络在原来的基础上做了一些修改。

4. 实验

4.1 测试细节

  • 首先通过使用3×3最大池化层在corner热图上应用NMS;
  • 然后从热图中选出前100个左上角和前100个右下角;
  • 接着根据corner偏移调整corner位置;
  • 计算左上和右下的嵌入向量之间的L1距离;
  • 距离大于0.5的或包含不同类别的corner对被剔除;
  • 左上角和右下角的平均得分作为检测得分

保持原分辨率(图片),填充0后读入网络,原图和翻转图都用于测试。最后将两个检测结合起来,使用softmax抑制冗余检测,仅保留前100个。

4.2 实验结果

(1)Corner Pooling的使用对中型/大型物体的效果较好

(2)对不同位置负样本采取不同权重的损失函数这个方式对中型/大型物体的效果较好

(3)主要瓶颈在于corner检测