前言
CenterNet是 2019年发表的一篇文章《 Objects as Points》中提出的一个经典的目标检测算法,该算法采用 Anchor-Free的方式实现目标检测及其他一些扩展任务,非常值得研究。
主要思想
CenterNet将目标检测当做一个标准的关键点估计问题,将目标表示为一个在其 bounding box中心位置的单独点,其他的一些属性比如目标尺寸、维度、朝向和姿态等则直接从这个中心点位置的图像特征中进行回归。该模型将图像输入到一个全卷积网络中用来生成热力图,热力图的峰值位置即为目标的中心,每个峰值位置的图像特征用来预测目标 bounding box的宽度和高度。该模型训练过程采用标准的监督学习方法,推理过程则是简单的网络前向传播而不需要在后处理中做非极大值抑制处理。这篇文章提出的是一个通用的目标检测方法,只需要在中心点的预测中添加一些额外的内容就可以非常简单地扩展到其他任务中去,比如 3D目标检测和人体姿态估计。对于 3D目标检测任务,是通过回归目标的绝对深度、 3D bounding box维度和目标的朝向来实现的;而对于人体姿态估计任务,则是将 2D关节位置视为距中心点的偏移量,并且在中心点位置直接回归得到它们。
原理
输入一张宽高分别为和的 3通道图像, CenterNet模型会输出关键点的热点图,其中表示热点图相对于输入图像的下采样因子,论文里默认为 4;表示关键点类别的数量,如果是用 COCO数据集训练的 2D目标检测任务那么,如果是人体姿态估计任务那么。在热点图中, 表示在坐标位置检测到一个类别为的关键点;反之,如果 表示在该位置不存在类别为的关键点。
作者采用 ResNet、DLA、Hourglass等几种不同的编码-解码结构的全卷积神经网络从图像中预测关键点,训练方式沿用 CornerNet``的方法。对于ground truth中每个类别为的关键点,需要在下采样倍后的热点图上计算一个等效的关键点:通过一个高斯核函数,把 ground truth中所有的关键点映射到热点图中,其中是一个与目标尺寸有关的标准差。如果某个类别的两个高斯分布区域存在重叠,那么就直接取元素值最大的就可以。
对于一个类别为的目标,我们通常会用一个坐标为的 bounding box来表示它在图像中的位置,那么它的中心点坐标为。通过前面的知识我们知道, CenterNet模型就是通过关键点估计的方式来预测所有目标的中心点,但是只有一个中心点还不足以表达一个 bounding box,还需要预测出它的尺寸,所以 CenterNet用了一个分支来预测目标的宽度和高度。为了减少因为下采样带来的中心点坐标精度误差,作者还添加了一个中心点坐标偏置预测分支来进行补偿。
在推理阶段,首先从每个类别的热点图中提取峰值点,如果一个点的值大于等于它的 8邻域内点的值,那么就认为这个点是一个峰值点,然后从这些候选的峰值点中选取前 100个点作为检测到的中心点。对于个检测到的中心点集合中类别为的中心点,它的置信度为,它的位置则用整型坐标值来表示,以它为中心点的一个目标的 bounding box可以通过下面的公式计算出来:
其中,是预测的中心点偏置值,是预测的宽度和高度值。需要注意的是,这里得到的 bounding box的坐标只是相对于热点图尺寸的坐标,如果要得到相对于原始图像尺寸的坐标,还需要乘以前面提到的下采样系数。最终所有的目标信息都是直接通过上述关键点估计的方式得到而不需要基于 IoU的非极大值抑制( NMS)或者其他后处理操作,因为峰值关键点选取的过程就是一次充分的 NMS操作,这个操作可以通过一个的 MaxPooling算子来实现。
损失函数
CenterNet的损失函数分为 3个部分:
其中分别为中心点预测分支损失函数、尺寸预测分支损失函数和中心点偏置预测分支损失函数,设置。
中心点预测分支损失函数
该分支损失函数采用 focal loss损失函数:
其中,和是 focal loss的超参数,分别设置为 2和 4;是输入图像中关键点的数量,用于将所有的 positive focal loss实例标准化为1。
尺寸预测分支损失函数
该分支的损失函数采用损失:
中心点偏置预测分支损失函数
该分支的损失函数同样采用损失:
扩展任务
3D目标检测
3D目标检测就是给每个目标去估计一个 3维的 bounding box,这需要 3个额外的属性:深度、 3D维度和朝向,这 3个属性通过 3个独立的分支进行预测。
- 人体姿态估计
人体姿态估计的目的是找出图像中每个人体实例的个关节位置( COCO数据集)。可以将姿态视为是包含维属性的中心点,并且通过到中心点的偏移量对每个关键点进行参数化,另外还使用一个热点图预测分支用于对关键点进行提纯。
检测结果
以下是用官方的代码和模型跑出来的一些结果。
2D目标检测
用 COCO数据集训练的 2D目标检测的结果如下:
3D目标检测
用 KITTI数据集训练的 3D目标检测的结果如下:
人体姿态估计
用 COCO数据集训练的人体姿态估计的结果如下:
总结
读完《 Objects as Points》这篇文章,我的感觉是文如其名,简单而又优雅。文中提出的目标检测算法 CenterNet,模型结构简单,速度快又效果好,而且还方便扩展,确实是非常经典!
