CornerNet
简介
很多目标检测会采用anchor来提升目标检测的定位精度,使用anchor主要有两个缺点:
- 通常需要大量的anchor,但是只有少部分的anchors会与ground truth重叠,造成正负样本的不均衡,降低训练的效率;
- 使用anchor需要一些超参数和设计方法,包括了anchor的数量、尺寸和比例等。需要通过对超参数调参完成anchor的设计,在多尺度框架下应对多分辨率会更加复杂。
CornerNet 是一个比较出色的One-Stage的目标检测方法,同时也是一种Anchor-free 的目标检测方法。文章的第一个创新点是Boundin box 用一对关键点表示,包括左上角点和右下角点。
backbone网络使用的是hourglass,分别使用一个网络检测预测同一种类的所有instances的左上角点和右下角点的热图,embedding vector 和offset。其中embedding vector 用于判断哪一对角点属于同一instance,offset 解决的是由降采样造成的定位精度下降。
文章的第二个创新点是corner pooling。所解决的问题是要检测的角点通常不在物体内部,因此不能使用局部特征定位两个角点。在每个位置上,corner pooling max-pools all features vectors to the right from the first feature map, max-pools all features vectors to the right from the second feature map, and add the two pooled results togehter.
CornerNet
角点检测
主干网络hourglass后解两个预测模块,分别输出左上角点与右下角点的heatmaps、embeddings、offsets。其中heatmaps有C个通道(C为类别数),每个通道对应一个类别;本文中的embedding是标量,用于聚类角点;offset采用了光滑L1损失。
对于每个角点,只有一个真值坐标,其他坐标都是负的。由一些负样本得到的bounding box与真值的overlap可能也会比较高,应该降低对这些负样本的惩罚。文章中,如果某一负样本落在真值的半径内,则降低对该负样本的惩罚,系数为e−x2+y22ρ2e^{-\frac{x^2+y^2}{2\rho^2}}e−2ρ2x2+y2,其中ρ\rhoρ为半径的1/31/31/3,半径由生成最低IoU大于ttt决定。设pcijp_{cij}pcij为预测热图中类别ccc在位置(i,j)(i, j)(i,j)的得分,ycijy_{cij}ycij为添加过惩罚系数后的热图得分,采用focal loss后,目标函数为:
ycijy_{cij}ycij可以降低对真值周围的负样本的惩罚。
由于降采样将坐标(x,y)(x, y)(x,y)映射至(⌊xn⌋,⌊yn⌋)(\lfloor \frac{x}{n}\rfloor, \lfloor \frac{y}{n}\rfloor)(⌊nx⌋,⌊ny⌋),会降低角点的定位精度,需要预测角点的偏移量
偏移量目标函数为:
聚类角点
在同一幅图片中,可能会出现多个物体,因此可以检测得到多个左上角点、右下角点。需要判断一对角点是否来自同一物体,本文采用了multi-person pose estimatation 中的embedding vector。该做法是,首先检测所有的人的joint,对每个joint生成一个embedding, 根据embedding的距离对joint进行聚类。
文章中采用了一维的embedding vector,记etke_{tk}etk为物体kkk的左上(top-left)角点的embedding,ebk为物体e_{bk}为物体ebk为物体k$的右上(bottom-left)角点的embedding,使用pull loss 训练网络以聚类角点,使用 push loss 以分离角点:
其中eke_kek为etke_tketk和ebke_{bk}ebk的均值,Δ\DeltaΔ设为1。类似于focal loss,这两个loss只设置在真值角点。
corner pooling
最终的损失为:
\begin{equation}
L = L_{det} + \alpha L_{pull} + \beta L_{push} + \gamma L_{off}
\end{equation}
MSCoCO 实验
从当时实验结果看,该方法比大多数的one-stage方法要好,但是对比SNIP明显不足,而且现在CoCo上mAP要比现在好很多。
思考
这篇文章提供了一个目标检测的anchor-free方法的思路,对我最大的影响有两点:
- 要想直接检测目标的Bounding box的点不能依靠局部特征,文中的corner pooling很有借鉴意义,尤其是想在图像中直接检测目标的3D Bounding box, 困难更大。 这点可以在找找之前一篇文章,检测物体的3D bb的。
- 目标函数LdetL_{det}Ldet中ycijy_{cij}ycij的设置有一些模糊集合的意思,把原来0和1的离散标签改成了由超参数ttt控制的连续标签, 然后使用focal loss 的变形。