SNIPER: Efficient Multi-Scale Training

论文名称: SNIPER: Efficient Multi-Scale Training

作者:Bharat Singh & Mahyar Najibi & Larry S.Davis

论文链接https://arxiv.org/abs/1805.09300:

代码链接:https://github.com/bharatsingh430/snip

简要概述文章精华

目标检测中的小目标的检测一直是一个难题,同样也有很多方法被提出来优化小目标的识别,使用图像金字塔进行多尺度检测是一个比较常用的方法,但是使用图像金字塔往往会带来巨大的资源消耗,本篇文章就针对这个问题,提出了一个解决利用图像金字塔进行多尺度训练时间长、资源消耗大的方法,其在SNIP的方法上发展而来,通过采样多个chips,并将chips缩放到相同的尺度(这点有点像RCNN)进行训练,不仅仅实现了多尺度,还提高了3倍的速度,并且保证了精度。

其实早在RCNN网络,就已经采用了多尺度训练方法,我们回顾一下RCNN方法:

R-CNN首先通过selective search生成候选区域(region proposals)然后将proposal缩放成224x224大小的图片。R-CNN将不同大小的region proposal缩放成固定大小,实际上就引入了 multi-scale ,任何尺寸的region proposal都相当于一个scale。RCNN最主要的问题在于提取特征时,CNN需要在每一个候选区域上跑一遍,候选区域之间的交叠使得特征被重复提取, 造成了严重的速度瓶颈, 降低了计算效率。

Fast RCNN的提出主要是解决了R-CNN的速度问题,它通过将selective search生成的候选区域映射到feature map上,实现了候选区域间的卷积计算共享,同时由于共同参与计算,Fast R-CNN也能更多的获取到全局信息(contex)。而同时提出的 ROI pooling也将对应到feature map上的候选区域池化到相同的大小,ROI pooling 在某种程度上也可以引进尺度不变性,因为可以将不同大小的region proposal(连同 object)在feature map层面池化到固定大小。但它的问题是前面的卷积层部分是只在一个scale上进行的,这正是为了实现卷积计算共享所带来的一点负面影响,因为是卷积计算共享,所以不同大小的目标没有办法进行不同比例的缩放操作,所以相对于原图大小来说,它们都处于一个scale。这影响了尺度不变性 ,因此为了弥补这一点,在训练或者inference时,会使用image pyramid的操作,直接把原图放大&缩小后送入同一网络进行训练。但是image pyramid有一个问题,就是在缩放原图时,object也会跟着缩放,这就导致原来比较大的object变得更大了,原来更小的object变得更小。这在R-CNN中是不存在这个问题的。

SNIPER就是借鉴RCNN的方法,有点类似将RCNN与Fast RCNN的思想结合到一块的感觉

下面介绍一下SNIPER是怎么做的。

SNIPER同样是采用多尺度的,将图像缩放到3个尺度(这里跟SNIP是一致的),但是SNIPER不是直接利用尺度变换后的图像进行训练,而是在3个尺度中,根据一定的规则提取一定大小的chip,然后将chip缩放到固定大小(512*512),最后只利用这些chip进行模型的训练。

chip是如何生成的?

将图像缩放到不同的尺度,然后利用K*K的滑窗来选取多个chip

提取chip后,如何筛选出需要的chip即positive chip

对于每一个尺度,我们会设置一个目标范围[r1,r2],当ground truth是在此范围内的才会参与训练,不然过大或者过小的gt都会被pass,这里选取chip的方式就是依次选取包含ground truth最多的chip,直到所有的ground truth都包含,这些chips就组成了训练的正样本。

如下图所示,左边图是将提取的chip都画在了一张图上,其中虚线代表的就是选取的positive chip,其中绿框代表的是ground truth,这里展示了4个positive chip。右边图代表的是将选取的chip缩放到固定尺度然后进行训练,图中红色的框代表由于不符合前面设定的ground truth的范围而忽略的ground truth.

这样,SNIPER便可以使用较小尺度的chip进行训练了,而不需要使用尺度较大的金字塔图像了,这就在一定程度上减少了计算量。

负样本的选取

我们使用的chip包含了所有的positive instance,但是很多的背景却被pass掉了,这就容易导致背景被判断为正样本,增加了误判的概率,所以,我们还需要把前面pass掉的背景再捞回一部分加入到训练中,如何往回捞数据呢?

首先,我们先训一个不是很准确的RPN,用来帮我们找到那些可能会误判的样例,因此RPN不需要特别准,提取RPN后,首先去掉那些跟positive chip存在交叠的proposal,然后在剩余的proposal中,挑选那些可以最大程度覆盖其他proposal的proposal,这里说的可能有点绕,我们看下面的图像就比较清晰了。如下图所示,第二排的红点代表proposal的中心,选择的proposal最大程度的覆盖红点,但是不能与第一排的ground truth存在交叠。就有点利用hard example进行训练的意思。

注:文章中使用RPN生成chips的过程,并不是模型训练的过程,只是算法的一个预处理过程,而且RPN也不是必须使用不可,使用其他方法也可替代,如Selective Search方法。

网络训练的细节参数,这里就不介绍了,感兴趣的读者可以在论文中自行查看

训练好了如何inference呢?

inference的时候,将原图缩放到3个尺寸:480-512、800-1280、1400-2000,然后结果使用soft-nms进行合并。

实验结果

下图展示了未使用negtive chips时的召回结果,可以发现不使用negtive chips确实召回会高一些,因为不考虑误判呀。

但是计算精度就不行了,下表可以看出,使用negtive chips是可以增加其精度的。本文的sniper均是使用3个scale的,如果将scale降为2,如下表第二行所示,其mAP存在一定的下降,这也说明了多尺度的重要性。

最后与其他方法以及采用不同backbone的实验对比结果

总结

本文是在snip的基础上,对snip进行的改进,由于snip是使用多尺度进行训练的,这样不仅使得训练的时间成倍的增加,而且当尺度较大的时候,对于机器GPU的要求也会相应的增加,因此作者在其基础上改进得到sniper,sniper不仅实现了snip的多尺度,同时使用较小的chip进行训练,不仅仅提高了3倍的训练速度,还保证了精度,此方法值得我们学习。

你可能感兴趣的:(深度学习-目标检测)