Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
By Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun
主要看目标检测部分
SPP-Net论文详解,参考主要思路
1. Contributions
这篇论文中作者想要解决的两个问题:
- 目前现有的网络结构的输入图片的尺寸都需要固定的;作者学习这种方法可能会降低精度;
- 针对目标检测,作者基于R-CNN改进;R-CNN存在的一个问题,就是对于每个region proposals都需要各自输入CNN中提取特征,这样仅处理一张图片,因为一张图就有2000个region proposals,就会非常耗时。
因此,作者提出的改进方法,就是使用SPP-net,使得网络的输入尺寸不再需要固定;同时基于R-CNN的目标检测方法,在使用了SPP-net后,不用再进行2000次的耗时的卷积,只有计算一次,大大提升效率。
2. Architecture
SPP-net所要达到的目标,就是使网络的输入不再需要是固定的尺寸。我们知道一般网络都分为卷积和全连接层两部分。而之前网络的输入,其尺寸需要固定的原因,不是因为卷积层,而是全连接层的输入尺寸需要固定。因此作者的方法就是在给定输入不固定的情况下,通过卷积层,经过SPP-net后,其尺寸能够固定,以便SPP-net的输出结果能够输入到全连接层中。
2.1 Spatial Pyramid Pooling
以AlexNet为例,全连接层前的最后一层是$pool_5$层(接在$conv_5$和$relu$之后,之后省略表述$relu$操作);因此作者通过用SPP(Spatial pyramid pooling)代替原来的$pool_5$层,以达到输出尺寸固定的目的。
举例来说:
- 图片经过$conv_5$后得到$13\times 13$尺寸的feature map的情况下,通过SPP操作,能够得到三个不同尺寸的feature maps:$3\times 3,\ 2\times 2,\ 1\times 1$;
- 图片经过$conv_5$后得到$10\times 10$尺寸的feature map的情况下,通过SPP操作,也能够得到三个不同尺寸的feature maps:$3\times 3,\ 2\times 2,\ 1\times 1$。
这样,将这三个尺寸不同但每次每个都是固定尺寸的feature maps展成一维向量并拼接,便可得到固定长度的向量。
这里,作者将$3\times 3,\ 2\times 2,\ 1\times 1$这种$3\times 3,\ 2\times 2,\ 1\times 1$的bins。
3. Training/Test
在目标检测任务的训练过程中,相较于R-CNN,其主要不同主要在于图片只要进行一次卷积操作,而不是对每个region proposal都进行卷积操作。SPP-net实现了此功能,但它的使用也需要一特别的改动。
3.1 How to get $n \times n$ bins
事实上这里作者直接给出了公式。设$conv_5$的输出为$a\times a$,需要的bins尺寸为$n\times n$,将pooling层作为sliding window pooling,则pooling的滑动窗口的大小$sizeX=\lceil a/n \rceil$,而stride则为$stride=\lfloor a/n \rfloor$。
举例来说,在$conv_5$的输出为$13\times 13$的情况下:想要得到$3\times 3$的bin,则根据公式,有$sizeX=5$,$stride=4$,我们滑动pooling窗口,便可得到$3\times 3$大小的bin;同理,$2\times 2,\ 1\times 1$的bin也通过以上方式可得到。
最终,假设$conv_5$的filters数量为256,我们就能得到$(3\times 3 + 2\times 2 + 1\times 1) \times 256$长度的向量,作为全连接层的输入。
3.2 Mapping a window to feature maps
在R-CNN中,网络的输入就是region proposal,因此我们可以直接得到相应的feature map;但是SPP-net的输入是一整张图,因此$conv_5$的输出结果也是整张图的feature map。那么,我们如何能够找到每个候选框在feature map中对应的区域呢?
作者直接给出了公式:设候选区域中的坐标为$x$,那么feature map中的坐标$x’ = \lfloor x/S \rfloor + 1$或$x’ = \lfloor x/S \rfloor - 1$,其中前者对应的上左的边界,而后者对应的是右下的边界,$S$则表示之前所有stride的乘积。
注:这里是直接摘抄论文的;文前的参考博客之后或许可以再看。
3.3 Single/Multi size training
虽然网络的输入可以是任意的尺寸,但是为了提高训练的效率,在训练的时候,还是使用固定的尺寸。
Single-size training
这里作者就是直接使用$224\times 224$的图片作为输入进行训练的。
Multi-size training
这里作者取了两种大小的尺寸($224\times 224,\ 180\times 180$)作为输入,交替训练网络,即224的图片训练一个epoch,180的图片训练一个epoch。
其中,224的图片通过crop得到,而180的图片则通过224的图片缩放得到。
论文中说这样训练的好处是可以更快收敛。
3.4 Test
在测试阶段,则直接使用任意尺寸的图片作为输入即可。
3.5 Multi-scale feature extraction
作者还通过multi-scale feature extraction来提高性能。
提出这个方法的原因,我觉得是在R-CNN中,原来如果一个候选框无论大小,都会缩放到$224\times 224$大小的尺寸。但是现在SPP-net直接把一整张图作为输入,那么如果一个检测目标在图中的尺寸比较小的话,则其得到的特征也会比较小,可能会影响精度。
所以multi-scale feature extraction方法先把图片resize成$\min(w,h) = s \in S = { 480, 576, 688, 864, 1200 }$。然后因为有这多的特征,我们需要进行选取或组合,作者的方法是,对于每个候选框,选择一个候选框尺寸最接近$224\times 224$的尺寸即可。
写到这里,再回过头来看刚才自己分析其原因的那一段,又觉得奇怪,因为这个multi-scale feature extraction不应该是在test阶段使用的吗?所以说在训练的训练,有些小的候选框在训练时本来就很小的,所以感觉自己分析的好像又不太对了。
4. Disscussion
- 3.2的mappinp;
- 3.5的multi-scale feature extraction。