论文:https://arxiv.org/pdf/1904.01355.pdf
代码:https://github.com/tianzhi0549/FCOS
 近期在Arxiv上出现的一篇比较火的单阶段目标检测算法-FCOS,今天我们就一起来分析分析这个算法。大家可能都知道目标检测算法以前主要分为两个大的方向:单阶段检测器/双阶段检测器,其对应的代表性算法分别是Faster-rcnn和Yolo。而随着目标检测性能的大幅度提升,这个领域的门槛变得很高,仅有很少的大佬们仍然在探索着新的检测算法。其实对于目标检测而言,我们还可以按照其它的类别进行划分,即所谓的基于anchor和anchor-free的算法,而本文其实就属于单阶段的anchor-free目标检测算法。下面我们开始今天的正题!
简而言之,FCOS是一个基于anchor-free的单阶段目标检测算法。
大家可能都会有这样的一个观点-单阶段检测算法的最大优势就是速度快,而双阶段检测算法的最大优势就是精度高。但是这几年我们慢慢的改变了我们的观点,相比于双阶段的目标检测算法而言,其实单目标检测算法得到了更大的落地,主要的原始是因为我们需要将目标检测这个任务应用到很多终端设备上,比如无人机、机器人、摄像头等等,而这些设备的计算能力有限,大家一般都会优先去选择速度较快的yolo或者ssd。除此之外,随着目标检测算法的发展,单阶段目标检测算法的精度也得到了大幅度的提升,基本上可以和双阶段检测算法不相上下,代表性的算法包括CornerNet和FCOS。总结一下个人认为FCOS比较火的原因如下所示:
作者为什么要提出anchor-free算法FCOS呢,主要的原因如下所示:
FCOS属于anchor-free类别的算法,且效果在anchor-free派系中算SOTA了。它的主要优点如下:
FCOS算法的整体框图如上所示:映入我们眼帘的是什么?对没错是FPN特征金字塔和三分支的头检测网络。
FPN特征金字塔在提出之后,已经得到了广泛的使用,在多个领域中都可以看到它的身影,如语义分割、细粒度分类等等,它的主要思路是结合了网络的浅层特征和深层特征,然后在多个分支同时输出不同大下的目标。充分的使用了网络的浅层特征和深层特征,浅层特征更关注一些细节信息,适合用来定位;而深层特征更关注于语义信息,适合用来分类等。具体的细节可以看我的这篇博客FPN链接。
步骤1-对输入的图片进行预处理操作;
步骤2-搭建如图所示的网络架构,将输入数据送入backbone网络中获取输入数据的feature_map,在feature_map的每一点上面进行回归操作,进行网络训练获取网络模型;
步骤3-将预训练的网络模型应用到测试图片中,从特征金字塔的多个Head中获得预测的结果;
步骤4-使用NMS等后处理操作获得最终的结果。
对于基于anchors的目标检测算法而言,我们将输入的图片送入backbone网络之后,会获得最终的feature_map,比如说是17x17x256;然后我们会在该feature_map上的每一位置上使用预先定义好的anchors。而FCOS的改动点就在这里,它是直接在feature_map上的每一点进行回归操作。具体的实施思路如下所示:
如果一个位置在多个BB的内部的话,我们将其看左边一个模糊样本,针对这样样本文中采样的方法是直接选择择面积最小的边界框作为其回归目标。由于网络中FPN的存在,导致这样的模糊样本的数量大大减少。
如果这个位置(x,y)和一个BB关联的话,该位置处的训练回归目标可制定为:其中(x1,y1)和(x2,y2)分别表示BB的左上角和右下角坐标值。
由于FCOS可以通过这样方式获得很多正样本块,然后使用这样正样本块进行回归操作,因此获得了比较好的性能提升,而原始的基于anchor的算法需要通过计算预设的anchor和对应的GT之间的IOU值,当该IOU值大于设定的阈值 时才将其看做正样本块。
该loss函数如上图所示,同样包含两部分,Lcls表示分类loss,本文使用的是Focal_loss;Lreg表示回归loss,本文使用的是IOU loss。其实这两个loss应当是当前最好的配置啦。
问题1是-对CNN中的feature_map而言,大的stride通常会导致第的BPR,而BPR对于检测任务而言却至关重要。而本文的实验发现,添加了FPN的FCOS算法即使是使用较大额stride,仍然能够获得较高的BPR值,甚至超过RetinaNet。主要的原因可能是FPN在不同的特征映射上面检测不同大小的目标,本文使用的网络最终能够在不同的特征映射上面获得大小分别为16、32、64和128的stride,即比较丰富,针对不同的情况它都能很好的处理。
问题2是-GT中的BB重叠可能导致训练期间难以解决的模糊性。即特征映射中的某一个位置(x,y)同时在多个BB中时应该采用那个进行回归的问题。而实验结果表明FPN能够很好的解决该问题。
除此之外,作者观察到FPN中不同的feature_map level需要回归不同大小范围的BB,针对特征级Pi,使用带有可训练的标量si的exp(six)来代替标准的exp(x),其中si是一个可训练的参数,用来自适用的调整不同level。
作者观察到FCOS会引入一些低质量的BB,即远离目标中心的BB,而Center-ness的作用就是用来很好的抑制这些低质量的BB的产生,它的优点是比较简单。不需要引入其它的超参数。它的位置是在Head网络的分类网络分支下面。对于给定的一个位置的回归目标的l、t、r、b而言,center-ness目标的定义如下所示:
其范围在[0, 1]之间,使用BCE损失函数来训练,它可以用来降低距离对象中心很远的边界框分数的权重,它可以被看做是一个软阈值,可以在网络训练的过程中学习得到,不需要进行调节。除此之外,由于NMS的存在可以在一定程度上过滤点这些低质量的BB。
在训练阶段,文中使用ResNet-50作为backbone网络,使用SGD优化器,初始学习率为0.01,batch_size=16,在迭代60K和80K时的weight_decay分别为0.0001和0.9,使用ImagNet预训练权重进行初始化,将输入图片裁剪为短边不小于800,长边不小于1333大小。整个网络是在COCO数据集上面训练得到的。
这个表格证明了FCOS无论是在精度上还是在速度上都优于RetinaNet。尽管两个算法的速度都不是很快!
这个表格和这张图同时证明了center-ness有用,同时也说明了center-ness的使用方式是和Head分支预测的分类得分进行相乘。
这个表格说明了FCOS算法的精度确实不低,超过了CornerNet和Faster-rcnn,但是并没有涉及算法的速度!!!