CornerNet: Detecting Objects as Paired Keypoints


摘要

我们研究了一种新的目标检测代码,我们检测物体框是使用一系列关键点完成的,左上角、右下角,用一个单一的神经网络。通过一对一对的点来检测物体,我们还消除了设计一些被广泛运用到 single-stage detectors的anchor boxes的需要。 除了新奇的想法之外,我哦们还要介绍我们的corener poolng一种新的pooling 层,来帮助更好地定位corners的做法。

1.介绍

大部分STOA的目标检测方法都是anchor boxes,即基于不同尺寸和比例的候选框来进一步进行操作的。anchor box后来就被拓展到了one-stage detectors,效果可以与two-stage媲美但是更快。one-stage的检测器在整个图片中密密麻麻地分布了anchor box,然后通过给anchor box打分和回归直接生成最终的box predictions。

但是问题就是需要大量的候选框(不再举论文中的例子),这是因为检测器需要被训练来分类哪个框和gt box重合度最高。结果最后只有一小部分被选中;这导致了一个巨大的正负样本不平衡的问题,并且减速了训练。

第二,anchor box的使用添加了许多超参数和各种各样的设计选择,这些包括有多少box,什么size,什么比例。这些选择很影响最后结果,那么就很麻烦。

这里我们介绍Corner Net, 一个新的one-stage的方法。我们用一个单一的神经网络来为所有的实例预测一个左上角的热力图,同样为右下角也预测一个热力图。还有为每个检测到的corner预测一个embedding的向量。 Embeddings是用来把属于同一物体的corners放在一组,网络最终会被训练地为同一物体的corner预测相似的embeddings. 我们的方法简化了网络的输出并且消除了设计不同anchor box的需要。下图介绍了整体的pipeline:
目标检测:Corner Net论文阅读
另一个骚操作是corner pooling, 一种新的pooling层,来帮助神经网络更加方便地定位bounding box的corner的。一个Bbox的corner经常是在物体的外部的(想想一个圆形的物体就很好理解)。在这种情况下一个corner不能根据当前的信息直接很好地定位。取而代之的是为了确定该像素位置是不是有一个top-left corner, 我们需要横向往右看过去看这个物体的边界,同时也要竖直往下看物体的最左面的边界。这激发我们做出了corner pooling:接受两个特征图;在每个像素点的位置都要往右看过去对这个向量做max pool,再用另外一个图向下做max pool,然后把两个 pooled result加起来,示意图如下:
目标检测:Corner Net论文阅读
我们提出两个解释为什么检测corners 比检测bbox 的center或者proposal更好的原因:
第一是因为box的center很难被定位因为它依赖于物体的四条边,但是定位corners只依赖于两条边,所以该方法更简单,加上corner pooling,考虑到了周围的信息,因此更加简单;第二是用corner可以用比anchor box更小的复杂度覆盖相同的范围。

我们测试了在MS COCO的结果,达到了42.2%AP,超过了当下(论文发布时的)所有one-stage检测器。

2.相关工作

2.1 two-stage detectors

介绍了RCNN、Faster RCNN、R-FCN等结构

2.2 one-stage detectors

介绍了YOLO、SSD等网络。
这里提到了王兴刚、刘文予老师等人的Point Linking Net,指出它第一次预测一个bbox的四角点和中心点来预测一个框。不过Corner Net和PLN很不一样,第一,CornerNet通过embedding vectors来讲corners分组,但是PLN则是使用预测像素点的方法。Corner Net使用pooling来更好地定位。

我们的方法还受到了 Associative Embedding在多人姿态估计任务中使用的影响,在这里,不同关节点通过embedding vector的距离来分类为不同人的关节。蓝儿我们好像是最早把这思想用在目标检测的,我们的corner pooling也很新奇,我们还改变了沙漏型的网络结果并且添加了自己的focal loss.

3.Corner Net

3.1 总览

在corner net中,我们把物体视为一对又一对的左上角和右下角的关键点组合。一个神经网络来预测两个热力图来表示不同物体的corners的位置,一个图是左上角的,一个图是右下角的。网络同样为每个检测出来的corner预测一个embedding vector,并且让来自同一个物体的点的距离很短。为了生成更加密集的bboxes,网络同样还预测一些偏置(offset)来轻微调整corners的位置。用来预测出来的热力图、embeddings、offsets,我们再加上一个简单的后处理就获得最后的bbox.下图给出了Corner Net的总览:
目标检测:Corner Net论文阅读
我们使用了hourglass的网络作为backbone,紧随其后的是两个预测的模块,一个是为了左上角corner预测的模块,另外一个则是为了右下角的corner预测的。每一个module都有自己的corner pooling来把从hourglass提取得到的特征图进行corner pooling,为预测热力图、offsets、embeddings做准备。不像其他一些检测器,我们不用不同size的特征图来预测不同size的物体。我们只是把两个模块应用在hourglass得到的结果上而已。

3.2 检测corners

我们预测了两组heatmaps,一个给左上角的corner,一个给右下角的corner。每个热力图有C个channels,C是物体的总类别数(不含背景),heatmap的size是H * W,每个通道的这一整张H * W 的值是一个掩膜,每一个点的值代表这个点属于该分类的分数。(论文说是二值的,应该打错了)
对于每一个corer,都只有一个gt positive location,其他的locations都是负的。在训练期间,我们并不同等地惩罚所有的负样本,我们在positive location某一半径内的negative locations减少惩罚。这是因为一组错误的corner detections,如果他们和本来对应的gt locations,那么实际上仍然可以产生一各与gt bbox覆盖度很大的bbox。如下图:
目标检测:Corner Net论文阅读
我们这样决定这个半径:如果预测的点在这个半径内,那么最后生成的一对点再生成的bbox和gt box的IoU要大于某一值t,这里设置t为0.3 (论文中所有试验都采取了0.3)。给出半径之后,惩罚的下降规则由一个 unnormalized 2D Gaussian给出:
目标检测:Corner Net论文阅读
其中gauss的中心点为positive location,
σ
sigma
σ
是半径的三分之一倍。


P
c
i
j
P_{cij}
Pcij
为在位置(i,j)处对于类别c的得分,让
y
c
i
j
y_{cij}
ycij
为gt 的heatmap,并且用unnormalized来拓宽它的定义。基于此设计了如下的focal loss:
目标检测:Corner Net论文阅读
其中N是一张图中的物体个数,
α
alpha
α

β
beta
β
是两个超参数,他们来控制每个点的权重,实验中将这两个参数分别设置为2和4. 由于高斯凸点定义在
y
c
i
j
y_{cij}
ycij
中,于是
(
1

y
c
i
j
)
(1-y_{cij})
(1ycij)
就减少了对周围的点的惩罚。

许多网络结构包括了降采样的层来获取全局信息,并且借此降低计算量。当他们对整个卷积使用这个策略时,通常会使输出的size小于image的size。因此,一个标注(x,y)就最后被映射到了热力图中的([x/n],[y/n]),n是降采样的倍数。当重新将这些位置映射到原图时,就会丢失一些精度,尤其对小物体影响较大。为了解决这个物体,我们在将特征图上的点重新映射到原图时预测了位置的偏置来调整corner的位置。
目标检测:Corner Net论文阅读
其中xk和yk是第k个corner的坐标,特别地,我们预测一组offset,这组offset对所有类别的top-left corners通用,为了训练,我们采用了smooth L1 Loss
目标检测:Corner Net论文阅读

3.3Grouping Corners

多个物体可能出现在一个图像中,因此多个top-left corners和bottom-right corners可能被检测出来。我们需要检测一组top-left corner和bottom-right corner是否是来自于同一个bbox。我们的方法从Associative Embedding中获得灵感。

网络为每个检测出来的corner预测一个embedding, 这样如果两个点同属于一个bbox,那么他们之间的距离应该非常小。我们可以根据top-left corner和bottom-right corner的embedding距离来分组。实际的embedding会映射到什么值我们不关心,重要的其实是距离。

我们这里选择生成一个一维的embedding, 那么其实就是给每个corner分配一个id而已。让
e
t
k
e_{t_k}
etk
是top-left corner的embedding,
e
b
k
e_{b_k}
ebk
为bottom-right corner的embedding,k代表第k个corner,我们使用"pull"loss来让同一组的corners更接近,用"push" loss来拉远不属于同一组的点
目标检测:Corner Net论文阅读
其中
e
k
e_k
ek

e
b
k
e_{b_k}
ebk

e
t
k
e_{t_k}
etk
的平均值,让
Δ
Delta
Δ
为1与offset的loss相似,我们只对在gt location的点施加这个loss。

3.4 Corner Pooling

如下图所示,经常没有当前位置的信息来决定corner的出现与否:
目标检测:Corner Net论文阅读
为了确定一个pixel是不是top-left corner,我们需要横向往右水平看,并且竖直往下看。于是提出了corner pooling.

假设我们想要确定一个(i,j)的点是不是top-left corner,那么我们让ft和fl为输入到top-left corner pooling层的特征图,让
f
t
i
j
ft_{ij}
ftij

f
l
i
j
fl_{ij}
flij
为(i,j)处在ft和fl中的向量。有看HW的特征图,pooling层首先对所有ft中在(i,j)与(i,H)之间的特征向量进行max-pooling形成
t
i
j
t_{ij}
tij
,让对在fl中所有在(i,j)与(W,j)中的向量进行max-pooling,形成向量
l
i
j
l_{ij}
lij
,最后把
t
i
j
t_{ij}
tij

l
i
j
l_{ij}
lij
相加这个计算可以以下表达式展示:
目标检测:Corner Net论文阅读
效果还是挺棒的。形象直观的pooling过程如下:
目标检测:Corner Net论文阅读
我们对bottom-right corner的pooling采取类似的措施.
corner pooling层在预测的模块中使用,为之后预测heatmap、offset、embedding打基础。整体的预测模块如下:
目标检测:Corner Net论文阅读
第一部分是一个被修改过后的残差块,将第一个3
3的卷积模块换成一个corner pooling的木刻,我们先用33的卷积处理了来自于backbone的特征图(128 channels)然后使用corner pooling 层。紧接着是一个残差块,然后将pooled features送给33的Conv-BN层(256 channels),然后加上projection shortcut。 修改过后的残差块后面跟着一个3*3的卷积模块(256channels),然后3个 Conv-RELU-Conv 层来产生heatmaps,offsets,embeddings.

3.5 HourglassNetwork

我们使用沙漏型网络作为backbone,这个想法最开始是在人体姿态估计中使用的。它是一个泉涓涓的神经网络,有一个或者多个沙漏型的结构。一个沙漏型的结构首先对输入的特征通过一系列的卷积网络和max pooling层进行降采样,然后再在通过一系列的上采样和卷积侧层还原到原来的分辨率。由于在max pooling层中丢失了一些信息,skip layers被加入网络,将信息加入到上采样之后的特征图中。沙漏型结构同时照顾了局部信息和全局信息。当多个沙漏结构在一个网络中连续使用时,网络能够捕捉较为高级别的信息。这些特性使得它挺好用~~

我们的沙漏型结构包括了两个沙漏,并且做了一些改变。我们用步长为2的卷积代替maxpooling来降低分辨率,我们降低分辨率5次,并且增加特征的通道数(256,384,384,384,512)当我们再上采样时我们用两个残差块并且跟着使用最邻近插值。每个skip connections同样包括了两个残差块。在沙漏结构的中间总共有4个512 channels的残差块,我们用7*7、stride = 2、128channels的卷积,同时后面跟着一个stride = 2、256channels的残差块来降低分辨率4次。

我们同样在训练过程中加入了监督。但是我们不加入中间层的预测,又因为发现影响性能。我们对第一个沙漏块的输入和输出都使用1*1的Conv-BN模块然后把他们合并起来,合并时通过element-wise addition,其后跟着一个ReLU层和一个256channels的残差块,结果被送入第二个沙漏块。沙漏网络的总深度为104.不想其他许多一些STOA的检测器,我们只有最后层的特征来做预测,而不用中间层的。

实验结果部分略