论文地址:https://arxiv.org/abs/1808.01244
代码地址:https://github.com/princeton-vl/CornerNet
目前很多 one-stage 目标检测算法都通过使用预设锚点(anchor box)的方法来实现对图像中目标框的预测,如SSD、RetinaNet等,但是这种同预设锚点的方法有很多弊端:1)由于大量的预设锚点中,只有极小一部分锚点会与标注框(ground truth)相交叠,而大部分预设锚点都与标注框无关,这就导致了正负样本(此处指锚点)极大不平衡,从而拖慢了训练过程。2)预设锚点引入了许多额外的超参数,如锚点的个数、尺寸和纵横比等。尤其是在多尺度预测时,在每个尺度的特征图上进行预测时都要使用其尺度相对应的锚点集合,这就大大增加了模型的复杂度。
由此,作者提出了一种通过预测每个目标的一对关键点(左上角和右下角)坐标来预测目标位置的方法。
为什么通过预测角点来预测目标框的方式要比通过预测中心点和预选框的方式好呢?
作者认为有两方面的理由:
1)预测中心点时依赖目标四个边的信息,而预测每个角点则只需要两个边的信息。再加上通过作者提出的 corner pooling,使得预测两个角点要比预测中心点容易的多。
2)角点提供了一种更有效率的密集离散化 box 空间的方式,我们只需要复杂度为 的角点就可以表示复杂度为 的anchor boxes。关于这一点,我个人理解是这样的:角点只可能存在于宽度为w高度为h的图中,所以最多有w*h种可能,复杂度为 。而box则不一样,box的中心点有w*h种可能,另外,box在每个中心点上的宽高组合又有w*h种,所以综合起来,box便最多有 种可能,复杂度为 。
CornerNet 的总体结构如上图所示,它通过预测 bounding box 的一对关键点(左上角和右下角)来达到目标检测的目的。CornerNet 选择 Hourglass Network 作为其基础网络,在该基础网络之后为两个 Prediction 模块来作为左上角点和右下角点的预测模块,每个模块都有其 Corner Pooling 模块来对 Hourglass Network 的输出特征进行池化操作,然后再分别进行三部分的预测:Heatmaps、Embeddings 和 Offsets。
1)Heatmaps:卷积神经网络预测两个 heatmap 来表示来自不同类别目标的角点坐标,一个用来表示左上角,另一个用来表示右下角。
2)Embeddings:仅有这些Heatmap是不够的,我们还需要知道每个左上角和右下角的对应关系,所以网络会对每个角点预测一个 embedding 向量,这个向量用来角点之间的配对:隶属于同一目标的左上角和右下角,其各自的 embedding 向量之间的距离最小。
3)Offsets:为了得到更精细的预测结果,网络还会预测一系列 offsets,用来微调角点的坐标。
CornerNet 不同于其他多尺度目标检测网络,它只利用基础网络最后一层的输出特征来进行相关预测。
改论文的亮点之一就是 corner pooling。
如Fig.2所示,目标框的角点位置在绝大多数情况下并不在目标实例上,这就需要一种特定的方法来实现对目标框角点的检测。比如,在预测左上角点时,我们需要观察该点的水平右侧方向上和竖直向下方向上有无目标;在预测右下角点时,我们需要观察该点的水平左侧方向上和竖直向上方向上由于目标。基于这些先验知识,作者设计了一种叫做 corner pooling 的池化方法。
假设 位置是一个左上角点, 和 分别为 corner pooling 层的输入特征图(feature map), 和 为在 位置上分别属于 和 特征图的特征向量(feature vector),首先按照式(6)、(7)计算得到 和 ,然后将 和 相加,将其作为 corner pooling 层的运算结果。
计算示例:
预测模块的整体结构如Fig.7所示,作者借鉴了 ResNet 中 Residual Block 的思想,用 corner pooling module 替代 3×3 convolution module。在corner pooling module 中,首先对基础网络输出的特征图进行一次 3×3 Conv-BN_ReLU操作(卷积为128 channels),然后再应用 corner pooling layer 得到池化结果。接着,对该池化后的特征图进行一次 3×3 Conv-BN(256 channels)操作,将得到的特征图与1×1 Conv-BN 得到的特征图相加,对ReLU后的结果进行一次3×3 Conv-BN(256 channels)操作,将得到特征图分别进行三次 3×3 Conv-ReLu 操作,用来生成Heatmaps、Embeddings 和 Offsets。
CornerNet 共生产两个 Heatmap 用来表示角点的坐标。每个 Heatmap 的形状为,其中 为类别数(不考虑背景),即 Heatmap 的每个通道为一个大小为 的二进制掩码(binary mask),用来表示某一类别的角点坐标。对于每个角点,只有预测为角点的位置为“正样本”位置,置为1。其余均为“负样本”位置,置为0。
标注信息的增强:
在训练过程中,如果对每个出现在“负样本”位置的角点都施行“同等力度的惩罚”的话,这里就存在着一个问题,那就是如果角点出现在“负样本”位置,但是预测效果可以接受(预测结果不是完全精确但是精度可接受)的情况下(如Fig.5),我们显然要“包容”这个预测结果,即减轻对这个预测结果的“惩罚”。基于这方面考虑,作者在角点的 ground truth 周围设置了一个圆的范围,圆的半径大小设定依据为:保证一对角点所构成的预测框与标注框的IOU大于一定值(作者设置为0.3)。然后对这个圆内的“负样本”位置的惩罚衰减,衰减的幅度依据“非正则二维高斯”(unnormalized 2D Gaussian):,其中中心点为角点标签位置的坐标,即和为圆内的点相对于中心点的偏移量,为圆半径的1/3。我个人理解是:通过“非正则二维高斯”公式来产生圆圈内的标注信息,使原来只有角点位置为1其余位置为0的标注变为:圆内标注的数字范围为(0, 1],圆外为0。
角点预测Loss的计算:
令 表示 heatmap 中, 位置被预测为类别 的角点的得分; 为经过“非正则二维高斯”扩充的 heatmap 的 ground truth。 为一张图像中目标的总个数, 和 为两个超参数(作者采用),用来控制每个位置点对Loss的影响程度。由此可见,通过“非正则二维高斯”对 ground truth 的扩充 和 因子,减小了 ground truth 周围的点对Loss的贡献率。
通过一系列卷积池化操作之后,最后得到的特征图会缩小为原始图像的,因此,在原始图像上的坐标点 映射到 heatmap 上为 ,但是,作者发现,在将 heatmap 上的坐标反向映射到原始图像上时会损失一些精度,这对小目标的检测有较大的影响。由此,作者提出了三大预测模块之一的 Offsets,在将 heatmap 上的坐标反向映射到原始图像上之前,用这个offsets来修正角点位置坐标。Offset 如下所示:
其中, 为offset, 为 角点 的坐标。
CornerNet 一共预测两个 offsets 集合(two sets of offsets):一个用于所有类别目标的左上角,另一个用于所有类别目标的右下角。在训练过程中,采用 Smooth L1 Loss 来计算 offset模块 的Loss:
注意:该loss只在应用在 ground truth 角点位置上。
因为一张图像中可能会存在多个目标,而我们同时检测到了目标框的多个左上角和右下角的角点,这就需要我们来对这些角点进行配对,即,找出属于同一个目标的左上角和右下角组合。为了达到上述目的,作者引入了三大预测模块之一的 Embeddings。
CornerNet 为每个检测到的角点都预测一个 embedding vector,如果某一对左上角点和右下角点属于同一目标,那么它们的 embedding 向量之间的距离应该很小。基于这个度量,我们可以将这些角点组合在一起。
作者提出了两个loss,其中 pull loss 用于组合角点,push loss 用于分离角点。其中, 和 分别表示目标k的左上角点和右下角点的 embedding 向量, 为 和 的均值,设置为1。
注意:该loss只在应用在 ground truth 角点位置上。
CornerNet 采用 Hourglass Network 作为其基础网络。Hourglass Net 有许多优点,例如:可以在一个单一的整体架构中,可以提取全局特征和局部特征、当多个 Hourglass 模块堆叠在一起时,可以提取更高等级的信息(higher-level information)。
作者采用了 2 个 Hourglass 模块,并且对模块的结构做了修改,详见论文3.5节。
训练过程和各种评估表格在此不再赘述,感兴趣的话可以看论文原文。
实验结果表明,CornerNet 中的三大部分Heatmaps、Embeddings 和 Offsets 都是必不可少的模块,另外,作者也更换了基础网络做了相关实验,表明 Hourglass Network 作为基础网络时效果最好。
值得一提的是:CornerNet 在 上的精度相对其他方法有较大提升,这说明 CornerNet 可以更精确的定位目标。
Fig.9 列举了部分误检样例,这是由于角点的误检和焦点的错误配对造成的,这说明 Corner Net仍有很大的提升空间!