paper:https://arxiv.org/pdf/1904.01355.pdf
code:https://github.com/tianzhi0549/FCOS
我的复现:https://github.com/panchengl/pcldetection
当年经典的SOTA算法,现在似乎有点精度落后(但依旧很高),但是近期paper团队有重新对fcosnet做了实验进行改进,精度直接冲到SOTA了(我记得coco-ap达到0.49了),改动在哪忘了,先讨论原版的文章结构,有时间再写新的paper的操作。
首先本文是一篇anchor-free的文章,但是很多人认为fcosnet不算一个真正的anchor-free算法,区别于cornernet、centernet等,但是本文思路依旧很清晰,首先总结anchor-based算法4点不足:
1、基于anchors的模型对anchors的大小、长宽比和数量很敏感,不同的超参数设置差异很大(github第一的efficientdet就是如此,anchors的超参数设置影响非常大)
2、即使anchors设计好,固定的anchors也难以适应所有的形状目标,检测器很难适应,泛化性能不好
3、为了高的召回率,模型会覆盖密集的anchor,但大都是negative example,导致样本不平衡
4、anchors数量太多了,比如retinanet号称达到了anchors数量的极限,带来了复杂的计算量。
然后paper提到了FCN,FCN在语义分割、关键点估计、深度估计等各个方面,但唯独目标检测没有使用,主要是由于存在anchor,那如果抛弃anchor,将FCN应用于目标检测,将这些任务都统一使用FCN来做,即以像素点来做,结果也是可以的。
使用fcosnet以后,具有如下优点:
1、检测器没有anchors了,无需严谨的设计参数,且检测器泛化简单,并极大地减少了计算量
2、没有复杂的计算量以后,加快了训练和推理的速度,one-stage的典型。
3、精度很高,甚至基于fcosnet的简单修改,可以应用于其他任务。
本文的anchor-free检测模式,如下图:
如上图所示,fcosnet预测的是前景中每一个像素点与上下左右边界的距离,即对每一个前景像素进行编码,fcosnet预测4d向量(l,t,r,b)进行工作,这样的话,FCOS利用尽可能多的前景样本来训练回归器。它不同于基于anchor的检测器,后者仅将和GT具有足够IOU视为正样本,这可能是FCOS优于其基于anchor的原因之一。这里提到一点,当某个像素落到了多个边界框区域,则视为模糊样本,作者选择的是此时边界框面积最小的作为回归的目标,并且文中最后通过多层次的预测显著减少模糊样本的个数,后文详细讨论,4d向量的计算方式如下:
1、网络结构:
上面提到了fcosnet的工作核心,接下来简单介绍网络结构,再进一步讨论细节。
resnet+fpn+head,需要注意的是,此处的fpn与原来标准的fpn是不一样的,如上图所示,多进行了两次特征变化,但是此处我们看一下我复现的代码(链接见文章第一段)复现,此处新的实验是对结构进行了修改的(后面还有一处修改的,但是我时间长了,我忘记在哪了):
新的结构存在一个叫做use_p5的标志位,如果不使用这个,则是本文的结构,则是使用c5-output的feature来进行卷积变换,获得p6和p7的feature-map如果使用这个标志位,则是使用p5-output的feature来进行卷积变换,获得p6和p7的feature-map。
2、逐像素回归
2.1 回归方式
假定Fi为backbone某一层feature-map,s是该层的总共stride,则将一张image的ground-truth bbox定义为一个4d向量:
如上所示,x0,y0,x1,y1用的是距离各个边的长度,c代表一个类别向量,维度与类别相同,注意由于回归目标始终为正,因此我们使用exp(x)将任何实数映射到回归分支顶部的(0,∞)。 且作者并没有使用多类别分类器,而是训练c个二分类器,coco为80,并且作者考虑到可能会出现低质量的框,作者用所提议的“center-ness”分支抑制了低质量的检测到的边界框。
对于Fi上的每一个位置(x,y),将其映射回 感受野的中心附近,与anchor不同,anchor将图像上的多个位置视为中心,然后利用anchor来回归bbox边界框,而fcos则直接回归每一个像素,将位置视为训练样本。当位置(x,y)落在GT中则视为正样本,否则视为负样本,同时回归一个4d向量(l,t,r,b)
2.2 FPN的多级预测
作者提到使用fpn可以解决fcos可能存在的两个问题
1、cnn的最后一层feature-map由于stride较大得到的召回率可能会低
文章直接指出,根据经验表明,fcos能够产生堪比retinanet的良好的召回率,此处不展开。
2、GT框的重叠(模糊样本),重叠的某个位置应该回归哪个边界框
作者表示通过多级预测会极大地减少这个问题,fcos将不同大小的box分配给不同的特征级别,直接限制每一个级别的回归范围,更具体地说,对每一层设定一个回归范围,文中为[0,64,128,256,512,正无穷],如果某目标或者,则将这个样本设为负样本,不在需要回归边界框,mi是本层回归的最大距离。因此fpn多级预测时,由于将不同大小的目标分配给不同级别特征进行预测,能够最大幅度避免模糊样本的问题,如果使用多级预测时在同级仍然存在模糊样本的问题,则只要选择最小的GT框就可以了。
2.3 head的trics
最后,在不同特征级别之间共享head,但是使用可训练的标量Si的exp(Six)自动调整fpn的当层特征Pi的指数函数基数,从而进一步略微提高性能
3、Center-ness for fcos
我们看到第一部分的结构图,head部分除了cls和reg的head之外,还多了一个center-ness的head,如下:
paper提到使用多级预测以后,fcos与anchor-based的检测器性能仍然有差异,作者观察到由于在远离对象中心的地方产生了许多低质量框,因此提出一种简单的无痛策略来抑制低质量bbox,称之为center-ness。
如上图所示,在分类head的边上并行添加一个单层分支,用来预测位置的center-ness,center-ness描述了从位置到该位置负责的对象中心的标准化距离,如下图公式所示,给定位置的回归目标l ∗,t ∗,r ∗和b ∗ ,中心度目标定义为:
我们在此处使用sqrt来减慢center-ness的衰减。 中心度的范围是0到1,因此受到二进制交叉熵(BCE)损失的影响。 损耗被添加到loss方程式中。 在测试时,通过将预测的center-ness与相应的分类分数相乘来计算最终分数(用于对检测到的边界框进行排名)。 因此,中心度可以降低远离对象中心的边界框的分数的权重。 结果,这些低质量的边界框很有可能通过最终的非最大抑制(NMS)过程被滤除,从而显着提高了检测性能。
4、损失函数
损失函数由2部分组成:
如上式所示,Lcls是 focal loss, Lreg是IOU loss,Npos是正样本数量,。
5、前向推理流程
给定输入图像,获得FPN的每一级的每个位置上的分类得分Pxy和回归预测Txy,选择Pxy>0.05的样本做为正样本,然后获得预测的边界框
6、实验和结果