提出问题
深度学习方法提出后,目标分类任务性能急剧提升,top-5 error on ImageNet已经从15%降低到2%,这对于1000类目标分类任务已经超越了人类水平。
但是在COCO数据集上的检测任务中(目标只有80类)检测器的mAP性能却只有62%(即使overlap设置只有50%)。
为什么目标检测要比目标分类任务困难许多?
- 检测目标的尺度范围变化很大(在COCO检测数据集中,最小的前10%的目标尺度与最大的前10%目标的尺寸相差有20倍之多,这对检测器对尺度变化的鲁棒性提出较高的要求),其中小目标的检测是造成检测性能下降的主要原因。
- 目标分类数据集中目标大小相差不大,而检测数据集中目标尺寸分布范围很广,因此两种任务的数据集之间的差异导致了使用分类数据集训练的model进行finetune时出现了domain-shift;
本文提出了一种名为Scale Normalization Image Pyramids的训练机制,解决上述问题。
现有解决scale variation和small object detection的方法
- 结合前侧卷积特征和深层卷积特征提高小目标检测效果;
- 使用dialated/deformable卷积增加感受野提高大目标检测效果;
- 在不同尺度的特征图上独立的进行不同尺度大小的目标检测;
- 使用context信息消除歧义;
- 训练时使用多尺度图像输入;
- 在多尺度图像金字塔上预测目标后使用NMS合并检测结果;
虽然上述解决方法在很大程度上提高了目标检测的性能,但是仍有很多余训练相关的重要问题没有解决:
- 现在检测网络为了提高对小目标的效果,都采用upsample的方法(目前检测数据集中典型的图像尺寸为480*640,为什么通常要将其upsample到800*1200?),这个真的是必要的吗?能不能直接用小的stride在ImageNet中低分辨率的图像不做upsample来预训练网络后在检测数据集上finetune用于小目标的检测?
- 当使用一个预训练的image classification model进行object detector finetuning时,upsample调整了图像大小以后,是应该只用64x64~256x256的ground truth来训练?还是用所有的gt(如COCO数据集中尺寸16*16到800*1000)来训练更好?
我们在ImageNet和COCO数据集上设计了对照试验来回答这些问题。
探究性实验
分析图像分辨率,目标尺寸大小及其variation对检测器性能的影响
为了探究这些因素的影响,作者使用如下不同的训练方式并在1400*2000分辨率的图像上进行了小目标的测试(COCO数据集中小目标尺寸小于32*32),结果如Table 1所示。
Training at different resolutions:
使用所有尺寸的目标进行训练,分别在两种分辨率的图像上进行了训练:800*1400和1400*2000,示意图如Fig5.1所示。
分别使用
80
0
a
l
l
800_{all}
800all和
140
0
a
l
l
1400_{all}
1400all表示,可以看到
140
0
a
l
l
1400_{all}
1400all的检测性能更好一点,这是由于训练和测试使用的图像分辨率是一致的,均为1400*2000.但是
140
0
a
l
l
1400_{all}
1400all的提升效果也是微弱的,因为在较大的分辨率上训练时,medium-to-large object将变得太大,导致无法正确分类,这使得检测性能受到影响。
Scale specific detectors:
我们在1400*2000分辨率的图像上忽略所有medium-to-large的目标(在源图像中尺寸大于80px),用以减少极大目标带来的小目标检测性能的损失,训练得到的detector( 140 0 < 80 p x 1400_{<80px} 1400<80px),示意图如Fig 5.2所示。但是这样训练得到的模型效果还不如 80 0 a l l 800_{all} 800all,原因是由于只使用小尺寸样本训练损坏了目标的大小外观的多样性,造成的负面影响要大于排除极端尺寸目标所带来的收益。
Mutl-Scale Training(MST):
最后作者评价了训练中常用的获取scale-invariant detector的方法,即训练时从多个分辨率中随机选取一个将图像缩放至该分辨率下,使用图像中的所有目标进行训练,这种方式我们记为MST,如Fig 5.3所示。这种方式保证了training instance在多种分辨率下被observed,但会引入很多很大的或很小的目标,导致检测性能下降。这种训练方式跟 80 0 a l l 800_{all} 800all很像。
作者给出结论:训练时使用合适大小的目标(将训练中使用的目标尺寸限制在合适的范围内),同时也要保证训练样本中目标的多样性(capturing as much variation across the objects as possible),这两点对于提高目标检测性能是十分重要的。本文提出的SNIP检测框架可以保证这两点,因此检测性能可以超出现有检测方法很多。
Scale Normalization for Image Pyramids(SNIP)
这一节介绍本文提出的检测方法。SNIP是MST的改进版本,只讲与pre-training dataset中的目标尺寸相近的目标(通常为224*224)用于训练过程。具体细节如下:
如Fig 6所示,作者在训练时划分了三个尺度,对应三种不同分辨率的图像。每个分辨率i下的RoI都有其指定范围,如果gt的box大小在这个范围内,就被标记做valid,否则就被标记为invalid。
在训练RPN网络时,生成Anchor并给Anchor分配label的时候,检查该Anchor是否和某个invalid gt box的overlap超过0.3,若存在,则该Anchor会被视作invalid Anchor,训练时将被排除在外(他们的梯度被设置为0,不会加入到反向传播的过程中从而对参数产生影响),在RCNN部分,同样弃用不在[si,ei]范围内的GT和Proposals。相当于在每个分辨率上,只对大小合适的目标进行训练,这就符合了作者设计的初衷。
在inference时,在每一个分辨率图上使用RPN网络生成proposals并在各自的分辨率下独立进行classsify,如Fig 6所示。同训练时一样,detections(not proposals)的尺寸若不在该分辨率指定的尺寸范围内也将被抛弃。经过classification和bounding-box regression后,我们将多个分辨率图像中的检测结果rescale后使用soft-NMS合并后得到最终的检测框,如Fig 6所示。
问题根源解释
下面这段内容本人觉得很有道理,有助于理解该方法思想,来自:https://blog.csdn.net/Jillian_sea/article/details/80607376?utm_source=copy
本质上,这是因为CNN网络没有尺度不变形,没有把scale这个隐藏变量学习到的机制,只能通过大量参数来强行记忆不同scale的物体。而下面部分谈到的方法也很可能只是治标不治本,关键还是怎么把scale这个隐藏变量抽离出来,甚至可以直接学习;或者直接赋予网络学习scale的能力。
MST—randomly sampled images at multiple resolutions during training 暴力扩充多尺度的样本.Multi-scale的做法扩充了不同scale样本的数目,但是仍然要求CNN去fit所有scale的物体。通过这样的一个对比实验,SNIP非常solid地证明了就算是数据相对充足的情况下,CNN仍然很难使用所有scale的物体。个人猜测由于CNN中没有对于scale invariant的结构,CNN能检测不同scale的“假象”,更多是通过CNN来通过capacity来强行memorize不同scale的物体来达到的,这其实浪费了大量的capacity.
SNIP----- training is only performed on objects that fall in the desired scale range and the remainder are simply ignored during back-propagation.只学习同样的scale可以保障有限的capacity用于学习语义信息。将尺度这个隐藏变量分离开来了.