
作者提出全卷积单阶段目标检测算法,类似语义分割方式进行逐像素预测。现在大部分stoa目标检测算法都是基于anchor的,FCOS是不用anchor和proposal的。通过去掉预先定义的achor框集合,FCOS能够避免与anchor框相关的复杂计算(比如训练时计算overlap),同时减少了显存的消耗。作者号称能够避免与anchor相关的超参设置(在实际使用中,anchor超参设置确实对结果有很大的影响)。FCOS用的后处理还是NMS。
作者在文中声称FCOS可以作为两阶段检测算法的RPNs,可以让算法得到更好地表现。并且说FCOS可以扩展成实例分割和关键点检测。
- FCOS是逐像素做检测
- 使用了多level的预测(提高召回+解决了训练时重叠框的不确定性问题)
- 提出了centerness,抑制低质量检测框,通过大margin提升整体性能
记 是在backbone的第i层的特征,s是在此层前的总体stride,将gt bboxes定义为
。其中的4个坐标表示框的左上角和右下角。c代表框的类别。对于在特征
上的位置(x,y),可以将它映射回输入图像
,这样是贴近位置(x,y)的 receptive field的中心的。FCOS对于每个位置直接回归bbox。
如果位置(x,y)在gt的bbox里面的话,那么它被认为是正样本,否则它会被认为是负样本。FCOS定义了4维的向量 作为回归目标。这四个坐标表示这个位置到框的四个边的距离(如下图所示)。如果一个位置在多个框中,它会被看做不确定样本,现在的做法是选择面积小的框作为它的目标。个人感觉这种方式还有待更多考虑和实验


如果给FCOS提供更多前景样本,它会更容易收敛。带anchor的方法需要高IOU判断才能当做正样本。
网络输出:对于COCO而言,最后一层预测80维分类标签和4维的bbox。FCOS训练了C个二分类网络;对于分类和回归,各在特征后面加入4个卷积层;因为回归结果正的,所以在回归分支用了exp(x)去映射真实值。FCOS相比anchor算法(每个位置9个anchor box的算法)减少了9倍的网络输出变量
损失函数如下图所示, 是focal loss,
是IOU loss.
是正样本数量,
为1,

在推断的时候,在每个特征层根据分类的score判断是否正样本,并用公式1来反推bbox。
FCOS多层预测
大stride(比如16)会大致低BPR(best possible recall). 对于anchor方法,低BPR的原因是对于正样本有IOU要求。对于FCOS而言,作者用实验证明了即使对于大stride,FCOS仍然能保证好的BPR。并且FPN还能提升BPR。
GT中的Overlaps可能导致棘手不确定性,这种情况会降低基于FCN的检测。
FCOS在不同层特征,检测不同size的物体,使用了5个特征层 ,3 4 5来着backbone C3,C4,C5后面接一个1x1卷积。P6 P7是在P5后面用stride为2的一层卷积层得到。那么stride分别为8,16,32,64,128。
FCOS直接在每层特征层限制bbox的回归范围。
- 计算所有位置的target框
- 如果一个位置满足
or
,这个位置会被置为负样本,不用回归bbox。
是特征i回归的最大距离
因为不同大小的目标被送到不同特征层中预测(可以缓解大小不同物体在overlap发生的情况造成的影响)个人感觉这会将 的设置变成超参
FCOS中不是使用exp(x),而是用了 ,其中
是可以训练的用来调整在特征层i的回归函数,这是涨点的一个关键。
Center-ness
FCOS在使用FPN情况下性能仍然低于achor方法,原因是远离目标中心的位置产生了低质量框预测。FCOS加了单个分支预测一个位置的Center-ness,gt计算方式是:
训练时候用BCE。推断的时候将centerness乘到分类score上去,这样可以抑制远离目标中心的位置产生的预测。
实验就不分析了。
个人总结FCOS的关键点是:
- 逐像素检测,训练时没有IOU阈值,训练时候正样本数目变多,有利于高召回
- 回归框的时候使用exp函数,利于收敛;在exp中使用可学习的变量,提升拟合能力
- 训练时根据目标与位置的相对距离分层分配,有利于收敛,同时能缓解overlap
- 使用center-ness学习每个位置的相对中心性,在训练时候引入了多个loss信息;在预测时候能够抑制低质量预测
