目录
近期在Arxiv上出现的一篇比较火的单阶段目标检测算法-FCOS,今天我们就一起来分析分析这个算法。大家可能都知道目标检测算法以前主要分为两个大的方向:单阶段检测器/双阶段检测器,其对应的代表性算法分别是Faster-rcnn和Yolo。而随着目标检测性能的大幅度提升,这个领域的门槛变得很高,仅有很少的大佬们仍然在探索着新的检测算法。其实对于目标检测而言,我们还可以按照其它的类别进行划分,即所谓的基于anchor和anchor-free的算法,而本文其实就属于单阶段的anchor-free目标检测算法。下面我们开始今天的正题!
一、FCOS是什么?为什么会这么火?
- 尽管是一个单阶段的目标检测算法,但是检测的精度却得到的极大的提升,远远超过了Faster-rcnn;
- 该算法是基于anchor-free的,即敢于去挑战权威,在目标检测领域中,很多人可能都形成了一个定势思路,为了处理尺度和不同比率问题,anchors是必须使用的模块,而本文的作者敢于脱离这个思路提出一个较新的视角,使得人们眼前一亮;
- 其实在检测领域中自从Faster-rcnn出现之后,已经很久没有什么特别的检测算法啦,大家基本都是小改小动;除此之外,FCOS算法的宣传力度比较大,开源工作也做的比较好,这些都是一些关键的因素。

二、为什么要提出FCOS以及FCOS的优势在哪?
作者为什么要提出anchor-free算法FCOS呢,主要的原因如下所示:
- anchor会引入很多需要优化的超参数, 比如anchor number、anchor size、anchor ratio等;
- 为了保证算法效果,需要很多的anchors,存在正负样本类别不均衡问题;
- 在训练的时候,需要计算所有anchor box同ground truth boxes的IoU,计算量较大;
FCOS属于anchor-free类别的算法,且效果在anchor-free派系中算SOTA了。它的主要优点如下:
- 因为输出是pixel-based预测,所以可以复用semantic segmentation方向的相关tricks;
- 可以修改FCOS的输出分支,用于解决instance segmentation和keypoint detection任务;
三、FCOS算法整体框架

FCOS算法的整体框图如上所示:映入我们眼帘的是什么?对没错是FPN特征金字塔和三分支的头检测网络。
FPN特征金字塔在提出之后,已经得到了广泛的使用,在多个领域中都可以看到它的身影,如语义分割、细粒度分类等等,它的主要思路是结合了网络的浅层特征和深层特征,然后在多个分支同时输出不同大下的目标。充分的使用了网络的浅层特征和深层特征,浅层特征更关注一些细节信息,适合用来定位;而深层特征更关注于语义信息,适合用来分类等。具体的细节可以看我的这篇博客FPN链接。
整个算法的实现步骤如下所示:
步骤1-对输入的图片进行预处理操作;
步骤2-搭建如图所示的网络架构,将输入数据送入backbone网络中获取输入数据的feature_map,在feature_map的每一点上面进行回归操作,进行网络训练获取网络模型;
步骤3-将预训练的网络模型应用到测试图片中,从特征金字塔的多个Head中获得预测的结果;
步骤4-使用NMS等后处理操作获得最终的结果。
四、FCOS算法实现细节详解
1、FCOS算法和基于anchors的检测算法的不同之处在哪里?
2、Loss函数详解

该loss函数如上图所示,同样包含两部分,Lcls表示分类loss,本文使用的是Focal_loss;Lreg表示回归loss,本文使用的是IOU loss。其实这两个loss应当是当前最好的配置啦。
3、FPN带来了哪些具体的优势呢?
4、FCOS中的Center-ness是什么,有什么作用?

作者观察到FCOS会引入一些低质量的BB,即远离目标中心的BB,而Center-ness的作用就是用来很好的抑制这些低质量的BB的产生,它的优点是比较简单。不需要引入其它的超参数。它的位置是在Head网络的分类网络分支下面。对于给定的一个位置的回归目标的l、t、r、b而言,center-ness目标的定义如下所示:

其范围在[0, 1]之间,使用BCE损失函数来训练,它可以用来降低距离对象中心很远的边界框分数的权重,它可以被看做是一个软阈值,可以在网络训练的过程中学习得到,不需要进行调节。除此之外,由于NMS的存在可以在一定程度上过滤点这些低质量的BB。
5、算法实现细节
在训练阶段,文中使用ResNet-50作为backbone网络,使用SGD优化器,初始学习率为0.01,batch_size=16,在迭代60K和80K时的weight_decay分别为0.0001和0.9,使用ImagNet预训练权重进行初始化,将输入图片裁剪为短边不小于800,长边不小于1333大小。整个网络是在COCO数据集上面训练得到的。
五、论文结果展示
1、客观评价指标展示

这个表格证明了FPN确实能够提升BPR!

这个表格证明了FCOS无论是在精度上还是在速度上都优于RetinaNet。尽管两个算法的速度都不是很快!


这个表格和这张图同时证明了center-ness有用,同时也说明了center-ness的使用方式是和Head分支预测的分类得分进行相乘。

这个表格说明了FCOS算法的精度确实不低,超过了CornerNet和Faster-rcnn,但是并没有涉及算法的速度!!!
2、主观效果展示

看起来还不错,BB的准确率挺高的,不过结果展示的有些少呀,我没有进行实测!
六、个人总结
总体来讲,FCOS算法确实不错,精度提高了不少,敢于突破传统思维,但是却让单阶段检测算法的速度变慢了,竟然和RetinaNet做比较,毕竟精度和速度必须这一个折中,不过基于anchor-free的检测算法应该是目标检测算法的一个趋势吧,单阶段目标检测算法的优势也会慢慢得到提高的,毕竟FCOS是基于anchor-free框架的起步的一些工作,期待着更惊艳的单阶段目标检测算法的出现。
注意事项
[1] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(邮箱:@.com),我会在第一时间回复大家,谢谢大家的关注。
[2] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。
[3] 如果您在阅读本博客时遇到不理解的地方,希望您可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。
[4] 本文内容中的大部分内容都摘自该博客,本来打算按照自己的思路去写,不过想来想去还是绝对这篇博客说的更好一点,为了让读者们能够更好地了解该论文,还是引用了该博客的内容。
[5] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加:详聊!!!
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202896.html原文链接:https://javaforall.net
