论文地址:https://arxiv.org/abs/1808.01244
代码地址:https://github.com/princeton-vl/CornerNet
创新点:
- 提出了一种通过预测一对关键点(左上角和右下角)来预测目标 bounding box 的方法。
- 提出了一种新的池化方法 corner pooling,该池化方法用来更好的定位 bounding box 的关键点位置。
1. 提出背景
目前很多 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便最多有 种可能,复杂度为 。
2. CornerNet 综述
CornerNet 的总体结构如上图所示,它通过预测 bounding box 的一对关键点(左上角和右下角)来达到目标检测的目的。CornerNet 选择 Hourglass Network 作为其基础网络,在该基础网络之后为两个 Prediction 模块来作为左上角点和右下角点的预测模块,每个模块都有其 Corner Pooling 模块来对 Hourglass Network 的输出特征进行池化操作,然后再分别进行三部分的预测:Heatmaps、Embeddings 和 Offsets。
1)Heatmaps:卷积神经网络预测两个 heatmap 来表示来自不同类别目标的角点坐标,一个用来表示左上角,另一个用来表示右下角。