扔掉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提取特征),通过三次上采样,再分成三个预测结果(图片来源)

提到这里我有个疯狂的想法,可能已经有人实现了,不去对中心点位置进行调整,直接输出预测框相对于中心点的相对位置。
目标检测
热点图确定中心点位置
首先假设输入图像为 I ∈ R W ∗ H ∗ 3 I∈R^{W*H*3} I∈RW∗H∗3 ,其中 W W W 和 H H H 分别为图像的宽和高,然后在预测的时候,我们要产生出关键点的热点图(keypoint heatmap): Y ^ ∈ [ 0 , 1 ] W R × W R × C \hat{Y}∈[0,1]^{\frac{W}{R}\times\frac{W}{R}\times C} Y^∈[0,1]RW×RW×C ,其中 R R R 为输出对应原图的步长,而 C C C是在目标检测中对应着检测点的数量,如在COCO目标检测任务中,这个 C C C 的值为80,代表当前有80个类别。VOC肯定就是20个类别了
插一段官方代码,其中 R R R就是self.opt.down_ratio也就是4,代表下采样的因子。
# 其中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
这样, Y ^ x , y , c = 1 \hat{Y}_{x,y,c}=1 Y^x,y,c=1 就是一个检测到物体的预测值,对于 Y ^ x , y , c = 1 \hat{Y}_{x,y,c}=1 Y^x,y,c=1 ,表示对于类别 c c c ,在当前 ( x , y ) (x,y) (x,y) 坐标中检测到了这种类别的物体,而 Y ^ x , y , c = 0 \hat{Y}_{x,y,c}=0 Y^x,y,c=0 则表示当前当前这个坐标点不存在类别为 c c c 的物体。
在整个训练的流程中,CenterNet学习了CornerNet的方法。对于每个标签图(ground truth)中的某一 C C C 类,我们要将真实关键点(true keypoint) p ∈ R 2 p∈R^2 p∈R2 计算出来用于训练,中心点的计算方式为 p = ( x 1 + x 2 2 , y 1 + y 2 2 ) p = (\frac{x_1+x_2}{2},\frac{y_1+y_2}{2}) p=(2x1+x2,2y1+y2) ,对于下采样后的坐标,我们设为 p ^ = ⌊ p R ⌋ \hat{p}=\lfloor \frac{p}{R} \rfloor p^=⌊Rp⌋ ,其中 R R R 是上文中提到的下采样因子4。所以我们最终计算出来的中心点是对应低分辨率的中心点。
然后我们利用 Y ^ ∈ [ 0 , 1 ] W R × W R × C \hat{Y}∈[0,1]^{\frac{W}{R}\times\frac{W}{R}\times C} Y^∈[0,1]RW×RW×C 来对图像进行标记,在下采样的[128,128]图像中将ground truth point以 Y ^ ∈ [ 0 , 1 ] W R × W R × C \hat{Y}∈[0,1]^{\frac{W}{R}\times\frac{W}{R}\times C} Y^∈[0,1]RW×RW×C的形式,用一个高斯核 Y x , y , c = e x p ( − ( x − p ^ x ) 2 + ( y − p ^ y ) 2 2 σ p 2 ) Y_{x,y,c} = exp(-\frac{(x-\hat{p}_x)^2+(y-\hat{p}_y)^2}{2\sigma^2_p}) Yx,y,c=exp(−2σp2(x−p^x)2+(y−p^y)2)来将关键点分布到特征图上,其中 σ p \sigma_p σp 是一个与目标大小(也就是w和h)相关的标准差。如果某一个类的两个高斯分布发生了重叠,直接取元素间最大的就可以。
这么说可能不是很好理解,那么直接看一个官方源码中生成的一个高斯分布[9,9]:

每个点 Y ^ ∈ [ 0 , 1 ] W R × W R × C \hat{Y}∈[0,1]^{\frac{W}{R}\times\frac{W}{R}\times C} Y

CenterNet是一种无Anchor的目标检测算法,通过预测目标中心点和大小实现检测。它摒弃了先验框,减少了计算复杂性。每个目标只有一个中心点,用热力图表示,通过高斯核标记。损失函数结合Focal Loss思想,处理正负样本不平衡。推断时,通过最大池化找到最可能的中心点,简化了NMS操作。该模型简单高效,适用于多种任务,但对重叠物体处理有限。
最低0.47元/天 解锁文章
7558

被折叠的 条评论
为什么被折叠?



