CenterNet 论文笔记

前言

本文提出了一种目标表示的新方法——通过bbox的中心点来表示目标,如下图所示。然后通过中心点处的图像特征回归到目标的其它属性,比如目标大小、维度、方向和姿态。这样就把目标检测问题变为关键点估计问题。
在这里插入图片描述
将输入图像送入一个全卷积网络后,会生成一个heatmap,在heatmap上出现的peak就是目标的中心点,每个peak的图像特征预测出目标的bbox的高和宽。模型训练采用标准的监督学习,inference是单个前向传播网络,没有任何NMS操作

使用中心点表示目标实现目标检测,只经过很小的改动就能扩展到其他任务上。对于3D bbox检测来说,还要回归目标的绝对深度、3D bbox的维度和目标的方向;对于人姿态估计来说,将关节点(2D joint)位置作为中心点的offset,直接在中心点位置回归出这些offset。

从下图可以看出,在实时检测中,CenterNet的速度和精度都更好一点。
在这里插入图片描述


准备工作

设输入图像为 I R W × H × 3 I∈R^{W×H×3} ,其中 W W H H 分别是宽和高。接下来的目标是要产生关键点的热点图(keypoint heatmap), Y ^ [ 0 , 1 ] W R × H R × C \hat{Y}\in[0,1]^{\frac{W}{R}×\frac{H}{R}×C} ,其中 R R 是输出对应原图步长,即对原图进行 R R 倍的下采样,这里 R = 4 R=4 C C 是关键点的类型数量。 Y ^ x , y , c = 1 \hat{Y}_{x,y,c}=1 表示可以检测到目标的关键点,也就是说对于类别 c c ,在点 ( x , y ) (x,y) 处检测到的目标属于类别 c c ;而 Y ^ x , y , c = 0 \hat{Y}_{x,y,c}=0 表示背景,即当前这个点 ( x , y ) (x,y) 处不存在属于类别 c c 的目标。

作者根据CornerNet的方法来训练关键点预测网络。对于属于类 c c 的每个真实关键点(gt keypoint) p R 2 p\in R^{2} ,计算得到低分辨率(经过下采样)上对应的关键点为 p ~ = p R \tilde{p}=\lfloor\frac{p}{R}\rfloor ,然后使用如下的高斯核将真实关键点分布到热点图 Y [ 0 , 1 ] W R × H R × C Y\in[0,1]^{\frac{W}{R}×\frac{H}{R}×C} 上:
在这里插入图片描述
其中 σ p \sigma_{p} 是一个与目标大小( w w h h )相关的标准差。如果某一个类的两个高斯分布发生重叠,直接取元素间最大的那个。


Training

损失函数

在这里插入图片描述
在CenterNet中,每个中心点对应一个目标,如上图所示,即这个点是 Y ^ x , y , c = 1 \hat{Y}_{x,y,c}=1 。中心点周围的其它点都是negative,它们的损失是经过衰减后的negative loss,所以中心点预测的损失采用的是focal loss

中心点预测的损失函数为:
在这里插入图片描述
其中 α \alpha β \beta 是focal loss的超参数, N N 是图像 I I 的关键点数量,用于将所有positive focal loss归一化为1,这里 α = 2 \alpha=2 β = 4 \beta=4

中心点偏置损失

在对图像进行4倍下采样之后,将特征图重新映射回原始图像上会产生精度误差。为了解决这个问题,额外为每个中心点提出了一个local offset O ^ R W R × H R × 2 \hat{O}\in R^{\frac{W}{R}×\frac{H}{R}×2} ,所有的类别共享同一个offset预测值。这个offset用L1 loss来训练:
在这里插入图片描述
只在关键点 p ~ \tilde{p} 处计算损失,其它点在训练时都被忽略掉。

目标大小的损失

( x 1 ( k ) , y 1 ( k ) , x 2 ( k ) , y 2 ( k ) ) (x^{(k)}_1,y^{(k)}_1,x^{(k)}_2,y^{(k)}_2) 是目标 k k 的边界框,它的类别是 c k c_k ,它的中心位置为 p k = ( x 1 ( k ) + x 2 ( k ) 2 , y 1 ( k ) + y 2 ( k ) 2 ) p_k=({\frac{x^{(k)}_1+x^{(k)}_2}{2}},{\frac{y^{(k)}_1+y^{(k)}_2}{2}}) ,用关键点预测 Y ^ \hat{Y} 来预测所有的中心点。然后对每个目标 k k 的大小进行回归 s k = ( x 2 ( k ) x 1 ( k ) , y 2 ( k ) y 1 ( k ) ) s_k=(x^{(k)}_2-x^{(k)}_1,y^{(k)}_2-y^{(k)}_1) ,这个值是在训练前提前计算出来的,是进行了下采样之后的长宽值。为了减少计算的负担,对每个目标,用 S ^ R W R × H R × 2 \hat{S}\in R^{\frac{W}{R}×\frac{H}{R}×2} 作为其预测值,使用L1 loss:
在这里插入图片描述
对目标 k k 的大小直接用原始像素坐标,不进行归一化操作,但是要用一个常量 λ s i z e \lambda_{size} 调节 L s i z e L_{size} 这个loss的权重。整体的loss为:
在这里插入图片描述
λ s i z e = 0.1 \lambda_{size}=0.1 λ o f f = 1 \lambda_{off}=1 ,整个网络会在每个位置预测 C + 4 C+4 个输出值,分别是 C C 个类别、偏置值以及尺度大小。所有输出共享一个全卷积的主干网络。下图是网络的输出,最上面的是目标检测,中间的是3D目标检测,最下面的是姿态估计。所有的输出共享同一个主干网络,主干网络输出的特征分别进入不同的3 × 3 conv+ReLU+1 × 1 conv
在这里插入图片描述


Inference

在inference时,首先对一个图像进行下采样,然后对下采样后的图像预测一个热点图,然后提取出每个类在热点图上的热点(peak)。那么如何提取这个热点呢?比较一个热点和与它相连的8个临近点的大小,如果该热点的值大于或者等于8个临近点的值,那么这个热点就是我们要找的,然后取100个这样的点。采用的方式是3 × 3的最大池化层,类似于NMS操作。

P ^ c \hat{P}_c 为检测到的中心点, P ^ = { ( x i ^ , y i ^ ) } i = 1 n \hat{P}=\lbrace(\hat{x_i},\hat{y_i})\rbrace^n_{i=1} 为类别 c c 中的一个点,每个关键点的位置由整型坐标 ( x i , y i ) (x_i,y_i) 表示,使用关键点的值 Y ^ x i y i c \hat{Y}_{x_i y_i c} 表示当前点的置信度,然后在这个点处生成边界框如下:
在这里插入图片描述
其中 ( σ x i ^ , σ y i ^ ) = O ^ x i ^ y i ^ (\sigma\hat{x_i},\sigma\hat{y_i})=\hat{O}_{\hat{x_i}\hat{y_i}} 是当前点对应原始图像的offset, ( w i ^ , h i ^ ) = S ^ x i ^ y i ^ (\hat{w_i},\hat{h_i})=\hat{S}_{\hat{x_i}\hat{y_i}} 是当前点对应目标的高和宽的预测值。直接由关键点预测产生所有的输出,不需要IoU和NMS,下图说明网络预测出来的中心点、offset和对应的目标的高和宽:
在这里插入图片描述
最后根据置信度,设置一个阈值,从选出的100个点中选出置信度大于该阈值的点作为最终检测结果。

发布了39 篇原创文章 · 获赞 1 · 访问量 1210

猜你喜欢

转载自blog.csdn.net/qq_30146937/article/details/104543313