空间金字塔池化(Spatial Pyramid Pooling, SPP)




主要参考这两篇博客:
https://blog.csdn.net/yzf0011/article/details/75212513
https://blog.csdn.net/u011534057/article/details/51219959 (这篇末尾讲的特别好)

Introduction

在一般的CNN结构中,在卷积层后面通常连接着全连接。而全连接层的特征数是固定的,所以在网络输入的时候,会固定输入的大小(fixed-size)。但在现实中,我们的输入的图像尺寸总是不能满足输入时要求的大小。然而通常的手法就是裁剪(crop)和拉伸(warp)。

空间金字塔池化(Spatial Pyramid Pooling, SPP)_第1张图片

这样做总是不好的:图像的纵横比(ratio aspect) 和 输入图像的尺寸是被改变的。这样就会扭曲原始的图像。而Kaiming He在这里提出了一个SPP(Spatial Pyramid Pooling)层能很好的解决这样的问题, 但SPP通常连接在最后一层卷基层。

既然之前的CNN要求输入固定大小的图片,那么我们首先需要知道为什么CNN需要输入固定大小的图片?CNN大体包含3部分,卷积、池化、全连接。
首先是卷积,卷积操作对图片输入的大小会有要求吗?比如一个5*5的卷积核,我输入的图片是30*81的大小,可以得到(26,77)大小的图片,并不会影响卷积操作。我输入600*500,它还是照样可以进行卷积,也就是卷积对图片输入大小没有要求,只要你喜欢,任意大小的图片进入,都可以进行卷积。
池化:池化对图片大小会有要求吗?比如我池化大小为(2,2)我输入一张30*40的,那么经过池化后可以得到15*20的图片。输入一张53*22大小的图片,经过池化后,我可以得到26*11大小的图片。因此池化这一步也没对图片大小有要求。只要你喜欢,输入任意大小的图片,都可以进行池化。
全连接层:既然池化和卷积都对输入图片大小没有要求,那么就只有全连接层对图片结果又要求了。因为全连接层我们的连接劝值矩阵的大小W,经过训练后,就是固定的大小了,比如我们从卷积到全连层,输入和输出的大小,分别是50、30个神经元,那么我们的权值矩阵(50,30)大小的矩阵了。因此空间金字塔池化,要解决的就是从卷积层到全连接层之间的一个过度。
也就是说在以后的文献中,一般空间金子塔池化层,都是放在卷积层到全连接层之间的一个网络层。
空间金字塔池化(Spatial Pyramid Pooling, SPP)_第2张图片
CNN一般结构和SPP结构

SPP 显著特点

1) 不管输入尺寸是怎样,SPP 可以产生固定大小的输出
2) 使用多个窗口(pooling window)
3) SPP 可以使用同一图像不同尺寸(scale)作为输入, 得到同样长度的池化特征。

其它特点

1) 由于对输入图像的不同纵横比和不同尺寸,SPP同样可以处理,所以提高了图像的尺度不变(scale-invariance)和降低了过拟合(over-fitting)
2) 实验表明训练图像尺寸的多样性比单一尺寸的训练图像更容易使得网络收敛(convergence)
3) SPP 对于特定的CNN网络设计和结构是独立的。(也就是说,只要把SPP放在最后一层卷积层后面,对网络的结构是没有影响的, 它只是替换了原来的pooling层)
4) 不仅可以用于图像分类而且可以用来目标检测

使用SPP的CNN

Convolutional Layers and Feature Maps


空间金字塔池化(Spatial Pyramid Pooling, SPP)_第3张图片

作者使用上图意在说明保留原图片的尺寸对实验的特征提取和结果都很重要

The Spatial Pyramid Pooling Layer

空间金字塔池化(Spatial Pyramid Pooling, SPP)_第4张图片
SPP原理

为什么会得固定大小的输出?
注意我们上面曾提到使用多个窗口(pooling窗口,上图中蓝色,青绿,银灰的窗口, 然后对feature maps 进行pooling,将分别得到的结果进行合并就会得到固定长度的输出), 这就是得到固定输出的秘密原因。

注:
空间金字塔池化(Spatial Pyramid Pooling, SPP)_第5张图片
文章中用的是AlexNet,conv5得到的feature map大小为13*13*256。SPP其实就是做了多尺度的提取特征。
之前在文章中和博客看到这个图片,以为是跟上面的16,4,1是对应的,但是其实第一个3*3池化不是对应的,如要与上图对应,第一个pool应为4*4,根据池化公式,n*n的pool层窗口大小为sizeX=ceil(13/4)=4,stride=floor(13/4)=3。

- 16 4 1
池化之后的大小 4*4 2*2 1*1
用n*n的pool窗 4*4 7*7 13*13
stride 3 6 13

使用SPP进行检测,先用提候选proposals方法(selective search)选出候选框,不过不像RCNN把每个候选区域给深度网络提特征,而是整张图提一次特征,再把候选框映射到conv5上,因为候选框的大小尺度不同,映射到conv5后仍不同,所以需要再通过SPP层提取到相同维度的特征,再进行分类和回归,后面的思路和方法与RCNN一致。

实际上这样子做的话就比原先的快很多了,因为之前RCNN也提出了这个原因就是深度网络所需要的感受野是非常大的,这样子的话需要每次将感兴趣区域放大到网络的尺度才能卷积到conv5层。这样计算量就会很大,而SPP只需要计算一次特征,剩下的只需要在conv5层上操作就可以了。

当然即使是这么完美的算法,也是有它的瑕疵的,可能Kaiming He大神太投入 SPP的功效了,使得整个流程框架并没有变得更加完美。首先在训练方面,SPP没有发挥出它的优势,依旧用了传统的训练方法,这使得计算量依旧很大,而且分类和bounding box的回归问题也可以联合学习,使得整体框架更加完美。这些Kaiming He都给忽略了,这样也就有了第二篇神作 Fast RCNN

你可能感兴趣的:(深度学习)