——CVPR2018,Best Student Entry in the COCO 2017 challenge
——小目标检测,多尺度检测
摘要
提出在极端尺度变化下检测识别的不同技术的分析。通过使用不同尺度的数据进行训练来比较检测器的尺度特性和尺度变化设计。通过比较不同网络结构在分类小目标上的性能,得出CNN对图像目标尺度变化并不鲁棒。基于这个理论,本文提出在相同尺度的图像金字塔上训练和测试检测器。由于小对象和大对象很难在其对应的尺度上识别,意即单独在较大或较小的尺度上检测大目标和小目标较为困难,故而提出一种新的训练策略,称之为SNIP(Scale Normalization for Image Pyramids),将目标在不同大小下的梯度信息选择性反向传播。在COCO数据集上,单个模型达到45.7%的mAP,三个模型集成达到48.3%的mAP。
介绍
下图横坐标表示对象大小所占图像大小的比例,纵坐标表示不同尺度的对象在数据集中所有对象中所占的比例,可见COCO数据集中90%的对象所占图像大小比例都小于0.472,而Imagenet数据集中对象尺度分布比较均匀。因此Imagenet预训练模型迁移到COCO数据集会带来较大的domain-shift。另外,在COCO数据集中对象尺度差异极大,最小的10%和最大的10%相差超过20倍。
为解决上述问题,有许多解决办法:如将低层特征与高层特征融合;使用空洞卷积、可形变卷积扩张感受野使检测器对scale跨度大的问题适应性更强;在不同分辨率的层进行独立预测;使用上采样增加上下文信息;在多尺度图像(图像金字塔)上进行训练或者测试等等。但是仍有一些问题没有解决:
1、用上采样来达到好的检测效果是否必要?检测数据集的典型大小是480*640,为什么要将图像上采样为800*1200?是否可以用smaller strides来预训练ImageNet数据集中的低分辨率图像,然后再迁移至目标数据集?
2、在预训练时,应当使训练集中所有大小的目标都参与训练么?还是应该只选取一部分大小的对象,如64*64~256*256。
对于尺度特定的检测器,一个解决对象尺度变化的方法是为不同尺度的对象单独训练检测器,在对象大小接近的数据集上进行迁移学习有助于减少domain shift,但是这种训练方法会减少每个尺度的训练样本的数量,这也会造成性能下降。另一方面,用所有的训练样本来训练一个单尺度的检测器将使得网络学习变得困难,因为网络需要学习检测大范围尺度的对象。
基于此,本文提出一种新颖的训练策略:SNIP(Scale Normalization for Image Pyramids),通过图像金字塔来克服尺度变化问题。为了减小迁移学习中的domain shift,只对预训练模型对象尺度相似的RoI/anchors的梯度进行回传,由于上述约束,在对数据集中每个尺度进行训练时,可以有效利用所有训练对象,性能得到极大提升,打破了只要提供足够数据,深度CNN就能解决尺度变化的共识。利用Deformable-RFCN骨架网络,在COCO数据集上。
实际上,目前也有很多针对小目标的措施和改良,如:
使用dilated/strous卷积来提高特征图的分辨率,Dilated/deformable卷积扩张/可变形的卷积保留了预训练网络的权重和感受野,并且不会带来大物体性能的下降;最常用的,Upsample来rezie网络输入图像的大小,训练时将诶图像放大1.5倍到2倍,测试时将图像放大4倍;使用FPN(FPN,Mask-RCNN,RetinaNet)把浅层特征和深层特征融合的,或者最后在预测的时候,使用浅层特征和深层特征一起预测;或者直接地在浅层和深层的特征图上直接各自独立做预测的(SDP,SSH,MS-CNN,SSD)。
《Finding tiny faces》将每个尺度的响应值做最大池化之后,再进行梯度的反向传播,在分类层中不同尺度的人脸使用不同的核,但是这样的方法在对象检测中有较大的局限性,因为每一类的训练数据量将被限制,而且通用对象在外观、姿态上比人脸更复杂。而且本文发现在R-FCN中为每一类加入固定尺度的核将对性能造成损伤。
Image Classification at Multiple Scales
现在的很多检测模型为了提升对小目标的检测精度,一般都会在 800×1200的分辨率上训练图片,为了进一步提升对小目标的监测精度,在inference时会进一步放大图片,比如在1400×2000的分辨率上检测。也就是说 train和test(inference)之间是存在domain shift 的。本文从实验上来验证放大图片对于检测效果的影响:
CNN-B:是在高分辨率图像的数据集上训练的(ImageNet 224),然后测试时,先将ImageNet的图像下采样至 48x48, 64x64, 80x80, 96x96 和128x128 大小,然后再上采样至224,将这个ImageNet称为ImageNet up-sampled low resolution images to 224(将低分辨率图片上采样至224)。
CNN-S:是在低分辨率图像的数据集上训练的(ImageNet 48x48, 64x64, 80x80, 96x96 and 128x128, 通过降采样完成),测试也是在相应低分辨率上测试的。
CNN-B-FT:是在高分辨率图像的数据集上训练(ImageNet 224),而后又在上采样到224的低分辨率的数据集(ImageNet up-sampled low resolution images to 224数据集)上fine-tuning的,测试也是在ImageNet up-sampled low resolution images to 224数据集上。
(a)CNN-B 在不同分辨率图像上的测试精度。CNN-B是在高分辨率图像上训练的,然后在由不同低分辨率图像上采样构成的 ImageNet上测试的。测试图像与训练图像的分辨率差别越大,效果越差。使用网络没有训练过的图像进行测试,结果只能是次优的,至少对于分类问题来说是这样。
(b)、(c)三种训练好的模型在 48×48 (96×96)大小的低分辨率图像上的测试精度,CNN-B的效果最差,CNN-S次之,CNN-B-FT最好。
直接用低分辨率图像训练(CNN-S,减小第一个卷积步长),然后低分辨率测试,效果是比较好的。直接启发是如果检测时想要提升对小目标的检测效果,应该专门在低分辨率的ImageNet上训练一个对低分辨率图像最优的分类模型(通过减小步长),然后再迁移到检测任务上,用于检测小目标。
先在高分辨率图像训练然后再在上采样后的低分辨率图像上fine-tuning 效果最好,说明分类模型在高分辨率图像中学习到了其他更有用的信息,上采样是有用的。直接启发是在高分辨率图像上先预训练,然后再在低分辨率图像上fine-tuning,对于分类小目标是有利的,应该比前一条提到的方法更有效。
进一步:
在高分辨率图像上先预训练,然后再在低分辨率图像上fine-tuning,对于分类小目标时有利的。
如果检测时的proposals与ImageNet预训练模型的分辨率相近,那么可以减少domain shift。
上采样确实是有用的。
Multi-scale Detection
D-RFCN作为baseline,ResNet101 作为backbone,在800*1200分辨率的图像上进行训练,5种anchor scales用于产生proposals。
train和test时分辨率不同将会存在domain shift,但是由于GPU现存的限制,这个差异一般都会存在。事实检测模型经常会在800×1000的分辨率上训练,然后再1400×2000的分辨率上测试。
在COCO数据集上关于scale-specific detector和scale invariant detector的实验:固定测试时的分辨率为 1400×2000 ,然后通过调整不同的输入来对比COCO数据集上小目标(小于32×32的目标)的检测精度。主要使用800×1000和1400×2000这两种训练输入分辨率,然后再梯度反向传播时,把所有scale的ROI的梯度回传。因此下表 800all,1400all,就是代表这个意思。
800all和1400all分别表示检测网络基于800*1400和1400*2000大小的图像进行训练,从二者的mAP结果对比可以看出1400all的效果要更好一些,主要原因就在于训练图像的分辨率和测试图像的分辨率一致,这和前面基于ImageNet数据集的实验结果也吻合,但这个提升非常小,猜测原因在于虽然基于放大图像(原始图像约640*480,放大成1400*2000)训练的模型在训练过程中可以提高对小目标物体的检测,但是由于训练数据中尺寸中等或较大的目标经过放大之后尺寸太大所以难以训练,这就影响了模型最终的效果。
1400<80px表示训练数据尺寸是1400*2000,但是训练过程中忽略中等尺寸和大尺寸的目标(中等和大尺寸目标的标准是在原始图像中目标宽高的像素点大于80),这就是scale-specific detector,也就是基于单一尺寸范围的输入进行训练,这样能够减少所谓的domain-shift。因此做这个实验的目的是基于前面那个实验中的猜想:基于1400*2000大小的图像训练时由于训练数据中尺寸中等及较大的目标对模型训练有负作用,因此这里直接在训练过程中忽略这样的数据。但是可以看出这个模型的效果非常差,猜想原因是忽略这些训练数据(占比大约30%)所带来的数据损失对模型效果的影响更大。
Multi-Scale Training(MST)表示训练一个检测器时采用不同尺度的图像进行训练(包括480*800),也就是scale invariant detector。照理来说这个实验的效果应该会比较好的,因为每个object都会有多种不同尺寸来训练检测模型,但是可以看出该模型的效果和800all差不多,主要原因在于训练数据中那些尺寸非常大或非常小的object会影响训练效果,因此这篇文章在引入MST思想的同时限定了不同尺寸的object在训练过程中的梯度回传,这就是SNIP。
Object Detection on an Image Pyramid
Scale Normalization for Image Pyramids
SNIP是MST的改进版本,只有当对象的分辨率和预训练模型的训练数据即相近时(224*224),才使用它来训练检测器。在MST中,每张图片都被缩放到不同的尺度,在高分辨率图像中,原本较大的对象变得更大,很难检测到,在低分辨率图像中,原本较小的对象变得更小,也很难检测到。SNIP的做法就是只对尺寸在指定范围内的目标回传损失(该范围需接近预训练模型的训练数据尺寸),也就是说训练过程实际上只是针对这些目标进行的,这样就能减少domain-shift带来的影响。又因为训练过程采用了类似MST的做法,所以每个目标在训练时都会有几个不同的尺寸,那么总有一个尺寸在指定的尺寸范围内。需要注意的是对目标的尺寸做限制是在训练过程,而不是预先对训练数据做过滤,训练数据还是基于所有数据进行。实验证明这种做法对小目标物体的检测非常有效。
某个ROI在训练中是否回传梯度是和预训练模型的数据尺寸相关的,也就是说当某个ROI的面积在指定范围内时,该ROI就是valid,也就是会在此次训练中回传梯度,否则就是无效的,valid anchor的定义是和invalid ground truth的IOU小于0.3的anchor。
在前向时,使用RPN在每个分辨率上生成候选区域,然后在每个分辨率上独立分类,跟训练阶段相似,在每个分辨率上,不将落在指定面积范围之外的检测结果剔除,在经过分类和回归之后,使用soft-NMS来讲不通分辨率上的检测结果融合起来。
为了降低训练对GPU内存的要求,将原图进行裁剪,目标是在原图裁剪尽可能少的1000x1000的区域,并且这些裁剪区域包含所有的小目标具体方法:选择一幅图像;随机生成50个1000x1000的裁剪区域;选择包括目标最多的裁剪区域;如果所有裁剪区没有包含原图所有的目标,继续随机生成50个1000x1000的裁剪区域;由于很多目标在原图边界,再加上是随机裁剪,为了加快速度,裁剪时,保证裁剪区域的至少一个边在原图边界上,对于分辨率小于1000*1000的,或者不包含小目标的图像,不进行处理。实验证明裁剪原图不是提高精度的原因。
对于分辨率为1400*2000的训练图像,原图中的有效尺寸的范围为[0,80],800*1200的训练图像,原图中有效尺寸为[40,160],480*800的训练图像有效尺寸为大于等于120。
关于RPN网络中anchor的正负样本比例。在RPN网络中,一个anchor的标签是根据该anchor和ground truth的IOU来决定的,只有两种情况下才会认为某个anchor的标签是正样本:1、假如该anchor和某个ground truth的IOU超过某个阈值(阈值默认采用是0.7),那么该ancho就是正样本;2、假如一个ground truth和所有anchor的IOU都没超过该阈值,那么和该ground truth的IOU最大的那个anchor就是正样本。将conv4的输出作为RPN网络的输入,然后设置了15种anchor(5 scales,3 aspect ratios),发现在COCO数据集上(图像大小为800*1200),只有30%的ground truth满足前面第一种情况,即便将阈值调整为0.5,也只有58%的ground truth满足第一种情况,说明即便阈值等于0.5,仍有40%的正样本anchor和ground truth的IOU小于0.5(这些anchor是因为满足前面的情况2才被定义为正样本)。显然,这样的正样本质量不算很高。而引入多种分辨率的图像作为输入在一定程度上缓解了这种现象。