FCOS:Fully Convolutional One-Stage Object Detection
ICCV2019的一篇文章,很有意思的是将目标分割的思想用到了目标检测中,提出了一种anchor-free的检测方式,取得了不错的效果
论文链接:https://arxiv.org/abs/1904.01355
1.motivation
作者认为以往的基于anchor的目标检测有以下缺点
- 检测算法的性能对于anchor一些参数很敏感,比如size ratio,number,设置起来很麻烦
- 由于目标复杂多变,固定的anchor参数难以满足
- 为了达到高的检测精度,需要采集很多的base_anchor,然而大部分anchor都输负样本,导致在训练的时候正负样本不均衡
- 在计算IOU的时候很麻烦,另外iou的阈值也需要自己定义
由此作者提出了将FCN用于检测的算法FCOS
2.主要思想
2.1 reg_loss,cls_loss
结构图如下
特征图上的每一个点(x,y)投影到原图中(s/2+x*s,s/2+y*s), 其中s是步长stride,(x,y)如果落到了原图中的某个gt中就被认为是正样本,类别就是该gt属于的类。否则就是负样本,类别设置为0.如果出现某个点落入到了多个gt中,这种被称为ambiguous sample,文中采用的策略是直接选择面积最下的那个gt,至于为什么这么做,请看后续的分析。
loss function:
其中分类损失采用的focal loss,回归损失采用的IOU loss,为(x,y)到gt左,上,右,下边界的距离,如figure1所示,
(x0,y0,x1,y1)表示为gt的左上角与右下角坐标。对应着每层level的网络输出。这里的focal loss采用的是C binary classifier,而不是multi-class classifier。由于回归损失基本上都是正的,所以作者利用exp(x)将他们投影到了(0,
),
,Npos表示正样本的数目,可以看出FCOS有很多的正样本用于训练,相对于anchor_based的detector仅仅选取指定iou阈值的anchor作为正样本,FCOS的正样本足够充分。这也是FCOS效果好的可能之一。
在inference的时候,将>0.05的是作为正样本,然后按照公式(1)计算出bbox。
2.2 multi_level FPN
按照以往的经验,在CNN中stride较大的话会导致召回率比较低,而且理论上在FCOS中由于大的stride在最后的feature map中没有编码得到的位置信息,所以recall应该会很低,但是结果表示FCOS的召回率还是很好,而且利用multi-level的FPN之后,FCOS的召回率又得到了大幅提升。
上述说的ambiguous sample也可以在multi-level的FPN中的得到很好的解决。不同于在anchor_based的detector中会在不同的level分配不同尺寸的base_anchor。FCOS会首先计算,如果满足,则认为是负样本,就不需要在计算机回归损失了。
是feature level i需要区域回归的最大尺寸,从网络结构图中可以看出,一共有五个level,所以依次设置m为(0,64,128,256,512,
),其实就是分别对应着每个level的stride的八倍。经过这样的操作不同尺寸的物体会被放在不同的level进行检测,而且物体之间的重叠往往发生在尺寸相差比较大的物体之间。所以这样可以有效的避免ambiguous sample带来的影响。
作者将使用exp(si*x)代替上述的exp(x),从而达到在不同的level使用不同的si,可以稍微的提升一些性能,至于si是怎么来的,这个得后续看代码了
2.3 Center-ness
作者发现用了上述额度FPN之后,FCOS的精度仍然和anchor_based的detector有一定差距,作者认为这是由于那些远离gt中心的位置产生了大量的low-quality的预测框。导致带偏了损失函数reg_loss,为了解决这个问题,引入
centerness的范围是0-1,用binary cross entropy loss进行训练。可以看出当位置位于目标中心的时候centerness为0,远离目标中心的位置centerness就会很大,这就极大的抑制了远离目标中心的位置。在test的时候,最后的classification score会乘以相应的centerness,the center-ness can downweight the scores of bounding boxes far from the center of an object.
2.4 结果图
可以看出精度已经超越了一些one-stages,two-stages的检测算法,还是不错的
3.其他
- FCOS会导致占用内存很大吗???
- centerness的位置文中说center-ness is parallel with the regression branch instead of the classification branch.但是在文中还是在classification branch,这个的影响在哪呢
- 为什么最后两层没有进行上采样呢?贴一个可能的回答:FPN结构在高层的语义特征进行融合效果并不好,所以构建FPN没有必要使用所有的卷积层。但为了尺度的多样性,在其后面加入了P6/P7.。目标检测:FCOS(2019) - TeddyZhang的文章 - 知乎 https://zhuanlan.zhihu.com/p/62869137