FCOS是典型的one-stage和anchor free结合,并且思路和cornerNet系列的寻找corner不同,借鉴了FCN的思想,通过单个feature上的点来做检测。
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的问题中,如实例分割,关键点检测等。
网络结构
基础网络借鉴FPN,引出P3~P7层用于检测。右侧的Head是FCOS的重点部分,可以看到每层feature被分为了两个分支,上面的分支用于做分类,下面的分支用于做目标框位置的回归。分类的分支还有一个Center-ness分支用于做中心点的预测,这个分支后面会讲到。
关注一下FCOS的目标框回归方式,不同于传统的中心点+宽高或者坐标点的形式,FCOS通过中心点和一个4D vector来预测物体框的位置。
假设是用来做分类的feature map,尺寸为
,其中C为分类的类别数。设
为feature map上的任意一点,根据的把这点映射到输入图像中的位置
上。在anchor-based的方法中,通常认为映射到图像上的点
就是anchor的中心点,然后再基于anchor的位置做回归。而FCOS中,摒弃了这种方法,当
(映射回input image中的位置)能够落入groundtruth当中,那么
对应位置上的类别会被标注成当前groudtruth的类别(如果是背景则标注为0)。
位置回归上则通过Regression对应feature map位置上4D vector
来预测框形状。训练的时候target可以写成:
可以看到FCOS中,只要feature map某个位置的点落入groundtruth的bbox中就被认为是正样本,可见用于训练的正样本的数量将会非常的多。作者认为这是FCOS能够赶超anchor-based方法的重要原因之一。
Loss Function
其中为分类损失,并且采用了Focal Loss;
为位置回归损失,用了IOU loss。
在FCOS用FPN
FCOS中存在两个问题:
- CNN的下采样会带来low best possible recall(BPR),BPR可以理解为召回率的上线。直观上理解,因为最终用于检测feature map经过了多次的下采样,有着更大的感受野,如果只通过某一层的feature来做检测,当感受野内有多个物体的时候,可能只能检测到一个物体,这就导致了低的BPR,及检测算法的上限会很低,当图像中的物体较密集的情况下,会产生较多的漏检。
- 无法有效的解决目标框重叠情况下的回归问题,如下图所示,当中心点被两个groudtruth所包含时:
但是当采用FPN网络之后这些问题能够被有效的解决。设regression的target为,当
或
,则这个target不需要参与这层feature 目标框的回归。换言之,即在FPN结构中,不同大小的目标被分配到不同层的feature做检测,这样可以有效的避免目标框重叠的问题。同事FPN可以提高召回率,解决了 low BPR的问题。
Center-ness
先前说过,只要feature上的点落在groundtruth的框内就被认为是正样本,因此FCOS中采用了大量的正样本,会产生大量的low-quality 的bounding box,为了解决这个问题,有必要对检测出的bounding box的质量做一个筛选。Center-ness就是用来做筛选工作。
centerness可以看成对中心点在groudtruth中心的位置做一个筛选,当和
或者
和
的比例差别过大,可以认为当前feature映射回原图的中心点在groudtruth中很偏离,这种中心点偏离的样本可以被认为是low-quality的,过滤掉即可。在测试的时候,centerness的分数会作为系数乘上classification score,达到抑制这些low-quality的bounding box的目的。