本文主要解读CenterNet如何加载数据,并将标注信息转化为CenterNet规定的高斯分布的形式。
1. YOLOv3和CenterNet流程对比
CenterNet和Anchor-Based的方法不同,以YOLOv3为例,大致梳理一下模型的框架和数据处理流程。
YOLOv3是一个经典的单阶段的目标检测算法,图片进入网络的流程如下:
- 对图片进行resize,长和宽都要是32的倍数。
- 图片经过网络的特征提取后,空间分辨率变为原来的1/32。
- 得到的Tensor去代表图片不同尺度下的目标框,其中目标框的表示为(x,y,w,h,c),分别代表左上角坐标,宽和高,含有某物体的置信度。
- 训练完成后,测试的时候需要使用非极大抑制算法得到最终的目标框。
CenterNet是一个经典的Anchor-Free目标检测方法,图片进入网络流程如下:
- 对图片进行resize,长和宽一般相等,并且至少为4的倍数。
- 图片经过网络的特征提取后,得到的特征图的空间分辨率依然比较大,是原来的1/4。这是因为CenterNet采用的是类似人体姿态估计中用到的骨干网络,基于heatmap提取关键点的方法需要最终的空间分辨率比较大。
- 训练的过程中,CenterNet得到的是一个heatmap,所以标签加载的时候,需要转为类似的heatmap热图。
- 测试的过程中,由于只需要从热图中提取目标,这样就不需要使用NMS,降低了计算量。
2. CenterNet部分详解
设输入图片为 I ∈ R W × H × 3 I\in R^{W\times H\times 3} I∈RW×H×3, W代表图片的宽,H代表高。CenterNet的输出是一个关键点热图heatmap。
Y ^ ∈ [ 0 , 1 ] W R × H R × C \hat{Y}\in[0,1]^{\frac{W}{R}\times\frac{H}{R}\times C} Y^∈[0,1]RW×RH×C
其中R代表输出的stride大小,C代表关键点的类型的个数。
举个例子,在COCO数据集目标检测中,R设置为4,C的值为80,代表80个类别。
如果 Y ^ x , y , c = 1 \hat{Y}_{x,y,c}=1 Y^x,y,c=1代表检测到一个物体,表示对类别c来说,(x,y)这个位置检测到了c类的目标。
既然输出是热图,标签构建的ground truth也必须是热图的形式。标注的内容一般包含(x1,y1,x2,y2,c),目标框左上角坐标、右下角坐标和类别c,按照以下流程转为ground truth:
- 得到原图中对应的中心坐标 p = ( x 1 + x 2 2 , y 1 + y 2 2 ) p=(\frac{x1+x2}{2}, \frac{y1+y2}{2}) p=(2x1+x2,2y1+y2)
- 得到下采样后的feature map中对应的中心坐标 p ~ = ⌊ p R ⌋ \tilde{p}=\lfloor \frac{p}{R}\rfloor p~=⌊R