一、为什么需要SPP
卷积神经网络(CNN)是由卷积层和全连接层组成,其中卷积层对于输入数据的大小并没有要求,唯一对数据大小有要求的则是第一个全连接层,因此基本上所有的CNN都要求输入数据固定大小,例如著名的VGG模型则要求输入数据大小是(224*224)
固定输入数据大小有两个问题:
- 很多场景所得到数据并不是固定大小的,例如街景文字基本上其宽高比是不固定的,如下图所示红色框出的文字。
- 可能你会说可以对图片进行切割,但是切割的话很可能会丢失重要信息。
综上,SPP的提出就是为了解决CNN输入图像大小必须固定的问题,从而可以使得输入图像宽高比和大小任意
二、SPP的原理
最详细的信息请查询论文:
《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》
上图是原文中给出的示意图,需要从下往上看:
- 首先是输入层(input image),其大小可以是任意的
- 进行卷积运算,到最后一个卷积层(图中conv5)输出得到该层的特征映射 (feature maps),其大小也是任意的
- 下面进入SPP层
3.1 我们先看最左边有16个蓝色小格子的图,它的意思是将conv5得到的特征映射分成16份,另外16×256中的256表示channel,即SPP对每一层都分成16份(不一定是等比分,原因看后面的内容就能理解了)
3.2 中间的4个绿色小格子和右边1个紫色大格子也同理,即特征映射分别分成4×256和1×256份
那么特征映射分成若干等份是做什么用的呢?我们看看SPP的名字就知道了,是池化操作,一般选择MAX Pooling,即对每一份进行最大池化。
我们看上图,通过SPP层,特征映射被转化成了16×256+4×256+1×256=21×256的矩阵,在送入全连接时可以扩展成一维矩阵,即1×5376了,所以第一个全连接层的参数就可以设置成5376了,这样也就解决了输入数据大小任意的问题了。
注意上面划分多少份是可以自己根据情况设置的,例如我们也可以设置成3×3等,但是一般建议还是按照论文中说的进行划分。
三、SPP公式
理论应该理解了,那么怎么实现呢?下面介绍论文中给出的计算公式,但是在这之前先要介绍两种计算符号以及池化后矩阵大小的计算知识。
- 预先知识
- 公式
- 公式修正
参考:
https://www.cnblogs.com/marsggbo/p/8572846.html#anchor