FCOS

Apr 25, 2024
2 views
Computer Vision

先要明确的知道,FCOS是一个基于FCN(全卷积网络用于目标检测)、一阶段(one stage)、anchor free、proposal free、参考语义分割思想 实现的逐像素目标检测的模型

简要介绍下FCOS几个核心点:

(1)FCOS方法借鉴了FCN的思想,对 feature map 上每个特征点做回归操作,预测四个值  , 分别代表特征点到Ground Truth Bounding box上、下、左、右边界的距离。

(2)特征点映射会原图后对应多个GT Bounding box,无法准确判断原图像素所属类别,因此模型引入 FPN 结构,利用不同的层来处理不同尺寸的目标框。

(3)远离目标中心点可能会产生劣质预测结果,为了增强中心点选取的准确性,模型引入了Center-ness layer。

(4)损失函数由三个部分构成:分类损失focal loss;回归损失iou loss;center-ness损失 BCE。

Anchor-based 方法的缺点

在前些时候主流的目标检测论文研究大多都是anchor-base,我们熟知的就有SSD、YOLOV2、YOLOV3、Faster-R-CNN、Mask-R-CNN(啥都能做。。),而且准确率最高的大多都是这类anchor-base的模型。

但是anchor-base也有不少缺陷:

  1. anchor-base模型的检测性能一定程度上依赖于anchor的设计,anchor的基础尺寸、长宽比、以及每一个特征点对应的anchor数目等。比如Faster提出的基准anchor大小16,3种倍数[8, 16, 32] 以及三种比例,共9种anchor。
  2. 设定好anchor了只能说是匹配到大部分目标,对于那些形变较大的目标检测起来还是比较困难,尤其是小目标(小目标识别已经是一个研究方向了)。同时这也一定程度上限制了模型的泛化能力。
  3. 为了取得较好的召回率(将负例识别为正例的概率越小,Recall越大),那就需要为每个特征点安排更密集的anchor,假如我们为了性能同时考虑形如FPN这样的多尺度结构,在前向推演以及NMS等操作时,显存以及CPU消耗很大。
  4. 在这些放置的更密集的anchor中,大多数anchor属于负样本,这样也造成了正负样本之间的不均衡。(Faster好像各选128 positive / negtive 作为训练anchor,不过肯定不是随机挑选的)。

这里讲一些我在实际论文和项目中的感觉啊,基于anchor-base的模型就单说准确率来说已经很高了,但是相对的FPS会低一些,可是!!现实中的项目包括各种制造厂、车载设备、道路设备最终都是需要集成到板端的,现在你搞了密集anchor,在前向推演以及NMS等操作耗时太长,必然不能满足需求。从研究论文角度来讲,anchor-base的门槛已经很高了。。所以大家都开始转战anchor-free,而且还取得了不错的成效,有些想法很棒。

FCOS模型结构

image

和语义分割相同,检测器直接将位置作为训练样本而不是anchor。具体的,每一个feature map上的特征点都是一个样本,但是在回归之前要映射回原图进行正负样本的判断,映射回原图后的点如果在某一个GT Bounding box内,则对应的特征点是正样本,类别就是Bounding box内目标的类别;否则,负样本。

FPN结构及作用

本文将 feature map 上每一个特征点作为样本,当落在多个GT Bounding box内,论文称这样的特征点为 "模糊样本"(ambiguous sample),那么模糊样本应该回归的边界框对应哪个GT Bounding box?

本文是这样抉择的:(1)引入FPN结构实现多级预测(2)在多级预测筛选后如果某一个特征点还是匹配多个GT Bounding box,这种情况简单的选择面积更小的GT Bounding box作为该特征点的回归目标。

当然模糊样本的出现,还是会干扰当前像素属于哪一类的判断。

本文通过多层级feature map的预测(引入FPN,{P3,P4,P5,P6,P7})来解决模糊样本的问题,说实话这一块其实不是很好懂,我最开始就很疑惑引入了多层级feature map,再把每一级feature map的特征点映射回原图,最后回归岂不是增加了冲突的次数以及计算量?

但是后来仔细看了论文以及查看了很多博客之后,发现FCOS其实是使用不同层级的 feature map 检测不同尺寸的目标(如果是anchor-base的话,这一块难道不就是不同层级的feature map设置不同大小的anchor尺寸吗?),为了实现这样的需求就需要引入一个阈值,该阈值限制不同层级特征回归预测一定范围内尺寸的目标。

Center-nes

在引入FPN结构实现多层级feature map预测后,在性能方面 FCOS 仍与 anchor-base 的模型存在一定差距。这是由于距离目标中心较远的位置预测出大量低质量的Bounding box造成的,简单点说就是某一个层级的特征点映射到原图上的点位于真实GT Bounding box的边缘或者位于距离box目标中心较远的位置,因此模型在学习和预测的时候可能认为这个点不属于它本该对应的目标,但这样造成的结果就是本该回归目标是某一个GT Bounding box的特征点预测出了一个新的box,而这个box没有特别大的意义(并不完全正确,也可以这么理解,本该归类为某一个目标的特征点错误预测成了其它类)。

解决这个问题,核心在于让模型学习到“中心度”,也可以理解成哪些点才是目标最可能的中心点(反向告诉某些特征点,它不是中心点,预测的box没有特别大的意义,这样就抑制了低质量box的产生)。

image

为了剔除远离目标中心的低质量预测bbox,作者提出了添加center-ness分支,和分类分支并行。

image

开根号使center-ness衰退缓慢。center-ness范围为0-1之间,通过BCE训练。测试时,最终分数由center-ness预测结果和分类分数乘积得到。

模型最终的目的是输出一组置信度高的box和类别,因此后续使用NMS进行筛选,我们知道NMS是需要一组置信度得分的,那么这个置信度得分如何计算那?是的。。就是模型的输出的 Final置信度 = (类别概率) (对应的center-ness),根据公式我们可以发现 center-ness 可以看做是一个注意力机制(加权),让模型更加关注那些距离真实目标中心点近的预测box*,即使距离中心点远的的点 类别概率得分很高,因为center-ness的存在也能抑制该点的置信度,仍会被NMS筛除。

损失函数

image

虽然很传统但是还是有所区别:

分类损失:舍弃了softmax,改为对head输出的classification(H * W * C)每一个通道(每一个通道代表一种类别)分别使用sigmoid函数,然后使用 Focal loss。这样做的好处,在我的理解中是为了保留类别之间的关联特性。

回归损失:IOU Loss,仅对那些有意义的特征点进行回归计算。有意义是什么意思那?其实就是先将特征点映射回原图,看看原图上对应的点在不在某一个GT Bounding box里面,不在就是负样本,也就是;如果在一个或多个box里面,则根据FPN不同层级feature map 能够回归的范围阈值筛除不符合条件的box,然后继续重复上述步骤判断该特征点是否有意义。

center-ness的损失:BCE损失(二值交叉熵),我很奇怪,这部分并没有体现在上面那个公式里面,不过肯定是有的。

补充一些细节

在引入FPN的同时还引入一些改变,FCOS在不同的特征层级之间共享head(共享的是结构/权重共享,代码中详看 cls_tower和bbox_tower )。但是不同的特征层级需要回归不同的大小范围(例如,P3的大小范围是[0,64],P4的大小范围是[64,128],因此对于不同的特征层级使用相同的head是不合理的。因此,论文中不再使用标准的exp(x),而是使用\(\exp(s_i * x)\),其中可训练标量 \(s_i\) 被用来自动调整不同层级特征的指数函数的基数,从而稍微提高了检测性能(在下面代码中si首次出现在__init__()函数的最后)。

Inference

FCOS目标检测论文各种细节解读