CornerNet: Detecting Objects as Paired Keypoints 论文解析
博客写完忘记保存,也没发表就关机了,,,,win10 用习惯了。。。心疼自己,重写第二版
CornerNet 舍弃了检测网络常用的anchor结构,采用了检测物体左上角以及右下角角点的方式来代替anchor,属于one-stage检测网络,领先于其他的one-stage网络,媲美two-stage网络。
出发点
- 作者认为两步网络里的anchor设置的数量太多了,其中高质量的anchor很少,造成正负样本分布失衡,影响网络收敛速度以及检测精度
- anchor需要设置很多超参数,对先验知识和训练经验有一定要求。
网络结构和输出
backbone采用FCN的HG网络如下图。
HG网络的原理这里不详细说,不了解的童鞋可以看一下FCN的相关知识,这里只需要知道,HG最后输出是一组feature map,没有FC结构。作者采用两个Corner detector (左上角和右下角共两个)分别检测左上角和右下角的角点信息,每个detector输出由三部分组成:
-
Heatmap (C)个,C是目标的类别数
也就是说每一张Heatmap专门预测一个类别,比如,第3张heatmap专门预测猫,你可以把这张图叫做猫图,图上有几个角点,就证明有几个猫。heatmap可以认为是C个二值图,在物体的角点处的值为1,其他处为0。但是,值得注意的是,实际上这样的方式并不好,作者给出了示意图来说明这个问题:
红色框代表GT,绿色的框是预测框,可以看到,绿色框已经很接近真值,然而红绿两个框的角点距离还是很大,因此,如果在Heatmap上只将真值角点处的值,那么很明显是不合理,也很难真正收敛的,所以,以GT角点为圆心以一定距离为半径的区域都认为是有效的,半径根据实际情况调节,同时采用高斯函数设置角点邻域内的数值分布。最后损失函数采用Focal Loss。
离中心越近的权重越小,越远越大。α和β是超参数,这里经验性的设置为2和4. -
2个偏移量(offset)
包括X方向和Y方向。由于Heatmap的尺寸和原图大小并不对应,所以在预测时一定会有精度损失(不能整除),因此作者同时预测了这个偏移量来对损失的精度进行补偿。
[x/n]是一个取整符号,n是原图与Heatmap的比值,也就是下采样的比例,x/n几乎不会整除,所以才会造成精度损失,那么损失的精度就是x/n-[x/n]是一个微小的偏移,因此,通过smoothL1来回归这个偏移。 -
1个标签(Embedding)
该作用在文章中成为Grouping Corners。从上文我们也知道,使用两个detector分别检测左上和右下两个角点,但是,如何知道哪两个角点是属于同一个物体的呢?这就需要对Embedding进行学习。
我们这里可以认为这个e就是一个标签,当左上和右下的标签相同(最近)就认为是属于同一个目标的两个角点,所以上述的损失函数中pull就是让同一目标的标签值尽可能的贴近,push是让不同目标的标签尽可能的拉远。很像Fisher分类器的思想。
- 整体的损失函数形式
因此网络整体输出为2*(C+2+1)个
Corner Pooling
Corner Pooling是文章的核心点,前文说了很多,但是Heatmap如何生成是最为关键的一步。
使用两张图来一起描述这个过程,这里我不太理解Fig6,我认为Fig6展示的是右下角角点的检测,从箭头方向上我们可以看到,池化的方向是从featuremap的右侧向左侧进行,从下侧到上侧进行,在该方向上取第一个值为初值F0,依次与方向上各点(假设为F1)进行比较,若F0>F1,则该点数值F1变为F0;若F0<F1,则F0 =F1。这样操作直到最后。 池化后将两个方向的Feature map求和得到新的Feature map,再次经过卷积操作,进行输出。
关键点
- 提出了新的池化方式,Corner Pooling
- 角点邻域采用高斯分布,降低了角点邻域内的损失惩罚,更具有合理性
- 通过学习Embedding,确定角点的归属
- 学习偏移量,对精度损失进行补偿。
各项关键点对AP的影响
Corner Pooling
作者对比了使用Corner Pooling前后的效果,其他参数都是相同的,结果大概提高了2.0%
角点邻域内的损失惩罚
表中,最上面是不使用高斯分布的邻域分布,中间是使用固定大小的半径作为分布的范围,下面是使用物体大小自适应半径的设置,可以看到分别都有很大的精度提升。
Heatmap和偏移量Offset的影响
作者为了节目效果直接演了一波,把Heatmap都去掉了,emmm。。。。
所以可以看到节目效果惨不忍睹,加上了瞬间涨了将近一倍,这里可以看到offset的精度补偿对于AP提高很明显,有13.1之多。
与其他检测网络对比
这里就话不多说,看图就行,检测的效果是state-of-the-art了
但是速度嘛。。。。。虽然是one-stage网络,224ms(4.5FPS)给one-stage网络丢人了
Reference
Law H , Deng J . CornerNet: Detecting Objects as Paired Keypoints[J]. 2018.
论文地址
代码地址