本专栏将从论文的角度解读一下CV方向的一些经典神经网络模型及其贡献与意义,以期加深自己的印象,后续可以随时翻看并且学习其中好的tricks。上一期的最后讲到了R-CNN的训练时间长的缺点,这一期先介绍一下改进的SPPNet.
论文相关信息
论文全名为《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》(论文链接),于2015年发表在IEEE上,作者相关信息如下:
论文所使用数据集为 ImageNet 2012 和 PASCAL VOC 2007数据集,并且SPPNet在ImageNet大规模视觉识别任务挑战(ILSVRC)2014上,获得了物体检测任务第2名和物体分类任务第3名。
tricks
目前流行的CNN模型都要求输入的图像尺寸是固定的(比如224×224),当遇到不同尺寸的图像时,就会需要一些cropping裁剪和warping缩放操作(就如同R-CNN中的各向异性缩放),但是裁剪会导致信息的丢失,变形会导致位置信息的扭曲变形,自然会影响识别的精度。众所周知,这种对于输入图像尺寸固定的问题是由最后的全连接层引起的,所以作者们在最后的卷积层与全连接层之间,引入一种SPP( spatial pyramid pooling,空间金字塔池化)层替换原来的池化层,来解决这个问题:
以图3为例,SPP层将conv5的每一通道(这里是256个通道)的特征图分别分成16个块、4个块和1个块,对每一块做最大池化,然后得到固定的 16X256+4X256+1X256 = 21X256 的矩阵,在进入全连接层时扩展成 1X10752 的一维矩阵,以此来解决输入图像尺寸固定的问题。并且这种池化方式可以提取到不同尺寸上的特征,增强表达鲁棒性。
那么显然,要从一个任意大小的特征图池化得到一个固定大小的特征图,卷积核的尺寸就不可能固定,如何计算卷积核大小、步长大小可以看这篇博客,下图为一个例子:
在目标检测任务中,SPPNet的做法是首先在图像上使用选择性搜索抽取2000个推荐区域,这一步和R-CNN一样。然后把整张图片输入到CNN中,进行一次特征提取,得到feature maps,然后在feature maps中通过映射关系找到各个候选框对应的区域,再对各个候选框采用SPP提取出固定长度的特征向量,最后训练后续的SVM分类和BBox回归:
需要注意的是,经过卷积处理后的特征图和原图大小并不相同,那么如何在特征图上找到基于原图产生的候选框呢?即对应关系是怎样的?可以看这里。原文中附录解释为:
总结
R-CNN将每个候选框输入到CNN中,而SPPNet只需要一次对整张图片的特征提取,因此速度会大大提升。但是SPPNet依然存在几个和R-CNN一样的缺点,比如训练分为多个步骤,称之为Multiple-stage pipeline:Region Proposals、CNNs、SVM、BBox Regression这种流水线作业,并且需要额外的磁盘空间来保存CNN训练出来的特征。下一篇来看 Fast R-CNN如何解决上述问题。