SPPNet:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

金字塔池化层有如下的三个优点

第一:他可以解决输入图片大小不一造成的缺陷。

第二:由于把一个feature map从不同的角度进行特征提取,再聚合的特点,显示了算法的robust的特性。

第三:同时也在object recongtion增加了精度。其实,你也可以这样想,最牛掰的地方是因为在卷积层的后面对每一张图片都进行了多方面的特征提取,他就可以提高任务的精度。

如何利用SPP-Net进行物体检测识别?具体算法的大体流程如下: 
1、首先通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。这一步和R-CNN一样。 
2、特征提取阶段。这一步就是和R-CNN最大的区别了,同样是用卷积神经网络进行特征提取,但是SPP-Net用的是金字塔池化。这一步骤的具体操作如下:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。而R-CNN输入的是每个候选框,然后在进入CNN,因为SPP-Net只需要一次对整张图片进行特征提取,速度是大大地快啊。江湖传说可一个提高100倍的速度,因为R-CNN就相当于遍历一个CNN两千次,而SPP-Net只需要遍历1次。 
3、最后一步也是和R-CNN一样,采用SVM算法进行特征向量分类识别。 
算法细节说明:看完上面的步骤二,我们会有一个疑问,那就是如何在feature maps中找到原始图片中候选框的对应区域?因为候选框是通过一整张原始的图片进行检测得到的,而feature maps的大小和原始图片的大小是不同的,feature maps是经过原始图片卷积、下采样等一系列操作后得到的。那么我们要如何在feature maps中找到对应的区域呢? 
这个答案可以在文献中的最后面附录中找到答案: 

3.1 如何在feature maps中找到原始图片中候选框的对应区域:

候选框是通过一整张原图片进行检测得到的,而feature maps的大小和原始图片的大小是不同的,feature maps是经过原始图片卷积、下采样等一系列操作后得到的。

直接利用计算的公式:假设(x,y)表示特征图上的坐标点,坐标点(x,y)表示原输入图片上的点,那么它们之间有如下转换关系:

(x,y)=(S*x,S*y)

其中S的就是CNN中所有的步长(strides)的乘积,反过来,通过(x,y)坐标求解(x,y),那么计算公式如下:

x=x/S+1

输入原图片检测到的windows,可以得到每个矩形候选框的四个角点,然后再根据公式:

LeftTop:                   x=x/S+1

RightBottom:             x=x/S-1

3.2 空间金字塔池化如何提取特征,得到固定大小的特征向量:

我们假设一个很简单两层网络:输入一张任意大小的图片,假设其大小为(w,h),输出21个神经元。也就是我们输入一张任意大小的特征图的时候,我们希望提取出21个特征。空间金字塔特征提取的过程如下:

 

    如上图所示,当我们输入一张图片的时候,我们利用不同大小的刻度,对一张图片进行了划分。上面示意图中,利用了三种不同大小的刻度(4*4,2*2,1*1),对一张输入的图片进行了划分,最后总共可以得到16+4+1=21个块,我们即将从这21个块中,每个块提取出一个特征,这样刚好就是我们要提取的21维特征向量。

    第一张图片,我们把一张完整的图片,分成了16个块,也就是每个块的大小就是(w/4,h/4);

    第二张图片,划分了4个块,每个块的大小就是(w/2,h/2);

    第三张图片,把一整张图片作为了一个块,也就是块的大小为(w,h)

    空间金字塔最大池化的过程,其实就是从这21个图片块中,分别计算每个块的最大值,从而得到一个输出神经元。最后把一张任意大小的图片转换成了一个固定大小的21维特征(当然你可以设计其它维数的输出,增加金字塔的层数,或者改变划分网格的大小)。上面的三种不同刻度的划分,每一种刻度我们称之为:金字塔的一层,每一个图片块大小我们称之为:windows size了。如果你希望,金字塔的某一层输出n*n个特征,那么你就要用windows size大小为:(w/n,h/n)进行池化了。



你可能感兴趣的:(论文笔记)