FCOS: Fully Convolutional One-Stage Object Detection
论文链接:论文链接
论文代码:代码链接
简而言之,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上的每一点进行回归操作。具体的实施思路如下所示:
首先,我们可以将feature_map中的每一个点(x,y)映射回原始的输入图片中;
然后,如果这个映射回原始输入的点在相应的GT的BB范围之内,而且类别标签对应,我们将其作为训练的正样本块,否则将其作为正样本块;
接着,我们回归的目标是(l,t,r,b),即中心点做BB的left、top、right和bottom之间的距离,具体如下图所示:
接着,如果一个位置在多个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数据集上面训练得到的。
这个表格证明了FPN确实能够提升BPR!
这个表格证明了FCOS无论是在精度上还是在速度上都优于RetinaNet。尽管两个算法的速度都不是很快!
这个表格和这张图同时证明了center-ness有用,同时也说明了center-ness的使用方式是和Head分支预测的分类得分进行相乘。
这个表格说明了FCOS算法的精度确实不低,超过了CornerNet和Faster-rcnn,但是并没有涉及算法的速度!!!
看起来还不错,BB的准确率挺高的,不过结果展示的有些少呀,我没有进行实测!
总体来讲,FCOS算法确实不错,精度提高了不少,敢于突破传统思维,但是却让单阶段检测算法的速度变慢了,竟然和RetinaNet做比较,毕竟精度和速度必须这一个折中,不过基于anchor-free的检测算法应该是目标检测算法的一个趋势吧,单阶段目标检测算法的优势也会慢慢得到提高的,毕竟FCOS是基于anchor-free框架的起步的一些工作,期待着更惊艳的单阶段目标检测算法的出现。
[1] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:[email protected]),我会在第一时间回复大家,谢谢大家的关注。
[2] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。
[3] 如果您在阅读本博客时遇到不理解的地方,希望您可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。
[4] 本文内容中的大部分内容都摘自该博客,本来打算按照自己的思路去写,不过想来想去还是绝对这篇博客说的更好一点,为了让读者们能够更好地了解该论文,还是引用了该博客的内容。
[5] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊!!!