FCOS: Fully Convolutional One-Stage Object Detection 论文学习

FCOS: Fully Convolutional One-Stage Object Detection

  • Abstract
  • 1. Introduction
  • 2. Related Work
    • 基于 Anchor 的检测器
    • Anchor-free 检测器
  • 3. 方法
    • 3.1 全卷积单阶段检测器
      • 网络输出
      • 损失函数
      • 前向推理
    • 3.2 Multi-level prediction with FPN for FCOS
    • 3.3 Center-ness
  • 4. Experiments

论文地址:https://arxiv.org/pdf/1904.01355.pdf

代码地址:https://github.com/tianzhi0549/FCOS

Abstract

作者提出了一个全卷积单阶段的目标检测器(FCOS),逐像素点预测的方式来解决目标检测问题,类似于语义分割任务。几乎所有的 state of art 的目标检测器都需要使用 anchor boxes,如 RetinaNet, SSD, YOLOv3, 和 Faster R-CNN。然而,我们提出的目标检测器FCOS不需要 anchors,也不需要 proposals。去掉了anchor boxes,FCOS 就可以完全避免关于 anchor boxes 复杂的计算,比如在训练时我们要计算重叠区域面积,这样就极大地降低了训练内存消耗。更重要的是,我们也排除了所有与 anchor boxes 有关的超参数,这些超参对最终的检测性能影响很大。我们的检测器更简洁,FCOS 只有一个后处理步骤—非最大抑制(NMS),它超过了之前基于anchor的单阶段检测器。这是圈内第一次有一个更简洁更灵活的框架,实现更高的检测准确率。

1. Introduction

目标检测在计算机视觉领域很基础也很具有挑战性,它需要算法对图像中的每个实例物体预测一个边框及其类别。所有主流的检测器如 SSD, Faster R-CNN, YOLO 都需要用到一个预先定义好的 anchor boxes 集合,而且人们也认为 anchor boxes 对检测器的效果至关重要。尽管这些算法很成功,但是我们也应注意到它们有以下问题:

  • 检测效果对 anchor boxes 的大小,宽高比,和个数很敏感。例如,RetinaNet 在 COCO 基准上,anchor boxes 的超参数的改动会造成 AP 值上下 4 % 4\% 4%的浮动。因此这些超参数需要花大力气去调。

  • 哪怕 anchor boxes 是精心设置过的,由于它们的 scales 和宽高比都是固定的,检测器在面对形状变化剧烈的物体时也比较困难,尤其是针对小物体时。

  • 为了获得高召回率,基于 anchor 的检测器需要在输入图像上摆放密集的 anchor boxes(如 FPN 在短边长度为800的图像上需要摆放 18万个 anchor boxes)。绝大多数的 anchor boxes 在训练中都会被标注为负样本。大量的负样本会造成训练过程中正负样本的不均衡。

  • 大量的 anchor boxes 也会造成计算量的激增和内存的消耗,当计算 anchor boxes 和真值边框的IOU时。

最近,全卷积网络 FCN 在密集预测的任务如语义分割,深度估计,关键点检测上取得了不错的效果。在视觉任务中,目标检测可能是唯一一个没有应用全卷积逐像素点预测的框架,主要还是由于 anchor boxes 的使用。那么,我们是否能像语义分割中的 FCN 那样使用逐像素点预测的方式来解决目标检测问题呢? 这样子,视觉任务中所有的问题都可以用一个框架来解决。这篇论文证明了,这是可以的。而且,这篇论文第一次证明,和基于 anchors 的检测器相比,更简单的基于 FCN 的检测器可以取得更好的效果。

在学术研究中,有一些方法尝试将全卷积框架用于目标检测,如 DenseBox 和 UnitBox。这些基于 FCN 的框架在每层特征图的每个空间位置上,直接预测一个 4D 向量加一个类别。如图1左所示,这个 4D 向量表示像素点到4个边框的距离。这些框架和语义分割中的全卷积网络类似,只是每一个点都需要回归一个4D的连续向量。但是为了应付不同大小的边框,DenseBox 将图像缩放到一个固定尺寸。这样的话,DenseBox 不得不在图像金字塔上进行检测,这和 FCN 的一次处理完所有卷积的方式相悖。而且,这些方法主要只能用于特殊场景下的目标检测,如文字检测和人脸检测,因为有观点认为这些方法应用在通用目标检测任务上效果不会很好,往往它们具有高度重叠的边框。如图1 右所示,高度重叠的边框会造成界限不明确:很难理清重叠部分的像素点应该属于哪一个边框。

FCOS: Fully Convolutional One-Stage Object Detection 论文学习_第1张图片

接下来,我们仔细地研究了这个问题,并且证明 FPN 能有效地解决这种不明确的问题。我们的方法已经可以取得和传统基于 anchors 方法一样的检测准确率。而且,我们发现 FCOS 会在远离目标物体中心的位置上产生一些效果不好的预测边框。为了降低这些不好的检测结果,我们引入了一个 “center-ness” 分支(只有一层),预测像素点到目标边框中心的距离(公式3)。这个分数然后用于降低效果不好的边框的权重,然后用 NMS 将检测结果合并。Center-ness 分支很简单,也很有效。有了它,在同样的训练和测试环境下,我们基于 FCN 的检测器就能超过基于 anchor 的检测器。

这个新的检测框架有以下优势:

  • 检测任务现在可以和其它用 FCN 能解决的任务统一起来,如语义分割。
  • 检测任务无需 proposal 和 anchor,这极大地降低了设计参数的个数,那些参数通常需要各种调参技巧才能获得优异的效果;FCOS 这样就变得很简单。而且,移除了 anchor boxes,我们的检测器就能完全避免复杂的 IOU 计算,降低内存消耗。
  • FCOS 单阶段检测器取得的成绩是 state of art,FCOS 也可作为 RPN 而用于双阶段检测器,取得的效果也要好于基于 anchor 的 RPN。
  • FCOS 检测器可被迅速地推广到其它视觉任务上,只需稍微改动,如实例分割和关键点检测。

2. Related Work

基于 Anchor 的检测器

基于 anchor 的检测器继承了传统的滑动窗和基于 proposals 的检测器,如 Fast R-CNN。在基于 anchor 的检测器中,anchor boxes 可以看作一个预先定义好的滑动窗或 proposals,然后被分类为正样本或负样本,再加一个额外的偏移回归来修正边框位置的预测。因此,这些检测器中的 anchor boxes 可以看作为训练样本。与过去的检测器不同,如 Fast RCNN 对每个滑动窗都重复计算图像特征,anchor boxes 利用卷积网络的特征图,避免了重复的特征计算,极大地提高了检测速度。Anchor boxes 在 Faster R-CNN,SSD,YOLOv2 中很常用。

但是 anchor boxes 会带来很多超参数去调。除了需要一些超参数来定义 anchor boxes 的形状和大小,还需要阈值超参数来确定某个 anchor box 是否为正样本,还是负样本。常用方法是通过 anchor box 和 ground truth box 之间的 IOU 来确定。这些超参对最终的准确率影响很大。同时,这些超参也因检测任务而异,使得检测任务没法像语义分割中的全卷积网络那样简洁。

Anchor-free 检测器

最常用的 anchor-free 检测器应该是 YOLOv1。YOLOv1没有使用 anchor boxes,它在目标物体的中心附近预测边框。在物体的中心位置检测,通常效果更好,所以 YOLOv1 只考虑中心附近的点。但是,又因为只考虑了中心附近的点来预测边框,YOLOv1 的召回率就比较低。结果呢,YOLOv2 也不得不用了 anchor boxes。和 YOLOv1 相比,FCOS 利用了 ground truth 边框中所有的点来预测边框,通过 center-ness 分支来抑制那些效果不行的检测边框。这样子,FCOS 就可以获得和基于 anchor 的检测器相同的召回率。

CornerNet 最近也提出了单阶段不需要 anchor 的检测器,它检测边框的两个拐角,将这两个拐角组成一组,形成最终的检测边框。CornerNet 需要复杂的后处理过程,将同一实例的拐角分组。这样为了学习如何分组,就需要学习一个额外的用于分组的距离 metric。

3. 方法

首先,我们将目标检测任务以逐个像素点预测的方式重新表示。然后,我们使用多层级预测的方式来提升召回率,解决了重叠边框引发的歧义。最后,我们提出了 center-ness 分支,抑制那些质量差的检测边框,提升整体性能。

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是该层之前的总共步长。输入图像的 ground truth 边框定义为 { B i } , B i = ( x 0 ( i ) , y 0 ( i ) , x 1 ( i ) y 1 ( i ) , c ( i ) ) ∈ R 4 × { 1 , 2 , . . . , C } . \{B_i\}, B_i = (x_0^{(i)}, y_0^{(i)}, x_1^{(i)} y_1^{(i)}, c^{(i)}) \in \mathbb{R}^4 \times \{1,2,...,C\}. {Bi},Bi=(x0(i),y0(i),x1(i)y1(i),c(i))R4×{1,2,...,C}. 这里 ( x 0 ( i ) , y 0 ( i ) ) (x_0^{(i)}, y_0^{(i)}) (x0(i),y0(i)) ( x 1 ( i ) y 1 ( i ) ) (x_1^{(i)} y_1^{(i)}) (x1(i)y1(i)) 分别表示边框左上角和右下角的坐标。 c ( i ) c^{(i)} c(i)表示边框物体的类别。 C C C是类别的总数,对于 COCO 数据集而言, C = 80 C=80 C=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 + xs, \lfloor \frac{s}{2} \rfloor + ys) (2s+xs,2s+ys)映射回输入图像上,这个位置靠近 ( x , y ) (x,y) (x,y)感受野的中心。基于 anchor 的检测器将输入图像上的位置作为 anchor boxes 的中心,然后对这些 anchor boxes 回归出目标边框。而我们的方法是直接在每个位置上回归出目标边框。也就是说,我们的检测器直接将每个点看作训练样本,而不是将 anchor boxes 看作训练样本,这和语义分割中的 FCN 一样。

如果 ( x , y ) (x,y) (x,y)落入一个 ground truth 边框内,它就被标注为正样本,该位置的标签 c ∗ c^* c就是 B i B_i Bi的标签。否则它就是负样本, c ∗ = 0 c^* = 0 c=0(背景类)。除了分类的标签,我们也有一个4D的向量 t ∗ = ( l ∗ , t ∗ , r ∗ , b ∗ ) t^* = (l^*,t^*,r^*,b^*) t=(l,t,r,b)作为每一个样本回归的目标。 l ∗ , t ∗ , r ∗ , b ∗ l^*,t^*,r^*,b^* l,t,r,b分别表示该位置到边框四个边的距离。如果一个点落入多个边框之中,它就被视作模糊样本。就目前来说,我们只选取最小面积的边框作为回归的目标。下一节中,我们将展示多层级预测,模糊样本的个数就会减少很多。如果位置 ( x , y ) (x,y) (x,y)与边框 B i B_i Bi相关联,该位置的回归目标可定义如下:
l ∗ = x − x 0 ( i ) , t ∗ = y − y 0 ( i ) , r ∗ = x 1 ( i ) − x , b ∗ = y 1 ( i ) − y l^* = x - x_0^{(i)}, t^*=y-y_0^{(i)}, r^*=x_1^{(i)}-x, b^*=y_1^{(i)}-y l=xx0(i),t=yy0(i),r=x1(i)x,b=y1(i)y

有一点要注意到,FCOS 能利用尽可能多的前景样本来训练回归器。这和基于 anchor boxes 的检测器不同,它们只将那些和 ground truth边框 IOU 足够高的 anchor boxes 当作正样本。我们认为也许这是FCOS 比基于 anchor 的检测器效果好的原因之一。

网络输出

与训练目标对应,最后一层预测一个类别标签的 80 维的向量 p p p,以及一个4维的向量 t = ( l , t , r , b ) t=(l,t,r,b) t=(l,t,r,b) 对应着边框坐标。我们训练 C C C个二元分类器,而不是一个多类别分类器。我们在主干网络特征图之后增加4个卷积层,分别对应分类和回归分支。而且,由于回归目标通常是正的,我们在回归分支上面用 e x p ( x ) exp(x) exp(x)将任意实数映射到 ( 0 , ∞ ) (0, \infty) (0,)之内。FCOS 的参数个数要比基于 anchor 的检测器少9倍,因为一般基于 anchor 的方法在每个位置上会有9个 anchor boxes。

损失函数

定义损失函数如下:
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 1 c x , y ∗ > 0 L r e g ( t x , y , t x , y ∗ ) L(\{p_{x,y}\},\{t_{x,y}\}) = \frac{1}{N_{pos}}\sum_{x,y} L_{cls}(p_{x,y}, c^*_{x,y}) + \frac{\lambda}{N_{pos}}\sum_{x,y}\mathbb{1}_{c^*_{x,y} > 0} L_{reg}(t_{x,y}, t^*_{x,y}) L({px,y},{tx,y})=Npos1x,yLcls(px,y,cx,y)+Nposλx,y1cx,y>0Lreg(tx,y,tx,y)

L c l s L_{cls} Lcls是 focal loss, L r e g L_{reg} Lreg是IOU loss。 N p o s N_{pos} Npos 表示正样本的个数,在这篇论文中 λ = 1 \lambda = 1 λ=1用于平衡 L r e g L_{reg} Lreg的权重。对特征图 F i F_i Fi上的各个位置的结果进行求和。 1 c ∗ > 0 \mathbb{1}_{c^* > 0} 1c>0 是指标函数,它等于1,当 c i ∗ > 0 c^*_i>0 ci>0时候,否则为0。

前向推理

FCOS 的前向推理很直接。给定输入图片,前向通过整个网络,获得特征图 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,则它被列为正样本,然后通过等式1获得预测边框。

3.2 Multi-level prediction with FPN for FCOS

这一节讨论如何解决FCOS 可能遇到的两个问题:

  • 最后一个特征图上较大的步长(比如16 × \times ×)可能导致 best possible recall(BPR) 较低。对于基于anchor 的检测器,因步长较大而导致召回率低的问题,可以通过降低判断正样本的 IOU 阈值来弥补。对于FCOS,人们可能会认为它的 BPR 会比基于 anchor 的方法低很多,因为步长很大,最终的特征图上不会有位置来编码物体信息。这里呢,我们证明即使步长很大,基于 FCN 的 FCOS 也能产生足够好的 BPR。而且,它甚至要比基于 anchor 的 RetinaNet 要好。因此,BPR 在 FCOS 就不是一个问题。而且,利用多层级 FPN 预测,BPR 能被进一步提升,达到 RetinaNet 的最好成绩。
  • Ground truth 边框的重叠区域会造成训练中的不明确,到底重叠区域内的位置应该回归到哪个边框里去?这个问题导致基于 FCN 的检测器性能降低。我们证明这种不明确问题可以通过多层级预测解决,和基于 anchor 的检测器相比较,基于 FCN 的检测器能取得更优的成绩。

接着 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 1\times 1 1×1的卷积层而产生,如图2所示。 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 8, 16, 32, 64, 128 8,16,32,64,128

FCOS: Fully Convolutional One-Stage Object Detection 论文学习_第2张图片

基于 anchor 的检测器在不同特征层上分配不同大小的 anchor boxes,而我们是直接限定边框回归的范围。更具体点,我们首先在所有特征层上的每个位置计算回归目标 l ∗ , t ∗ , r ∗ , b ∗ l^*, t^*, r^*, b^* l,t,r,b。然后,如果一个位置满足 m a x ( l ∗ , t ∗ , r ∗ , b ∗ ) > m i max(l^*, t^*, r^*, b^*)>m_i max(l,t,r,b)>mi或者 m a x ( l ∗ , t ∗ , r ∗ , b ∗ ) < m i − 1 max(l^*, t^*, r^*, b^*)<m_{i-1} max(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 , 128 , 256 , 512 , ∞ 0, 64, 128, 256, 512, \infty 0,64,128,256,512,。因为不同大小的物体被分配到不同的特征层,而绝大多数的重叠物体彼此间的大小很不一样,多层级预测能极大地缓解前面提到的重叠区域模糊问题,因而提升 FCN 检测器的精度。

最后,我们在不同的特征层级间共享 heads,提升了检测器的效率和性能。但是我们发现不同特征层级需要回归不同的大小范围(比如对 P 3 P_3 P3 [ 0 , 64 ] [0, 64] [0,64],对 P 4 P_4 P4 [ 64 , 128 ] [64, 128] [64,128]),因而对不同的特征层级使用一样的 heads 是不合理的。所以,除了使用标准的 e x p ( x ) exp(x) exp(x),我们也有用 e x p ( s i x ) exp(s_i x) exp(six) s i s_i si是一个可训练的标量,自动调节特征层 P i P_i Pi 的指数函数的底数,从而提升性能。

3.3 Center-ness

使用了多层级预测后,在 FCOS 和基于 anchor 的检测器间还有一道鸿沟要跨越。我们发现,在远离物体中心的位置,有许多质量差的预测边框。

我们提出了一个简单却很管用的方法来抑制这些低质量的边框,而无需引入额外的超参。我们仅增加了一层分支预测位置的 center-ness(该位置到对应物体中心的距离),它和分类分支平行,如图2所示。给定某位置的回归目标 l ∗ , t ∗ , r ∗ , b ∗ l^*, t^*, r^*, b^* l,t,r,b,center-ness 目标函数定义如下:

c e n t e r n e s s ∗ = m i n ( l ∗ , r ∗ ) m a x ( l ∗ , r ∗ ) × m i n ( t ∗ , b ∗ ) m a x ( t ∗ , b ∗ ) centerness^* = \sqrt{\frac{min(l^*, r^*)}{max(l^*, r^*)} \times \frac{min(t^*, b^*)}{max(t^*, b^*)}} centerness=max(l,r)min(l,r)×max(t,b)min(t,b)

我们用 \sqrt{} 是为了降低 center-ness 衰减的速度。Center-ness 值的范围从0到1,通过二元交叉熵损失来训练。这个损失然后加到等式2 的损失函数中去。测试时,将预测的 center-ness 和对应的分类得分相乘,得到最终的得分,再用这个得分对检测边框进行排名。这样,这个 center-ness 就可以降低那些远离物体中心边框的得分。在最后的 NMS 过程中,这些低质量的边框就会很大概率上被剔除,提升检测效果。

基于 anchor 的检测器使用2个 IOU 阈值 T l o w , T h i g h T_{low}, T_{high} Tlow,Thigh 来将 anchor box 标为负样本,忽略,和正样本。而 center-ness 可以看作为一个 soft 阈值。Center-ness 通过模型训练来学习,而无需手动去调。而且依据此方法,我们的检测器仍可以将任意落入 ground truth 边框的点看作正样本,除了那些在多层级预测中已经被标注为负样本的点,在回归器中就可以使用尽可能多的训练样本。

FCOS: Fully Convolutional One-Stage Object Detection 论文学习_第3张图片

4. Experiments

Pls read paper for more details.

你可能感兴趣的:(图像识别,深度学习,目标检测)