FCOS算法详解

论文:FCOS: Fully Convolutional One-Stage Object Detection
论文链接:https://arxiv.org/abs/1904.01355
代码链接:https://github.com/tianzhi0549/FCOS/

这篇是发表在CVPR2019的目标检测论文,主要创新点在于去掉了anchor做检测,也就是常说anchor free,这是最近一段时间目标检测领域比较活跃的方向,比如ECCV2018上的CornerNet,再早一些的比如YOLO v1、UnitBox等等,这篇博客介绍FCOS。

先来聊一聊为什么要去掉anchor。众所周知,anhcor的引入对目标检测算法的效果提升帮助很大,这也是为什么最近几年流行的目标检测算法基本上都是基于anchor来预测目标框位置的。但是显然anchor的引入也带来一些问题,最主要的有2点:1、超参数较多。这些超参数包括anchor的尺寸、数量、确定正负样本的IOU阈值等等,不同的超参数对检测结果都有一定影响,而调参显然是比较麻烦的工作。当然,关于超参数方面也诞生了一些有意思的作品,比如YOLO v2的anchor聚类、RefineDet的anchor refine等,都是为了提供更准确的anchor。2、正负样本不均衡。因为一张图像中目标数量是有限的,为了达到足够的召回率,anchor数量一般要铺设比较多,这就导致负样本要远远多于正样本,虽然大部分目标检测算法有类似负样本欠采样等步骤做过滤,但都不能算是从根本上解决正负样本不均衡的问题。这或许就是研究anchor free的目标检测算法的原因,FOCS也是其中之一。

FCOS的核心思想就是预测输入图像中每个点所属的目标类别和目标框。网络结构如Figure2所示,整体上是类似FPN的网络结构,最后基于5个融合后的特征层做预测,重点在于预测层,也就是虚线框里面的内容。因为这篇论文主要是和RetinaNet做对比,所以在网络结构设计上也尽可能和RetinaNet贴近,因此在最后3个输出层之前的全部网络结构基本上和RefinaNet(包含FPN)一样。3个输出层中第一个输出是分类支路,H*W表示特征的大小,C表示类别数,特征上的位置(x,y)可以通过下面这个公式换算成输入图像的位置,其中s表示stride,也就是缩放比例,这样就建立了特征图上点的位置和输入图像上点的位置之间的关系,方便计算特征图上每个点的分类和回归目标。
在这里插入图片描述
第二个输出是Center-ness,这个分支用于计算每个点和目标中心点的距离,用于减少那些离目标中心点较远的预测点,后面会详细介绍。
第三个输出是回归支路,4表示回归相关的4个值,这部分是anchor free类型的目标检测算法和基于anchor的目标检测算法的主要差别。
FCOS算法详解_第1张图片

因为回归支路是核心,所以先重点介绍回归支路。FCOS的回归部分预测4个值(l, t, r, b),分别表示目标框内某个点离框的左边、上边、右边、下边的距离,如Figure1的左图所示。假设一张图像上的一个标注好的目标框Bi的坐标和类别用如下式子表示,其中前4个值是框的左上角和右下角点坐标,最后一个值是类别,c的范围是1到C,比如对COCO数据集而言,C就是80:
在这里插入图片描述
那么输入图像上每个点的类别标签就可以根据这个点是否在标注框内来确定,在标注框外的点就是负样本,类别设置为0;在标注框内的点(x,y)就是正样本,类别目标就是标注框的类别,回归目标就是下面这4个值:
在这里插入图片描述
因此可以看出FCOS的正负样本是基于每个点的,一般一张图像上目标框的面积和非目标框的面积差距不会非常大,因此基本不存在正负样本不均衡的现象。
当然,因为这4个值都是正的,所以为了保证回归支路的输出结果都是正,回归支路的输出会通过exp()函数再输出,exp()函数输入是负无穷到正无穷,输出大于0。
FCOS算法详解_第2张图片

FCOS算法的回归部分大概就是这样,当然这会有一个问题,仔细看Figure1的右图,图像中存在2个部分重叠的标注框,那么2个目标框重合部分的点的训练目标该怎么算?因为目标框重合是比较常见的现象,因此这个问题就显得十分重要,作者也通过实验证明了这样的歧义样本(ambiguous sample)大概占23.16%(Table2左边一列第一行)。
FCOS算法详解_第3张图片
为了解决这个问题,作者引入FPN结构并基于不同特征层预测不同尺度的目标框,这样就将大部分有重合的目标框剥离开来,在不同特征层分别预测,而区分哪些点在哪个特征层预测的依据是该点的(l, t, r, b)这4个值的最大值是否在预先设定好的范围内。每个特征层都预先设定好尺度范围,比如P3层只负责最大值在[0, 64]范围内的点,P4层只负责最大值在[64, 128]范围内的点,依次类推。举个例子,在Figure1的右图中,假设重合部分的那个点到球拍框的4个距离中最大值为60,到人框的4个距离中最大值为120,那么这个点在P3层时的回归目标是球拍框,在P4层时的回归目标是人框,而在P5、P6、P7层时是负样本点。当然,这种区分主要也是基于大部分有重合的目标框尺度差别较大,假如重合目标框大小接近且类别不同,那还是比较棘手的。对于那些仍旧无法剥离的目标框,还是沿用原来的策略:训练目标基于重合目标框中面积最小的那个框进行计算。我们知道在基于anchor的目标检测算法中,一般通过在不同stride的特征层上设定不同尺寸的anchor实现不同尺度目标的预测,这种方式并非强制,也就是说有一些大目标可能还是通过浅层预测得到的,反之亦然,但是FCOS不是,FCOS采用的是更加明确的预测任务分配,是强制的
基于这样的优化,这种歧义样本数量就降到7.14%(Table2左边一列第二行),再进一步,假如歧义样本所属的框类别一样,那这种情况对回归来说影响相对小一些,假如把这样的歧义样本去掉,那么比重就进一步降低至3,75%,可以看到影响越来越小。作者也通过Table3这个实验证明引入FPN且为每个特征层分配不同尺度的目标框对最终检测指标的影响,基本上差了一倍。
FCOS算法详解_第4张图片

基于上述的实验设计,FCOS能得到的最好结果是33.8的AP,这仍然和AP值为36.1的RetinaNet有2个点差距。基于对实验结果的分析,发现问题在于部分误检框离真实框的中心点距离较大,也就是说这部分其实是错得比较离谱的误检,因此作者用一种比较简单的方式减少这种误检,这个方法的核心就是将分类支路的输出乘以一个权重图得到最终的分类置信度,而这个权重图代表的就是目标框中每个点到中心点的距离,距离越近,权重越大,如Figure3所示。而这个权重图就是通过Figure2中的Center-ness支路训练得到的。
FCOS算法详解_第5张图片
既然是训练得到的,那么就涉及监督信息,这个监督信息可以通过下面这个式子计算得到,4个输入值就是回归支路的回归目标:
在这里插入图片描述
增加center-ness的效果如Table5的最后一行所示(36.6),第二行的33.1表示权重图直接基于回归支路的4个输出值计算得到,可以看到效果较差,这说明增加center-ness分支并训练得到权重图是非常有必要的,这也比较容易理解,毕竟回归支路的参数是基于回归目标来训练的,对于center-ness任务并不是最优的,而新增的center-ness分支参数可以更好地拟合权重图的训练目标。另外,为了证明增加权重图确实能减少那些远离目标框中心的的预测框(误判),作者直接基于标注信息计算权重图,测试AP能达到42.1,这同时也说明了目前的这种基于单独分支训练得到的权重图还有较大的优化空间。
FCOS算法详解_第6张图片
最后,FCOS算法和其他基于anchor的目标检测算法的对比试验可以看Table7,提升还是比较明显的。
FCOS算法详解_第7张图片

你可能感兴趣的:(深度学习,计算机视觉,目标检测-object,detection)