SNIP

from: https://blog.csdn.net/Gentleman_Qin/article/details/84789249

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

论文下载:https://arxiv.org/abs/1711.08189

论文代码:http://bit.ly/2yXVg4c


一、概述:

1、本文的主要工作:

(1)通过实验验证了upsampling对于提高小目标检测的效果——认为其效果不大

(2)提出了一种Scale Normalization for Image Pyramids的方法——很有道理但不易实现

2、针对COCO数据集的实验结论:

作者对COCO数据集的尺度进行了分析,下图中,横坐标代表了GT目标与图像大小的IoU比,纵坐标代表了尺度的概率分布(每个IoU所对应该值以内GT的比重)。COCO数据集中,大部分的object面积只有图像面积的1%以下,这说明在COCO数据集中小目标占比要比ImageNet数据集大。另外,从Figure1中的COCO曲线可以看出,第90%的倍数(0.472)差不多是第10%的倍数(0.106)的20倍!这说明在COCO数据集中的object尺寸变化范围非常大。

SNIP

3、作者的motivation:

(1)现在检测网络为了提高对小目标的效果,都采用upsample的方法,这个真的是必要的吗?我能不能直接用低分辨率的图像不做upsample来训练网络(需要调小strides),即在ImageNet上用低像素图片预训练一个缩放倍数较小的CNN?

(2)用ImageNet做预训练模型的时候训练检测器的时候, 是否所有尺寸的object都可以参与进来?用所有的gt来训练真的更好吗? 能不能通过挑选样本的方式来增加网络效果的,比如我upsample调整了大小以后,只用64x64~256x256范围的ground truth来训练?

4、现在有很多针对小目标的措施和改良方案:

(1)扩大卷积感受野:使用dilated/strous或者deformable这类特殊的卷积来提高检测器对分辨率的敏感度(如RFB);

(2)上采样把小目标变大:最常用的,upsample来rezie网络输入图像的大小(如YOLO);

(3)融合低层特征:使用FPN这种把浅层特征和深层特征融合的,或者最后在预测的时候,使用浅层特征和深层特征一起预测;也有比较直接地在浅层和深层的feature map上直接各自独立做预测的(如FPN);

二、内容:

SNIP

SNIP

1、提出训练策略:

(1)CNN-B——原图训练(高清)+ “伪高清”测试(低清upsample):

CNN-B是一个在224x224尺度上训练的模型, 其stride=2,将测试图片降采样到 [48x48, 64x64, 80x80, 96x96,128x128], 然后再放大回224x224用于测试。

结论:训/测尺度(实际上是清晰度)差距越大,,性能越差, 因为不用与训练尺度相互匹配的尺度进行测试, 会使得模型一直在sub-optimal发挥。

(2)CNN-S——低清训练 + 低清测试:

CNN-S是根据上述原则,,做的训练/检测尺度匹配的实验.,选取48x48作为训练和测试的尺度.,并且stride=1,根据结果看到, 训/测尺度匹配后, 性能大幅提升. 同样将48换成96也得到一致的结果.

(3)CNN-B-FT——原图训练(高清)+ “伪高清”微调(低清upsample) +  “伪高清”测试(低清upsample):

把由原图训练的CNN-B用伪高清去做微调.,最终CNN-B-FT的结果甚至好于CNN-S。可得在高清训练集学出来的模型依然有办法在低清晰度的图片上做预测,直接用低清晰度图片微调好过将stride降低得到高清图片后微调(重新训练)。

总结,这三个网络:

   (1) CNN-B使用高分辨率图像训练,分类经过降采样和upsample的图片;
   (2)CNN-S使用低分辨率图像训练,分类经过降采样的图片;
   (3)CNN-B-FT使用高分辨率图像训练,然后在低分辨率图像上fine-tune,分类经过降采样和upsample的图片;

本质上,其实三个网络都是在对小目标进行分类,最后结果,CNN-B-FT准确率最高,CNN-S其次,作者认为这是因为模型从高分辨率图像中得到了充分的学习。同时说明,训练样本和输入样本如果分辨率存在太大误差,performance必然下降。与其为了小目标而专门使用改变的网络结构(CNN-S),直接upsample微调和使用高分辨率图像预训练得到的模型是更好的选择(CNN-B-FT)。

SNIP

作者想通过上面这个实验说明:

(1)upsample确实一定程度上可以提高性能,但是并不显著,这是因为Upsample提高了小目标的检测效果,但会让本来正常大小或者本来就大的目标过大,性能下降;
(2)训练网络需要使用大量样本,样本损失会导致性能下降;
(3)随机在分辨率之间采样的效果也不好,虽然你的样本满足了多尺度条件,但是还有其它原因限制了性能。

2、提出SNIP:

SNIP

(1)SNIP的思想:

SNIP是MST(多尺度训练)的升级版.,只有当这个物体的尺度与预训练数据集的尺度(通常224x224)接近时,我们才把它用来做检测器的训练样本。这一切基于一个假设, 即不同尺度的物体,因为多尺度训练,总有机会落在一个合理的尺度范围内,只有这部分合理尺度的物体参与了训练, 剩余部分在BP的时候被忽略了,不参与反向传播

(2)SNIP中的RPN阶段(以anchor为基础生成region proposal):

1)生成Anchor并判断正负:用所有的GroundTruth给Anchors分配好+/-标签;

2)删除过大、过小的Anchor:根据第i个尺度下的有效范围: [si,ei], 将GroundTruth根据是否落在范围内分为Valid/Invalid GT;

3)删除定位不准的Anchor:除那些IoU(anchors|InvalidGT)>0.3的Anchors;

SNIP

(3)SNIP中的FC阶段:

1)给region proposal分类:用所有的GroundTruth给ProposalRoIs分配好类别标签;

2)在本次迭代的本张图片中删除过大or过小的GT和Proposal:弃用不在[si,ei]范围内的GT和Proposals;

3)在本次迭代中删除不存在合适大小的GT的图片;

(4)算法核心:

1)在生成Anchor并给Anchor分配label的时候,检查该Anchor是否和某个invalid gt box的overlap超过0.3,若存在,则该Anchor会被视作invalid Anchor;若不存在,则会被视作valid Anchor。这些invalie anchor在train的时候都会被无效化,也不会加入到反向传播的过程中从而对参数产生影响,相当于在每个分辨率上,只对大小合适的目标进行训练,相应的,在inference预测边界框时候,如果区域面积在那个分辨率的指定范围外,也同样会被抛弃,最后,在进行rescale和NMS。

2)SNIP相当于开了三个pipe-line,划分了三个尺度,其中包括了三个并行的feature extraction,对应三种不同分辨率的图像,每个pipe-line的RPN只负责一个scale range的proposal生成,每个分辨率i下的RoI都有其指定范围,如果gt的box大小在这个范围内,就被标记做valid,否则就被标记为invalid。每个尺度只学最容易学的region proposal,因此SNIPaccuracy高,但speed慢;

3)对于大尺度的feature map,对应的RPN只负责预测被放大的小物体,此时原来的大目标因为太大已经不在有效范围内;对于小尺度的feature map,对应的RPN只负责预测被缩小的大物体,此时原来的小目标因为太小已经不在有效范围内;这样的设计保证了每个CNN分支在判别proposal是否为感兴趣区域时,只需针对最易分类的中等range的proposal进行训练,而不会大小一起学从而走火入魔——学乱了记差了;

(5)细节问题:

1)作者使用的是Deformable RFCN detector而不是常见的一般卷积;
2) 作者使用的网络结构是Dual path networks(DPN)和ResNet-101,由于需要内存很大,为了适应GPU内存,作者对图像进行了采样,具体方法是选取一个1000x1000的包含最多目标的区域作为子图像,然后重复该步骤直到所有目标都被选取;
3) 作者为了提升RPN的效果,尝试了使用7个尺度,连接conv4和conv5的输出等等。

三、测试阶段:

1、测试方法:

(1)用多尺度正常进行测试;

(2)在合并多尺度Detection之前, 只在各个尺度留下满足其条件的参与Detection的框;

(3)Soft-NMS合并结果;

2、实验结果:

SNIP

上一篇:目标检测——IoU 计算


下一篇:分治——hyl天梦