目标检测系列(6)—FCOS

248 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情

FCOS(Fully Convolutional One-Stage Object Detection)的缩写,这篇文章发表于 2019 年,并且在 2020 有了新的版本。

从名字上来看这个一个阶段的目标检测网络,在一阶段目标检测中,按照是否有 Anchor 又分为

001.png

想一想在做目标检测时,我们为什么需要 Anchor 呢。在深度学习中,是将目标检测的问题转换为对一个候选区域进行分类和回归的问题。好那么我们首先就需要一个候选区域,不同的网络,关于候选区域的生成的方式也不尽相同。对于像 SSD 和 YOLO 这样一阶段的目标检测模型来说,候选区域是通过类似滑动窗口形式来生成的,在二阶段目标检测的模型中,虽然采用 RPN 这样网络来生成候选框,其本质还是在滑动窗口上做了一次回归和分类。

可以将候选框看成我们的先验,也就是通过经验来总结出那些要检测的目标可能的大小和宽高比。 Anchor Box 的设计优劣会影响到检测的准确率,产生 Anchor Box 数量也会影响到目标检测召回率。

Anchor Box 尺寸和宽高比的设计都依赖于数据集,那么对于不同的数据集,就需要重新对样本进行统计,计算出适合当前数据集的 Anchor Box 尺寸和宽高比例,这样就比较繁琐。引入 Anchor 同时也会在训练过程中带来额外的计算量,例如 IoU 和 NMS 的计算,这些计算从一个侧面都带来了性能损耗。

这样一来就会给 Anchor-free 机会,那么 Anchor-free 和 single Anchor 有什么区别以及 Anchor-free 有哪些局限性

Anchor-free 和 Anchor-base

  • 正负样本
  • 候选框生成机制,Anchor-Box

当下流行的目标检测的网络大多数都采用 Anchor-base 的网络,对于预测框也好,对于真实框也好都是相对于 Anchor box 来表示的,例如预测框中心点位置预测的是预测框中心点位置到 Anchor box 的位置,对于预测框的宽高,预测的是相对于 Anchor box 的宽和高的缩放因子。

005.png

那么对于 Anchor-free 的 FCOS 他又是如何预测的呢?上图有一个点也就是预测点,然后预测该点到目标左右、上下边界的距离,也就是图 l、r 和 t,b 的值

网络结构

fcos_001.png

注意这张图是 2019 年版本,在随后 2020 年的版本中,是将 Center-ness 放在回归分支里,主干网络输出为 C3C3C4C4C5C5 经过 FPN 得到 P3P3P4P4P5P5 然后在 P5P5 的基础再经过一个 3×33\times 3 步长为 2 卷积得到 P6P6,在 P6P6 基础上通过通常卷积层得到 P7P7

对于每一个预测点只只需要 l、r、t 和 b 4 个值,这样大家感觉是不是又回到 YOLOv1 的时代,也就是在特征图尺度上进行预测,要的

xmin=cxl×symin=cyt×sxmax=cx+r×symax=cy+b×sx_{min} = c_x - l \times s\\ y_{min} = c_y - t \times s\\ x_{max} = c_x + r \times s\\ y_{max} = c_y + b \times s

检测中心度

除了两个对于目标检测必备的检测头,回归和分类检测头。这里又添加一个中心度检测头用来弥补 FCOS 没有 Anchor box 的不足。

centerness=min(l,r)max(l,r)min(t,b)max(t,b)centerness^{*} = \sqrt{\frac{\min(l^*,r^*)}{\max(l^*,r^*)}\frac{\min(t^*,b^*)}{\max(t^*,b^*)}}

希望预测点位置为预测框的中心度

基于 Anchor 网络存在的问题

基于目标检测

Anchor-Free

预测点直接预测

正负样本的匹配

只要预测点落入在真实框中,这些点就是算正样本点,作者后来实验证明将那些落入在目标中心点附件的预测点做正样本可能效果会更好,关于这个区域应如何计算呢?作者给出公式

(cxrs,cyrs,cx+rs,cy+rs)(c_x - rs, c_y - rs, c_x + rs, c_y + rs)

这里 rr 是一个超参数,关于 rr 也通过实验找到 1.5 时效果最好,

001.png 如上图某一个预测点落入和网球选手和网球拍这两目标框中,那么应该如何分配这个预测点,作者给出的答案是,默认分配给面积最小的真实框。

损失函数

L({Px,y},{tx,y},{sx,y})=1Nposx,yLcls(Px,y,cx,y)+1Nposx,y1(cx,y>0)Lreg(tx,y,tx,y)+1Nposx,y1(cx,y>0)Lctrness(sx,y,sx,y)L(\{P_{x,y}\},\{t_{x,y}\},\{s_{x,y}\}) = \frac{1}{N_{pos}} \sum_{x,y} L_{cls}(P_{x,y},c^*_{x,y})\\ + \frac{1}{N_{pos}} \sum_{x,y}\mathbb{1}_{(c_{x,y}^* > 0)} L_{reg}(t_{x,y},t^*_{x,y})\\ + \frac{1}{N_{pos}} \sum_{x,y}\mathbb{1}_{(c_{x,y}^* > 0)} L_{ctrness}(s_{x,y},s^*_{x,y})\\

1cx,y>0\mathbb{1}_{c_{x,y}^* > 0} 只会计算正样本的损失

总结

FCOS 让目标检测摆脱 anchor box 的束缚,避免一些像 IoU 和 NMS 这样额外的计算量开销比较大计算。