SPPNet方法来自《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》 ,是大神何凯明2014年的paper。在此,我将自己对SPPNet的理解总结一下。
SPPNet方法的一个创新点就是提出了空间金字塔池化,这个方法的最终速度比R-CNN快了许多倍,因为它可以输入的任意比例尺寸的图像池化为统一规格的特征向量并输入给全连接层。
方法背景
在之前物体检测的文章,比如R-CNN中,他们都要求输入固定大小的图像,这些图像或者经过裁切(Crop)或者经过变形缩放(Warp),都在一定程度上导致了图像信息的丢失和变形,限制了识别精确度。两种方式如下所示。
事实上,在网络实现的过程中,卷积层是不需要输入固定大小的图片的,而且还可以生成任意大小的特征图,只是全连接层需要固定大小的输入。因此,固定长度的约束仅限于全连接层。在本文中提出了Spatial Pyramid Pooling layer 来解决这一问题,使用这种方式,可以让网络输入任意的图片,而且还会生成固定大小的输出。这样,整体的结构和之前的R-CNN有所不同。
下图中上面的是常规的卷积神经网络的结构,先要将图像进行裁切和变形,再进行卷积操作;下面的是SPPNet方法的结构,通过SPP层将卷积层输出的任意比例尺寸的feature map池化为统一规格的特征向量传递给全连接层。
Spatial Pyramid Pooling具体操作
空间金字塔就是以不同大小的块对图像进行特征提取,如上图中所示,使用了4*4、2*2和1*1的网格对每个feature map进行了池化,最终每个feature map将得到16+4+1=21组特征。这种以不同的大小格子的组合方式来池化的过程就是空间金字塔池化(SPP)。
物体检测
带有SPP层的网络称为SPP-Net,它在物体检测上跟R-CNN也有一定的区别。首先是特征提取上,速度提升了好多,R-CNN是直接从原始图片中提取特征,它在每张原始图片上提取2000个Region Proposal,然后对每一个候选区域框进行一次卷积计算,差不多要重复2000次,而SPP-net则是在卷积原始图像之后的特征图上提取候选区域的特征。所有的卷积计算只进行了一次,效率大大提高。从这张我们可以大致看到这两种方法的区别。
如何从一个region proposal 映射到feature map的位置?
SPPNet通过角点尽量将图像像素映射到feature map感受野的中央,假设每一层的padding都是p/2,p为卷积核大小。对于feature map的一个像素(x',y'),其实际感受野为:(S*x',S*y'),其中S为之前所有层stride的乘积。然后对于region proposal的位置,我们获取左上右下两个点对应的feature map的位置,然后取特征就好了。左上角的映射为:
右下角映射为:
当然,如果padding大小不一致,那么就需要添加相应的偏移值。
存在的不足
和RCNN一样,SPP也需要训练CNN提取特征,然后训练SVM分类这些特征。需要巨大的存储空间,并且分开训练也很复杂。而且selective search的方法提取特征是在CPU上进行的,相对于GPU来说还是比较慢的。
SPP-Net和R-CNN最大的区别就在候选框特征的提取这一步,其他的基本相同。R-CNN的具体步骤请参考R-CNN学习总结。