SNIP-An Analysis of Scale Invariance in Object Detection

论文名称 : An Analysis of Scale Invariance in Object Detection – SNIP

论文作者:Bharat Singh & Larry S.Davis

论文链接:https://arxiv.org/abs/1711.08189

代码链接:https://github.com/bharatsingh430/snip


简要概述

本篇文章是一篇优化目标检测精度的文章,在two stage方法上进行模型优化的,文章的主要关注点在于目标尺度(Scale)。基于作者对目标尺度的实验与分析,设计了SNIP方法,该方法实验证明,可以有效提高目标检测的精度

那么作者对目标尺度的分析到底有什么特殊发现呢?

作者对比了ImageNet以及COCO数据集中目标尺度的差异,目标的尺度统计结果如下图Figure 1所示,其中棕色线以及蓝色线分别对应于ImageNet以及COCO数据集的尺度统计结果,(两条线你可以理解为对尺度数量做累加,最后都会到1),根据统计结果发现,在ImageNet中,排在中位的尺度是0.554,但是在COCO中,排在中位的尺度是0.106,这就说明了在COCO数据集中,大部分的目标的尺度其实是小于图像面积的1%的。更糟糕的是,作者统计了COCO中最大的10%的目标以及最小的10%的目标的尺度,发现最小的10%中,最大的目标尺度是0.024,而最大的10%中,最小的目标尺度为0.472,两者相差了大约20倍,如图Figure 1中绿色箭头所示。这巨大的差异将成为detector需要面临的巨大的挑战。另外,在进行目标检测的时候,我们一般会采用ImageNet上训练的预训练模型作为检测模型的backbone,而训练imagenet我们常使用的尺度是224*224,而目标检测往往会采用更大一些的尺度,这种分类与检测中存在的尺度的巨大差异也将带来一定的问题,作者将其称为domain-shift,本篇文章主要就是解决的就是这两个问题。

SNIP-An Analysis of Scale Invariance in Object Detection_第1张图片

目前在解决尺度变换以及小目标的问题上,已经存在一定的研究并且具有一定的成果,比如,FPN,将浅层特征与深层特征相结合来提高小目标的检测精度,dilated/deformable convolution,扩大检测的感受野来提高对大尺度目标的检测,还有在不同尺度的卷积层预测不同尺度的目标,以及利用多尺度训练或者多尺度inference等。虽然这些方法已经显著的改善了目标检测的结果,但是还有很多问题其实是没有被解决的,这里作者提出了两个疑问:

  1. 为了检测小目标将图像放大是必要的吗?对于小分辨率图像,我们是否可以不放大图像,然后将stride调小一点呢?
  2. 在进行检测器fine-tune的时候,我们是否应该只选择目标尺度在[64,256]范围内的进行训练,因为ImageNet的目标主要集中在该范围内,选择COCO数据集的所有尺度[16,800]进行训练,对效果会有影响吗?

带着问题,我们一起进行探索

问题一:对于小目标,是放大图像效果好还是调整stride效果好呢?

由于目前stage-of-the-art检测器多是在800*1200分辨率进行训练,inference的时候采用的是图像金字塔,这就包括了更高的分辨率1400*2000,那么为了提高小目标的检测,在inference阶段将图像放大来提高小目标的检测效果是否有效果呢?

这里作者在分类模型上进行了对比实验。

(1)作者将image图像分别缩放到48*48,64*64,80*80,96*96,128*128,然后在ImageNet上,用224*224训练的模型进行测试,以此来验证对小目标,直接放大后inference的效果,实验结果如下图Figure 4(a)所示,Figure 4(a)为top-1的accuracy,可以发现分辨率被缩放的越低,模型的效果实际上越差,换句话说就是,模型最适应的还是跟训练尺度一样的图像。

(2)那么既然小目标在分类中表现的不是那么理想,会不会是网络下采样的时候,把小目标的特征丢失了,那么我们是否可以采用多尺度的训练来强化小目标特征的学习呢?将各个尺度的图像都拿来训练。我们知道ResNet101网络的输入是7*7,stride=2的卷积,然后接一个3*3,stride=2的pooling结构,作者进行了如下修改,在输入图像为48*48的时候,使用3*3的卷积,stride=1,对于输入图像是96*96,则使用kernel size 5*5, stride=2. 这也就可以利用小卷积来get到小目标的特征了,实验结果怎么样呢?图Figure 4(b)中CNN-S,可以发现,还是有一定的效果的,比原来的模型效果提升了不少。

(3)又或者,我们直接将小图放大到224*224去fine-tune我们的模型,结果又会怎么样呢?实验结果如图Figure 4©CNN-B-FT,可以发现,实验结果比实验二还要好一些,说明将图像放大后,还是可以get到一些小目标的特征的。这就是我们平时在进行模型迁移时候的finetune的方法

SNIP-An Analysis of Scale Invariance in Object Detection_第2张图片

SNIP-An Analysis of Scale Invariance in Object Detection_第3张图片

既然在分类中对于小目标,直接放大到224后进行finetune的效果提升较好,那么在检测中会如何呢?

于是乎,作者在检测模型上进行了一系列实验

实验一:将图像放大到不同的尺度的效果对比,作者将COCO图像分别放大到800*1400以及1400*2000进行训练,然后在inference的时候,图像尺寸是1400*2000,实验结果如下表Table 1所示,其中800_all以及1400_all分别代表缩放到800以及1400的结果,结果如我们所预期,1400的效果要好一些,毕竟1400图像大,而且训练和测试在相同的尺度内。但是为什么效果提升的这么小呢?只有0.3个百分点。作者猜想原因可能是虽然我们将小目标放大了,但是对于原来本来就很大的图像,就会变得更大以至于较难正确的分类,所以模型的整体精度下降了一些。

SNIP-An Analysis of Scale Invariance in Object Detection_第4张图片

SNIP-An Analysis of Scale Invariance in Object Detection_第5张图片

实验二:那既然大物体会存在一定的影响,那么我们是否可以忽略大物体,只训练小物体呢,如图Figure 5-2所示,只用其中的小物体进行训练。很遗憾,结果显示,其效果还不如放大到800的效果好尼。。为什么会出现这个现象呢?主要应该是我们丢掉了很多的大样本,样本数量少了,多样性减少自然会产生一定的影响。

实验三:多尺度训练(Multi-Scale Training),那么既然忽略掉大物体不行,那怎么办呢?使用多尺度是一个解决方法,如图Figure 5(3)所示,将图像缩放到不同的尺度进行训练,这样既可以兼顾大物体又可以对小物体进行一定的优化,实验结果显示,其结果同样没有直接resize到1400的效果好,作者猜想应该是图像中的极大极小图影响比较大。

所以经过这一系列的实验,我们可以总结出,train一个detector,关键点是需要有合适的目标尺度,过大或者过小都会对其产生影响。

那么我们如何更好的兼顾大目标以及小目标呢?这就需要本文的重点SNIP出场。

SNIP(Scale Normalization for Image Pyramids)

SNIP采用的是MST(Multi-Scale-Training)的训练方式,我们知道在MST中,大目标在大图的时候识别的不好,小目标在小图的时候识别效果不好,如何屏蔽掉过大或者过小的目标,我们是否可以只训练在我们理想尺度范围内的目标呢?SNIP采用的方法是所有的目标全部参与到网络训练中,但是对于尺度不同的目标,SNIP设置了3个尺度,每个尺度只检测在自己尺度范围内的目标,并且为了减少domain-shift问题,每次训练SNIP只采用目标尺度在224*224尺度内的目标,而其他目标不参与。

其结果显示如表Table 1 ,其mAP相比较于MST要提高大约3个点,效果还是比较明显的。

具体怎么做的呢?

如下图Figure6所示,SNIP设置了3个尺度范围[s1,e1],[s2,e2],[s3,e3],分别对应3个图像分辨率,然后在图像训练的过程中,如果gt的box大小在这个范围内,就被标记做valid,否则就被标记为invalid。然后在生成Anchor并给Anchor分配label的时候,检查该Anchor是否和某个invalid gt box的overlap超过0.3,若存在,则该Anchor会被视作invalid Anchor;若不存在,则会被视作valid Anchor,而这些invalid anchor在训练的时候都会被无效化,不会加入到反向传播的过程中,相当于在每个分辨率上,只对大小合适的目标参与训练,这也就符合了作者设计的初衷。相应的,在inference时候,根据图像尺度选择相应的detector,并且经过MST(multi scale train)后,将得到的结果进行rescale以及softNMS得到最终的结果。因为调整了RoI的分辨率与分类的分辨率几乎一致,所以网络fine-tune的效果也较好。

SNIP-An Analysis of Scale Invariance in Object Detection_第6张图片

训练细节

SNIP选择的网络是Deformable-RFCN,并且选择了3个尺度,分别为[480,800],[800,1200],[1400,2000],其对应的目标有效范围分别是:[120,120+],[40,160],[0,80],其中包含40的重叠。

  • RPN网络的一点改变
    为了提高RPN的效果,作者将conv4与conv5连接在一起,并且使用了7个anchor scales.

实验

下表是使用不同尺度方法的模型对比,其中Single scale是使用单一尺度进行训练和测试,单一尺度为(800,1200),MS Test是使用多尺度进行inference,MS Train/Test是使用多尺度进行训练以及使用多尺度进行测试,SNIP为本文方法,从测试结果可以发现,SNIP还是有明显优势的,较MS提高了2个点。

SNIP-An Analysis of Scale Invariance in Object Detection_第7张图片

下表是RPN召回率的结果图,实验结果显示,Baseline的平均召回率只有大约57.6%,SNIP方法的平均召回率达到了64%。

SNIP-An Analysis of Scale Invariance in Object Detection_第8张图片

下表是SNIP与其他检测网络的精度对比,在实验中,作者使用了DCN以及Soft-NMS.在D-RFCN中相比较于不使用SNIP,使用SNIP后平均精度提高了大约3.5%,观察表中,精度最高的是Faster-RCNN + SNIP(RPN+RCN),backbone使用ResNet-101,平均精度达到了惊人的44.4%,小目标的建精度达到了56.9%。

SNIP-An Analysis of Scale Invariance in Object Detection_第9张图片

总结

纵观本文,不仅仅作者的方法提高了目标检测的mAP,同等重要的是作者对数据的分析,以及详细的实验证明,从数据中发现问题,进而利用详细的实验证明,进而解决问题,这也是值得我们学习的解决问题的方法。大数据时代,从数据角度去优化模型,往往会比单纯的杠模型取得更好的效果。

你可能感兴趣的:(深度学习-目标检测)