SPP全称为Spatial Pyramid Pooling,即空间金字塔池化,听名字就知道是对RCNN的一种变形,目的是为了解决RCNN输入图像的大小固定(224*224)的问题,因为真实照片中的物体的大小并不都一样,对图像就行wrap或者切割,不可避免会造成图像的失真,从而增大运算结果的误差。
SPP与RCNN最大的不同就是SPP使用了一个全连接层,而不进行微调,并且计算region propsal时使用了多个region,从而只计算一次,避免了RCNN中的重复计算。
1、结构比较:
RCNN
SPP
2、RCNN固定输入的原因:
理论上说conv layers(卷积层)可以接受任意大小的输入,RCNN固定输入的限制来源于fc layers(全连接层)
spp使用一个spp layers,位于conv layers和fc layers之间,接受任意大小的输入,但是产生固定大小的输出(以匹配全连接层),来取消对输入的限制。
3、SPP的来源
SPP其实很早就应用在CV领域,通过或粗或细的将图片分割成多个多个部分,从而获得他们的特性,但是SPP并不是CNN的一部分,SPP有三大特性:a,接受任意大小的输入 b,可产生固定大小的输出 c,不同于RCNN,SPP采用多个层次的pooling window 。
4、SPP的迭代训练
SPP训练的时候,不是一次输入多个尺寸的图片,而是采用了一个近似的方法,SPP进行多次迭代,每次迭代的时候输入不同的尺寸,但是参数保持一致,从而获得近似结果。主要原因是Cuda和Caffee(GPU)更倾向于训练固定输入尺寸的数据(为了提高结果的准确度)。
5、extract features
RCNN通过深度卷积网络提取每个候选区域的特征,但是因为一张图片要计算几千个(RCNN是2000)候选区域的特征,每区域的像素是224*224,因此当图片数据比较多时,计算量会特别大。
而SPP每个Window只进行一次卷积计算,从而速度相对于RCNN来说,可以提高几百倍。
SPP-Net继承了 deep CNN 的feature maps和SPP对于输入的灵活性,不仅提高了特征提取的速度,也提高了特征提取的精度。
还有一个不同之处,就是SPP-Net获取区域的时候使用的是EdgeBoxes,而RCNN使用的是Selective search。
7、Deep NetWorks
RCNN-著名的7层网络:前五层是卷积层(conv layers),使用滑动窗口,后两层是全连接层(fc layers),输出为N路Softmax,其中N为种类的数量。卷积层的输出尺寸与RCNN网络的输入尺寸一致
SPP-Net
卷积层(conv layers)的输入是任意的,因此卷积层的输出也是任意的,但是全连接层(fc layers)的输入是有尺寸限制的,这里引入了一个概念BOW(Bag-of-Words),BOW本来是用来处理文本数据,假定对于一个文本,忽略其词序和语法,句法,将其仅仅看做是一个词集合,或者说是词的一个组合,文本中每个词的出现都是独立的,不依赖于其他词是否出现。
示意图从下往上看,
首先是输入层(input image),可以输入任意尺寸的图片
然后是卷积层(conv layers),卷积层共有5层,每层都进行卷积运算,直到conv_5(最后一个卷积层),conv5输出该层的特征映射(feature maps),其大小也是任意的(与输入层尺寸一致)
接下来是SPP层
SPP层包含三部分左边的16个蓝色格子,中间4个绿色格子,右边1个紫色格子。
16个蓝色格子中的作用是将conv5输入的特征分为16份(不均等),16x256表示的是channel(SPP对每一层都分成16份)。
中间4个绿色格子,右边1个紫色格子也同理,即将特征分别分成4x256和1x256份。
将特征映射分成若干等分的作用,是做池化操作,一般选择MAX Pooling,即对每一份进行最大池化。
通过图可知,通过SPP层,特征映射被转化成了16X256+4X256+1X256 = 21X256的矩阵,在送入全连接时可以扩展成一维矩阵,即1X10752,所以第一个全连接层的参数就可以设置成10752了,这样也就解决了输入数据大小任意的问题。
当然划分为多少份,我们可以自己设置(不建议)。
8、Training the NetWork
9、SVM
SPP和RCNN一样使用ground-truth windows获取不是背景的正样本。
当一个window和一个正样本的iou超过30%时,保留,当与一个负样本的iou超过70%时,移除
10、fine-tune
RCNN,调整所有层
SPP-Net,调整全连接层(fc layers)
11 bbox regression