论文翻译|FCOS: Fully Convolutional One-Stage Object Detection

FCOS:全卷积单阶段目标检测

  • 摘要
  • 1. 引言
  • 2. 相关文献
      • anchor based模型
      • anchor free模型
  • 3. 方法
      • 3.1 全卷积单阶段目标检测器
      • 3.2 FCOS的FPN多层级预测
      • FCOS的中心度(*Center-ness*)
  • 实验

摘要

我们提出了一种全卷积的单阶段目标检测器FCOS,在像素级预测中解决目标检测问题,类似于语义分割。几乎所有的sota目标检测器,如:RetinaNet、SSD、YOLOv3、Faster R-CNN都依赖于预定义的anchor框,而我们的FCOS是anchor free的,而且是proposal free的,完全避免了和anchor框相关的复杂计算(IOU),降低了计算内存占用。更重要的是,我们也避免了和anchor框相关的对检测性能非常敏感对所有超参数。经过NMS后处理,我们的FCOS比基于anchor的单阶段检测器要表现出色,且更加简单。我们首次证明了一种更简单、更灵活的检测框架,并且提升了检测效果。我们希望所提出的FCOS能成为其他实例级任务的强有力的替代品。

代码已开源:tinyurl.com/FCOSv1。

1. 引言

目标检测是一项基本但也富有挑战的计算机视觉任务,它需要一套算法来为图像上的每个实例预测一个带有类别标签的边界框。所有当前主流的检测器诸如Faster R-CNN、SSD、YOLOv3,都依赖于预定义的anchor集合,并且一直被认为是目标检测成功的关键点。尽管基于anchor的方法获得了巨大的成功,仍然有必要提出该方法的几个缺点:

  1. 如[12],[20]所述,检测性能对anchor的尺寸、宽高比、数量十分敏感。比如RetinaNet中,调整超参数能够影响4%的AP在COCO数据集上。因此对于anchor的超参数需要细致调整。
  2. 即使经过的精心的设计,由于anchor框的尺寸和宽高比是固定的,检测模型会难以处理尺度变化很大的目标,尤其是很小的目标。预定义的anchor框也会妨碍检测模型的泛化性能,对于新的检测任务就需要有不同的尺寸和宽高比。
  3. 为了获得更高的找回率,基于anchor的模型会在输入图像上密集放置anchor框(对于输入图像短边长度为800的FPN网络超过了180k个anchor),大多数anchor框在训练阶段被认为是负例,过多的负例加剧了正负样本之间的不平衡。
  4. 大量的anchor框也会明显增加计算量和内存占用,尤其在iou计算的阶段。
    论文翻译|FCOS: Fully Convolutional One-Stage Object Detection_第1张图片
    图1:如左图所式,FCOS预测一个4D向量 ( l , t , r , b ) (l,t,r,b) (l,t,r,b)来编码每个前景像素点对应边界框的位置(训练时由ground-truth监督)。右图展示了一个像素点对应多个边界框,这可能会给边界框的回归带来问题。

近期,全卷积FCN神经网络在密集预测任务(语义分割、高度估计、关键点检测、计数)上获得了巨大的成功。作为其中一种高层的视觉任务,目标检测因为用到了anchor,可能是唯一一个没有纯粹全卷积像素级预测的任务了。很自然我们会疑问:我们能通过简单的像素级预测来做目标检测吗,像语义分割中的FCN那样?这样的话那些基础的视觉任务就可以用一套框架全部解决。我们的回答是肯定的。而且我们第一次证明,简单的全卷积模型甚至可以达到比anchor-base的模型更好的检测效果。

在文献中,一些工作尝试去构造一种FCN-base的框架,如DenseBox、UintBox。具体来说,这些FCN-base的模型直接在特征图的一层的每个空间位置上预测一个4D向量和一个类别。如图1左所示,4D向量表示该位置到边界框四条边的偏移量。这些模型和语义分割的FCNs很像,除了每个位置需要回归一个4D向量以外。然而,为了处理不同尺寸的边界框,DenseBox将训练样本缩放成固定尺寸,从而在特征金字塔上进行检测,这和一次计算所有卷积的FCNs理念不同。而且,这些方法主要用在特定区域的检测上,比如场景文字检测和人脸检测,因为边界框大大重叠,所以这方法不适合在通用目标检测上使用。如图1右所示,高度重叠的边界框会给训练带来问题:重叠处的像素回归的框是不明确的。

接下来,我们进一步考虑了这个问题,说明了使用FPN可以大幅度减弱这种不明确性。因此,我们的方法已经达到了和传统anchor base检测模型相似的检测精度。而且我们观察到我们的方法会在远离目标中心的位置生成很多低质量的预测边界框,我们提出了一种新的“中心度”(center-ness)分支(只有一层)来预测一个像素到对应边界框中心的偏移,如公式3所示。这个得分的使用可以降低低质量检测框的权重,并且用NMS融合检测结果。这种简单但高效的中心度分支使FCN base的模型在完全相同的训练和测试设置下性能超越ancher base的模型。

这种新的检测模型有如下优势:

  • 检测和其他FCNs的任务(如语义分割)统一,使它便于在任务间复用。
  • 检测也可以是proposal free和anchor free的,显著降低参数量。设计参数一般需要多次调整,用上很多tricks来获得好的性能。因此我们新的检测框架使检测模型大大简化,尤其是在训练阶段。而且我们的方法完全避免了anchor的复杂的iou计算和匹配,降低了两倍的内存占用。
  • 毫无疑问,我们达到了单阶段检测器sota的性能,而且我们提出的FCOS也可以用做RPN网络,在其他RPN的双阶段检测器中,达到了更好的性能。考虑到这是一个简单的、anchor free的、性能卓越的模型,我们建议学界重新思考anchor的必要性,而后者在当下被认为是检测中理所应当的标准。
  • 提出了模型通过少量调整可以立刻用于解决其他视觉任务,包括实例分割、关键点检测。我们相信这种新的方法可以成为实例级预测问题的新的baseline。

2. 相关文献

anchor based模型

anchor based模型由传统滑窗和proposal base模型演变而来。在anchor based模型中,anchor框可以看作是由滑窗或提议得到的预定义的框,并且对这些框所包含的图域进行分类,再经过回归得到准确对边界框对位置。因此anchor框在这些模型中可以被看作是训练样本。不同于之前对检测模型,如Fast RCNN,分别计算图域内的特征,anchor充分利用了卷积神经网络的特征图,避免了特征的重复计算,加速了检测过程。Faster RCNN中的RPN、SSD、YOLOv2中anchor的设计非常流行,已经成为了现代检测模型的惯例。

但是,如上所述,anchor框会带来很多超参数,需要精细调整才能达到好的性能。不光是anchor框,anchor还需要额外的参数来标记自身是一个正例、忽略、负例样本。在之前的工作中,通常会计算anchor框和gt框的iou来判断标签类别(正例iou[0.5,1])。这些超参数对最终对准确度有非常大对影响,需要反复调整。同时,这些超参数对不同任务不同,使检测任务和简单的FCNs架构不同。

anchor free模型

最流行的anchor free检测器该属YOLOv1,它预测目标中心附近的点上的边界框,而不使用anchor。只有接近中心的点会被使用,因为它们可以提高检测质量。但是,因为只使用了中心附近的点来预测边界框,YOLOv2提到YOLOv1的召回率很低。因此YOLOv2同样用上了anchor。和YOLOv1相比,FCOS利用到了ground truth中的所有点来预测边界框,而差的边界框会被”中心度“分支抑制。因此,FCOS可以达到和anchor based方法相近的召回率。

CornerNet是一种最近提出的单阶段anchor free目标检测器,它通过检测边界框的一对角点并且归并得到最终的检测框。CornerNet的将角点分配给实例的后处理过程十分复杂,并且为了归并,需要额外学习一种距离度量。

另外一些anchor free模型,如UnitBox,是基于DenseBox的。这一类模型因为难以处理重叠框,召回率低,而不适合作为通用目标检测模型。在本文中,我们展示了上述的两种问题都可以通过多层FPN解决。而且我们也把中心度分支结合进去,得到了比anchor base更好的检测结果。

3. 方法

在本章中,我们首先推导目标检测在像素级预测范式中的形式。其次展示了如何利用多层预测来提高召回率,解决训练中重叠边界框的不确定性的问题。最后,我们提出了“中心度”分支,抑制差的检测框,大幅度提高总体性能。

3.1 全卷积单阶段目标检测器

F i ∈ R H × W × C F_i \in \mathbb{R}^{H \times W \times C} FiRH×W×C为主干CNN第 i i i层特征图, s s s是该层总stride。ground truth边界框的集合为 { B i } \{B_i\} {Bi},其中 B i = ( x 0 ( i ) , y 0 ( i ) , x 1 ( i ) , y 1 ( i ) , c ) ∈ R 4 × { 1 , 2 , . . . , C } B_i=(x^{(i)}_0, y^{(i)}_0, x^{(i)}_1 ,y^{(i)}_1, c) \in \mathbb{R}^4 \times \{1,2,...,C\} Bi=(x0(i),y0(i),x1(i),y1(i),c)R4×{1,2,...,C},这里 ( x 0 ( i ) , y 0 ( i ) ) (x^{(i)}_0,y^{(i)}_0) (x0(i),y0(i)) ( x 1 ( i ) , y 1 ( i ) ) (x^{(i)}_1,y^{(i)}_1) (x1(i),y1(i)) (原文x1和y1之间没有‘,’,这里加上) 表示边界框左上和右下角点的坐标。 c ( i ) c^{(i)} c(i)表示边界框内目标所属类别。 C C C是类别数,对于COCO而言是80。

对于特征图 F i F_i Fi上每个位置 ( x , y ) (x,y) (x,y),我们可以回退到原图的坐标 ( ⌊ s 2 ⌋ + x s , ⌊ s 2 ⌋ + y s ) (\lfloor \frac{s}{2} \rfloor + x_s, \lfloor \frac{s}{2} \rfloor + y_s) (2s+xs,2s+ys),该坐标和 ( x , y ) (x,y) (x,y)位置的感受野的中心很接近。不同于anchor based检测器,将输入图像上的位置看作是anchor框的中心,并回归anchor至目标边界框,我们直接回归每个位置上对应的目标边界框。换句话说,我们的检测器直接将位置作为训练样本,和FCNs语义分割相同。

具体来说,如果位置 ( x , y ) (x,y) (x,y)落在任意ground truth框内,那么它就被认为是正样本,类别 c ∗ c^* c属于 B i B_i Bi。否则,它就被认为是负样本, c ∗ = 0 c^*=0 c0(背景类)。除了分类的标签,我们也可以得到一个4D真实的用于回归的偏移向量 t ∗ = ( l ∗ , t ∗ , r ∗ , b ∗ ) \bold{t}^*=(l^*,t^*,r^*,b^*) t=(l,t,r,b),这里 l ∗ , t ∗ , r ∗ , b ∗ l^*,t^*,r^*,b^* l,t,r,b代表了该位置到边界框四个边的距离,如图1左所示。如果一个位置落在多个边界框中,则它被认为是模糊样本(ambiguous sample)。到目前为止,我们简单根据最小面积选取边界框作为位置上向量的回归目标。下一章中我们会说明多层级预测,使模糊样本的个数大大减小。公式表示为,如果位置 ( x , y ) (x,y) (x,y)对应一个边界框 B i B_i Bi,那么回归任务可以被写做:
l ∗ = x − x 0 ,   t ∗ = y − y 0 ,   r ∗ = x 1 ( i ) − x ,   b ∗ = y 1 ( i ) − y l^*=x-x_0,\ t^*=y-y_0,\ r^* = x^{(i)}_1-x,\ b^*=y^{(i)}_1-y l=xx0, t=yy0, r=x1(i)x, b=y1(i)y

值得一提的是,FCOS会得到尽可能多的前景点来训练回归器。这和anchor based方法不同,后者只会将和ground truth的iou足够大的框认为是正样本。我们认为,这是FCOS优于anchor based竞争对手的其中一个原因。

网络输出。 针对训练目标,网络的最后一层会输出80D的向量 p \bold{p} p作为分类标签,4D向量 t = ( l , t , r , b ) \bold{t}=(l,t,r,b) t=(l,t,r,b)作为边界框坐标。根据[12],我们训练 C C C个二值分类器,而不是训练一个多类别的分类器。和[12]相似,我们在特征图后加入4个卷积层分别用于分类和回归分支。而且,由于回归目标总是正的,我们用 exp ⁡ ( x ) \mathcal{\exp}(x) exp(x)来对回归分支上 ( 0 , + inf ⁡ ) (0,+\inf) (0,+inf)的所有实数做映射。值得一提的是,FCOS的网络输出变量数比流行的每个位置9个anchor的anchor based检测器要少9倍。

损失函数。 我们定义训练损失函数如下:
L ( { p x , y , t x , y } ) = 1 N p o s ∑ x , y L c l s ( p x , y , c x , y ∗ ) + λ N p o s ∑ x , y I ( c x , y ∗ > 0 ) L r e g ( t x , y , t x , y ∗ ) L(\{\bold{p}_{x,y}, \bold{t}_{x,y}\}) = \frac{1}{N_{pos}} \sum_{x,y}{L_{cls}(\bold{p}_{x,y},c^*_{x,y})} + \frac{\lambda}{N_{pos}}\sum_{x,y}{\mathbb{I}(c^*_{x,y}>0)L_{reg}(\bold{t}_{x,y},\bold{t}^*_{x,y})} L({px,y,tx,y})=Npos1x,yLcls(px,y,cx,y)+Nposλx,yI(cx,y>0)Lreg(tx,y,tx,y)
其中 L c l s L_{cls} Lcls是focal loss, L r e g L_{reg} Lreg是UnitBox的IOU loss。 N p o s N_{pos} Npos代表正例数量, λ \lambda λ设为 1 1 1用于平衡两种损失。求和计算在整个特征图上进行,其中 I ( ⋅ ) \mathbb{I}(\cdot) I()代表指示函数。

前向推理。 FCOS的前向是直接的。给定一张输入图像,前向通过整个网络,获得特征图上每个像素点的类别得分 p x , y \bold{p}_{x,y} px,y和回归预测 t x , y \bold{t}_{x,y} tx,y,我们选择类别得分大于0.05的作为正例,根据公式1变换获得预测的边界框。

论文翻译|FCOS: Fully Convolutional One-Stage Object Detection_第2张图片
图2:FCOS的网络结构,其中 C 3 C_3 C3 C 4 C_4 C4 C 5 C_5 C5代表主干特征图, P 3 P_3 P3 P 7 P_7 P7用于最终预测的特征层。 H × W H\times W H×W是特征图的宽和高,“ / s   ( s = 8 , 16 , . . . , 128 ) /s\ (s=8,16,...,128) /s (s=8,16,...,128)”是该特征图对应于输入图像的下采样倍数。图中以 800 × 1024 800 \times 1024 800×1024的输入图像为例。

3.2 FCOS的FPN多层级预测

本章我们展示了FCOS如何解决文章开头的两个问题。

  1. CNN最终特征图的大的stride(如16)会导致相对低的最佳可能召回(best possible recal,BPR),这个原因是由于较大stride会在某种程度上降低正例框的IOU得分。对于FCOS而言,乍一看我们的BPR肯定比anchor based方法小,这是因为在最终特征图上因为stride大,而且没有位置信息,几乎不可能召回目标。这里,我们重点想说明,即使是stride很大,FCN based FCOS也可以得到好大BPR,甚至可以好过官方实现大Detectron的anchor based RetinaNet。因此BPR对于FCOS来说不是问题。而且使用多层级FPN预测,BPR可以进一步提高,接近RetinaNet对最好水平。
  2. 重叠框会在训练过程中带来二义性模糊的问题,因为重叠区域的像素需要判断:我到底该去回归哪个框呢?这是导致FCN based模型性能较差的一个原因。在本文中,我们展示了多层级预测可以很好的解决这个问题,使FCN based模型达到甚至超过anchor based模型。

根据FPN,我们在不同层次对特征图上检测不同尺寸的物体。具体来说,我们抽出五层特征图,分别定义为 { 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_3 P3 P 4 P_4 P4 P 5 P_5 P5由主干CNN的特征图 C 3 C_3 C3 C 4 C_4 C4 C 5 C_5 C5经过一个1x1卷积横向连接得到,如图2。 P 6 P_6 P6 P 7 P_7 P7分别由 P 5 P_5 P5 P 6 P_6 P6经过一个stride=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分别对应stride 8,16,32,64,128。

不同于anchor based检测器在不同特征层上分配不同尺寸的anchor框,我们直接限制边界框的回归范围。具体来说,我们首先计算所有特征图上每个位置的回归目标 l ∗ , t ∗ , r ∗ , b ∗ l^*,t^*,r^*,b^* l,t,r,b接下来如果对于某一像素位置满足 max ⁡ ( l ∗ , t ∗ , r ∗ , b ∗ ) > m i \mathcal{\max}(l^*,t^*,r^*,b^*)>m_i max(l,t,r,b)>mi max ⁡ ( l ∗ , t ∗ , r ∗ , b ∗ ) > m i \mathcal{\max}(l^*,t^*,r^*,b^*)>m_i max(l,t,r,b)>mi ( l ∗ , t ∗ , r ∗ , b ∗ ) < m i − 1 (l^*,t^*,r^*,b^*)<m_{i-1} (l,t,r,b)<mi1,它会被设为负例,并且不会用于边界框的回归。这里 m i m_i mi是第 i i i层特征图最大的回归距离。本文中, 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 , 12 , 256 , 512 , + inf ⁡ 0,64,12,256,512,+\mathcal{\inf} 0,64,12,256,512,+inf。因为不同尺寸的目标被分配到不同特征层上,而大部分重叠都发生在尺寸差异比较大的目标之间,所以多层级的预测可以缓解上文提到的二义性问题,提高FCN based检测器的性能,使之接近anchor based检测器。实验也说明了这一点。

最后,根据[11],[12],我们在不同特征层上共享了头部网络,这样不仅可以使检测器更参数高效(parameter-efficient, 我理解为性能参数比更高,也就是达到同样性能所用的参数量更少),而且也可以提升检测性能。但是我们观察到,不同的特征层对应不同的回归尺寸范围(比如:对于 P 3 P_3 P3来说是 [ 0 , 64 ] [0,64] [0,64],对于 P 4 P_4 P4来说是 [ 64 , 128 ] [64,128] [64,128]),因此没有理由使用完全相同的头部网络作用在不同的特征层上。所以,我们使用 s i s_i si可学习的 exp ⁡ ( s i x ) \mathcal{\exp}(s_ix) exp(six)来自动调节特征层 P i P_i Pi的指数函数,而不是使用标准的 exp ⁡ ( x ) \mathcal{\exp}(x) exp(x),从而大大提升了检测性能。

FCOS的中心度(Center-ness)

在使用了多层级预测后,FCOS的性能仍然和anchor based方法有一定差距。我们观察到这是由于网络预测了很多低质量的、远离目标中心的边界框所致。

我们提出了一种简单而高效的策略来抑制这种低质量的边界框,并且不引入额外的超参数。具体来说,我们在网络中增加了一个和分类分支并列的单层网络分支来预测一个位置的“中心度”(即,该像素位置到该像素对应目标的中心的距离),如图2所示。给定某一位置的回归目标 l ∗ , t ∗ , r ∗ , b ∗ l^*,t^*,r^*,b^* l,t,r,b,中心度定义如下:
c e n t e r n e s s = min ⁡ ( l ∗ , r ∗ ) max ⁡ ( l ∗ , r ∗ ) × min ⁡ ( t ∗ , b ∗ ) max ⁡ ( t ∗ , b ∗ ) centerness=\sqrt{\frac{\mathcal{\min(l^*,r^*)}}{\mathcal{\max(l^*,r^*)}} \times \frac{\mathcal{\min(t^*,b^*)}}{\mathcal{\max(t^*,b^*)}}} centerness=max(l,r)min(l,r)×max(t,b)min(t,b)
我们开根号是为了减缓中心度的衰减。中心度的范围从0到1,因此可以使用二值交叉熵(BCE)损失来训练。这个损失加到公式2所示的损失函数上。测试的时候,最终得分(用来给预测的边界框排序)为分类的分和中心度的乘积。因此中心度可以降低远离目标中心边界框的权重,进一步说,这些低质量的边界框大概率会被NMS过滤掉,从而显著提升了检测性能。

对于采用两个IOU阈值 T l o w , T h i g e T_{low},T_{hige} Tlow,Thige来标记anchor框为正、略、负样本的anchor based检测器来说,中心度可以被看做是一种软阈值(soft threshold)。它可以在训练中被学习,不需要调参,而且模型仍然可以将任何落在边界框内的像素认为是正例(除了尺寸不属于改层的被认为是负例以外),可以为回归器获得足够多的正例。

实验

简要提一下,日后如果感兴趣再补。

COCO训练集上训练,验证集上测试和消融研究,在测试集上提交得到最终结果。

如果没额外说明:
训练:
主干resnet50,优化器SGD训练90K次迭代,初始学习率0.01,batchsize=16,学习率在60K和80K次迭代时减小10倍,衰减系数1e-4,动量0.9。用ImageNet预训练模型,RetinaNet中的初始化方法初始化其他参数,输入图像短边固定在800,长边小于等于1333。

预测:
输入图像经过模型,后处理和RetinaNet相同(包括超参数)(文中表示这些超参数再优化一下效果还能更好)。

消融分析

  1. BPR:我们看到RetinaNet还是很强的,但是在使用了多层级FPN预测后,FCOS的召回也很棒。
    论文翻译|FCOS: Fully Convolutional One-Stage Object Detection_第3张图片
  2. 二义性样本:使用了FPN后,二义性样本减小明显。
    在这里插入图片描述
  3. AP:FPN同样提升了10几个点
    在这里插入图片描述
  4. 候选框数量、存储:因为没有anchor,所以对比单个像素点上9个anchor框少了9倍的候选框数量就很显然了,与此同时,显存占用也只有一半,性能总体没掉,甚至看AP还比RetinaNet高。
    在这里插入图片描述
  5. 中心度:从上至下分别是没用中心度、使用每个像素上回归出来的向量计算得到中心度(间接的方法)、使用文中提到的额外分支预测的中心度(直接的方法)。可见这个额外分支虽然只有单层,但在全指标上都有明显的提升。

论文翻译|FCOS: Fully Convolutional One-Stage Object Detection_第4张图片

  1. RPN:FCOS可以作为two-stage模型的RPN网络,提了不少点。
    论文翻译|FCOS: Fully Convolutional One-Stage Object Detection_第5张图片
  2. 全家福:文中结果看看起来基本稳坐one-stage方法第一的宝座。但模型共享了头部网络,也减小了anchor算iou的计算量,但是全文通篇没有提到前向速度。我姑且估计是因为ResNe(X)t-50/101+FPN的多层级预测减慢了速度,可以跑跑开源代码试试。
    论文翻译|FCOS: Fully Convolutional One-Stage Object Detection_第6张图片

谢谢看到这里的朋友们的捧场!

你可能感兴趣的:(目标检测)