整体信息:
这篇文章题目言简意赅,就非常吸引人眼球。不同于CornerNet预测一对角点得到bbox,以及基于CornerNet改进的CenterNet预测三个点得到bbox,本文提出的CenterNet同样作为一种anchor-free的目标检测方法,化繁去简,直接将目标作为一个点去预测,彻底丢掉了nms等后处理操作,而且将这种方法应用到姿态估计和3D目标检测问题上。相对于一些伪Anchor-free,个人觉得这篇文章非常有创新点,考虑精度和速度trade-off,同时在coco上也取得不俗的成绩:28.1%mAP/142FPS,37.4%mAP/52FPS,45.1%mAP/1.4FPS。
简介
目标检测驱动了很多基于视觉的任务,如 实例分割,姿态估计,跟踪,动作识别。目前大部分检测器都以bounding box轴对称框的形式(其实就是矩形)框住目标。对于每个目标框,分类器来确定每个框中是否是特定类别目标还是背景。
One stage detectors在图像上滑动复杂排列的可能bbox(即锚点),然后直接对框进行分类,而不会指定框中内容。
Two-stage detectors对每个潜在框重新计算图像特征,然后将那些特征进行分类。
后处理,即 NMS(非极大值抑制),通过计算Bbox间的IOU来删除同个目标的重复检测框。虽然基于NMS改进的算法也有很多,但是这种后处理很难区分和训练,因此现有大多检测器都不是端到端可训练的。(个人觉得NMS的作用其实类似于在语义分割中CRF的作用,都是对于算法的一种后处理。随着分割精度的不断提升,CRF已经渐渐淡出人们眼球。同样我相信在未来NMS这种后处理操作也会步入它的后尘。)
本文通过目标中心点来找到目标(见图2),然后在中心点位置回归出目标的一些属性,例如:size, dimension, 3D extent, orientation, pose。 这样就可以把目标检测问题转换为一个标准的关键点估计问题。我们仅仅将图像传入全卷积网络,得到一个热力图,热力图峰值点即中心点,每个特征图的峰值点位置预测了目标的宽高信息。模型训练采用标准的监督学习,推理仅仅是单个前向传播网络,不存在NMS的操作。
相关工作
作者提出的方法与基于Anchor的one-stage方法相近。可以将feature map的中心点可看成形状未知的锚点(见图3)。但存在几个重要差别:
第一,分配的锚点仅仅是放在位置上,没有尺寸框,也没有人工设置的阈值做前后景分类。(像Faster RCNN会将与GT IOU >0.7的作为前景,<0.3的作为背景,其他不管);(减去超参数的设置,降低了调参的难度)
第二,每个目标仅仅有一个正的锚点,因此不需要NMS后处理,我们提取关键点特征图上局部峰值点(local peaks);
第三,CenterNet 相比较传统目标检测而言(stride=16),使用更大分辨率的输出特征图(stride=4),因此无需用到多重特征图锚点(FPN架构);
第四,相对于其他基于关键点的目标检测方法相比(比如CornerNet,ExtremeNet),无需grouping过程以及后处理操作(这些操作会拖慢速度);
算法实现
损失函数:
中心点预测的损失函数:
其中 α 和 β 是Focal Loss的超参数,N是图像的关键点数量,用于将所有的positive focal loss标准化为1。在这篇论文中和分别是2和4。这个损失函数是Focal Loss的修改版,适用于CenterNet。
这个损失也比较关键,需要重点说一下。和Focal Loss类似,对于easy example的中心点,适当减少其训练比重也就是loss值,当=1时,就充当了矫正的作用,假如接近于1,则说明是个较为容易分辨的点,那么就会使得其比重降低。反之对于难分的点(接近于0)说明对它的判断能力还不够,则其权重变大!
对于Otherwise这种情况,我来简单分析一下:之前提到了是由一个高斯核生成(如上图),在中心点=1,从中心点周围扩散会由1慢慢变小,而不是并不是直接为0。因此,与中心点越近,它的值越小,反之越大。于中心点越近,它的值越大;越远越小。与两者相互制约,那它们是怎么协同工作的呢?
情况1:
(1)对于距离实际中心点近的点,值接近于1,我们假设其为0.9。但是在预测时将 预测为接近于1的值,显然是不对的,它检测出来的值应该为0 (因为此时我们是在otherwise的情况下,≠1)。因此采用惩罚一下,加大此loss的权重。但是因为这个检测到的点距离实际的中心点很近了,检测到的 的值接近于1也说得过去,就使用安抚一下,将其权重减少一点(求求你不要这么针对我)。整个流程类似于打个巴掌给个糖,很有意思。
(2)对于距离实际中心点较远的点,值接近于0,我们假设其为0.1。但是在预测时将预测为接近于1的值,显然又又又是不对的,它应该检测到的值为0,需要用来惩罚一下你咯。(这里有些绕,大意就是反正在otherwise情况下,你就是不能把我预测为1)。如果预测出来的接近0,那么差不多了(孺子可教也),用来安抚一下(我少针对你一点点)。对于的话,因为此时预测距离中心点较远的点,所以这一项使距离中心点越远的点的损失比重占的越大,而越近的点损失比重则越小,这相当于弱化了实际中心点周围的其他负样本的损失比重,相当于处理正负样本的不平衡了。
综上所述:与用来解决简单样本(包括简单负样本和正样本)主导反向传播时梯度这一问题(因为简单数量太多了,虽然简单样本好判断,但是遭不住人海战术啊!!!!)。而则用来处理正负样本的不平衡问题(因为每一个物体只有一个实际中心点,其余的都是负样本,但是负样本相较于一个中心点显得有很多。所以它只在otherwise情况下使用)。
此外论文中有解释:传统的基于anchor的检测方法(如Fast-RCNN),通常我们选择与标记框IoU大于0.7的作为正样本,IoU小于0.3的则标记为负样本,如图3。这样设定好box之后,在训练过程中使用Mining机制将positive和negative的box比例限制为1:3,来解决正负样本不均衡问题。而在CenterNet中,每个中心点只对应一个目标的位置,不需要使用overlap的判断。那么怎么去减少正负样本的比例呢?CenterNet是采用Focal Loss的思想,在实际训练中,中心点的周围其他点(negative center pointer)的损失则是经过衰减后的损失(上文提到的),而目标的长和宽是经过对应当前中心点的w和h回归得到的。
目标中心位置损失
因为作者对原始图像进行了Stride=4的下采样(R=4),这样会使得特征图重新映射到原始图像上的时候会带来精度误差(列如向下取整,向上取整,在feature map上只有1个像素的差距,对应原图是四个像素点的差距),因此对于每一个中心点,作者额外采用了一个local offset来进行偏差补偿。
所有类的中心点共享offset prediction,这个偏置值(offset)用L1 loss来训练:(是否可以换成smooth L1或者别的损失函数呢???):
是原始图像经过下采样得到的,。对于[512,512]的图像如果 R=4的话,则其下采样的feature map大小为[128,128]。下采样之后对Label图像用高斯分布来在图像上撒热点,怎么撒呢?首先将box坐标也转化为与[128,128]大小图像匹配的形式,但是因为我们原始的annotation是浮点数的形式(COCO数据集),使用转化后的box计算出来的中心点也是浮点型的,假设计算出来的中心点是[98.97667,2.3566666]。
但是在前向传播过程中,假设我们输入图像大小为[640,320],然后resize成[512,512],然后下采样4倍成[128,128]。最终预测使用的图像大小是[128,128]。假设模型预测出与实际GT的中心点[98.97667,2.3566666]对应的点是[98,2],坐标是(x,y), 对应类别是c,则=1,为某个物体的中心。直接映射为[512,512]的形式肯定会有精度损失,为了解决这个就引入了Loss-offset。
表达式中绝对值里第一项是模型预测出来的偏置,第二项相当于GT(向下取整后与label真实的差距)
目标大小损失
推理阶段
CenterNet在训练过程中,如果同一个类的不同物体的高斯分布点互相有重叠,那么则在重叠的范围内选取较大的高斯点。
总结
目前,我在公司里预研一些轻量化的网络来提升检测算法的速度。了解到Anchor-Free在学术界炙手可热,但确实在生产中确实比较少见。所以我就预研了一些算法。这篇文章相对于一些为了创新而创新的Anchor-free系列论文,我觉得它的工作是特别特别好的,对今后的学习以及工作上大有裨益。文中的idea虽然乍一看不是特别有新意,相信很多人可能也有过类似拍脑袋的想法,但是将它实现出来还是非常不容易的。我复现了一下论文代码,目测精度应该可以达到论文中的要求。作者在文中没有尝试轻量级的模型,但是个人觉得这篇文章的思想对于提升模型速度是有效果的。后续也会尝试对其进行一些改进。
论文中其实有些地方的设计,个人不太赞同。列如:它在对目标进行长宽回归的时候为什么不进行归一化处理?normalize the scale,以前的论文都会加log或者其他归一化方式,我觉得本文方法对目标尺度并没有做到很鲁棒?可能是作者试了之后,没效果就没继续采用?后续我会尝试一下用IOU Loss或者长宽归一化的方法对loss函数进行改进。
因为第一次写简书,很多地方是从别的博主借鉴过来的,望见谅!