文章16
标签10
分类1

FSAF:Feature Selective Anchor-Free Module for Single-Shot Object Detection

论文名称:Feature Selective Anchor-Free Module for Single-Shot Object Detection
论文地址:传送门

Abstract

本文提出了Feature Selective Anchor-free(FSAF)模块,它是一个用于一阶段检测器的极其简单的building block,可以加入到任何有FPN结构的模型当中。

FSAF主要解决anchor-based+FPN当中的两个问题:

  1. 启发式特征选择(heuristic-guided feature selection)
  2. 基于重叠面积的样本选择(ovelap-based anchor saampling)

FSAF模块基本的概念是应用在训练过程中的多层anchor-free分支。具体来说,一个anchor-free分支被应用在FPN的每一个层上。在训练过程中,我们动态的将实例(instance)分配给最适合的特征层。在测试时,FSAF可以和anchor-based分支联合输出预测结果。

试验结果表明,FSAF在COCO数据集上比anchor-based的检测器精度更高且速度更快。在和anchor-based分支一起工作时,FSAF可以稳健的提升Retinanet的baseline。最后,加入FSAF的最好的模型在COCO上可以达到44.6%的mAP。

Introduction

目标检测当中一个很有挑战性的问题就是尺度差异(scale variation)。为了实现尺度不变,SOTA的方法都采用FPN的结构。如下图所示,可以看到40和50被分在了同一层,而60被分在另一层。

而FSAF出发点就是让每个实例选择最好的feature level来优化整个网络。具体来说,在anchor-based detector当中,每个实例的分配是人为设计的,而我们通过FSAF可以去学习这些参数,从而将实例分配到最适合的feature level上。如下图所示。

在FPN的每个level上都有一个anchor-free的分支,每个分支包含一个分类子网络和回归子网络。一个实例被分配到anchor-free的每一个分支,在训练的过程中,我们动态的选择最适合这个实例的level,而不是简单的根据其bounding box分配到一个层。在测试时,FSAF可以和anchor-based分支一起预测。

此外,FSAF也可以被应用在使用FPN的Single-Stage detector当中。

Feature Selective Anchor-Free Module

Network Architecture

RetinaNet和FSAF的网络结构如上图所示。可以看出,FSAF的结构极其简单。RetinaNet可以看作一个backbone和两个分支网络,一个cls,一个reg。而FSAF则是在cls和reg分支上分别添加一个anchor-free分支,同样的,在cls上的分支负责分类,在reg上的分支负责回归。

具体来说,FSAF在每个feature level引入了两个额外的卷积层。每个卷积层都是通过$3 \times 3$的卷积核实现的,对于cls分支则有K个卷积核,其中K为数据集类别;对于reg分支,则有4个卷积核,对应四个坐标值。

Ground-truth and Loss

对于一个实例,我们知道它的类别$k$和坐标$b=[x,y,w,h]$。
$b_p^l=[x_p^l,y_p^l,w_p^l,h_p^l]$ 是$b$在特征金字塔的$l$层$P_l$上的映射。
$b_e^l=[x_e^l,y_e^l,w_e^l,h_e^l]$ 是有效框,表示一个框的中心位置,如下图的白色区域。
$b_i^l=[x_i^l,y_i^l,w_i^l,h_i^l]$ 是忽略框,如下图灰色区域。
对于一个框内其他部分则被作为负样本,其值都是0.

在本文中,设定了有效框的范围为0.2,忽略框的范围为0.5.

Classification Output

cls分支的输出是K个分类图,每个图对应一个类别。我们对ground truth map有以下定义:

  1. 有效框(上图白色区域)的值为1
  2. 忽略框(灰色区域)的值不会回传到网络当中
  3. 相邻特征图的忽略框也是此特征图的忽略区域。

loss选择Focal Loss,cls总的loss是所有有效框的和,并使用像素总数进行normalize。

Box Regression Output

回归的ground truth是与类别无关的4个offset maps。对于有效框内的一个像素点$(i,j)$,我们定义$d_{i,j}^l=[d_{t_{i,j}}^l,d_{l_{i,j}}^l,d_{r_{i,j}}^l,d_{b_{i,j}}^l ]$,分别表示点到框四边的距离。有效框外的区域被忽略。loss选择IOU Loss,总的回归Loss所有有效框的平均值。

在inference的时候,可以直接解码出bbox和class,每个框的分数可以从classification map中得出。

Online Feature Selection

FSAF的出发点就是通过学习选择出最适合每一个实例的特征层,而不是根据框的大小直接分配。对于一个实例$I$,我们定义其分类Loss和回归Loss分别是$L_{FL}^I(l)$和$L_{IoU}^I(I)$。($l$表示FPN中的$l$层)
$$\begin{aligned} L_{F L}^{I}(l) &=\frac{1}{N\left(b_{e}^{l}\right)} \sum_{i, j \in b_{e}^{l}} F L(l, i, j) \ L_{I o U}^{I}(l) &=\frac{1}{N\left(b_{e}^{l}\right)} \sum_{i, j \in b_{e}^{l}} L_{IoU}(l, i, j) \end{aligned}$$
其中$N(b_e^l)$表示$b_e^l$中的像素总数。

上图表示在线特征选取的过程。每个实例都通过所有feature level的anchor-free分支,然后计算每一层总的Loss,最后将实例分配到Loss最小的那一层。
$$l^{*}=argmin_{l} (L_{F L}^{I}(l)+L_{I o U}^{I}(l))$$

对于一个训练的batch,features负责的实例被更新。其目的是选择最适合这个实例的特征。通过训练,我们可以进一步提高其下界(也就是说,无论其被分配到哪个层,都有较好的检测效果)。在测试的时候,我们不需要选择特征,因为最适合的特征层可以输出较高的置信度。
有个问题:刚开始训练的时候,某个实例被分配的特征层应该会不断地移动吧?

Joint Inference and Training

FSAF可以和RetinaNet一起工作。在Inference时,FSAF分支的输出结果也可以解码出bbox,我们经过置信度0.05后,在每一个feature level上选择1k个top-scoring locations,然后和anchor-based branch一起使用NMS进行筛选。

优化: 整个网络的Loss包括anchor-based的和anchor-free的。
$$
L=L^{a b}+\lambda\left(L_{c l s}^{a f}+L_{r e g}^{a f}\right)
$$
本文将$\lambda$设置为0.5。整个网络使用SGD,在8块GPU上训练,每个GPU两张图像。

Experiments

整个实验在COCO上进行,训练数据是COCO trainval35k,包含来自train的80k图像,和来自val的35k图像,测试时使用minival的5k图像,在比较精度时,使用的是test-dev。

Ablation Studies

Anchor Free branches are necessary. FSAF更擅长哪些具有挑战的物体,如小物体,特别瘦长的物体及那些不能被anchor boxes覆盖的物体。

Online feature selection is essential. 可以看到FSAF也遵循大的目标分配在高层,小的目标分配在底层的规则,然而FSAF和RetinaNet检测的也有些许的不同。

FSAF module is robust and efficient.

Comparison to State of the Art

Conclusion

FSAF在FPN特征选层这个问题上做了深入的探讨,并通过加入很小的head,实现了动态的分配实例,而不是根据其尺寸进行分配,因而进一步提升了精度,却没有引入多少计算量。

另外刚好最近读了FCOS,发现两者还是有很大的相似之处。不同的是FSAF是将FCN加入到RetinaNet当中,而FCOS是加入center-ness,直接使用FCN。

FCOS中center-ness的效果

FSAF精度

FCOS精度对比

有没有觉得,FCOS比FSAF高的那3.6(41.5-37.9)是从center-ness中来的?
接下来我也会实验一下,看看FSAF+center-ness的效果怎么样。

FCOS:全卷积一阶段目标检测模型

论文名称:FCOS: Fully Convolutional One-Stage Object Detection
论文地址:传送门

Introduction

目前主流的目标检测模型如Faster R-CNN,SSD,YOLO都需要预设一些anchor。
虽然他们的效果都不错,但是它们有一些缺点:

  1. 检测效果对参数敏感,如anchor的sizes,ratios,numbers
  2. 因为其anchor的设计是固定的,对于有较大差异的图像,尤其是小目标的检测效果并不好。
  3. 为了达到检测效果,anchor boxes过多,如短边800的图像在FPN中将产生180K anchor boxes。
  4. IoU计算耗时。

基于FCN的方法在语义分割等任务上取得了很好的效果。由于anchor的使用,目标检测到目前还没有从FCN中受益。

之前采用FCN进行检测的工作主要集中在特定的领域,如Face detection,Text Detection,主要是FCN在Generic Object Detection上效果并不好。主要原因是:以FCN方式检测时很难处理物体的重叠问题。

在本文中,作者采用FPN,很大程度上解决了重叠所造成的ambiguity。
同时由于本文的方法产生了很多远离目标中心的低质量的点,因此作者提出了“centerness”的概念,来衡量点接近目标中心的程度。通过“centerness”,越靠近中心的点,权重越高,远离中心的点,则权重降低。

Implement Details

FCOS模型示意图

如上图模型,可以看出FCOS的结构确实十分的优雅,输入一张影像,输出三个branch:classification,centerness,regression,且每个branch的大小都是对应featmap的尺寸$H \times W$.

Fully Convolutional One-Stage Object Detector

首先有一些定义:
$F_i \in R^{H \times W \times C}$: CNN产生的第i个featmap
$B_i = (x_0^i,y_0^i,x_1^i,y_1^i,c^i) \in R^4 \times {1,2 \dots C}$: 图像的ground-truth bounding box。
$s$: 当前featmap与输入图像间总共的strides。

对于$F_i$上的一个点$(x,y)$,我们可以直接映射到原图像的$([\frac{s}{2}]+xs,[\frac{s}{2}]+ys)$。
相较于传统基于anchor的检测方法,FCOS直接将每一个点当作训练样本。换句话说,在基于anchor的检测方法中,每一个anchor box从featmap上抠出来,然后通过cls和reg,得到类别和坐标;而FCOS直接将每个点当作样本,featmap上的每个点都能产生一个类别和预测一个box,也就是所谓的semantic segmentation style。

具体来说,对于classification任务,如果一个点落在了一个ground-truth box内,那么它就是正样本,类别$c^*$为ground-truth box的类别;如果其落在box外,那么$c^*=0$。

同时还有regression任务。每个点都定义一个4D向量,$t^*=(l^*,t^*,r^*,b^*)$,其中$l^*,t^*,r^*,b^*$分别为此点到它所在gt_box的四边的距离。

如果一个点落在了多个gt_box内,则其被称为ambiguous sample,则选择最小面积的哪个gt_box作为回归的目标。在下一部分我们会看到FCOS使用FPN来解决这个问题。

即如果一个点$(x,y)$落在了$B_i$中,那么回归目标可以定义为:
$$l^*=x-x_0^i,t^*=y-y_0^i,r^*=x_1^*-x,b^*=y_1^*-y$$

Network Outputs. 如上图模型示意图,模型最后输出一个80D的classification vector,一个4D的coordinates vector。

Loss Function.
$$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} 1_{c_{x,y}^*>0} L_{reg}(t_{x,y},t_{x,y}^*)$$

其中$L_{cls}$为Focal Loss,$L_{reg}$为IOU Loss。

inference. 对于一张输入影像,直接输出每个featmap的$p_{x,y}$和$t_{x,y}$,然后选择出$p_{x,y}>0.05$的样本作为正样本,接着从$t$中反解出bounding box。

Multi-level Prediction with FPN for FCOS

FCOS采用FPN来解决FCN目标检测中存在的重叠问题。

在构建FPN时,FCOS共定义了5个level,${P_3,P_4,P_5,P_6,P_7}$. 其中${P_3,P_4,P_5}$是有CNN的${C_3,C_4,C_5}$产生的。${P_6,P_7}$是分别在${P_5,P_6}$上添加一个步长为2的卷积层产生的。至此,${P_3,P_4,P_5,P_6,P_7}$的步长分别为8,16,32,64,128.
作者之所以不采用原FPN中的$P_2$,可能是$P_2$特征较浅,效果不好,且参与运算的样本更多。

我们知道FPN与Fast R-CNN结合时,是将RPN的anchor根据大小分配到不同level的featmap上,而在FCOS中,作者也将点分配到不同的level上,同时又解决了重叠的问题。

首先,点在不同level分配的原则时:根据回归距离的大小。也就是回归距离小的点分配到底层如$P_3$,而回归距离较大的层则分配到顶层如$P_7$。具体来说,如果:
$$max(l^*,t^*,r^*,b^*)>m_i$$
或者
$$max(l^*,t^*,r^*,b^*)< m_{i-1}$$
那么这个样本被定义为负样本,不参与box回归。其中$m_2,m_3,m_4m_5m_6$被设置为0,64,128,256,512和∞。

由于小目标被分配在了不同的层,因此重叠问题很大程度降低了。如果此时还有多个box重叠,那么取最小面积的哪个作为回归目标。

Center-ness for FCOS

尽管使用了FPN,但是FCOS和anchor-based detector之间仍存在精度差异。作者认为其是由于FCOS产生了大量的低质量的远离目标中心的点导致的。因此作者定义了一个centerness,根据目标与回归中心的距离,为不同的点赋予不同的权重。其定义如下:

$$centerness^* = \sqrt(\frac{min(l^*,r^*)}{max(l^*,r^*)},\frac{min(t^*,b^*)}{max(t^*,b^*)})$$

使用sqrt主要是为了降低centerness的decay。centerness的范围为$[0-1]$,使用BCE Loss。
在训练时,$L_{center}$和$L_{cls}$,$L_{reg}$一起训练;在测试时,centerness_score与cls_score相乘,然后在排序筛选出得分较高的box。

Summary

总的来说FCOS还是十分的work的,与Faster R-CNN相比,模型的结构也十分的优雅。
刚接触Detection时我也在想为什么不用Segmentation的方式进行检测,主要原因是物体的重叠问题,而FCOS使用FPN很大程度解决了这个问题。
同时作者提出的Centerness可以减少low-level的点,在预测时可以较少错误检测。

但是相比于其他模型的输入300300,FCOS直接使用8001024的图像,精度自然会高许多,然后还有GN等tricks。
同时每次训练时得到target也挺耗时的,不过知乎有大佬指出可以把这部分放在data_loader里。

如果想要改进的话,感觉还可以从FCN导致的重叠做起,找到一种较为完美的解决重叠的方法。
看到Github已经有issue问是否要做instance segmentation,作者说已经在做了。去arxiv找了下,商汤已经有人做了PolarMask