今天我继续来介绍一个Anchor-Free新的算法(它是基于密集采样的AF),这个文章我看下来个人觉得非常有意思。因为它将语义分割的思想用来做检测了。在学校期间,我的研究方向就是语义分割。在公司做检测的时候,我也思考过:除了在特征融合以及backbone方面,在核心思想两者能否互相借鉴一下,比如用分割思想去解决检测;用检测去辅助分割(毕竟分割是检测更深一层次)。这篇文章很好的解答了我的一些疑惑,下面就来对这个文章进行一下分享吧。
1.网络整体介绍
本文提出了一种全卷积one-stage目标检测算法(FCOS),以逐像素预测的方式解决目标检测问题,类似于语义分割。目前最流行的不论是one-stage目标检测算法,如RetinaNet,SSD,YOLOv3,还是two-stage目标检测算法,如Faster R-CNN。这两类算法大都依赖于预定义的锚框(anchor boxes)。相比之下,本文提出的目标检测算法FCOS不需要锚框。通过消除预定义的锚框,FCOS避免了与锚框相关的复杂计算,例如在训练期间计算重叠等,并且显著减少了训练内存。更重要的是,FCOS还避免了设定与锚框相关的所有超参数,这些参数通常对最终检测性能非常敏感。FCOS算法凭借唯一的后处理:非极大值抑制(NMS),实现了优于以前基于锚框的one-stage检测算法的效果。
其实最著名的无anchor的目标检测网络是YOLOv1算法(可以算是鼻祖啦),YOLOv1算法告诉大家,回归网络也可以进行目标检测,但是该网络由于其召回率过低而使其并无太多实用价值,因此YOLO作者在其基础上提出了基于anchor的YOLOv2,v3算法。而本文提出的FCOS算法相当于保留了无anchor机制,并且引入了逐像素回归预测,多尺度特征以及center-ness三种策略,主要流程框架如下图所示,最终实现了在无anchor的情况下效果能够比肩各类主流基于anchor的目标检测算法。
2、为什么要提出FCOS以及FCOS的优势在哪?
作者为什么要提出anchor-free算法FCOS呢,主要的原因如下所示:
anchor会引入很多需要优化的超参数, 比如anchor number、anchor size、anchor ratio等;
为了得到一个较高的召回率,基于anchor的检测器需要在输入图像上密集的设置anchors,其中大部分anchor被标记为negative,加剧了正负样本之间的不平衡问题;
在训练的时候,需要计算所有anchor box同ground truth boxes的IoU,计算量较大;
FCOS属于anchor-free类别的算法,且效果在anchor-free派系中算SOTA了。它的主要优点如下:
因为输出是pixel-based预测,所以可以复用semantic segmentation方向的相关tricks; (这点很讨喜)
可以修改FCOS的输出分支,用于解决instance segmentation和keypoint detection任务;(这点也很讨喜,毕竟要恰饭的吗嘛(发paper))
3、FCOS算法实现细节详解
1、FCOS算法和基于anchors的检测算法的不同之处在哪里?
对于基于anchors的目标检测算法而言,我们将输入的图片送入backbone网络之后,会获得最终的feature_map,比如说是17x17x256;然后我们会在该feature_map上的每一位置上使用预先定义好的anchors。YOLOv1中也使用了无anchor策略,但基于YOLOv1在预测边界框的过程中,提出的cell概念,导致YOLOv1只预测了目标物体中心点附近的点的边界框。这很显然预测的框少,召回率(Recall)自然也就低了。基于此,本文提出的FCOS算法为了提升召回率,则对目标物体框中的所有点都进行边界框预测。当然这种逐像素的边界框预测肯定会导致最终预测得到的边界框质量不高,因此作者在后续还会提出弥补策略。FCOS目标检测算法在边界框预测中使用的策略和YOLOv1有所不同,FCOS的改动点就在这里,它是直接在feature_map上的每一点进行回归操作。具体的实施思路如下所示:
首先,我们可以将feature_map中的每一个点(x,y)映射回原始的输入图片中;
然后,如果这个映射回原始输入的点在相应的GT的BB范围之内,而且类别标签对应,我们将其作为训练的正样本块,否则将其作为正样本块;
接着,我们回归的目标是(l,t,r,b),即中心点做BB的left、top、right和bottom之间的距离(其主要原因是为了后续使用center-ness做准备的),具体如下图所示:
接着,如果一个位置在多个BB的内部的话(如上图右侧,人手中拿着一个球拍这种情况),我们可以将其看作一个模糊样本,针对这样样本文中采样的方法是直接选择择面积最小的边界框作为其回归目标。由于网络中FPN的存在,导致这样的模糊样本的数量大大减少。
接着,如果这个位置(x,y)和一个BB关联的话,该位置处的训练回归目标可制定为:其中(x0,y0)和(x1,y1)分别表示BB的左上角和右下角坐标值。
接着,由于FCOS算法是基于目标物体框中的点进行逐像素回归的,因此执行回归的目标都是正样本,所以作者使用了exp()函数将回归目标进行拉伸,我个人认为此操作是为了最终的特征空间更大,辨识度更强。 由于FCOS可以通过这样方式获得很多正样本块,然后使用这样正样本块进行回归操作,因此获得了比较好的性能提升,而原始的基于anchor的算法需要通过计算预设的anchor和对应的GT之间的IOU值,当该IOU值大于设定的阈值 时才将其看做正样本块(这样计算量太大)。
4. 多尺度策略
对于基于anchor的检测算法,由于较大的降采样操作而导致的低召回率可以通过降低正anchor所需的IOU阈值(降低心里水平,总会有合适的嘛)做一定程度上的补偿,进行召回率的提升。然而对于FCOS算法,如果降采样的尺度过大,那么网络不可能回忆起一个在最终特征图上没有位置编码的对象的初始框的,基于此作者提出了基于FPN的多尺度策略。(虽然作者在文中说,即使没有FPN策略,逐像素检测网络在召回率上表现的也不逊色基于anchor的网络。,但是我个人觉得这点很重要的)
如上图所示,FCOS算法那使用了{P3, P4, P5, P6, P7}这五个尺度的特征映射。其中P3、P4、P5由主干CNNs网络的特征层 C3、C4、C5经过一个1*1的卷积得到的,而P6、P7则是接着P5进行了步长为2的卷积操作得到的(相当于降采样)。最终对这五个尺度都做逐像素回归。
当然,作者为了能够更好的利用这种多尺度特征,在每一个尺度的特征层都限定了边界框回归的范围,不散养它们。(基于anchor的检测网络也有类似策略,比如YOLOv3中将不同大小的anchor分配到不同特征层级中作回归)。众所周知,神经网络的浅层更多的是细节特征,且对小目标检测有利,高层更多的是语义特征,用于检测大目标。更具体地说,作者首先计算所有特征层上每个位置的回归目标
第一:计算当前层级中的回归目标:l、t、r、b。
第二:判断max(l, t, r, b) > mi 或者 max(l, t, r, b) < mi -1是否满足。
第三:若满足,则不对此边界框进行回归预测。
第四:mi是作为当前尺度特征层的最大回归距离。
而且这种约束带来的额外的效果在于,由于不同尺寸的物体被分配到不同的特征层进行回归,又由于大部分重叠发生在尺寸相差较大的物体之间,因此多尺度预测可以在很大程度上缓解目标框重叠情况下的预测性能。
那么如果在一个层中出现重叠区域呢?我们就直接简单的使用最小区域作为回归目标!总结如下两句话:
如果大尺度和小尺度的重叠,比如人和手中的苹果,作者使用了FPN结构来在每一层加以限定,因为这两者之间的尺度相差较大,文章中共有5个区间来限定[0,64][64,128]等等。如果一个像素点在同一层落到了多个GT区域,这样也会ambiguous。这是作者简单的会使用最小区域来作为回归目标。
Note: 由于作者认为,不同的特征层需要回归不同的尺寸范围(例如,P3的尺寸范围为[0,64],P4的尺寸范围为[64,128],因此在不同的特征层使用相同的输出激活是不合理的。因此,作者没有使用标准的exp(x)函数,而是使用exp(si,x)其中si是一个可训练的标量si,能够通过si来自动调整不同层级特征的指数函数的基数,这从经验上提高了检测性能。
5.center-ness
作者在使用了多尺度检测后发现仍然和anchor-based的检测器有很大差距,然后发现FCOS存在大量的低质量的检测框。这是由于我们把中心点的区域扩大到整个物体的边框,经过模型优化后可能有很多中心离GT box中心很远的预测框,为了增加更强的约束基于此,作者提出了一个简单而有效的策略center-ness来抑制这些低质量检测到的边界框,且该策略不引入任何超参数。
如上图所示,center-ness策略在每一个层级预测中添加了一个分支,该分支与分类并行,相当于给网络添加了一个损失,而该损失保证了预测的边界框尽可能的靠近中心。该损失的公式如下,其中l,r,t,b表示的为如下图左图中所示的预测值。,使用BCE
loss对center-cess进行优化!
而该策略之所以能够有效,主要是在训练的过程中我们会约束上述公式中的值,使得其接近于0,这就导致如下图中的蓝色框中的短边能够向黄边靠近,使得分布在目标位置边缘的低质量框能够尽可能的靠近中心。这样的话,在最终使用该网络的过程中,非极大值抑制(NMS)就可以滤除这些低质量的边界框,提高检测性能。
6.Loss函数
该loss函数如上图所示,同样包含两部分,Lcls表示分类loss,本文使用的是Focal_loss;Lreg表示回归loss,本文使用的是IOU loss。其实这两个loss应当是当前最好的配置啦。
7.网络效果
FCOS与其他最先进的two-stage或one-stage目标检测算法的比较。在相同主干网络的情况下,FCOS的性能比基于anchor的RetinaNet高出1.9%。FCOS的性能也优于最近推出的无anchor的one-stage检测网络CornerNet,且设计复杂度大大降低。
首先分析FPN结构:
可以看出哪些交叠区域,也就是ambiguous sample大大减少了,因此,其AP也上升了很多!将近一倍!
接着分析Center-ness结构:
我们可以看到较大物体的AP显著提高,这就是由于较大物体的中心偏离比较严重,总体AP提高了有3点。
然后分析其样例总数和内存占用:
可以看到,样例总数减少了9倍,内存占用减少了2倍。
与其他模型的比较
8、个人总结
总体来讲,FCOS算法确实不错,精度提高了不少,敢于突破传统思维,但是却让单阶段检测算法的速度变慢了,和RetinaNet做比较提升了两个点。毕竟它所用的思想是语义分割这种密集分类定位问题,所以速度肯定有影响。不过基于anchor-free的检测算法应该是目标检测算法的一个趋势吧,期待着更惊艳的单阶段目标检测算法的出现。