CoenerNet是一篇被ECCV 2018收录的有关目标检测论文,以前我大概看了一下,今日重新看了一遍论文,又有许多新的收获,故记之!
论文地址:https://arxiv.org/abs/1808.01244
介绍
首先明确CornerNet是one-stage的检测算法,但是普通的one-stage算法都要使用anchor来生成bbox,bbox的比例和大小都是超参数,因此实验成功与否与运气有很大的关系。而这篇论文提出的CornerNet使用一组角点来检测目标,抛去了anchor,分别预测两个角点,通过heatmap embedding offset来确定bbox的大小和位置。
具体实现
大体框架
图像先经过backbone,分两路分别预测左上角点和右下角点,经过embedding组成成对的角点,最后通过offset微调
BackBone
这篇论文使用当时比较先进的两个四阶hourglass network,本文不做阐述
Top-Left与Bottom-Right
图片经过hourglass network以后,分成两组,分别来进行角点的预测
Prediction Modules
接下来就进入预测模块,我们以预测左上角点为例。特征会先经过一个corner pooling。那么corner pooling是如何工作的呢?
对于预测top-left角点,backone经过一次3x3-bn-rulu卷积(此处生成两个特征图,至于为什么,接下来便知),对于每一个经过conv-bn-rulu的特征图来进行corner pooling。对于top-left来说,即是将该图中的每一点分别进行一个竖直向上方向的取最大值和从右往左取最大值的过程(注意,并不是对于该点的整行或者整列取最大值,只对于某一点的右下方向,这是因为一张图中可能会有多个目标,整行或者整列扫描会造成误检),下面这张图可以帮助理解corner pooling
我们再以一张图片进行说明如何对左上角点进行corner pooling:
图片中的鸟作为一个很明显的特征,在进行top-left corner pooling时,水平方向从右往左取最大值,垂直方向从下往上取最大值,然后相加。可以得到他的左上特征角点值应该是最大的。
最后放上数学公式:
然后在经过一个resduial模块就到了最后一步预测,由三部分组成
heatmap
heatmap中找出特征值最大的作为角点。对于真实的目标来说,只有一个左上角点和一个右下角点。我们认为GT只有真正的角点地方为1,其余小于1,论文引入双变量的高斯分布来进行建模。并且对于预测出的角点GT值不为1,我们也进行了 分情况。一种是普通的,的确距离角点很远,另一种则是在GT为1的附近,我们认为这样也是正确的(我们实际操作中为GT=1,建立一个可允许的误差范围内,即只要距离真正角点一定范围内都算正确,在高斯分布上则是接近于1),只需要经过offset即可回归。而二阶高斯分布则做到了这一点
论文中的delta为1/3用来控制半径
因此这部分的损失函数为:
embedding
得到了左上角点和右下角点,如何将同一类的角点group呢,论文引入了embedding。注意这里不注重角点处特征值大小,而是计算角点间的距离,认为角点距离最小则为一组。这里使用了两个损失函数,Lpull是同一组的损失函数,Lpush是不同组的损失函数
offset
offset也比较简单,不做过多介绍
最后的损失函数:
α和β是0.1 γ是1
实验结果