扔掉anchor!真正的CenterNet——Objects as Points论文解读
简单讲一下,目标检测中,存在两种anchor机制哦,一种是anchor-base,典型就是Faster RCNN中先验框以及YOLO2-5系列,另一种是anchor-free,典型的是YOLOv1,YOLOX以及本博客所讲的CenterNet,但是论文原名不是CenterNet,原因是被别人使用了,所以作者起名叫Object as Point。anchor-base和anchor-free最大的区别是区别是否有先验框。
论文下载链接:https://arxiv.org/abs/1904.07850
提:那CenterNet相比于之前的one-stage和two-stage的目标检测有什么特点?
- CenterNet的“anchor”仅仅会出现在当前目标的位置处而不是整张图上撒网,所以也没有所谓的box overlap大于多少多少的算positive anchor这一说,也不需要区分这个anchor是物体还是背景 – 因为每个目标只对应一个“anchor”,这个anchor是从heatmap中提取出来的,所以不需要NMS再进行来筛选
- CenterNet的输出分辨率的下采样因子是4,比起其他的目标检测框架算是比较小的(Mask-Rcnn最小为16、SSD为最小为16)。
总体来说,CenterNet结构优雅简单,直接检测目标的中心点和大小,是真anchor-free。
使用网络
论文中CenterNet提到了三种用于目标检测的网络,这三种网络都是编码解码(encoder-decoder)的结构:
- Resnet-18 with up-convolutional layers : 28.1% coco and 142 FPS
- DLA-34 : 37.4% COCOAP and 52 FPS
- Hourglass-104 : 45.1% COCOAP and 1.4 FPS
每个提取网络(encode)内部的结构不同,但是在模型的最后都是通过三次上采样加了三个网络构造来输出预测值,默认是80个类、2个预测的中心点坐标、2个中心点的偏置。
类别是通过热图确定的
下图给个列子(resnet提取特征),通过三次上采样,再分成三个预测结果(图片来源)
说到这里,我有一个疯狂的想法,可能已经有人实现了,不用调整中心点的位置,直接输出预测框相对于中心点的相对位置。
目标检测
确定中心点位置的热图
首先假设输入图像为
插一段官方代码,其中
# 其中input_h和input_w为512,而self.opt.down_ratio为4,最终的output_h为128
# self.opt.down_ratio就是上述的R即输出对应原图的步长
output_h = input_h // self.opt.down_ratio
output_w = input_w // self.opt.down_ratio
这样,
在整个训练的流程中,CenterNet学习了CornerNet的方法。对于每个标签图(ground truth)中的某一
然后我们利用
这么说可能不是很好理解,那么直接看一个官方源码中生成的一个高斯分布[9,9]:
每个点
以上是热图的介绍。
损失函数
中心点预测损失
重点看一下中心点预测的损失函数,原始论文中因为篇幅关系将第二个otherwise的公式挤一块了:
其中
这个损失也比较关键,需要重点说一下。和Focal Loss类似(差别在于
再说下另一种情况,当
简单分为几种情况:
- 对于距离实际中心点近的点,
值接近1,例如 ,但是预测出来这个点的值 比较接近1,这个显然是不对的,它应该检测到为0,因此用 惩罚一下,使其LOSS比重加大些;但是因为这个检测到的点距离实际的中心点很近了,检测到的 接近1也情有可原,那么我们就同情一下,用 来安慰下,使其LOSS比重减少些。 - 对于距离实际中心点远的点,
值接近0,例如 ,如果预测出来这个点的值 ]比较接近1,肯定不对,需要用 惩罚(原理同上),如果预测出来的接近0,那么差不多了,拿 来安慰下,使其损失比重小一点;至于 的话,因为此时预测距离中心点较远的点,所以这一项使距离中心点越远的点的损失比重占的越大,而越近的点损失比重则越小,这相当于弱化了实际中心点周围的其他负样本的损失比重,相当于处理正负样本的不平衡了。 - 如果结合上面两种情况,那就是:
和 来限制easy example导致的gradient被easy example dominant的问题,而 则用来处理正负样本的不平衡问题(因为每一个物体只有一个实际中心点,其余的都是负样本,但是负样本相较于一个中心点显得有很多)。
另外看一下官方的这张图可能有助于理解:传统的基于anchor的检测方法,通常选择与标记框IoU大于0.7的作为positive,相反,IoU小于0.3的则标记为negative,如下图a。这样设定好box之后,在训练过程中使positive和negative的box比例为1:3来减少negative box的比例(例如SSD没有使用focal loss)。
而在CenterNet中,每个中心点对应一个目标的位置,不需要进行overlap的判断。那么怎么去减少negative center pointer的比例呢?CenterNet是采用Focal Loss的思想,在实际训练中,中心点的周围其他点(negative center pointer)的损失则是经过衰减后的损失(上文提到的),而目标的长和宽是经过对应当前中心点的w和h回归得到的:
目标中心的偏差损失
因为上文中对图像进行了
上述公式直接看可能不是特别容易懂,其实
但是在推断过程中,我们首先读入图像[640,320],然后变形成[512,512],然后下采样4倍成[128,128]。最终预测使用的图像大小是[128,128],而每个预测出来的热点中心(headmap center),假设我们预测出与实际标记的中心点[98.97667,2.3566666]对应的点是[98,2],坐标是
在这个公式中,
# ct 即 center point reg是偏置回归数组,存放每个中心店的偏置值 k是当前图中第k个目标
reg[k] = ct - ct_int
# 实际例子为
# [98.97667 2.3566666] - [98 2] = [0.97667, 0.3566666]
reg[k]之后与预测出来的reg一并放入损失函数中进行计算。注意上述仅仅是对某一个关键点位置
此时,我们可以发现这个bias loss是可选的,我们也可以不用,但是准确率会下降一点。
目标大小损失
我们假设
为了减少回归的难度,这里使用
整体损失函数是object loss、size loss、bias loss之和,每个loss都有对应的权重。
在论文中
推理阶段
在预测阶段,首先针对一张图像进行下采样,随后对下采样后的图像进行预测,对于每个类在下采样的特征图中预测中心点,然后将输出图中的每个类的热点单独地提取出来。具体怎么提取呢?就是检测当前热点的值是否比周围的八个近邻点(八方位)都大(或者等于),然后取100个这样的点,采用的方式是一个3×3的MaxPool,类似于anchor-based检测中nms的效果。
这里假设
代表
下图为网络模型预测的中心点,中心点偏移量,以及该点对应的目标长宽:
那最终是怎么选择的,最终是根据模型预测出来的
总结
优势:
- 检测模型原理简单,不仅相比于two-stage简单,对于one-stage也是简单的,简化了边界框的去重,nms操作变为max pool,工作量下降了很多
- 该模型应用广泛,目标检测、3D检测和人体姿态识别
缺点:
- 在实际训练中,如果在图像中,同一个类别中的某些物体的GT中心点,在下采样时会挤到一块,也就是两个物体在GT中的中心点重叠了,CenterNet对于这种情况也是无能为力的,也就是将这两个物体的当成一个物体来训练(因为只有一个中心点)。同理,在预测过程中,如果两个同类的物体在下采样后的中心点也重叠了,那么CenterNet也是只能检测出一个中心点,不过CenterNet对于这种情况的处理要比faster-rcnn强一些的,具体指标可以查看论文相关部分。
- 有一个需要注意的点,CenterNet在训练过程中,如果同一个类的不同物体的高斯分布点互相有重叠,那么则在重叠的范围内选取较大的高斯点。
学习资料参考:https://zhuanlan.zhihu.com/p/66048276
文章出处登录后可见!