前言
本文提出了一种目标表示的新方法——通过bbox的中心点来表示目标,如下图所示。然后通过中心点处的图像特征回归到目标的其它属性,比如目标大小、维度、方向和姿态。这样就把目标检测问题变为关键点估计问题。
将输入图像送入一个全卷积网络后,会生成一个heatmap,在heatmap上出现的peak就是目标的中心点,每个peak的图像特征预测出目标的bbox的高和宽。模型训练采用标准的监督学习,inference是单个前向传播网络,没有任何NMS操作。
使用中心点表示目标实现目标检测,只经过很小的改动就能扩展到其他任务上。对于3D bbox检测来说,还要回归目标的绝对深度、3D bbox的维度和目标的方向;对于人姿态估计来说,将关节点(2D joint)位置作为中心点的offset,直接在中心点位置回归出这些offset。
从下图可以看出,在实时检测中,CenterNet的速度和精度都更好一点。
准备工作
设输入图像为 ,其中 和 分别是宽和高。接下来的目标是要产生关键点的热点图(keypoint heatmap), ,其中 是输出对应原图步长,即对原图进行 倍的下采样,这里 , 是关键点的类型数量。 表示可以检测到目标的关键点,也就是说对于类别 ,在点 处检测到的目标属于类别 ;而 表示背景,即当前这个点 处不存在属于类别 的目标。
作者根据CornerNet的方法来训练关键点预测网络。对于属于类
的每个真实关键点(gt keypoint)
,计算得到低分辨率(经过下采样)上对应的关键点为
,然后使用如下的高斯核将真实关键点分布到热点图
上:
其中
是一个与目标大小(
和
)相关的标准差。如果某一个类的两个高斯分布发生重叠,直接取元素间最大的那个。
Training
损失函数
在CenterNet中,每个中心点对应一个目标,如上图所示,即这个点是
。中心点周围的其它点都是negative,它们的损失是经过衰减后的negative loss,所以中心点预测的损失采用的是focal loss
中心点预测的损失函数为:
其中
和
是focal loss的超参数,
是图像
的关键点数量,用于将所有positive focal loss归一化为1,这里
,
。
中心点偏置损失
在对图像进行4倍下采样之后,将特征图重新映射回原始图像上会产生精度误差。为了解决这个问题,额外为每个中心点提出了一个local offset
,所有的类别共享同一个offset预测值。这个offset用L1 loss来训练:
只在关键点
处计算损失,其它点在训练时都被忽略掉。
目标大小的损失
设
是目标
的边界框,它的类别是
,它的中心位置为
,用关键点预测
来预测所有的中心点。然后对每个目标
的大小进行回归
,这个值是在训练前提前计算出来的,是进行了下采样之后的长宽值。为了减少计算的负担,对每个目标,用
作为其预测值,使用L1 loss:
对目标
的大小直接用原始像素坐标,不进行归一化操作,但是要用一个常量
调节
这个loss的权重。整体的loss为:
设
,
,整个网络会在每个位置预测
个输出值,分别是
个类别、偏置值以及尺度大小。所有输出共享一个全卷积的主干网络。下图是网络的输出,最上面的是目标检测,中间的是3D目标检测,最下面的是姿态估计。所有的输出共享同一个主干网络,主干网络输出的特征分别进入不同的3 × 3 conv+ReLU+1 × 1 conv
Inference
在inference时,首先对一个图像进行下采样,然后对下采样后的图像预测一个热点图,然后提取出每个类在热点图上的热点(peak)。那么如何提取这个热点呢?比较一个热点和与它相连的8个临近点的大小,如果该热点的值大于或者等于8个临近点的值,那么这个热点就是我们要找的,然后取100个这样的点。采用的方式是3 × 3的最大池化层,类似于NMS操作。
设
为检测到的中心点,
为类别
中的一个点,每个关键点的位置由整型坐标
表示,使用关键点的值
表示当前点的置信度,然后在这个点处生成边界框如下:
其中
是当前点对应原始图像的offset,
是当前点对应目标的高和宽的预测值。直接由关键点预测产生所有的输出,不需要IoU和NMS,下图说明网络预测出来的中心点、offset和对应的目标的高和宽:
最后根据置信度,设置一个阈值,从选出的100个点中选出置信度大于该阈值的点作为最终检测结果。