论文: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的输出等等;当然还有其他一些设置,这里就不详细提了.

python中的snip用法_简单说说SNIP相关推荐

  1. python中result的用法_关于Python中的列表理解及用法

    在Python中,列表理解通常用于编写单行语句,这些语句通过可迭代对象进行迭代以创建新的列表或字典.本文首先介绍for循环如何在Python中工作,然后解释如何在Python中使用列表理解. Pyth ...

  2. python中case的用法_用 Python 实现简单的 switch/case 语句

    在Python中是没有Switch / Case语句的,很多人认为这种语句不够优雅灵活,在Python中用字典来处理多条件匹配问题字典会更简单高效,对于有一定经验的Python玩家不得不承认,的确如此 ...

  3. python中content的用法_学python吗,教你5个python现学现用的有趣用法

    在我们使用python的过程中也会遇到一些有意思的用法,这里找到了一些总结有趣的 话不多说,接着看下去吧!!!!python高薪就业(视频.学习路线.免费获取)​shimo.im for-else用法 ...

  4. [转载] python中的且语句_简单探讨python中的语句和语法

    参考链接: 在Python中解包:并行分配之外 python程序结构 python"一切皆对象",这是接触python听到最多的总结了.在python中最基层的单位应该就是对象了, ...

  5. python中的浮点数用法_如何利用Python在运算后得到浮点数值的方法详解

    在python中进行两个整数相除的时候,在默认情况下都是只能够得到整数的值,而在需要进行对除所得的结果进行精确地求值时,想在运算后即得到浮点值,那么如何进行处理呢? 1.修改被除数的值为带小数点的形式 ...

  6. [转载] python中for语句用法_详解Python中for循环的使用_python

    参考链接: 在Python中将else条件语句与for循环一起使用 这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 &q ...

  7. python中reduce函数用法_一文读懂reduce函数

    Python中的reduce函数是经常和map,filter一起被提到的函数,但是reduce的工作原理却不是那么直观,我们这里就来详细讲解一下这个函数. 首先先来看一下reduce函数的用法 imp ...

  8. python中len的用法_总结Python中len()函数的使用实例

    这篇文章主要简单介绍了Python中的len()函数的使用,包括在四种情况下的使用小例子,是Python学习当中的基础知识,需要的朋友可以参考下 函数:len() 1:作用:返回字符串.列表.字典.元 ...

  9. python中with open用法_在线玩转python中with用法

    在本篇文章里小编给大家整理的是关于python中with用法讲解内容,有需要的朋友们可以参考下. 我们都知道打开文件有两种方法:f = open() with open() as f: 这两种方法的区 ...

  10. python中case的用法_如何在Python中使用TestCase实现一个断言功能

    如何在Python中使用TestCase实现一个断言功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题. Python TestCase断 ...

最新文章

  1. MVC案例-架构分析
  2. 【Android】SlidingMenu属性详解
  3. linux 脚本设置时间戳,修改linux系统时间的方法(date命令)
  4. SpringBoot在IDEA中实现热部署
  5. 学python多长时间能够精通-学Python多长时间?老男孩Python技术培训
  6. 最讨厌心灵鸡汤 所有失败最终都是人不行
  7. Ubuntu下取消MySQL自动启动
  8. rg1 蓝光危害rg0_LED(护眼)台灯|蓝光那些事
  9. ht1621b和单片机电平匹配_有备无患,单片机面试问题集
  10. SQL Server 数据库身份认证以及包含数据库
  11. python 利用urllib2通过指定网页访问url,并捕获内容
  12. 网易新闻iOS版开发使用的第三方框架和组件列表
  13. 分支程序设计03 - 零基础入门学习C语言12
  14. python turtle画太极的代码_python turtle 绘制太极图的实例
  15. Java插入Excel指定行
  16. 安居客 楼盘信息 项目代码-
  17. golang办公工作流workflow js-ojus/flow包介绍——系列一
  18. 登录可以用微信的163邮箱!TOM VIP商务邮全新而来!
  19. Office 连供打印机无法进纸怎么办 卡纸,塞纸怎么办
  20. 模仿新浪微博雷达搜索动画效果

热门文章

  1. 计算机网络 王道考研2021 第一章 -- 计算机网络组成 / 分类
  2. Busting Frame Busting
  3. Win11如何查看硬盘型号?Win11查看硬盘型号步骤
  4. AD19导出bom表的方法(按照元件不同数值分类,重点信息突出)
  5. java纸牌_Java纸牌拖拉机简单模拟
  6. 2021 苟且活着,2022 向上生长
  7. 流媒体直播点播系统方案设计
  8. help用法总结(基于材料:“老托福听力93篇”)
  9. 德国华人餐饮外卖的春天?
  10. 如何使用python刷博客浏览量---第二种方法