本文贡献点:
- 指出了 anchor-based 和 anchor-free 方法性能差别的决定性因素:如何定义正样本和负样本
- 提出了一种根据目标的统计信息来自动确定样本正/负的方法
- 验证了在每个位置上铺设多个 anchor 的方法是没有多大效果的
代码:https://github.com/open-mmlab/mmdetection/tree/master/configs/atss
出处:CVPR2020
一、背景和动机
目标检测在很长一段时间内都是被 anchor-based 的方法统治,先预定义很多 anchor,然后通过训练来调整这些anchor,输出最终的检测结果。两阶段的方法 refine anchor 的次数大于单阶段的方法,所以准确率更高,当时 SOTA 的结果还是来源于 anchor-based 方法。
后来出现了一些基于 FPN 和 Focal loss 的 anchor-free 的方法,也取得了很好的效果,anchor-free 的方法是不基于预定义的框,而是直接预测目标框,主要有两种直接预测的方法。
- 第一种是确定关键点,然后确定边界框:keypoint-based methods,继承了标准的 keypoint 估计方法的 pipeline,和 anchor-based 方法相差较大。
- 第二种是使用目标的中心点或一些区域来定义正样本,然后预测该点距离四个边界的距离:center-based methods,和 anchor-based 方法更加类似,将每个点作为训练样本,而非 anchor box。
anchor-free 方法的优势:
- 剔除了需要预设定的参数,如 anchor 个数、尺寸、宽高比等,让模型更加灵活
单阶段 anchor-based 方法和 anchor-free 方法的对比:
- RetinaNet:在每个位置设定多个 anchor,使用 IoU 来区分前景、背景框,
- FCOS:将每个点当做训练样本,使用点是否在框内来区分前景、背景点,
上述方法的劣势:
这些方法都是需要设定阈值参数的,这些确定的规则虽然对大多数目标适用,但对一些 outer 的目标是不使用的,所以,对不同的目标应该用不同的规则。
寻找关系到模型效果的关键因素:
该文章指出,anchor-based 和 anchor-free 的方法最大的不同,就是如何判断正负样本,这是导致上述两种方法性能 gap 的最大的原因。
如果他们使用相同的方法来定义正负样本,最后的性能几乎没有差别。这也就说明了定义正负样本的重要性。
本文的解决方案和效果:
于是,该文章提出了 Adaptive Training Sample Selection (ATSS) ,来根据目标的统计信息,自动选取正负样本,无任何超参数。
ATSS 在 COCO 上达到了 50.7% AP
二、方法
2.1 分析不同
在训练检测器时,首先要定义正负样本来进行分类,其次要对正样本进行回归,下面也证明了 FCOS 是对 RetinaNet 在正负样本定义上的优化,也取得了效果提升。
首先将 RetinaNet 和 FCOS 的效果进行了拉齐,然后进行了对比。
1、Classification:区分正负样本的对比
如图 1 所示:
RetinaNet 使用 IoU 来区分正负样本,IoU 大于某个阈值(如0.5)的为正样本,小于某个阈值(如0.3)的为负样本,其他框忽略。
FCOS 是将落在真值框内的点,并考虑当前特征图尺度,将当前尺度上符合预设定大小的点,当做正样本,其他当做负样本。
如表 2 所示,对于 RetinaNet,使用 FCOS 的定义正负样本的方法,AP 从 37.0%→37.8%。
对于 FCOS,使用 IoU 方法来定义正负样本,AP 从 37.8%→36.9%。
该结论说明,正负样本选择的方法对 anchor-free 和 anchor-based 方法的结果的差别起到了很重要的作用。
2、Regression:回归方式的对比
- RetinaNet:回归四个偏移,如图 2b
- FCOS:回归特征点到四个边的距离,如图 2c
所以,对于正样本,RetinaNet 的回归的初始状态是框,FCOS 是点,如表 2 第一行和第二行对比,当两个方法使用相同的的正负样本选择策略,结果没有很大差别。
3、对比结论
单阶段 anchor-based 方法和 anchor-free 方法的效果差距的最主要原因在于正负样本的划分方式。
2.2 方法
正是由于上面所说的正负样本划分方式的重要性,本文提出了一种新的划分方法,无需任何超参数,可以让模型通过目标的统计分布来自适应的进行正负样本划分。
前面涉及到的两个方法正负样本的划分,都涉及到了超参数,这样就使得样本的划分需要遵循特定的规则,难免会有一些异常的样本被遗漏。
ATSS 方法的过程:
对图中的每个grund-truth box g g g:
- 首先寻找所有的候选正样本(line 3-6),也就是对每个pyramid level,计算每个anchor 的中心点和目标的中心点的 L2 距离,选择距离最近的前 k k k 个 anchor box。如果有 L L L 层,则共有 L × k L \times k L×k 个。
- 计算每个候选正样本和 ground truth g g g 之间的 IoU ( D g D_g Dg, line 7)
- 计算这组 IoU 的均值 m g m_g mg 和方差 v g v_g vg,(line 8-9),设置选取正样本的阈值为: t g = m g + v g t_g = m_g+v_g tg=mg+vg (line 10)
- 根据 IoU,选择那些 IoU 大于等于阈值(且 anchor 中心在 gt 内部,line12)的 anchor 作为最终的正样本(line11-15)
- 如果一个框被几个不同的 gt 都分配过去了,那就选择 IoU 最高的。
- 其他的作为负样本
步骤总结:
1、计算每个样本点和真实框中心点的 L2 距离,保留距离最小的前 k 个点
2、计算保留下来的 anchor 和真实框的 IoU,并计算这组 IoU 的均值和方差,均值和方差的和即为阈值
3、大于阈值的为正样本
上面为什么使用 anchor 和 object 的中心点距离来选择候选框?
- RetinaNet 中,如果两个框中心点距离越近,则其 IoU 得分会越高
- FCOS 中,anchor point 如果距离目标中心点的距离越近,则是高质量 point,会产生更好的检测结果。
为什么要使用均值和标准差这些统计结果来非固定的阈值?
这里使用的是 k × l k\times l k×l 个 anchor 的 IoU 的统计信息,也可以看做是选择了 level。
本文的阈值是一个统计结果,如图 3(a) 有一个高的阈值,这是因为这里的候选框质量都很高,如图3(b) 有一个低的阈值,说明这里的框的质量都不高,如果使用高阈值的话,会把绝大部分的框都滤掉,不合适,所以使用统计的量作为阈值是一个可取的方式。
IoU 的方差决定了由 FPN 的哪几个 level 来负责检测该目标:
FPN 层的一个很大的作用就是分而治之,比如较大的目标是由较深的层来负责:
- 若方差大, 则说明不同 level 上的 anchor 和 gt 的匹配程度有较大差异,有少数几个 level 上的 anchor 的 IoU 特别高,那么 IoU 的阈值也应该调高,这样那几个少数的合适 level 上的 anchor 被保留,其余 level 被淘汰。下图 a 就是高方差的情景,level 3适合检测该目标,则加上高方差后,level3 留下,其余淘汰
- 若方差小,则说明不同 level 上的 anchor 和 gt 的匹配程度有较小差异,那么 IoU 的阈值也该调小,这样加上低方差,正确的 level 就会保留,下图 b 是低方差的情况,加上低方差后, level 1 被保留。
综上也可知,IoU 阈值和 IoU 的方差有关
对不同尺寸目标的不均衡的修正:
根据统计理论,大约16%的框会落到 [ m g + v g , 1 ] [m_g+v_g, 1] [mg+vg,1] 这个区间内,也就是大于等于 [均值+方差] 的数据会占 16%,虽然 IoU 的分布不是正态分布,但统计结果表明大约有 0.2 ∗ k L 0.2*kL 0.2∗kL 的正样本,这是不随尺度、aspect ratio、location 而改变的。
但 retinanet 和 fcos 的方法,会更多的关注于大尺度的正样本,导致不同大小的目标数量不均衡。
ATSS 的超参数:
ATSS 只有一个超参数 k k k,但实验也证明了该超参数对检测结果没有很大的影响,所以可以忽略不计。
Anchor size 的影响:
由于 ATSS 是使用 anchor 来定义正样本的,所以需要设定一个合理的 anchor size。
在之前的方法中,在每个位置点上布了 8S 个 anchor(S 是当前特征图的 stride)。
① anchor 尺度影响:
如表 5 所示,作者使用了不同的尺度 [5, 6, 7, 8, 9],检测效果都很稳定
② anchor 形状影响
如表 6 所示,展示了不同纵横比下的效果,也很稳定,说明 ATSS 对 anchor 形状的变化表现很稳定。
③ anchor 个数影响
使用 1 个和使用 9 个效果没差多少,所以这也说明了使用 ATSS 来进行正样本的选择,能够达到和之前方法使用多种不同尺度 anchor 的效果,所以也间接证明了在每个位置上铺设多个 anchor 是不必要的。在使用 IoU 阈值来区分正负样本的情况下,多个 anchor 是有必要的,但使用 ATSS 来区分正负样本是必要的。
2.3 嵌入 FCOS
1、嵌入 RetinaNet
RetinaNet 是 anchor-based 的方法,可以直接使用 ATSS 的划分正负样本的方式,提升了 2.3% AP。该提升主要来源于 ATSS 的自适应样本选择。
2、嵌入 FCOS
FCOS 是 anchor-free 的方法,这里使用两个版本:lite 和 full
对于 lite 版本,使用了一些 ATSS 的技巧。FCOS 是使用 anchor point 来划分正负样本的,会产生低质量的正样本,ATSS 给每个框选择前 9 个候选样本,将 AP 从 37.8% 提升到了 38.6%。
对于 full 版本,将 FCOS 中的 anchor 点变为使用 8S 尺度的 anchor box 来定义正负样本,但仍然和 anchor 点一样回归。
full 版本更好一些,两者主要的区别在于选取候选框的尺度问题。
三、效果
以 FCOS 为基础,添加 ATSS 模块作为对比基准:
四、代码
MMDetection 提供了基于 RetinaNet 的 ATSS,没有提供基于 FCOS 的 ATSS。
因为 ATSS 是在 RetinaNet 的基础上,加上了 FCOS 的各种技巧,包括 GroupNorm、GIoU Loss、In GT Box、Centerness、Scalar。所以诞生了一个 RetinaNet 和 FCOS 的结合产物:
- backbone:和 RetinaNet 一致,ResNet50
- neck:和 FCOS 一致,在 output 上进行额外卷积
- ATSSHead:继承于 AnchorHead,多了 centerness 分支
- AnchorGenerator:和 RetinaNet 一致
- loss:和 FCOS 一致
- BBox_coder:和 RetinaNet 一致