论文地址:https://arxiv.org/pdf/1904.01355.pdf
代码地址:https://github.com/tianzhi0549/FCOS
作者提出了一个全卷积单阶段的目标检测器(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的单阶段检测器。这是圈内第一次有一个更简洁更灵活的框架,实现更高的检测准确率。
目标检测在计算机视觉领域很基础也很具有挑战性,它需要算法对图像中的每个实例物体预测一个边框及其类别。所有主流的检测器如 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 右所示,高度重叠的边框会造成界限不明确:很难理清重叠部分的像素点应该属于哪一个边框。
接下来,我们仔细地研究了这个问题,并且证明 FPN 能有效地解决这种不明确的问题。我们的方法已经可以取得和传统基于 anchors 方法一样的检测准确率。而且,我们发现 FCOS 会在远离目标物体中心的位置上产生一些效果不好的预测边框。为了降低这些不好的检测结果,我们引入了一个 “center-ness” 分支(只有一层),预测像素点到目标边框中心的距离(公式3)。这个分数然后用于降低效果不好的边框的权重,然后用 NMS 将检测结果合并。Center-ness 分支很简单,也很有效。有了它,在同样的训练和测试环境下,我们基于 FCN 的检测器就能超过基于 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 检测器应该是 YOLOv1。YOLOv1没有使用 anchor boxes,它在目标物体的中心附近预测边框。在物体的中心位置检测,通常效果更好,所以 YOLOv1 只考虑中心附近的点。但是,又因为只考虑了中心附近的点来预测边框,YOLOv1 的召回率就比较低。结果呢,YOLOv2 也不得不用了 anchor boxes。和 YOLOv1 相比,FCOS 利用了 ground truth 边框中所有的点来预测边框,通过 center-ness 分支来抑制那些效果不行的检测边框。这样子,FCOS 就可以获得和基于 anchor 的检测器相同的召回率。
CornerNet 最近也提出了单阶段不需要 anchor 的检测器,它检测边框的两个拐角,将这两个拐角组成一组,形成最终的检测边框。CornerNet 需要复杂的后处理过程,将同一实例的拐角分组。这样为了学习如何分组,就需要学习一个额外的用于分组的距离 metric。
首先,我们将目标检测任务以逐个像素点预测的方式重新表示。然后,我们使用多层级预测的方式来提升召回率,解决了重叠边框引发的歧义。最后,我们提出了 center-ness 分支,抑制那些质量差的检测边框,提升整体性能。
设 F i ∈ R H × W × C F_i \in \mathbb{R}^{H\times W\times C} Fi∈RH×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∗=x−x0(i),t∗=y−y0(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,y∑Lcls(px,y,cx,y∗)+Nposλx,y∑1cx,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获得预测边框。
这一节讨论如何解决FCOS 可能遇到的两个问题:
接着 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。
基于 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∗)<mi−1,它就被设为负样本,就不需要回归边框。 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 的指数函数的底数,从而提升性能。
使用了多层级预测后,在 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 边框的点看作正样本,除了那些在多层级预测中已经被标注为负样本的点,在回归器中就可以使用尽可能多的训练样本。
Pls read paper for more details.