python中的snip用法_简单说说SNIP

文章探讨了目标检测中小物体检测的挑战,并提出了SNIP(Scale Normalization for Image Pyramids)方法。研究发现,尺度不一致是预训练模型在小物体检测上表现不佳的主要原因。SNIP通过只使用与预训练尺度相近的目标进行训练,改善了模型的性能,是多尺度训练的升级版。实验表明,SNIP在小物体检测上表现优于其他尺度调整策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

论文链接:An Analysis of Scale Invariance in Object Detection - SNIP​arxiv.org

1. Background & Related Work

1.1 简介

这篇文章主要的研究点是目标检测中的小物体问题。小物体检测一直是目标检测中的难题,做过实验的同学应该都知道数据集中small类的AP基本是最低的,主要原因是两个,一个就是CNN网络提取到的语义化特征和分辨率之间的矛盾;另一个就是目前的目标检测都采用了Faster RCNN的Anchor思想,小物体有时候即使全部在Anchor内,也容易因为小面积导致IoU过低。Anchor本质上是大小固定的box,过小物体会出现IoU过低,过大物体也容易出现IoU过低,结果就是容易漏检……

文章分析了小尺度与预训练模型尺度之间的关系, 并且提出了一个和 Cascade R-CNN 有异曲同工之妙的中心思想:要让输入分布接近模型预训练的分布(本文主要探讨尺度的分布不一致带来的问题). 之后利用分析的结论, 提出了一个多尺度训练(MST)的升级版:Scale Normalization for Image Pyramids (SNIP).

1.2 分类和检测的难度差异

使用深度网络后, 分类任务已经做到了误差率2%(ImageNet). 为什么在COCO上才62%? 这么悬殊的距离主要因为检测数据集中包含了大量小物体, 他们成了绊脚石.

可以看到,COCO 90%的Instance的大小都在0.472以下,和ImageNet差别非常大,在 ImageNet (classification) vs COCO (detection), 其中等尺度目标在图像中的占比分别是 0.554 and 0.106 respectively。所以在COCO 中大部分目标在图像中小于 1% 的面积。更糟糕的是在 COCO 最小最大10%的目标在图像中的占面积比是 0.024 and 0.472 respectively(导致尺度相差近20倍)。

这一方面说明了类似COCO这样的数据集中存在着大量的小物体,另一方面也说明了ImageNet预训练的模型在迁移到样本大小差异较大的COCO中时很可能产生一定的domain-shift偏差。因此作者产生这样的motivation:

1. 现在检测网络为了提高对小目标的效果,都采用upsample的方法,这个真的是必要的吗?我能不能直接用低分辨率的图像不做upsample来训练网络(需要调小strides)?

2. 能不能通过挑选样本的方式来增加网络效果的,比如我upsample调整了大小以后,只用64x64~256x256的ground truth来训练?用所有的gt来训练真的更好吗?

1.3 各种对付尺度变化的方法

实际上,现在有很多针对小目标的措施和改良,包括:

1. 使用dilated/strous或者deformable这类特殊的卷积来提高检测器对分辨率的敏感度

2. 最常用的,upsample来rezie网络输入图像的大小

3. 使用FPN这种把浅层特征和深层特征融合的,或者最后在预测的时候,使用浅层特征和深层特征一起预测;也有比较直接地在浅层和深层的feature map上直接各自独立做预测的;这个也就是我们常说的尺度问题(scales)

4. 多尺度训练/测试

1.4 本文的主要工作:

1. 通过实验验证了upsampling对于提高小目标检测的效果

2. 提出了一种Scale Normalization for Image Pyramids的方法

2. 探究性实验

2.1 分析现存的解决方法浅层小物体, 深层大尺度

例子: SDP, SSH, MS-CNN.

缺点: 在浅层预测小物体时, 是以牺牲语意抽象性来实现的.特征融合/特征金字塔

> 尽管Feature Pyramids 有效的综合了多卷积层特征图信息,但是对于very small/large objects 检测效果不是很好。

例子: FPN, Mask-RCNN, RetinaNet

缺点: 若一个25x25的物体, 即使融合上采样x2后也仍然只有50x50. 距离预训练模型224x224还是有很大差距.多尺度分类问题

> 借由分类模型的实验, 探索检测中domain-shift带来的影响. 检测中的Domain-shift主要来自于训练/测试尺度不匹配:

训练800x1200. 因为显存有所限制, 不能更大了 ,测试1400x2000. 为了提升小物体检测性能

2.2 实验一

作者在这一步主要探究的是低分辨率图像+特定的改良网络结构是否会有比较好的效果。

他训练了三个网络:

这三个网络:CNN-B使用高分辨率图像训练,分类经过降采样和upsample的图片

CNN-S使用低分辨率图像训练,分类经过降采样的图片

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

2.2.1 CNN-B: 原图训练 / 伪高清测试

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

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

2.2.2 CNN-S: 低清训练 / 低清测试

CNN-S是根据上述原则, 我们做一个训/测尺度匹配的实验. 选取48x48作为训/测尺度. 并且stride=1, 因为如果不修改stride的话很容易就卷没了. 模型架构变了, 于是针对与上文CNN-S的可比较性问题, 作者说:

> After-all, network architectures which obtain best performance on CIFAR10 [17] (which contains small objects) are different from ImageNet.

根据结果看到, 训/测尺度匹配后, 性能大幅提升. 同样将48换成96也得到一致的结果.

2.2.3 CNN-B-FT: 原图训练, 伪高清微调 / 伪高清测试

我们很容易想到的另一种方法就是, 为了在伪高清尺度测试, 我们就把由原图训练的CNN-B用伪高清去做微调. 最终CNN-B-FT的结果甚至好于CNN-S.

2.2.4 分析与结论

本质上,其实三个网络都是在对小目标进行分类,不过CNN-S因为本身网络结构就不同,输入比较小,不需要经过upsample。最后结果,CNN-B-FT准确率最高,CNN-S其次,作者认为这是因为模型从高分辨率图像中得到了充分的学习。

这就说明了,训练样本和输入样本如果分辨率存在太大误差,performance必然下降。与其为了小目标而专门使用改变网络结构(CNN-S),直接upsample和使用高分辨率图像预训练得到的模型是更好的选择(CNN-B-FT)。

可以这样理解作者的三个实验:ImageNet物体大、分辨率高,而COCO目标都很小,直接迁移会有问题,作者在试图探究如何进行迁移。降采样后的小图像数据集其实对应的是COCO数据集普遍存在的小目标的情况,试图模仿COCO数据集。因此三个网络的含义应该是:CNN-B,ImageNet预训练后的参数直接用来给COCO这种分辨率低的数据集用;CNN-S,不用ImageNet这种高分辨率的数据集做训练,我把网络就设置成适合COCO这类数据集的,训练和测试都用分辨率低的数据集;CNN-B-FT,ImageNet人家都训练好了,不用白不用,但是用之前,先用低分辨率数据集做一下fine-tune改良效果。

从CNN-B-FT的实验可以得出:在高清训练集学出来的模型依然有办法在低清晰度的图片上做预测. 直接用低清晰度图片微调好过将stride降低重新训练一个网络推广到目标检测上, 当尺度不同时, 我们可以选择更换在ImageNet上pre-trained网络架构.

2.3 实验二,分析尺度变化

这个是只检测小目标的不同检测器的mAP值,然后800all和1400all分别是图像统一resize到短边为800、1400的大小,然后使用所有样本进行训练的模型;1400<80px是upsample后只用小目标进行训练的模型……而MST是随机在低分辨率和高分辨率之间采样进行训练的模型

作者通过这个实验说明如下:upsample确实一定程度上可以提高性能,但是并不显著,这是因为Upsample提高了小目标的检测效果,但会让本来正常大小或者本来就大的目标过大,性能下降。

训练网络需要使用所有样本,样本损失会导致性能下降

随机在分辨率之间采样的效果也不好,虽然你的样本满足了多尺度条件,但是还有其它原因限制了性能。

2.3.2 总结

这是因为CNN网络没有尺度不变形,没有把scale这个隐藏变量学习到的机制,只能通过大量参数来强行记忆不同scale的物体。

3.IPN与SNIP

作者的主要思路就是在训练和反向传播更新参数时,只考虑哪些在指定的尺度范围内的目标,由此提出了一种特别的多尺度训练方法,即SNIP(Scale Normalization for Image Pyramids)。SNIP是MST的升级版. 只有当这个物体的尺度与预训练数据集的尺度(通常224x224)接近时, 我们才把它用来做检测器的训练样本.

还基于一个假设, 即不同尺度的物体, 因为多尺度训练, 总有机会落在一个合理的尺度范围内. 只有这部分合理尺度的物体参与了训练, 剩余部分在BP的时候被忽略了

作者在训练时划分了三个尺度,对应三种不同分辨率的图像。每个分辨率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的输出等等;当然还有其他一些设置,这里就不详细提了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值