FCOS: Fully Convolutional One-Stage Object Detection

论文地址

背景介绍

FCOS是比较有代表性的anchor free的检测模型,论文中作者的研发思路都是与RetinaNet进行比较,有针对性的进行改进。

作者总结了anchor based模型的四个缺点

  1. 模型最终的表现对anchor尺寸大小的设置非常敏感
  2. 就算是小心设计过的anchor,在处理一些特殊的物体上能力也不够,这样也就限制了模型的泛化性,并且对于不同的数据集需要重新设计anchor的尺寸和大小,才能更好的拟合数据
  3. 为了提升recall,通常会设计大量的anchor,导致正负样本不均衡
  4. 使用anchor会引入复杂的计算,因为需要计算IOU来进行正负样本的划分

并且作者总结了anchor free模型的五大优点

  1. anchor free的模型结构与分割方法非常相似,可以服用分割的模型结构
  2. 不需要人工设计anchor
  3. 不用在训练的过程中计算IOU,会加快训练速度
  4. 可以将anchor free的模型用作two-stage模型的RPN网络,也能得到更高的精度
  5. anchor free的模型切换到其他任务,比如分割,关键点,也非常容易

之前比较被人熟知的anchor free方法应该就是YOLOv1,但是YOLOv1中如果目标的中心点落在某在格子中,这个格子会负责预测这个目标,但是问题是每个目标都只有一个格子负责预测,会导致最终的recall比较低。

另外还有一种anchor free的方法是CornerNet,这个模型是预测框的左上和右下的两个角点,最后还要使用聚类的方法将同一目标的角点聚合在一起,所以后处理上比较复杂。

FCOS方法介绍

网络机构

上图就是FCOS基本的网络结构,需要进一步深入分析的有如下几个部分:

  • FPN结构以及如何分配FPN负责的bbox尺寸
  • Head中的Classification
  • Head中的Center-ness
  • Head中的regression
  • 网络最终的loss

Head中的Classification和Regression

这部分是Anchor free的核心,所以先介绍这个分支。

anchor-based方法的分类和回归都是针对anchor box来进行的,但是现在FCOS是针对每个像素点来进行的,是像素点级别的分类和回归,所以与分割模型非常相似。

如果feature map上的一个点(x, y),还原到原图的位置,这里说的还原到原图的公式是(\left \lfloor \frac{2}{s} \right \rfloor +xs,\left \lfloor \frac{2}{s} \right \rfloor +ys)。如果还原到原图后的坐标是落在gt box中的,那么就认为feature map上的这个(x,y)是正样本,它的类别就是落入的这个box的类别c^*。否则就是负样本,c^*=0。分类分支就是这样对feature map上的像素点进行分类,与分割的模型确实非常像。

如果(x,y)是正样本,那么还会预测一个4维向量t^*=(l^*,t^*,r^*,b^*),这个向量是相对(x,y)的上下左右偏移,看下图:

GT的box可以表示为B_i=(x_0^{(i)},y_0^{(i)},x_1^{(i)},y_1^{(i)},c^{(i)}),这里(x_0^{(i)},y_0^{(i)})(x_1^{(i)},y_1^{(i)})代表左上和右下的角标。那么有公式:

这里的(l^*,t^*,r^*,b^*)需要保证为正数,所以预测的结果会进行exp计算。

但是这里存在一个漏洞,如上图右边的那幅图展示的,如果两个box有重叠,那么上面的点应该是属于哪个box的正样本?这里粗暴的处理就是将这个点分配给面积更小的框,后面在FPN的部分会介绍通过FPN的处理,这种重叠的例子不会对精度有太大的影响。

总结一下分类和回归分支的输出:

  1. 分类分支输出为HxWxC,C是所有类别数+1
  2. 回归分支的输出为HxWx4,每个像素预测4个偏移值

Loss函数

分类分支每个位置都会进行分类loss计算,回归分支只计算正样本。

FPN

使用FPN结构能够改善两个问题:

  1. 低BPR(best possible recall)的问题。其实FCOS本身的BPR就不会低,因为会对box内的每个像素都当作正样本,但是使用了FPN结构后,BPR会进一步提高,因为一个目标可能会在多个feature层被预测出来。
  2. 能解决大部分重叠框的问题,因为FPN的不同feature层会预测不同尺寸的目标,所以,重叠的box大部分会被分配到不同的feature层进行预测。

最终的输出有5层feature map,分别是{{P_3,P_4,P_5,P_6,P_7}},P_3,P_4,P_5是通过C_3,C_4,C5经过1x1卷积,并且与下一层上采样后相加而得到的。P_6,P_7就是通过P_5,P_6经过两倍下采样得到的。

{P_3,P_4,P_5,P_6,P_7}分别是下采样8,16,32,64,128倍。

anchor-based模型在分配box属于哪层feature的时候,是通过IOU计算的,FCOS不会使用这种方法。

FCOS会对目标框进行不同尺寸范围的划分,m_2,m_3,m_4,m_5,m_6,m_7分别是0,64,128,256,512,\infty。比如对P_3而言,如果max(l^*,t^*,r^*,b^*)<m_3 并且max(l^*,t^*,r^*,b^*)>m_2,那么这个框由P_3层的feature map负责,反之那么就属于P_3的负样本。推广开来就是

max(l^*,t^*,r^*,b^*)<m_i

max(l^*,t^*,r^*,b^*)>m_{i-1}

如果在这个范围内,那么就由P_i这层feature map负责。通过这样划分,可以将不同的尺寸分开来。这样的处理对于重叠的情况会有很大的改善,但是如果仍然有重叠在同一个feature层进行预测,那就跟之前说的方法一样,选择更小的框。

 Head中的Center-ness

作者在比较FCOS与anchor-based模型精度时,发现FCOS还是有一定的精度差异,进一步分析发现是因为预测了大量质量很低的box,而这个box的预测点都离中心点非常远。作者设计了一种方法抑制低质量的预测框,增加了一个分支center-ness。

centerness的值范围在0~1之间,这个分支的loss是使用binary cross entropy,这个分支的loss会加在上面的公式2后面。

预测的时候最终的分值,要使用centerness的预测结果与classification的预测结果相乘。centerness能够降低离中心点远的像素的分值。这样最终通过NMS过滤的时候,这些低分值的框很容易被过滤掉。

实验

如果同样使用ResNet-01-FPN做为backbone,RetinaNet的精度为39.1,而FCOS为41.5,确实精度上有提升。其他的消融实验可以在论文中查看。

FCOS是比较有意义的anchor-free模型,为后续anchor-free的发展奠定了一定的基础。之前阅读过的AutoAssign就是针对FCOS进行的改进,COCO上最高可以达到52%以上,是非常不错的成绩。相信anchor-free的模型未来还会有更好的发展。

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值