转载自:https://blog.csdn.net/u014380165/article/details/80793334
论文:An Analysis of Scale Invariance in Object Detection – SNIP
论文链接:https://arxiv.org/abs/1711.08189
这篇是CVPR2018的文章,引用文献非常到位,同时实验结果非常惊艳,总体来看比同是CVPR2018上的cascade RCNN效果还要好一些。概括而言,这篇文章从COCO数据集开始分析,认为目前目标检测算法的难点在于数据集中object的尺寸分布较大,尤其对于小目标的检测效果也有待提高,因此提出Scale Normalization for Image Pyramids (SNIP)算法来解决这个问题。
先来看看这篇文章的出发点。这篇文章的出发点可以简单概括为:数据集。作者发现如果将数据集按照图像中object的尺寸(scale)除以图像尺寸的倍数来排序,那么在ImageNet数据集中,这个倍数的中位数差不多是0.554倍,而在COCO数据集中,这个倍数是0.106倍,如Figure1中两条线标出的Median点所示。Figure1是关于ImageNet和COCO数据集中object尺寸和图像尺寸的倍数关系曲线,横坐标表示object的尺寸/图像尺寸的值,纵坐标表示占比。也就是说在COCO数据集中,大部分的object面积只有图像面积的1%以下,这说明在COCO数据集中小目标占比要比ImageNet数据集大。另外,从Figure1中的COCO曲线可以看出,第90%的倍数(0.472)差不多是第10%的倍数(0.106)的20倍!这说明在COCO数据集中的object尺寸变化范围非常大。
那么这种差异会带来什么影响呢?因为在目标检测算法中常用基于ImageNet数据集预训练的模型来提取特征,也就是常说的迁移学习,但是从Figure1的两条曲线可以看出ImageNet和COCO数据集在object的尺寸分布上差异比较大,这样在做迁移学习时可能会存在一些问题,文章中将这个问题概括为domain-shift,可以简单理解为训练集和测试集分布存在较大差异,后面会有实验来证明这种差异对效果的影响。
其实之前就有不少算法针对数据集中不同尺寸的object检测进行改进,比如以Feature Pyramid Network(FPN)为例的通过融合高低层特征并基于多层融合特征单独预测的算法;以Dilated/Deformable Convolution为例的通过改变卷积核的感受野来提升检测效果;以multi-scale training/inference为例的通过引入图像金字塔来训练或验证图像。
首先是在ImageNet数据集上做关于scale variantion的实验,换句话说就是验证前面提到的domain-shift对模型效果的影响,实验结果参看Figure3。
CNN-B:分类模型还是基于ImageNet数据集常规的224*224大小来训练,但是验证数据做了修改,首先将ImageNet的验证数据缩小到48*48、64*64、80*80、96*96和128*128,然后再将这些尺寸放大到224*224作为模型的输入,可以看出放大后的图像分辨率较低。因此这个实验模拟的就是你训练数据的分辨率(resolution)和验证数据的分辨率不一致(甚至是差别很大)的时候对效果的影响,该实验的结果可以看Figure4(a)。
CNN-S:训练数据的分辨率和验证数据的分辨率保持一致,这里主要针对48*48和96*96分辨率,同时对网络结构的第一层做了修改。比如基于48*48的数据进行训练,将卷积核大小为7*7的卷积层换成卷积核为3*3,stride为1的卷积层。基于96*96的数据进行训练时,将卷积核大小为7*7的卷积层换成卷积核尺寸为5*5,stride为2的卷积层。显然,该实验模拟的是训练数据分辨率和验证数据分辨率一致时的效果,实验结果可以看Figure4(b)(c)。
CNN-B-FT:是CNN-B在放大的低分辨率图像上fine tune后的模型,同时输入图像也采用放大的低分辨率图像。可以看出该实验主要验证基于高分辨率图像训练的模型是否能有效提取低分辨率图像的特征,实验结果可以看Figure4(b)(c)。
摘自知乎,其实和一些人讨论的时候,好像都觉得这个实验对主旨并没有太大帮助。我个人又重新看了几次论文,我是这样理解的:ImageNet物体大、分辨率高,而COCO目标都很小,直接迁移会有问题,作者在试图探究如何进行迁移。降采样后的小图像数据集其实对应的是COCO数据集普遍存在的小目标的情况,试图模仿COCO数据集。因此三个网络的含义应该是:CNN-B,ImageNet预训练后的参数直接用来给COCO这种分辨率低的数据集用;CNN-S,不用ImageNet这种高分辨率的数据集做训练,我把网络就设置成适合COCO这类数据集的,训练和测试都用分辨率低的数据集;CNN-B-FT,ImageNet人家都训练好了,不用白不用,但是用之前,先用低分辨率数据集做一下fine-tune改良效果。
介绍完在ImageNet数据集上的实验,接下来就来看看在COCO数据集上关于scale-specific detector和scale invariant detector的实验,具体实验结果参看Table1和Figure5。
Table1是关于在小目标验证集上的检测效果对比,所用的验证图像尺寸都是1400*2000。
- 800(all)和1400(all)的对比:训练时使用不同大小的图训练,理论上如果使用更大图,小物体检测的性能应当有显著提升。但是实验表明这个提升非常小。文章中给出的解释是虽然1400的图训练会提升小物体的性能,但是会加大大物体训练的困难,所以此消彼长,并不会有比较大提升。(其实我是不太认可这个解释的,个人理解见下面的第三条。)
- 1400(<80px)和1400(all)的对比:既然大物体太难train了,可能对小物体造成干扰,是否去掉大物体可以提升小物体的性能呢?答案也是否定的,而且损失掉的大物体的语义会让结果变得更加糟糕。
- MST:在Object Detection中,为了提升测试针对不同scale物体的性能,大家一般会使用Multi-scale training/testing这样的测试时融合的技巧来提升结果。与SNIP做法最大的区别就在于Multi-scale的做法扩充了不同scale样本的数目,但是仍然要求CNN去fit所有scale的物体。通过这样的一个对比实验,SNIP非常solid地证明了就算是数据相对充足的情况下,CNN仍然很难使用所有scale的物体。个人猜测由于CNN中没有对于scale invariant的结构,CNN能检测不同scale的“假象”,更多是通过CNN来通过capacity来强行memorize不同scale的物体来达到的,这其实浪费了大量的capacity,而SNIP这样只学习同样的scale可以保障有限的capacity用于学习语义信息。
摘自知乎,如下图所示,作者在训练时划分了三个尺度,对应三种不同分辨率的图像。每个分辨率i下的RoI都有其指定范围,如果gt的box大小在这个范围内,就被标记做valid,否则就被标记为invalid。
在生成Anchor并给Anchor分配label的时候,检查该Anchor是否和某个invalid gt box的overlap超过0.3,若存在,则该Anchor会被视作invalid Anchor;若不存在,则会被视作valid Anchor……这些invalie anchor在train的时候都会被无效化,也不会加入到反向传播的过程中从而对参数产生影响,相当于在每个分辨率上,只对大小合适的目标进行训练,这就符合了作者设计的初衷。相应的,在inference时候,如果区域面积在那个分辨率的指定范围外,也同样会被抛弃,最后,在进行rescale和NMS……
思想很简单,但是效果很好,实现起来要考虑的因素还是比较多的:
1. 作者使用的是Deformable RFCN detector而不是常见的一般卷积,当然受制于实验自身,需要作出一定的改变。
2. 作者使用的网络结构是Dual path networks(DPN)和ResNet-101,由于需要内存很大,为了适应GPU内存,作者对图像进行了采样,具体方法是选取一个1000x1000的包含最多目标的区域作为子图像,然后重复该步骤直到所有目标都被选取。
3. 作者为了提升RPN的效果,尝试了使用7个尺度,连接conv4和conv5的输出等等;当然还有其他一些设置,这里就不详细提了。
关于RPN网络中不同标签的anchor比例作者也做了分析,我们知道在RPN网络中,一个anchor的标签是根据该anchor和ground truth的IOU来决定的,只有两种情况下才会认为某个anchor的标签是正样本(标签为1):1、假如该anchor和某个ground truth的IOU超过某个阈值(阈值默认采用是0.7),那么该ancho就是正样本。2、假如一个ground truth和所有anchor的IOU都没超过该阈值,那么和该ground truth的IOU最大的那个anchor就是正样本。同样,作者将conv4的输出作为RPN网络的输入,然后设置了15种anchor(5 scales,3 aspect ratios),接下来就有意思了,作者发现在COCO数据集上(图像大小为800*1200),只有30%的ground truth满足前面第一种情况!即便将阈值调整为0.5,也只有58%的ground truth满足第一种情况!这说明什么?说明即便阈值等于0.5,仍有40%的正样本anchor和ground truth的IOU小于0.5(这些anchor是因为满足前面的情况2才被定义为正样本)!显然,这样的正样本质量不算很高。而这篇文章因为引入多种分辨率的图像作为输入,所以在一定程度上缓解了这种现象。
实验结果:
Table2是SNIP算法和其他算法的对比。第二行的multi-scale test显然比第一行的single scale效果要好。第三行,在multi-scale test的基础上加入multi-scale train的时候,会发现在大尺寸目标(APL)的检测效果上要比只有multi-scale test的时候差。这个原因我们在前面也介绍过了,主要是因为训练数据中那些尺寸极大和极小的object对训练产生了负作用。
Table4是几个目标检测算法结果的对比。D-RFCN表示Deformable RFCN。D-RFCN+SNIP(RCN+RPN)表示在Deformable RFCN算法的检测模块和RPN网络中同时加入SNIP。