上一篇R-CNN中提到过, R-CNN是先提取region,每个region都过这五个卷积。这样做计算量非常庞大。针对这个问题,SPP-Net做了改进,它是整个图过一次卷积(五个卷积操作),然后取对应得region。同样的,卷积可使用Alex和VGG。
一、SPP-Net的结构
Conv5计算出的feature map也是任意大小的,现在经过SPP之后,就可以变成固定大小的输出了,以上图为例,一共可以输出(16+4+1)*256的特征。
重点解释:
1.之前的卷积操作都需要输入统一尺寸的图片,这里为什么可以接受任意尺寸图片呢?
卷积层的参数和输入大小无关,它仅仅是一个卷积核在图像上滑动,不管输入图像多大都没关系,只是对不同大小的图片卷积出不同大小的特征图,但是全连接层的参数就和输入图像大小有关,因为它要把输入的所有像素点连接起来,需要指定输入层神经元个数和输出层神经元个数,所以需要规定输入的feature的大小。
SPP-Net在最后一个卷积层后,接入了金字塔池化层,使用这种方式,可以让网络输入任意的图片,而且还会生成固定大小的输出。 因此,固定长度的约束仅限于全连接层。
2.什么是金字塔池化?
黑色图片代表卷积之后的特征图,在这里SPP一共3层:第一层对整张图像做池化(最大、均值等);第二层将图像划分为2*2=4个块,分别做池化;第三层划分为4*4=16个块,分别做池化
通过以上步骤,最后获得1+4+16=21个特征值。这样刚好就是全连接的输入要求为21维。
这种以不同的大小格子的组合方式来池化的过程就是空间金字塔池化(SPP)。
3.经过前面的卷积和池化,如何在feature maps里找到对应的候选区域?
对于映射关系,论文中给出了一个公式:假设(x’,y’)表示特征图上的坐标点,坐标点(x,y)表示原输入图片上的点,那么它们之间有如下转换关系,这种映射关心与网络结构有关: (x,y)=(S*x’,S*y’)反过来,我们希望通过(x,y)坐标求解(x’,y’),那么计算公式如下:
其中S就是CNN中所有的strides的乘积,包含了池化、卷积的stride。
对于R-CNN,整个过程是:
1.首先通过ss对待检测的图片进行搜索出2000个候选窗口。
2.把这2k个候选窗口的图片都缩放到227*227,然后分别输入CNN中,每个proposal提取出一个特征向量,也就是说利用CNN对每个proposal进行提取特征向量。
3.把每个候选窗口的对应特征向量,利用SVM算法进行分类识别。
可以看出R-CNN的计算量是非常大的,因为2k个候选窗口都要输入到CNN中,分别进行特征提取。
而对于SPP-Net,整个过程是:
1.首先通过ss,对待检测的图片进行搜索出2000个候选窗口。
2.特征提取阶段就是和R-CNN最大的区别了。这一步骤的具体操作如下:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后将原图中2K个候选窗口映射到feature maps中,找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出21维的特征向量。
因为SPP-Net只需要一次对整张图片进行特征提取,速度会大大提升。
3.最后一步也是和R-CNN一样,采用SVM算法进行特征向量分类识别。