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

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

在SPPnet和Fast-RCNN中都用到了空间金字塔池化(Spatial Pyramid Pooling, SPP)来提高object detection的效率。SPP本质的目的是为了使得CNN可以接受任意尺寸的输入图片,从而避免了图像预处理中要将图片resize到统一尺寸这个限制。

SPPnet论文中给出了如下的图示:
空间金字塔池化(Spatial Pyramid Pooling, SPP)_第1张图片

给定一张任意尺寸的输入图片,首先经过一个网络,得到某卷积层的输出(即图中Conv5的输出);之后经过三个不同的池化层,分别得到 16 × 256 16\times 256 16×256维、 4 × 256 4\times 256 4×256维和 1 × 256 1\times 256 1×256维的向量,将这些向量拼接起来,即得到固定长度的特征向量(fixed-length representation,这里长度为5376)。无论输入的图片是任何尺寸的,我们都可以得到长度为5376的特征向量。

卷积层实际上并不受限于输入图像的尺寸,无论给定什么尺寸的图,卷积都是可以进行的。然而后面的全连接层就不行了,必须接受固定尺寸的输入。所以通过上述的金字塔池化,就可以解决全连接层的输入问题。从而使得网络可以接受任意尺寸的输入图片。

单看论文还是不好理解,到底是如何操作的。我们从代码的角度来看下是如何实现的,最后再证明下这样确实是可行的。

import torch.nn as nn
import torch

def spatial_pyramid_pool(previous_conv, num_sample, previous_conv_size, out_pool_size):
    '''
    previous_conv: a tensor vector of previous convolution layer
    num_sample: an int number of image in the batch
    previous_conv_size: an int vector [height, width] of the matrix features size of previous convolution layer
    out_pool_size: a int vector of expected output size of max pooling layer
    
    returns: a tensor vector with shape [1 x n] is the concentration of multi-level pooling
    '''    
    print(previous_conv.size())
    for i in range(len(out_pool_size)):
        h_wid = int(math.ceil(previous_conv_size[0] / out_pool_size[i]))
        w_wid = int(math.ceil(previous_conv_size[1] / out_pool_size[i]))
        h_pad = int((h_wid*out_pool_size[i] - previous_conv_size[0] + 1)/2)
        w_pad = int((w_wid*out_pool_size[i] - previous_conv_size[1] + 1)/2)
        print (h_wid, w_wid,h_pad,w_pad)
        maxpool = nn.MaxPool2d((h_wid, w_wid), stride=(h_wid, w_wid), padding=(h_pad, w_pad))
        x = maxpool(previous_conv)
        if(i == 0):
            spp = x.view(num_sample,-1)
        else:
            spp = torch.cat((spp,x.view(num_sample,-1)), 1)
    return spp

假如这里输入的feature map即previous_conv的channel为512,out_pool_size=[4,2,1]。则经过这三个池化层,我们分别得到 4 × 4 × 512 4\times 4\times 512 4×4×512 2 × 2 × 512 2\times 2\times 512 2×2×512 1 × 1 × 512 1\times 1\times 512 1×1×512的feature map。展开拼接后得到10752维度的特征向量。

根据上述代码,我们可以得到计算的公式:

  • 设输入尺寸为: W i n × H i n × C i n W_{in}\times H_{in}\times C_{in} Win×Hin×Cin
  • 设期望的池化层输出尺寸为: n n n。这里池化不改变channel,所以 C o u t = C i n C_{out}=C_{in} Cout=Cin。即输出尺寸为 n × n × C o u t n\times n\times C_{out} n×n×Cout

池化层的kernel_size:

F w = ⌈ W i n n ⌉ F h = ⌈ H i n n ⌉ F_w=\left \lceil \frac{W_{in}}{n} \right \rceil \\ F_h=\left \lceil \frac{H_{in}}{n} \right \rceil Fw=nWinFh=nHin

池化层的stride:

S w = F w S h = F h S_w=F_w \\ S_h=F_h Sw=FwSh=Fh

池化层的padding:

P w = ⌊ F w × n − W i n + 1 2 ⌋ P h = ⌊ F h × n − H i n + 1 2 ⌋ P_w=\left \lfloor \frac{F_w\times n-W_{in}+1}{2} \right \rfloor \\ P_h=\left \lfloor \frac{F_h\times n-H_{in}+1}{2} \right \rfloor Pw=2Fw×nWin+1Ph=2Fh×nHin+1

根据卷积层池化层输出尺寸公式:

W o u t = W i n − F w + 2 × P w S w + 1 H o u t = H i n − F h + 2 × P h S h + 1 W_{out}=\frac{W_{in}-F_w+2\times P_w}{S_w}+1 \\ H_{out}=\frac{H_{in}-F_h+2\times P_h}{S_h}+1 Wout=SwWinFw+2×Pw+1Hout=ShHinFh+2×Ph+1

我们可以看到给定任何尺寸的输入和 n n n,我们期望池化层输出的尺寸是: n × n × C o u t n\times n\times C_{out} n×n×Cout。给 n n n以不同的值,我们就可以得到不同的输出,展开后拼接就是一个固定的特征向量。所以我们需要证明如下的等式是否成立:

W o u t = n H o u t = n W_{out}=n \\ H_{out}=n Wout=nHout=n

我们以 W o u t W_{out} Wout为例来看看证明过程, H o u t = n H_{out}=n Hout=n的证明是一样的。将 F w F_w Fw P w P_w Pw S w S_w Sw代入卷积层池化层输出尺寸公式,可得:

W o u t = W i n − ⌈ W i n n ⌉ + 2 × ⌊ ⌈ W i n n ⌉ × n − W i n + 1 2 ⌋ ⌈ W i n n ⌉ + 1 W_{out}=\frac{W_{in}-\left \lceil \frac{W_{in}}{n} \right \rceil+2\times \left \lfloor \frac{\left \lceil \frac{W_{in}}{n} \right \rceil\times n-W_{in}+1}{2} \right \rfloor}{\left \lceil \frac{W_{in}}{n} \right \rceil}+1 Wout=nWinWinnWin+2×2nWin×nWin+1+1

这里取上整和下整可以分情况讨论,这里我们只看一种特殊的情况,即恰好可整除。则可得:

W o u t = W i n − ⌈ W i n n ⌉ + 2 × ⌊ ⌈ W i n n ⌉ × n − W i n + 1 2 ⌋ ⌈ W i n n ⌉ + 1 = W i n − W i n n + W i n n × n − W i n + 1 W i n n + 1 = n − 1 + 1 = n W_{out}=\frac{W_{in}-\left \lceil \frac{W_{in}}{n} \right \rceil+2\times \left \lfloor \frac{\left \lceil \frac{W_{in}}{n} \right \rceil\times n-W_{in}+1}{2} \right \rfloor}{\left \lceil \frac{W_{in}}{n} \right \rceil}+1 \\ =\frac{W_{in}-\frac{W_{in}}{n}+\frac{W_{in}}{n}\times n-W_{in}+1}{\frac{W_{in}}{n}}+1 \\ =n-1+1 \\ =n Wout=nWinWinnWin+2×2nWin×nWin+1+1=nWinWinnWin+nWin×nWin+1+1=n1+1=n

同理,我们也可以证明其它的情况。由此,对于不同的输入尺寸,channel是一致的,而 n n n值也是一致的,因此输出尺寸是一致的。因此可以适应于不同尺寸的图片输入。

你可能感兴趣的:(算法,机器学习)