CornerNet: Detecting Objects as Paired Keypoints
ECCV2018
Abstract
-
提出了CornerNet,不同于传统的边界框(对Anchor进行回归),本文使用一对关键点(左上角和右下角)来定位目标
-
提出了Corner Pooling,有助于更好的定位corner
Introduction
-
之前的工作都是基于Anchor,有两个缺点:
- 需要大量的Anchor
- 引入了很多超参数,比如Anchor的大小、比例、个数
-
CornerNet通过左上角点和右上角点来检测目标
-
Corner Pooling如图所示,采用两个特征图,一个对于所有像素向右做最大池化,一个对于所有像素向下做最大池化,最后将两个特征图简单的相加
-
使用角点比边界框好的原因
- 边界框的中心更难定位,因为它依赖于四个边,corner依赖两条边,Corner Pooling编码了关于角点定义的先验知识
- O ( w h ) O(wh) O(wh)个角点可以表示 O ( w 2 h 2 ) O(w^2h^2) O(w2h2)个边界框
-
在COCO数据集上达到了42.2%的AP,优于当时左右一阶段检测器
Related Work
本文受到了多人姿态估计中工作的启发
DeNet
-
一种两阶段的目标检测器,没有使用Anchor来生成RoIs
-
首先确定每个位置属于边界框四个角点的可能性,然后列举所有的组合来生成RoI,最后对RoI进行分类
-
本文与DeNet的区别:
-
DeNet不能识别出两个点是否属于同一个对象,还需要对RoI进行分类,CornerNet是一个单阶段的检测器
-
DeNet selects features at manually determined locations relative to a region for classification, while our approach does not require any feature selection step.
-
CornerNet引入了Corner Pooling
-
Point Linking Network (PLN)
-
一种一阶段的目标检测器,没有使用Anchor
-
首先预测一个边界框的四个角点和一个中心点,然后对于每一个角点预测其他像素是中心点的概率,对中心点预测其他像素是四个角点的概率,最后结合角点和中心点的预测生成最终的边界框
-
本文与PLN的区别:
- CornerNet groups the corners by predicting embedding vectors, while PLN groups the corner and center by predicting pixel locations.
- CornerNet引入了Corner Pooling
CornerNet
-
CornerNet采用一对关键点(左上角和右下角)来检测目标,卷积网络生成两个预测分支来分别用于左上角和右下角,采用的backbone为沙漏网络。
-
没有使用最大池化,使用步长为2的池化层减小分辨率
-
预测分支经过Corner Pooling之后生成Heatmaps、Embeddings、Offsets
-
Heatmaps大小为 C ∗ H ∗ W C*H*W C∗H∗W, C C C是类别数(不包含背景)
- 每个通道都是二值的掩码,代表是不是该类别的角点
- 训练的时候只标记一个真实点为正样本,其他点都为负样本,负样本的点在以正样本为中心的圆内损失减小,圆的半径根据目标的大小而定,需保证圆内的点生成边界框和GroundTruth的IoU大于 t t t( t t t在文中设为0.3)
- 根据计算的半径,损失的减少规则为高斯分布 e x 2 + y 2 2 σ 2 e^{\frac{x^2+y^2}{2σ^2}} e2σ2x2+y2,其中中心点为真实点, σ σ σ为半径的 1 / 3 1/3 1/3
- 损失函数为Focal Loss的变体(
p
c
i
j
p_{cij}
pcij是
(
i
,
j
)
(i,j)
(i,j)是
c
c
c类角点的概率,
y
c
i
j
y_{cij}
ycij则是Gaussians公式生成的分数,
N
N
N是一张图片中的目标数,α 和 β 是控制每个点贡献的超参数,文中 α 为 2 、β 为 4):
-
Offsets
- 由于在卷积过程中进行了下采样,所以在预测的角点对应回原图之后会损失一些精度
- 于是增加了偏移量来消除这部分精度损失,
O
k
O_k
Ok表示偏移量,其中
n
n
n代表下采样的倍数,
x
k
,
y
k
x_k,y_k
xk,yk是真实角点
k
k
k的坐标
- 所有的类共享一组参数(左上角和右下角的偏移)
- 训练过程的损失如下(其中
N
N
N是目标的数量):
-
Embeddings
-
图片中可能出现同一类的多个目标,于是需要确定一对左上角点和右下角点是不是来自同一个边界框,为每一个检测到的角点生成一个一维嵌入向量,如果左上角和右下角属于同一个边界框,那么他们嵌入向量的距离就比较小。然后,我们可以根据左上角和右下角嵌入向量之间的距离对角点进行分组。嵌入向量的实际值并不重要,只用它们之间的距离用于对角点进行分组。
-
本文的方法受到用于多人姿态估计任务的关联嵌入方法的启发。
-
训练过程中使用以下损失来分组角点,缩小属于同一个目标(k类目标)的两个角点的距离( e t k e_{t_k} etk代表 k k k类目标左上角的embedding, e b k e_{b_k} ebk代表右下角的embedding, e k e_k ek是两者的平均值,该损失只用于真实角点):
-
使用以下损失来分离角点,扩大不属于同一个目标的两个角点的距离(∆为1, k 和 j k和j k和j代表不同的类别):
-
-
- 总的训练损失(α 和 β 为 0.1,γ 为 1):
Corner Pooling
- 如图2所示,有些角点没有局部视觉特征,为了确定一个像素是否是左上角,我们需要水平向右看一个目标的最上面的边界,垂直向下看最左边的边界。因此,提出corner pooling,通过编码明确的先验知识来更好地定位角点。
- 如图6所示,以左上角为例,水平方向从右向左做最大池化得到一张特征图,竖直方向从下到上做最大池化得到一张特征图,最后将两张特征图逐元素相加
- Corner Pooling 的公式表示(以左上角点为例)如下( f t , f l f_t,f_l ft,fl表示左上角点输入的两张特征图,大小为 W ∗ H W*H W∗H, f t i j 和 f l i j f_{t_{ij}}和f_{l_{ij}} ftij和flij分别表示 f t , f l f_t,f_l ft,fl上坐标为 ( i , j ) (i,j) (i,j)的点,公式6表示从左到右做最大池化,公式7表示从下到上做最大池化):
- 图7为prediction module的具体结构,首先是一个残差块(原本是两个3x3卷积),将1个3x3卷积替换为corner pooling,残差块之后是一个3x3的Conv-BN-ReLU,最后分为三个3x3的Conv-ReLU分支,使用1x1卷积生成Heatmaps、Embeddings、Offsets
Experiments
- 图片不进行Resize,而是使用0进行填充
后处理流程
-
We first apply non-maximal suppression (NMS) by using a 3×3 max pooling layer on the corner heatmaps.
-
Then we pick the top 100 top-left and top 100 bottom-right corners from the heatmaps.The corner locations are adjusted by the corresponding offsets.
-
calculate the L1 distances between the embeddings of the top-left and bottom-right corners.Pairs that have distances greater than 0.5 or contain corners from different categories are rejected.
-
The average scores of the top-left and bottom-right corners are used as the detection scores.
-
验证corner pooling 的作用
- 对中大型目标效果更明显
- 对中大型目标效果更明显
-
探讨角点在图片不同象限对检测有没有影响
- 验证减少对负样本的惩罚的作用,验证半径对检测的影响
- 对比沙漏网络和FPN
- 对比不同IoU下几个网络的性能
- 误差分析
- 直接将生成的热图替换成GroundTruth,提升巨大,说明主要瓶颈还是角点的检测
- 和其他方法的对比