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