简介
这篇文章分析了小尺度与预训练模型尺度之间的关系, 并且提出了一个和 Cascade R-CNN 有异曲同工之妙的中心思想: 要让输入分布接近模型预训练的分布(本文主要探讨尺度的分布不一致带来的问题).
之后利用分析的结论, 提出了一个多尺度训练(MST)的升级版:Scale Normalization for Image Pyramids (SNIP).
先简单来介绍一下SNIP这个paper做的事情。在CNN中,我们需要不同种类的invariance(不变性)来做识别,这其中translation invariance在CNN中可以比较好地被考虑,然而另外一种重要的不变性,scale invariance就很难被CNN考虑到。为了解决这个问题,一般常用的两大种策略就是Image Pyramid或者Feature Pyramid。在传统的Image Pyramid中,一般会使用一个固定大小的模板进行训练,将检测问题转换为一个固定大小的输入图像的分类问题。然后建立大小不同的Image Pyramid,在这个Pyramid中的每个scale的图片上,使用这个固定大小的检测器使用sliding window或cascaded classifier来分类。这大类方法中在deep时代比较经典的有MTCNN;另外一大类方法也就是Feature Pyramid,大家应该比较熟悉,这里的代表工作包括SPPNet和FPN,其中后者已经是目前检测算法的一个标准组件。 这篇文章中,作者对于scale对于CNN性能的影响做了十分深入的分析。下面这个表是引出这篇文章的motivation的核心。作者首先统一了测试的scale是1400,报告了COCO数据集上小物体(小于32*32)检测的mAP。 |
上了深度网络后, 分类任务已经做到了误差率2%(ImageNet). 为什么在COCO上才62%? 这么悬殊的距离主要因为检测数据集中包含了大量小物体, 他们成了绊脚石.
COCO90%的Instance的大小都在0.472以下,和ImageNet差别非常大,这一方面说明了类似COCO这样的数据集中存在着大量的小物体,另一方面也说明了ImageNet预训练的模型在迁移到样本大小差异较大的COCO中时很可能产生一定的domain-shift偏差。因此作者产生这样的motivation:
* 结论: 检测器必须同时应对如此之大的尺度变化的样本, 这就导致了我们使用ImageNet(或其他分类)预训练模型时, 有严重的domain-shift问题.
尽管Feature Pyramids 有效的综合了多卷积层特征图信息,但是对于very small/large objects 检测效果不是很好
借由分类模型的实验, 探索检测中domain-shift带来的影响. 检测中的Domain-shift主要来自于训练/测试尺度不匹配:
* 训练800x1200. 因为显存有所限制, 不能更大了
* 测试1400x2000. 为了提升小物体检测性能
|
CNN-B是一个在224x224尺度上训练的模型, 其stride=2. 我们将测试图片降采样到 [48x48, 64x64, 80x80, 96x96,128x128], 然后再放大回224x224用于测试. 结果如图:
* 结论: 训/测尺度(实际上是清晰度)差距越大, 性能跌的越厉害. 因为不用与训练尺度相互匹配的尺度进行测试, 会使得模型一直在sub-optimal发挥.
CNN-S是根据上述原则, 我们做一个训/测尺度匹配的实验. 选取48x48作为训/测尺度. 并且stride=1stride=1, 因为如果不修改stridestride的话很容易就卷没了. 模型架构变了, 于是针对与上文CNN-S的可比较性问题, 作者说:
After-all, network architectures which obtain best performance on CIFAR10 [17] (which contains small objects) are different from ImageNet
根据结果看到, 训/测尺度匹配后, 性能大幅提升. 同样将48换成96也得到一致的结果.
我们很容易想到的另一种方法就是, 为了在伪高清尺度测试, 我们就把由原图训练的CNN-B用伪高清去做微调. 最终CNN-B-FT的结果甚至好于CNN-S.
数据库中原图尺寸为640x48, 小物体是小于32x32的物体
800all | 1400all |
---|---|
19.6 | 19.9 |
* 分析: 正如之前分析的一样, 当训/测尺度一致时, 得到的结果最好. 所以1400all胜出.
* 问题: 但是为什么只超过了一点点呢? 因为在考虑小物体的分类性能而放大图片的同时, 也将中/大尺度的样本放大得太大, 导致无法正确识别.
1400<800px | 800all |
1400all |
---|---|---|
16.4 | 19.6 | 19.9 |
* 分析问题: 跟预想的不一样, 为什么性能下降这么多? 其根本原因是因为这种做法抛去了太多的样本(~30%), 导致训练集丰富性下降, 尤其是抛弃的那个尺度的样本.
1400<800px | 800all | 1400all | MST |
---|---|---|---|
16.4 | 19.6 | 19.9 | 19.5 |
* 分析问题: 其最终性能跟800all 没太大差别, 主要原因和”实验800all vs 1400all类似, 因为这一次引入了极大/极小的训练样本.
其实SNIP做的事情是非常简单的:在训练中,每次只回传那些大小在一个预先指定范围内的proposal的gradient,而忽略掉过大或者过小的proposal;在测试中,建立大小不同的Image Pyramid,在每张图上都运行这样一个detector,同样只保留那些大小在指定范围之内的输出结果,最终在一起NMS。这样就可以保证网络总是在同样scale的物体上训练,也就是标题中Scale Normalized的意思。 |
If there are no ground truth boxes within the valid range at a particular resolution in an image, that image- resolution pair is ignored during training
考虑到GPU显存, 需要crop图片来满足显存局限.
* 用最少数量的1000x1000的chips来囊括所有的小物体. 如果没有小物体的话, 这个区域就不需要进行任何计算, 加速训练.
* 操作:
只对1400x2000的图片进行采样. 800x1200/480x640/图片无小物体时, 不进行采样
sampled_chips = []
while num_sampled_unique_object < num_object:
chips = get_random_chips(size=(1000,1000), number=50)
sampled_chips.append( chips.where(chips.num_objects is max ) )
sampled_chips = sampled_chips.truncate_boundary()