An Analysis of Scale Invariance in Object Detection – SNIP 论文笔记

前言

首先思考这样一个问题:为什么目标检测与图像分类相比要更加困难呢?作者认为,这是由于目标的尺度变化,尤其当检测非常小的目标时很难达到理想的效果。在ImageNet和COCO中,目标的中等尺度分别为0.554和0.106,也就是说,COCO数据集中的大多数目标的尺度都小于图像区域的1%。更糟的是,在COCO中最小和最大的10%目标的尺度分别为0.024和0.472,这几乎是20倍的尺度变化!如下图所示:
An Analysis of Scale Invariance in Object Detection – SNIP 论文笔记
检测器需要处理COCO中目标的尺度变化,而这对于CNN的尺度不变性来说是一种巨大的挑战。并且,ImageNet预训练的模型在迁移到样本大小差异较大的COCO中时很可能产生domain-shift偏差。目前也有很多方法解决尺度变化和小目标带来的问题,比如:

  • 结合深层特征和浅层特征以检测小目标;
  • 使用dilated/deformable卷积以提升感受野,从而检测大目标;
  • 不同分辨率的卷积层进行独立预测,将预测结果用于捕获不同大小的目标。

上述方法虽然能够改善目标检测,但与训练相关的许多重要问题依然没有得到解决:

  • 为了提高对小目标的检测效果,对图像进行上采样真的有必要吗?能不能直接用低分辨率的图像对CNN进行预训练(需要调小stride),然后在检测数据集上对网络进行微调以检测小目标?
  • 当从一个预训练的图像分类模型来对目标检测器进行微调时,在调整输入图像的大小后,是将训练样本的分辨率控制在一个固定范围(比如从64×6464\times 64256×256256 \times 256)之内呢?还是将所有分辨率的样本都投入训练呢?

尺度变化对分类网络的影响

这一节主要研究domain shift的影响,在训练和测试时,当输入不同分辨率的图像时,就会引入domain shift。作者设计了三个实验,如下图所示,讨论了在对小目标进行分类时,是设计专门的网络结构的效果好,还是就在原来的网络上进行微调的效果好。
An Analysis of Scale Invariance in Object Detection – SNIP 论文笔记

  • CNN-B是用分辨率为224×224224 \times 224的图像训练的,对ImageNet中的图像先进行下采样,再上采样到224×224224 \times 224,作为CNN-B的输入。
  • CNN-S是专门为小目标设计的网络,对于48×4848 \times 48的图像,第一个卷积层步长为1,卷积核大小为3×33\times 3;对于96×9696 \times 96的图像,第一个卷积层步长为2,卷积核大小为5×55 \times 5
  • CNN-B-FT是在CNN-B的基础上,使用经过上采样的低分辨率图像进行微调。

这三个网络的分类结果如下图所示:
An Analysis of Scale Invariance in Object Detection – SNIP 论文笔记

  • 对于CNN-B来说,随着训练图像和测试图像之间分辨率差异的增大,性能会随之降低。因此,如果网络仅用一种分辨率的图像进行训练,而测试图像的分辨率与训练图像的分辨率不同,那么网络性能并不能达到最优;
  • CNN-S针对不同低分辨率的图像设计了不同的网络结构,可以看到它确实比CNN-B的性能好。因此,对于低分辨率图像的目标检测,可以采用具有不同结构的分类网络进行预训练。
  • CNN-B-TF的性能表现比CNN-S还要好,这个结果说明在高分辨率的图像上进行学习,对于识别低分辨率图像也是很有帮助的。因此,与其将步长减少2倍,不如对图像上采样2倍,然后再对网络进行微调。

这里作者其实考虑的是如何将预训练的网络迁移到检测数据集,能够达到最好的效果。这三个网络的含义是:

  • CNN-B,ImageNet上预训练后的参数直接给COCO这种低分辨率的数据集用;
  • CNN-S,不用ImageNet做预训练,直接把网络设计成适合COCO这种低分辨率数据集的形式;
  • CNN-B-TF:在ImageNet上经过预训练之后,为了让网络适应COCO这种低分辨率数据集,先用低分辨率图像进行微调。

总结:当训练目标检测器时,要么使用不同的网络结构来对不同分辨率的目标进行分类,要么使用一种单一结构处理所有分辨率。由于在ImageNet上进行预训练是很有用的,并且在大目标上进行学习,对于小目标的分类也是很有帮助的,因此对图像进行上采样,使用在高分辨率图像上预训练的网络,比专门设计用来分类小目标的网络更好。通过以上三个网络的对比,也说明了微调的重要性。


尺度变化对目标检测的影响

这一节分析了图像分辨率、目标的尺度以及数据的变化对检测性能的影响,作者在3种不同的设置下训练了3个检测器,最终都是在1400×20001400 \times 2000的图像上进行测试,以评估检测小目标的能力。
An Analysis of Scale Invariance in Object Detection – SNIP 论文笔记
An Analysis of Scale Invariance in Object Detection – SNIP 论文笔记

  • 首先使用两种不同分辨率800×1400800 \times 14001400×20001400\times 2000上的所有目标来训练检测器,分别称为800all800_{all}1400all1400_{all},如上图(1)所示。从表中可以看出,1400all1400_{all}的性能比800all800_{all}要好,因为对于1400all1400_{all}来说,训练和测试时的分辨率是相同的,但这种提升只是微乎其微的,这是为什么呢?这是由于在如此大的分辨率下进行训练时,中大型目标会被放大以至于无法被正确分类!因此,虽然在高分辨率下进行训练可以放大小目标,能够更好的对小目标进行分类,但是,中大型目标也会被放大,从而降低性能。
  • 在分辨率为1400×20001400 \times 2000下训练另一个检测器(1400<80px1400<_{80px}),忽略所有的中大型目标(>80px>_{80px}),以消除大目标的有害影响,如上图(2)所示。然而,从表中可以看出,这样做还不如800all800_{all},这是为什么呢?由于忽略了中大型目标,从而失去了外观和姿态变化的一个重要来源,也就是失去了目标的尺度变化信息。
  • 最后,通过在多分辨率上随机采样图像,以获得尺度不变的检测器,也就是多尺度训练(multi-scale training,MST),如上图(3)所示。这样做虽然能够确保训训练样本来自不同的分辨率,但对于极端小或大目标来说,性能仍会降低,从表中可以看出,它的性能类似于800all800_{all}。作者得出的结论是:用合适大小的目标来训练检测器,同时尽可能多的捕获目标的变化是很重要的。

SNIP

作者的目标是将两种最好的方法结合在一起:尽可能捕获目标的最大的变化以进行训练,同时还要将尺度限制在一个合理的范围内。 由此作者提出SNIP,如下图所示:
An Analysis of Scale Invariance in Object Detection – SNIP 论文笔记
SNIP的思路是,仅使用与预训练数据集的分辨率(通常是224×224224 \times 224)相接近的目标来训练检测器,也就是在训练和测试时使用尺度相差不大的目标。 为了消除极大或极小目标对训练的影响,只对尺度在一定范围之内的目标进行训练,剩下的目标在反向传播中被忽略掉。SNIP在训练时使用所有有效的目标,这有助于捕获所有的外观和姿态上的变化,同时还能减少预训练网络的domain-shift问题。

在training时,使用所有的gt来为proposal分配标签。如果在某分辨率上的proposal或gt超出了特定的尺度范围,那么它们将不会被选择。如上图所示,作者划分了三个尺度,对应三种不同分辨率的图像,每个分辨率ii下的RoI都有其指定范围[sic,eic][s^c_i,e^c_i],如果gt的尺度在这个范围内,就记为valid,否则就是invalid。在给anchor分配标签时,如果一个anchor与invalid gt之间的overlap小于0.3,那么这个anchor就参与训练,否则从训练中排除。这就实现了只对每个分辨率上大小合适的目标进行训练。

在inference时,建立不同分辨率的图像金字塔,使用RPN为每个分辨率生成proposal,然后在每个分辨率下分别进行分类。与training类似,如果某分辨率上的检测结果的尺度超出了指定范围,这样的检测结果同样会被丢弃。在分类和bbox回归后,使用soft-NMS对不同分辨率的检测结果进行处理,以获得最终的检测结果。


结论

本文通过分析不同的网络结构在进行小目标分类的性能,说明CNN对尺度变化一点都不鲁棒,就算是数据充足的情况下,CNN也不能充分使用所有尺度的目标,要么因为放大小目标而损害中大型目标的检测性能,要么由于丢失中大型目标而严重损害性能。由此作者提出SNIP,在训练时只回传那些大小在一定范围之内的proposal的梯度,忽略极大或极小的proposal;在测试时,建立不同分辨率的图像金字塔,分别运行不同的检测器,同样在每个分辨率上只保留大小在一定范围内的检测结果。在处理尺度变化这个问题上,最有效的方法还是在训练和测试时使用尺度差不多的目标。