Anchor Free,框即是点,CenterNet
Github:https://github.com/xingyizhou/CenterNet
CVPR 2019
CenterNet,一个anchor free的新的检测算法,算是对cornerNet的改进,在cornerNet基础上,引入了中心点的概念,因此,称为CenterNet。
算法亮点,
- anchor free,大大减少了anchor部分的计算量,并且不需要nms这样的后处理。
- 一个框架可以做2d检测,3d检测,pose姿态估计,3种不同的任
速度够快,速度和精度的良好平衡,在MS-COCO上28.1%的MAP,142FPS,或者,37.4%的MAP,52FPS。采用多尺度测试的话,可以达到45.1%的MAP,1.4FPS。
CenterNet的anchor free思想和基于anchor框架的区别:
CenterNet可以看作基于anchor框架的演变,可以看作只有一个形状的anchor。
A center point can be seenas a single shape-agnostic anchor
传统的基于anchor的思想,需要计算anchor和ground truth的IOU,IOU>0.7是正样本,IOU<0.3是负样本,其他的忽略掉。
CenterNet只取ground truh边框的中心一点作为anchor,只回归该中心点和宽,高。该点周围的其余点当作负样本。
- CenterNet只根据位置布置anchor,背部关心IOU,不需要像基于anchor的框架那样人工设置阈值来进行前景背景分类。
- 由于每一个物体只有一个正的anchor,因此不再需要后处理的NMS,只需要提取输出feature map种峰值最高的点即可。
- CenterNet的网络输出特征层尺度更大,是原图的1/4,而基于anchor的方法,最后一层特征图大小是原图的1/16,因此基于anchor的方法需要多个不同长宽比和尺度的anchor。这里为什么anchor free的方法,需要输出是原图的1/4呢?因为,大多数anchor free的方法,基本都需要下采样+上采样这样的结构,来综合底层和高层特征,才可以保证分割或者回归的准确性。
Loss设计:
输入图片大小为I (W ×H×3),其中W=H=512,
网络最后输出的特征层Y大小为,(W/R ×H/R×C),C为输出的通道数,R为输出的滑动步长,Y(x,y,c)=1表示检测到的关键点,Y(x,y,c)=0表示背景
实际训练中的groundtruth使用高斯核进行处理,核函数为,
最终,中心点的loss函数为基于focal loss改进的损失函数,
α ,β是focal loss的超参数,分别取α =2,β=4,N表示一幅图像I中的点的数目
偏移offset使用L1 loss进行计算,
物体的size使用L1 loss进行计算,
最终,整体的loss 就是中心点的loss(Lk)+物体宽高的loss(Lsize)+偏移的loss(Loff)
参数,λsize = 0:1 , λoff = 1
在推断部分,每一个类别一个输出特征图。如果一个点周围的8领域的像素都比中心该点的像素值小,则将其当作一个检测出的peak 点(该操作可以通过3*3的max pooling实现)。每一个特征图,取前100个peak点,最后通过卡阈值得到最终的结果。
如果是需要mul scale的推断的话,每一个scale输出的结果就需要通过NMS的融合。如果只是单一scale做推断,就不需要NMS操作。
For multi-scale, we use NMS to merge results
网络结构:
(a)沙漏(HourGlass)网络结构
(b)ResNet结构+反卷积
(c)原生的DLA-34结构
(d)本文基于DLA-34,修改后的结构,增加了skip connections。
网络输入为512*512,输出为128*128,
数据增强方式包括,random flip, random scaling (0.6-1.3), cropping, color jittering
网络的基础结构可以采用,ResNet-18, ResNet-101, DLA-34, Hourglass-104,在这些基础结构的基础上进行了下面2个修改,
- 增加可变形卷积(deformable convolution)
- 增加反卷积,采用沙漏结构(Hourglass)
CenterNet模型可以适用于传统的2d目标检测,3d目标检测,姿态估计,等3个任务,不同的任务,最终的模型输出层略有区别。
2d检测任务:
输出3个分支,分别是,
- 物体的特征图,一个类别一个channel,包含C个channel。
- 物体中心点的偏移,包含x,y两个偏移量,因此是2个channel。
- 物体的大小,也就是宽,高,因此也是2个channel。
姿态估计任务:
这里我的训练任务的pose关键点有5个。
输出6个分支,分别是,
- 物体的特征图,一个类别一个channel,包含C个channel。
- 物体中心点的偏移,包含x,y两个偏移量,因此是2个channel。
- 物体的大小,也就是宽,高,因此也是2个channel。
- 物体的关键点基于中心点的偏移,输出k*2个通道,k表示关键点的数目,2表示x,y两个偏移。
- 基于分割的思想得到的物体关键点的特征图,输出k个通道,一个点一个通道。
- K个关键点的偏移,所有这些关键点采用同样的偏移量,x,y两个指标,输出2个通道。
实验结果:
不同基础网络结构对比,
COCO数据集2d检测结果对比,
KITTI 3d检测结果对比,
COCO pose检测结果对比,
总结:
(1)简单,快速,准确。
(2)anchor free领域新的里程碑
(3)一个框架,同时兼顾2d检测,3d检测,姿态估计
(4)实际训练中,对于两个物体中心点重叠的情况,CenterNet无能无力,只能将2个点,也就是2个物体,当作一个物体,一个点来处理。同理,测试的时候,对于两个遮挡的中心点重合的物体,也只能检测出一个中心点。
(5)CenterNet相比于CornerNet,更像是将左上角点和右下角点的回归修改为,一个中心点和宽高的回归,从而不再需要corner pooling,不需要左上角点和右下角点的配对问题,不再需要后处理的NMS。
CenterNet相比于有anchor的检测框架,本质上都是回归中心点和宽高,这点本质没变。区别就在于大大的减少了anchor的布置,只需要一个anchor就可以,也就从本质上省去了NMS后处理操作。
其实认真一思考,其实本质上,也许就该是CenterNet这样的思想来做。至于为啥没有,也许可能从最开始的机器学习中滑动窗口的过渡,需要延续这样的思想了。人的思想也许很难有如此大跨度的升华。