【R-CNN系列目标检测】(2)SPP-Net算法

重点参考《深度学习(十九)基于空间金字塔池化的卷积神经网络物体检测》

SPP-Net(Spatial Pyramid Pooling)是何凯明2014年提出的方法【1】,通过解决传统CNN无法处理不同尺寸输入的问题对同年的R-CNN算法做改进,实验结果表明SPP方法比R-CNN快了近100倍

从算法架构上,SPP-Net与R-CNN相似:通过Selective Search获取候选区域,最后也是使用SVM做分类。

但不再将每个候选区域过一次CNN,而是将原始图过一次CNN,在CNN的全连接层前添加新提出的SPP层,根据候选区域位置crop的图像卷积结果通过SPP层来确保输入全连接层的尺寸满足要求。最后在全连接层的输出一次性获得所有候选区域的特征向量。

算法思路

R-CNN实现了CNN做检测的一种方法,但由于一次检测需要过大约2K次CNN(每个候选区域过一次),因此检测效率特别低,几乎无法实用,同时对每个区域的resize也降低了最终的检测精度。

基于此,SPP-Net将原始图像作为CNN输入,希望仅过一次CNN就将所有区域的特征向量提取出来。但这里遇到一个问题:传统CNN的输入尺寸是固定的,而通过Selective Search获得的区域尺寸显然是各异的。

那么该如何改进CNN网络,使之接受不同尺寸的输入呢?

文章提到,CNN主要包含3种层:卷积层、池化层和全连接层。从概念上不难推断,卷积层和池化层对不同的尺寸均适用,但全连接层的输入和输出尺寸是在模型里就定死的。这是传统CNN仅接受固定尺寸输入的根本原因

文章提出,在CNN的卷积(或池化)与全连接层之间添加一个空间金字塔池化层(SPP Layer)将上一层的输出统一为所需尺寸

空间金字塔池化

假设一个很简单的两层网络,池化的输出尺寸是未知的,全连接的输入要求为21
        【R-CNN系列目标检测】(2)SPP-Net算法_第1张图片
                图1. 空间金字塔池化(来源:1)
在这里SPP一共3层:第一层对整张图像做池化(最大、均值等);第二层将图像划分为2*2=4个块,分别做池化;第三层划分为4*4=16个块,分别做池化
通过以上步骤,最后获得1+4+16=21个特征值

结合SPP的目标检测流程

1)通过Selective Search获取2K个候选区域
2)原始图像输入CNN进行一次特征提取,得到feature maps(全连接层前的结果)。在feature maps里找到候选区域,对每个区域做SPP,提取出固定长度的特征向量
3)全连接层的输出向量作为特征,输入SVM做分类

这里一个问题是:经过前面的卷积和池化,如何在feature maps里找到对应的候选区域?

假设(x’, y’)为特征图上的坐标点,(x, y)为原始输入图片的坐标点。两者间有如下转换关系:
           (x, y) = (S*x’, S*y’)
其中S为CNN中所有卷积和池化的strides值的乘积,如下图的3个网络,Overfeat-5/7对应的S=2*3*2=12
      【R-CNN系列目标检测】(2)SPP-Net算法_第2张图片
                     图2. 转换参数的计算(来源:1)


算法实现

作者在Github上公开了代码,同样可能是由于selective search代码的原因,使用的Matlab


参考文献

【1】He K, Zhang X, Ren S, et al. Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2014, 37(9):1904-16.


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