论文阅读: A Simple and Strong Anchor-freeObject Detector(FCOS_imprv)

论文信息: Zhi Tian,Adelaide
代码链接:https://github.com/aim-uofa/AdelaiDet
整体框架: 这篇论文是fcos原作者重新修改后发表在PAMI上面的一篇文章,fcos_imprv和fcos整体思想是一致的,只是在原作上做了部分修改,是网络性能得到进一步提升,在backbone为ResNet-101-FPN上面的性能从41.0提升到43.2,提升明显。本文主要是记录一下fcos_imprv相比原方法的一些改进和提升方法。

改进点

对于原始fcos方法的原理介绍,可以参考这里 ,这里详细说一下改进的地方:

1.正负样本

作者对正负样本的指定做了修改,在原始fcos中,对于目标被的所有特征点均指定为正样本,以及该特征点到目标边界的距离满足所处的FPN层的约束;而在FCOS_imprv中则要求指定只有在目标中心区域的特征点才为正样本;目标中心区域的大小为:

其中 $\left(c{x}, c{y}\right)$ 为目标中心,s为当前层的stride,r 为超参数,在论文中r设置为1.5。这个代码的实现可以看一下mmdetection中FCOS的实现:fcos_head.py 其中center_sample_radius参数默认设置为1.5.

2.回归目标修改

Fcos的回归目标直接是特征点到目标边界的距离,由于Head是共用的,所以在预测时为每个level预设一个可学习的scale因子,而fcos_imprv则加入stride,变得更适应FPN的尺寸,可学习的scale因子依然使用,具体形式如下:

这一部分的代码实现,可以看一下这个地方:fcos_head.py#L147 其中scale为可学习参数。

3.centerness 修改

在原始fcos中,centerness是和分类分支放在一起预测,而在fcos_imprv中,将该分支移至回归分支,以便更好的利用位置相关信息;

fcos_imprv

4.回归损失函数

在fcos方法中,训练损失函数如下:

第一项是分类分支的损失函数,使用的是的focal loss,第二项是回归分支的损失函数。在原始fcos中,使用的IOU loss,而在fcos_imprv中,使用的GIOU loss。这里顺便介绍一下IOU loss和GIOU loss的区别。

  • IOU loss,原始smooth l1 loss在计算目标检测的 bbox loss时,都是独立的求出4个点的 loss,然后相加得到最终的 bbox loss。这种做法的默认4个点是相互独立的,而目标检测评价的是IOU指标,与实际不符。IOU loss计算如下:
  • GIOU loss,iou loss计算的是预测框与gt框存在重叠情况下的损失函数,而对于不重叠情况下,损失函数不可导,无法优化两个框不相交的情况。此外,如果iou是确定的,其iou值是无法确定两个框是如何相交的。GIOU 计算如下:

    GIoU 的实现方式如上式,其中 C 为 A 和 B 的外接矩形。用 C 减去 A 和 B 的并集除以 C 得到一个数值,然后再用 A 和 B 的 IoU 减去这个数值即可得到 GIoU 的值。可以看出:1)GIoU 取值范围为 [-1, 1],在两框重合时取最大值1,在两框无限远的时候取最小值-1;2)与 IoU 只关注重叠区域不同,GIoU不仅关注重叠区域,还关注其他的非重合区域,能更好的反映两者的重合度。

    GIOU loss计算如下:

5.分数计算

最终分数的计算,fcos采用分类分数以及center-ness之积,fcos_imprv则采用分类分数以及center-ness之积的平方根:

实验结果

fcos_exp