深度学习-空间金字塔池化(Spatial Pyramid Pooling SPP)


参考: https://blog.csdn.net/qqliuzihan/article/details/81217766

1、介绍

在一般的CNN结构中,在卷积层后面通常连接着全连接。而全连接层的特征数是固定的,所以在网络输入的时候,会固定输入的大小(fixed-size)。但在现实中,我们的输入的图像尺寸总是不能满足输入时要求的大小。然而通常的手法就是裁剪(crop)和拉伸(warp)。
在这里插入图片描述
这样做总是不好的:图像的纵横比(ratio aspect) 和 输入图像的尺寸是被改变的。这样就会扭曲原始的图像。而Kaiming He在这里提出了一个SPP(Spatial Pyramid Pooling)层能很好的解决这样的问题, 但SPP通常连接在最后一层卷积层。

既然之前的CNN要求输入固定大小的图片,那么我们首先需要知道为什么CNN需要输入固定大小的图片?CNN大体包含3部分,卷积、池化、全连接。

  • 卷积层:比如一个55的卷积核,我输入的图片是3081的大小,可以得到(26,77)大小的图片,并不会影响卷积操作。我输入600*500,它还是照样可以进行卷积,也就是卷积对图片输入大小没有要求,只要你喜欢,任意大小的图片进入,都可以进行卷积。
  • 池化:比如我池化大小为(2,2)我输入一张3040的,那么经过池化后可以得到1520的图片。输入一张5322大小的图片,经过池化后,我可以得到2611大小的图片。因此池化这一步也没对图片大小有要求。只要你喜欢,输入任意大小的图片,都可以进行池化。
  • 全连接层:因为全连接层我们的连接权值矩阵的大小W,经过训练后,就是固定的大小了,比如我们从卷积到全连层,输入和输出的大小,分别是50、30个神经元,那么我们的权值矩阵(50,30)大小的矩阵了。因此空间金字塔池化,要解决的就是从卷积层到全连接层之间的一个过度。

2、SPP显著特点

  • 不管输入尺寸是怎么样,SPP可以产生固定大小的输出,提高了图像的尺度不变(scale-invariance)和降低了过拟合(over-fitting)
  • 使用多个窗口(pooling window)
  • SPP 可以使用同一图像不同尺寸(scale)作为输入, 得到同样长度的池化特征。
  • 由于把一个feature map从不同的角度进行特征提取,再聚合的特点,显示了算法的robust的特性
  • 同时也在object recongtion增加了精度,在卷积层的后面对每一张图片都进行了多方面的特征提取,就可以提高任务的精度。好比是不同大小的图片在不同的网络中进行训练一样,大大提高了模型的精度。

3、什么是金字塔池化层

在这里插入图片描述
我们可以看到这里的spatital pyramid pooling layer就是把前一卷积层的feature maps的每一个图片上进行了3个卷积操作。最右边的就是原图像,中间的是把图像分成大小是4的特征图,最左边的就是把图像分成大小是16的特征图。 那么每一个feature map就会变成16+4+1=21个feature maps。这不就解决了特征图大小不一的状况了吗?

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

那么具体是如何操作的呢?我们来看看:图片的输入大小相等的时候,我们假设图片经过第五层的卷积核之后的输出大小是aa (例如,1313),我们bins的大小是n*n,那么每一个窗口win=cell(a/n),然而stride的大小是stride=floor(a/n),前面一个是向上取整,后面的是向下取整,最终会形成如上图所示的三个pooling操作。这三个的本质都是最大化池,只不过使用了不同的窗口大小和移动的步长而已。fc6代表的是全链接层。实验表明,多层次的卷积行为可以使得实验的最终精度提升。而不同大小的图片操作都是一样的方法。

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

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

猜你喜欢

转载自blog.csdn.net/weixin_48167570/article/details/120922689