论文阅读笔记 | 目标检测算法——FCOS算法


如有错误,恳请指出


paper:FCOS: Fully Convolutional One-Stage Object Detection
source code:https://tinyurl.com/FCOSv1

简介:FCOS以类似于语义分割的逐像素预测方式来解决目标检测,由全卷积网络组成。是一种anchor free,甚至是proposal free的方法。完全避免与anchor有关的复杂计算与超参数,利用唯一的后处理非最大抑制(NMS)。

1. Introduction


在很长的一段时间内,anchor的使用被认为是目标检测的关键一步,所以很多主流的目标检测算法都是基于anchor的检测,包括Faster RCNN,SSD,YOLOv2,v3等算法。但是,基于anchor的目标检测算法具有几下些缺点:

1)检测性能对锚盒的大小、纵横比和数量很敏感。因此,这些超参数需要在基于anchor的检测器中仔细调整。
2)即使经过精心设计,由于anchor的比例和纵横比保持固定,检测器在处理具有大形状变化的候选对象时也会遇到困难,尤其是对于小对象。预定义的anchor也妨碍了检测器的泛化能力,因为它们需要针对具有不同对象大小或纵横比的新检测任务进行重新设计。
3)为了提高检测时的召回率(查全率),需要密集覆盖的使用anchor。而在多尺度使用时,anchor的用量更甚。而绝大多数anchor都是负样本,所以会出现正负样本不均衡的问题。(retinanet提出的focal loss就是为了解决这个问题)
4)密集的使用anchor意味着计算量更大,因为需要计算anchor与ground truth的交并比(iou)

作者首次证明,简单得多的基于FCN的检测器比基于anchor的检测器获得更好的性能。

FCOS算法不是首先提出使用全卷机网络实现目标检测的,DenseBox同样是基于FCN的一个算法。FCOS会对特征图上的每一个点预测出一个4维的向量再加上一个类别信息,也就是对WxH的特征图上的每一个点,设置的channels为5.其实这与语义分割是类似的,只不过多了4个边界框偏移的信息。(见下文的图1)

但是这些算法主要应用与本文检测与人脸检测领域,因为当应用于具有高度重叠的边界框的一般对象检测时,这些方法不能很好地工作。如上右图所示,高度重叠的边界框导致难以处理的模糊性,不清楚参数w,r,t为重叠区域中的像素回归哪个边界框。不过,paper中也提到,有了FPN,这种模糊性可以在很大程度上消除。

作者观察到,FCOS算法可能会在远离目标对象中心的位置产生许多低质量的预测边界框。为了抑制这些低质量检测,作者引入了“center-ness”的分支(只有一层)来预测一个像素相对于其对应边界框中心的偏差。然后,该分数被用于对低质量检测到的边界框进行降低权重,并合并NMS的检测结果。由于设置了这个“center-ness”分支,使得基于FCNs的检测器要由于基于anchor的检测器。

FCOS作为一个新的检测框架,具有如下一些优点:

1)检测现在与许多其他可行的任务(如语义分割)相统一,使得重用这些任务中的想法变得更加容易。也就是可以将语义分割上的一些想法用在检测上。
2)检测避免了anchor与proposal,减小了设计的参数量,避免了许多特定任务的调整与技巧,同时还减少了计算量(Iou)
3)没有花哨的功能,我们在One-step检测器中取得了一流的结果。所提出的FCOS可以用作Two-step检测器中的区域提议网络(RPNs),并且可以获得比基于anchor的区域提议网络更好的性能。为此,需要重新思考物体检测中anchor的必要性。
4)FCOS可以立即扩展,以最小的修改来解决其他视觉任务,包括实例分割和关键点检测。

2. FCOS Approach


2.1 Fully Convolutional One-Stage Object Detector

定义 F i ∈ R H × W × C F_{i} ∈ R^{H \times W \times C} FiRH×W×C表示为backbone输出的第i层的特征图,s表示为当前层缩放的步长。定义 B i B_{i} Bi为输入图像的ground truth的边界框, B i = ( x 0 i , y 0 i , x 1 i , y 1 i , c i ) ∈ R 4 × { 1 , 2 … C } B_{i} = (x_{0}^{i},y_{0}^{i},x_{1}^{i},y_{1}^{i},c^{i}) ∈ R^{4} \times \{1,2\ldots C \} Bi=(x0i,y0i,x1i,y1i,ci)R4×{ 1,2C}。其中 ( x 0 i , y 0 i ) (x_{0}^{i},y_{0}^{i}) (x0i,y0i) ( x 1 i , y 1 i ) (x_{1}^{i},y_{1}^{i}) (x1i,y1i)分别表示真实边界框的左上角坐标与右下角坐标, c i c^{i} ci表示真实边界框对应的类别,C表示类别的总个数,其中在 MS-COCO数据集上类别的总个数为80.对于第i层的预测特征层 F i F_{i} Fi的每一个位置坐标 ( x , y ) (x,y) (x,y),都可以将其映射回输入图像的位置 ( ⌊ s / 2 ⌋ + x s , ⌊ s / 2 ⌋ + y s ) (\lfloor s/2 \rfloor +xs,\lfloor s/2 \rfloor +ys) (s/2+xs,s/2+ys),其靠近位置 ( x , y ) (x,y) (x,y)的感受野中心。

基于Anchor的检测器将特征图上每个位置作为anchor box的中心,然后通过回归这些anchor得到预测框,这些检测器相当于把anchor当作的训练样本,如果与gt的IoU大于阈值则为正样本,反之负样本。而FCOS则是直接把预测特征图上的每个位置 ( x , y ) (x,y) (x,y) 当作训练样本,如果该位置在某个ground truth box的内部,则视为正样本,该位置的类别标签 c ∗ c^{*} c则对应这个ground truth bounding box的类别,反之,视之为负样本, c ∗ = 0 c^{*} = 0 c=0(称为背景类)。这与语义分割的任务是类似,都是对每个像素进行训练分类与判断。

除了用于分类的标签之外,还有一个4D实向量 t ∗ = ( l ∗ , t ∗ , r ∗ , b ∗ ) t^{*}=(l^{*},t^{*},r^{*},b^{*}) t=(ltrb)作为该位置的回归目标。其中 ( l ∗ , t ∗ , r ∗ , b ∗ ) (l^{*},t^{*},r^{*},b^{*}) (ltrb)是从该位置到边界框四边的距离,如图所示:
在这里插入图片描述
如果一个位置在多个ground truth box内,则它视为模糊样本,选择box面积最小的作为它的回归对象。在下一节中,将展示使用多级预测(类似FPN结构),模糊样本的数量可以显著减少,因此它们几乎不影响检测性能。

因此,如果预测特征图上的某一个位置,映射回原图后的 ( x , y ) (x,y) (x,y)在某一个输入图像的ground truth的边界框内,那么该位置的训练4个回归参数可以表述为:
l ∗ = x − x 0 i , t ∗ = y − y 0 i , r ∗ = x 1 i − x , b ∗ = y 1 i − y l^{*} = x - x^{i}_{0},t^{*} = y - y^{i}_{0},r^{*} = x^{i}_{1} - x,b^{*} = y^{i}_{1} - y l=xx0it=yy0ir=x1ixb=y1iy
值得注意的是,FCOS可以利用尽可能多的前景样本来训练回归器。而基于anchor的检测区只考虑具有足够高的Iou的anchor box作为正样本,这可能是FCOS表现更优的原因之一。

2.1.1 Networks

在FCOS的网络结构的最后一层上,将预测分类标签长度为80D的类别向量p ,同时还将预测一个4D的向量t作为距离边界框的四个参考偏移量 t = ( l , t , r , b ) t = (l,t,r,b) t=(l,t,r,b).对于分类,采用的c个二分类器而不是多分类器。类似于RetinaNet,在Backbone后增加4个卷积层分别用于预测分类和回归,由于所有回归的对象都是正样本,所以在回归分支后使用函数 e x p ( x exp(x exp(x)将所有真值映射到 ( 0 , ∞ ) (0,∞) (0,)。相比使用9个anchor的基于anchor的网络,其输出少了9倍。具体的网络结构如图所示:
在这里插入图片描述

2.1.2 Loss

损失函数定义为:
在这里插入图片描述
其中 L c l s L_{cls} Lcls是retinanet中的focal loss, L r e g L_{reg} Lreg是UnitBox中的IOUloss。 N p o s N_{pos} Npos指代正样本数量,λ是用于平衡 L r e g L_{reg} Lreg的权重,设置为1。累加符号是指特征图 F i F_{i} Fi上的所有点的损失相加。 l { c x , y ∗ > 0 } l_{\{ c_{x,y}^{*} > 0 \}} l{ cx,y>0}是一个指标函数,满足条件时为1,否则为0。也就是当前像素在某一个ground truth box的内部,所以其类别标签预测时才大于0,而只有在ground truth box的内部的特征点才有预测边界偏移参数的必要。对于背景类不需要预测回归量。

对于FCOS的推理过程比较简单,将给定的输入图像通过backbone后获得特征图 F i F_{i} Fi上每一个特征位置点的分类预测 p x , y p_{x,y} px,y与回归预测 t x , y t_{x,y} tx,y。如果当前特征点的分类预测 p x , y > 0.05 p_{x,y} > 0.05 px,y>0.05,则表示其可能在ground truth box的内部,所以将其视为正样本,然后根据公式 l ∗ = x − x 0 i , t ∗ = y − y 0 i , r ∗ = x 1 i − x , b ∗ = y 1 i − y l^{*} = x - x^{i}_{0},t^{*} = y - y^{i}_{0},r^{*} = x^{i}_{1} - x,b^{*} = y^{i}_{1} - y l=xx0it=yy0ir=x1ixb=y1iy来获取预测的边界框。

补充:
在paper中,其实对损失函数的解释比较少,但是一眼看上去,其实大概可以了解其含义。FCOS的损失函数由两个部分组成,一个是分类损失,另外一个就是边界框回归损失。而对于分类损失,使用的是retinanet的focal loss,focal loss的解释具体可以查看另一篇文章:focal loss

2.2 Multi-level Prediction with FPN for FCOS

上诉内容提到过,FCOS具有两个可能的问题:1)低召回率. 2)模糊样本.而这两个问题可以通过使用多尺度特征预测来解决,也就是使用FPN结构。

1) low best possible recall

在CNN中,如果最终特征图的stride很大,那么会导致一个相对很低的最大可能召回率best possible recall (BPR)。对于基于anchor的检测器来说,可以通过降低判断为正样本的IOU阈值来弥补一些。对于FCOS,虽然看似可能会因为很大stride导致一些物体在最终特征图上消失,进而导致无法检测这些物体,但是实际上,即使有着很大的stride,基于FCN的FCOS也能够达到很好的BPR,甚至好过RetinaNet。加上多级FPN预测后,BPR能够进一步提高。

2)intractable ambiguity

若干ground truth boxes的重叠会使得该在这些区域的位置不知道以谁作为回归对象,这也是导致基于FCN网络的性能下降的原因,本文证实通过多级预测能够很好的解决这个问题,使得基于FCN的网络能有和基于anchor的网络一样甚至更好的性能。

作者发现,以上所说,FCOS的两个可能的问题都可以通过多尺度特征预测(multi-level prediction)来解决。

和FPN相似,我们使用不同的层次的特征图来检测不同尺寸的物体,具体来讲,使用了5个不同层次的特征图 { P 3 , P 4 , P 5 , P 6 , P 7 } \{ P_{3},P_{4},P_{5},P_{6},P_{7} \} { P3,P4,P5,P6,P7},其中 { P 3 , P 4 , P 5 } \{P_{3},P_{4},P_{5}\} { P3,P4,P5}由CNN的骨干网的 { C 3 , C 4 , C 5 } \{C_{3},C_{4},C_{5}\} { C3,C4,C5}特征层通过1×1的卷积得到,他们自上而下的连接。 P 6 , P 7 P_{6},P_{7} P6,P7是分别在 P 5 , P 6 P_{5},P_{6} P5,P6上经过一个步长为2的卷积得到的,最终 P 3 , P 4 , P 5 , P 6 , P 7 P_{3},P_{4},P_{5},P_{6},P_{7} P3,P4,P5,P6,P7的步长分别为8,16,32,64,128。基于anchor的检测器给不同level的特征图分配不同尺寸的anchor,而FCOS则是直接限制每个level的bounding box regression范围。更具体地说,对于每个level上的每个位置,先计算回归对象 ( l ∗ , t ∗ , r ∗ , b ∗ ) (l^{*},t^{*},r^{*},b^{*}) (ltrb)如果一个位置满足 m a x ( l ∗ , t ∗ , r ∗ , b ∗ ) > m i max(l^{*},t^{*},r^{*},b^{*}) > m_{i} max(ltrb)>mi或者 m i n ( l ∗ , t ∗ , r ∗ , b ∗ ) < m i − 1 min(l^{*},t^{*},r^{*},b^{*}) < m_{i-1} min(ltrb)<mi1,那么它就会被设置为负样本,并且不再需要回归边框了也就是说,第i层特征图 F i F_{i} Fi,其回归的距离范围为 ( m i − 1 , m i ) (m_{i-1},m_{i}) (mi1,mi)。paper中,分别设置 ( m 2 , m 3 , m 4 , m 5 , m 6 , m 7 ) (m_{2},m_{3},m_{4},m_{5},m_{6},m_{7}) (m2,m3,m4,m5,m6,m7) ( 0 , 64 , 128 , 256 , 512 , ∞ ) (0,64,128,256,512,∞) (0,64,128,256,512,).

由于具有不同大小的对象被分配到不同的要素级别,并且大部分重叠发生在具有显著不同大小的对象之间。如果一个位置,即使使用了多级预测,仍然被分配给多个ground-truth boxes,我们只需选择面积最小的ground-truth boxes作为目标即可。实验表明,多级预测可以很大程度上缓解上述模糊样本,并将基于FCN的检测器提高到与基于anchor的检测器相同的水平。

然后,在retinanet中,在不同的特征级别之间共享头部,不仅使检测器参数高效,而且提高了检测性能。但是,在FCOS中可以观察到,不同层的feature level需要回归指定大小的回归框(例如,对于 P 3 P_{3} P3 P 4 P_{4} P4,尺寸范围分别为[0,64]和[64,128]),对于不同的feature level使用相同的head这是不合理的。因此,本文并不使用标准的 e x p ( x ) exp(x) exp(x),而是增加了一个训练参数 s i s_{i} si,基于 e x p ( s i ⋅ x ) exp(s_{i}·x) exp(six)根据 P i P_{i} Pi进行自动调整。这略微提高了检测性能。

2.3 Center-ness for FCOS

解决了多尺度预测的问题后,仍存在另一个问题:实验表明FCOS会产生大量偏离目标中心的边界框。作者提出了一个简单而有效的策略来抑制这些低质量的检测边界框,而不引入任何超参数。具体来说,作者在最后的分类head中,添加了一个单层分支,与分类分支并行(如图所示),以预测某一位置点的“center-ness”。
在这里插入图片描述
center-ness描绘了从该位置到该位置负责的对象中心的归一化距离。给定一个位置的回归目标 ( l ∗ , t ∗ , r ∗ , b ∗ ) (l^{*},t^{*},r^{*},b^{*}) (ltrb),center-ness目标被定义为:

这里使用sqrt来减缓center-ness的衰退。center-ness范围从0到1,因此用二元交叉熵损失进行训练。损失被加到损失函数方程中。
在这里插入图片描述
在测试时,通过将预测的center-ness与相应的分类分数相乘来计算最终分数(用于对检测到的边界框进行排序)。因此,center-ness可以降低远离对象中心的边界框的分数。结果,这些低质量的预测边界盒很有可能被最终的非最大抑制(NMS)过程过滤掉,从而显著提高检测性能。

center-ness的一个替换方法是只把ground truth box距离其中心的某个半径范围内的点(即ground truth box中心的点)视为正样本,这个idea是作者从focal loss中得到的,最后作者尝试了同时结合这两种方法,性能得到了些许提升。

3. Result

  • Multi-level Prediction的作用:
    在这里插入图片描述
  • center-ness的作用:
    在这里插入图片描述
  • 与其他SOTA算法的对比:
    在这里插入图片描述
    总结:

作者提出了一个anchor-free与proposal-free的检测器FCOS。实验结果优于RetinaNet, YOLO ,SSD,且复杂度更低。FCOS完全避免了与anchor相关的所有计算和超参数,并以每像素预测的方式解决了对象检测,类似于语义分割等其他密集预测任务。在One-step网络中获得一流的性能,并且可以替代Two-step网络中的RPN模块,效果甚至优于RPN结构。

猜你喜欢

转载自blog.csdn.net/weixin_44751294/article/details/119585952