FCOS是一阶段anchor free目标检测算法,其主要的卖点为无锚。通过回归特征图上每个位置距离目标框的上下左右距离来实现目标检测。如果一个位置落在了多个目标框内,文中的方法是通过多尺度+回归幅度限制的方法来缓解这个问题。为了解决目标框数量过多的问题,文中提出了center-ness的方法,为每个位置学习一个center-ness分数,最后乘以预测类别分数作为非极大抑制的输入参数来解决这个问题。
FCOS采用resnext+FPN的网络作为backbone。右侧共得到五个特征层。
FCOS
对特征图上每个点 ( x , y ) (x,y) (x,y)做回归,计算其与目标框的上下左右距离,若该位置落入第 i i i个目标框,左上坐标为 ( x 0 ( i ) , y 0 ( i ) ) (x^{(i)}_0,y^{(i)}_0) (x0(i),y0(i)),右下坐标为 ( x 1 ( i ) , y 1 ( i ) ) (x^{(i)}_1,y^{(i)}_1) (x1(i),y1(i))该位置距离其上下左右的距离为 t ∗ , b ∗ , l ∗ , r ∗ t^*,b^*,l^*,r^* t∗,b∗,l∗,r∗,则
l ∗ = x − x 0 ( i ) , t ∗ = y − y 0 ( i ) l^* = x-x^{(i)}_0 , t^* = y - y^{(i)}_0 l∗=x−x0(i),t∗=y−y0(i)
l ∗ = x 1 ( i ) − x , t ∗ = y 1 ( i ) − y l^* = x^{(i)}_1-x , t^* = y^{(i)}_1-y l∗=x1(i)−x,t∗=y1(i)−y
最终每个特征图上每个位置输出(C+4)维的向量,C个类别和四个回归距离。损失函数如下:
第一项为类别损失,根据focal loss,对每个类别单独预测一个二分类结果。第二项是IOU损失,前面的系数为类别置信度,表明该位置是否落入目标框,是为1,否则为0。
为了解决一个位置落在了多个目标框内的问题,使用多尺度的方法,每个尺度上都有一个最大回归距离限制,对应于物体的大小,最深的特征层不受限制。在多尺度特征融合时,由于设置了尺度距离限制,造成一定的gap,采用每层乘上一个可学习的系数的方法来解决。
经过以上的设计,效果仍然不好,一个可能的原因是无用的框太多了,每个位置都产生一个预测框,最终有些没有被去掉。为此设计了一个center-ness模块。直观的理解如下:
为每个位置学习一个与目标框中心相对距离的分数,离中心越近,分数越接近与1,反之越接近0。上图中,蓝色部分为0,中心红点部分为1,其余部分为0-1之间的分数。分数计算公式如下:
c e n t e r n e s s ∗ = m i n ( l ∗ , r ∗ ) m a x ( l ∗ , r ∗ ) × m i n t ∗ , b ∗ m a x ( t ∗ , b ∗ ) centerness^*=\sqrt{\frac{min(l^*,r^*)}{max(l^*,r^*)}\times\frac{min{t^*,b^*}}{max(t^*,b^*)}} centerness∗=max(l∗,r∗)min(l∗,r∗)×max(t∗,b∗)mint∗,b∗
从以上公式可以看出,如果左右距离越接近相等,根号下的第一项越接近1,上下距离也一样,可以看出,该位置离目标框中心越近其分数越接近1,反之越接近0。这样达到降低里目标框中心较远的位置的权重的作用。
该损失函数作为一个分支加到总损失函数中。最终center-ness分数乘以类别分数作为nms的排序参考。
总结