FCOS(Fully Convolutional One-Stage Object Detection)学习笔记
论文: FCOS: Fully Convolutional One-Stage Object Detection
代码: https://github.com/tianzhi0549/FCOS
作者: Zhi Tian, Chunhua Shen, Hao Chen, Tong He
FCOS的提出
当前所有主流的检测器如Faster R-CNN, SSD, YOLOv2,v3等都依赖于一组预定义的anchor boxes,长期以来人们人们一直认为使用anchor boxes是检测器成功的关键。但基于anchor boxes的检测器具有以下缺点:
- 检测器的性能对anchor boxes的尺寸、宽高比和数量等比较敏感,如RetianNet通过改变这些参数可以在COCO数据上使得AP提高4%。因此这些超参数需要在基于anchor boxes的检测器中仔细调整。
- 即使精心设计,由于anchor boxes的尺寸、宽高比是固定的,检测器在处理形状变化较大的物体时也会遇到困难。预定义的anchor boxes还妨碍了检测器的泛化能力,因为它们需要针对不同尺寸或宽高比的新的检测任务上重新设计。
- 为了实现较高的召回率,基于anchor boxes的检测器需要将anchor boxes密集地放置在图像上。在训练过程中,大多数这些anchor boxes都标记为负样本。负样本的数量过多会加剧训练过程中正样本与负样本之间的不平衡。
- Anchor boxes还设计复杂的计算,例如计算与真实框的IoU
使得作者设计FCOS的另外一个原因是,object detection由于使用了anchor boxes,可能是唯一偏离整洁的全卷积像素框架的高级视觉任务,因此,作者在想,能否想FCN对于语义分割一样,以整齐的逐像素预测方式类解决object detection任务呢? 这样基本视觉任务就(几乎)可以统一在一个框架中。
因此,作者提出了anchor-free和proposal-free的检测器FCOS,它具有以下优点:
- FCOS使得检测可以与许多其他FCN可解决的任务(如语义分割)统一在一起,从而可以re-use这些任务中的思想
- 它是anchor-free和proposal-free,因此减少了需要设计的参数的数量
- 消除了和anchor box有关的计算,比如与真实框的IoU计算、匹配等任务
- 在所有one-stage检测器中取得了最好的效果。另外FCOS可以作为two-stage的RPNs来使用,而且具有更好的性能。
- FCOS可以很快的进行扩展,以最小的修改来解决其他视觉任务,包括实例分割和关键点检测。
FCOS介绍
Object detection当做像素级任务来做有两个挑战:
- 很容易得到低的Recall, 因为当步幅较大时,在最终特征图上没有信息(位置)的object是很难召回的。
- 一个正样本像素点出现在ground truth boxes的交叉区域时,该像素点应该回归哪个ground truth box? 如 Fig1所示。
下面看看FCOS是如何解决这些问题的。
FCOS的网络如Fig2所示。
2.1 Object detection的全卷积形式的表示
FCOS同FCN一样,它的训练样本是各个像素点,比如位置(x, y)如果落在了任何一个ground-truth box的内部,它就是一个正样本,它的类别就是ground-truth box的类别。如果它没有落在任何一个ground truth box内部,它就是一个负样本,类别是0(背景类)。
以上部分基本和语义分割一样,不同于语义分割的是,除了每个位置的label,我们还需要回归一个4D的向量。假设位置(x, y)落在ground-truth box Bi 中,Bi的左上角和右下角坐标为,则(x, y)位置需要回归的值为
相比于基于anchor boxes的检测器,只考虑与ground-truth有高IoU的anchor boxes作为正样本;FCOS因为使用像素作为样本,因此利用了更多的正样本训练。作者也认为它可能是FCOS比对应的anchor-based检测器性能好的一个原因。
网络的输出
最后一层特征图的每一个位置输出一个**多维(C + 1 + 4)**向量, 对于前面C维,是C个二分类器,在COCO数据集中C= 80。1表示是center-ness,用来去掉一些低质量的检测框,下面的2.3会详细介绍。4 表示的距离四个边界的信息,如前面介绍的。另外,由于回归的目标总是正值,我们这里使用exp函数对进行修正。这相比于每个位置使用9个anchor boxes的RetinaNet和FPN等,输出的参数少了9倍。
Loss 函数
是focal loss, 是IOU loss,这个是有些与众不同的地方。
Inference
FCOS的inference是直接的。给定一张输入图片,让其通过FCOS得到分类特征图和位置。我们选择的位置作为正样本,通过公式
求得bouding boxes的位置。通过nms求得最后的结果。
注意: FCOS引入center ness了来降低低质量检测框的权重,从而抑制这些低质量的检测。这个在2.3会详细介绍。
2.2 通过FPN实现multi-level预测
这里是解决上述两个问题(低Recall, overlap不清晰的回归对象)的解决方案。
CNN中最后输出的特征图由于比较大的stride(比如16),会导致相对较低的 best possible recall(BPR,可以达到召回率的上界)。基于anchor box的检测器可以通过在判别正、负anchors时降低IoU的阈值。
然而,作者通过经验表明,即使stride较大,基于FCN的FCOS仍然能够产生良好的BPR,甚至可以比基于anchor的检测器的BPR更好。从而, FCOS可以解决低Recall的问题。
具体怎么解决的,目前我还没有想清楚。 ???
第二个问题overlap中的不确定的回归问题在很大程度上也可以通过multi-level预测来解决
依据FPN,作者在不同level的特征图上检测不同尺寸的object。
如Fig2所示,作者使用了5个level的特征图,,其中和由骨干网络产生(上采样, concat操作等)。和由步长(stride=2)卷积得到。的stride分别为8, 16, 32, 64和128。
不像基于anchor的检测器,在不同level的特征上赋予anchor boxes不同的尺寸,作者直接限制了每一个level中bounding box回归的返回大小(本质区别是什么???)。例如, 首先记S = , 回归的是S在0-64的样本, 回归的是S在64-128的样本,回归的是S在128-256的样本,回归的S是在256-512的样本,回归的是S大于512的样本。
这样大部分的overlap问题就可以解决了。如果一个位置(x, y)在使用了multi-level预测之后,仍旧有多于一个ground-truth boxes的overlap,简单的选择具有最小面积的bouding box作为其回归对象。
Head部分在不同level特征之间是共享的,不仅使得检测器parameter-efficient的而且提高了检测性能。
然而,作者观察到不同level的特征需要回归不同的尺寸range,对于不同level的特征使用相同的heads是不合理的。因此作者使用带有训练参数的来代替进行调整,这轻微得提高了检测性能。
2.3 Center-ness
在使用了multi-level预测之后,在FCOS和基于anchor的检测器在性能上仍有一定的差距。作者发现这是由于很多由远离object中心点位置预测出的低质量的检测框。
论文中介绍了一种简单的、无需引入超参数的但是有效的策略来抑制这些低质量的检测框。通引入在分类分支旁边引入single-layer 分支,来预测一个位置的center-ness, 如Fig2所示。
(x, y)的center-ness描述了(x, y)距离”(x, y)位置负责预测”的object的中心的标准化距离。给定一个位置的,center-ness定义为
可以看到,当(x, y)位于object的中心时,根据定义center-ness的值为1,当(x, y)位于object的边界时,center-ness的值为0。因此center-ness可以反映距离中心的偏移。
这里采用开方是为了减慢center-ness的衰减, center-loss采用binary cross entropy(BCE) loss。
通过Fig7,我们可以看到center-ness对于FCOS的影响,它可以使得低质量(高score, 低IoU)的框减少。
在测试时,最终的score是分类score和center-ness相乘,center-ness可以削减远离object中心点的bouding boxes的score。因此这些具有高score但低质量的bounding boxes可以被最后的NMS过滤掉,因此可以显著的提高检测性能。
一种center-ness的替代是只使用grounding truth box的中心部分作为训练的正样本。这两个方法的综合可以获得更好的性能。详情参见https://github.com/yqyao/FCOS_PLUS
FCOS实验结果
与其他模型的对比
FCOS的缺点
在使用了multi-level预测后,如果一个overlap的位置落在了同一个level,虽然作者选择了最小面积的target的作为回归对象,这会对模型有什么影响吗? 或者作者为什么这样做? ??
疑惑
- FCOS multi-level预测和基于anchor的检测器中不同level设置不同size的anchors的方法有什么区别?
- FCOS如何解决Recall低的问题?
- 当multi-level预测不能解决overlap的时候,为什么选择了最小面积的target的作为回归对象?