简介:FCOS是典型的one-stage和anchor free结合,并且思路和cornerNet系列的寻找corner不同,借鉴了FCN的思想,通过单个feature上的点来做检测。该算法是一种基于FCN的逐像素目标检测算法,实现了无锚点(anchor-free)、无提议(proposal free)的解决方案,并且提出了中心度(Center—ness)的思想,同时在召回率等方面表现接近甚至超过目前很多先进主流的基于锚框目标检测算法。此外,本算法目前已开源。
一、前言
FCOS是一个基于anchor-free的单阶段目标检测算法。单阶段检测算法的最大优势就是速度快,而双阶段检测算法的最大优势就是精度高。但是这几年,相比于双阶段的目标检测算法而言,其实单目标检测算法得到了更大的落地,主要的原因是因为我们需要将目标检测这个任务应用到很多终端设备上,比如无人机、机器人、摄像头等等,而这些设备的计算能力有限,大家一般都会优先去选择速度较快的yolo或者ssd。除此之外,随着目标检测算法的发展,单阶段目标检测算法的精度也得到了大幅度的提升,基本上可以和双阶段检测算法不相上下,代表性的算法包括CornerNet和FCOS。
二、出发点和FCOS的优点
FCOS摒弃了anchor带来的一些缺点:
- 用anchor的框架对于anchor的尺寸非常敏感,anchor的尺寸会影响检测的performance。
- anchor尺寸的固定导致了对网络对特殊形状的物体鲁棒性较差(一旦数据集发生了变化可能面临要重新设计anchor)。
- 为了获得高的recall,要非常密集的堆放anchors,通常大多数的anchor都是负样本,导致了easy example等一系列问题。
- 大量的anchor增加了计算和显存消耗(尤其是每个anchor都要计算IOU)。
FCOS的优势:
- 完全proposal free和anchor free,减少了参数量和计算量。
- 能够达到one-stage的SOTA,尤其是文中提到FCOS甚至可以用于two-stage的RPN中,并且经测试能为two-stage带来更好的performance。
- 可以用在很多的instance-wise的问题中,如实例分割,关键点检测等。
三、FCOS算法整体框架
整个算法的实现步骤如下所示:
- 步骤1-对输入的图片进行预处理操作;
- 步骤2-搭建如图所示的网络架构,将输入数据送入backbone网络中获取输入数据的feature_map,在feature_map的每一点上面进行回归操作,进行网络训练获取网络模型;
- 步骤3-将预训练的网络模型应用到测试图片中,从特征金字塔的多个Head中获得预测的结果;
- 步骤4-使用NMS等后处理操作获得最终的结果。
四、FCOS算法的实现细节
1、逐像素回归预测
FCOS的目标框回归方式,不同于传统的中心点+宽高或者坐标点的形式,FCOS通过中心点和一个4D vector来预测物体框的位置。
假设F1是用来做分类的feature map,尺寸为H*W*C,其中C为分类的类别数。设(x,y)为feature map上的任意一点,根据的把这点映射到输入图像中的位置上(s/2+xs,s/2+ys)。在anchor-based的方法中,通常认为映射到图像上的点(s/2+xs,s/2+ys)就是anchor的中心点,然后再基于anchor的位置做回归。而FCOS中,摒弃了这种方法,当(x,y)(映射回input image中的位置)能够落入groundtruth当中,那么对应位置上的类别会被标注成当前groudtruth的类别(如果是背景则标注为0)。
位置回归上则通过Regression对应feature map(x,y)位置上4D vector 向量(l*,t*,r*,b*)来预测框形状。训练的时候target可以写成:
可以看到FCOS中,只要feature map某个位置的点落入groundtruth的bbox中就被认为是正样本,可见用于训练的正样本的数量将会非常的多。作者认为这是FCOS能够赶超anchor-based方法的重要原因之一。
2、损失LOSS
该loss函数如上图所示,同样包含两部分,Lcls表示分类loss,本文使用的是Focal_loss;Lreg表示回归loss,本文使用的是IOU loss。其实两个loss应当是当前最好的配置了。
3、多尺度策略
两个问题:
- 基于锚框的检测器由于大的步伐导致低召回率,需要通过降低正的锚框所需的交并比分数来进行补偿:在FCOS算法中表明,即使是大的步伐(stride),也可以获取较好的召回率,甚至效果可以优于基于锚框的检测器。
- 真实边框中的重叠可能会在训练过程中造成难以处理的歧义,这种模糊性导致基于fcn的检测器性能下降:在FCOS中 ,采用多级预测方法可以有效地解决模糊问题,与基于锚框的模糊检测器相比,基于模糊控制器的模糊检测器具有更好的性能。
为了解决真实边框重叠带来的模糊性和低召回率,FCOS采用类似FPN中的多级检测,就是在不同级别的特征层检测不同尺寸的目标。
如上图所示,FCOS算法使用了{P3, P4, P5, P6, P7}这五个尺度的特征映射。其中P3、P4、P5由主干CNNs网络的特征层 C3、C4、C5经过一个1*1的卷积得到的,而,P6、P7则是接着P5进行了步长为2的卷积操作得到的(相当于降采样,看注解)。最终对这五个尺度都做逐像素回归。
为了能够更好的利用这种多尺度特征,在每一个尺度的特征层都限定了边界框回归的范围,不让其野蛮生长。(基于anchor的检测网络也有类似策略,比如YOLOv3中将不同大小的anchor分配到不同特征层级中作回归)更具体地说,作者首先计算所有特征层上每个位置的回归目标
- 第一:计算当前层级中的回归目标:l、t、r、b。
- 第二:判断max(l, t, r, b) > mi 或者 max(l, t, r, b) < mi -1是否满足。
- 第三:若满足,则不对此边界框进行回归预测。
- 第四:mi是作为当前尺度特征层的最大回归距离。
即在FPN结构中,不同大小的目标被分配到不同层的feature做检测,这样可以有效的避免目标框重叠的问题。同时FPN可以提高召回率,解决了 low BPR的问题。
4、center-ness
由于FCOS算法使用了逐像素回归策略,只要feature上的点落在groundtruth的框内就被认为是正样本,因此FCOS中采用了大量的正样本,会产生大量的low-quality 的bounding box,为了解决这个问题,有必要对检测出的bounding box的质量做一个筛选。基于此,作者提出了一个简单而有效的策略center ness来抑制这些低质量检测到的边界框,且该策略不引入任何超参数。
如上图所示,center-ness策略在每一个层级预测中添加了一个分支,该分支与分类并行,相当于给网络添加了一个损失,而该损失保证了预测的边界框尽可能的靠近中心。该损失的公式如下:
center-ness(可以理解为一种具有度量作用的概念,在这里称之为"中心度"),中心度取值为0,1之间,使用交叉熵损失进行训练。并把损失加入前面提到的损失函数中。测试时,将预测的中心度与相应的分类分数相乘,计算最终得分(用于对检测到的边界框进行排序)。因此,中心度可以降低远离对象中心的边界框的权重。因此,这些低质量边界框很可能被最终的非最大抑制(NMS)过程滤除,从而显着提高了检测性能。
五、FCOS算法与anchor-based的检测算法不同之处和相似之处
1、相似之处:
第一点:
- anchor-based算法将输入图像上的位置作为锚框的中心点,并且对这些锚框进行回归。
- FCOS直接对feature map中每个位置对应原图的边框都进行回归,换句话说FCOS直接把每个位置都作为训练样本,这一点和FCN用于语义分割相同。
第二点:
- 在训练过程中,anchor-based算法对样本的标记方法是,如果anchor对应的边框与真实边框(ground truth)交并比大于一定阈值,就设为正样本,并且把交并比最大的类别作为这个位置的类别。
- 在FCOS中,如果位置 落入任何真实边框,就认为它是一个正样本,它的类别标记为这个真实边框的类别。
2、相似处:
FCOS算法训练的目标函数同样包括两个部分:位置损失和类别损失。
网络效果: FCOS与其他最先进的two-stage或one-stage目标检测算法的比较。在相同主干网络的情况下,FCOS的性能比基于anchor的RetinaNet高出1.9%。FCOS的性能也优于最近推出的无anchor的one-stage检测网络CornerNet,且设计复杂度大大降低。
本文暂时没有评论,来添加一个吧(●'◡'●)