本文为您解读 SPP-net:
- Spatial Pyramid Pooling in Deep Convolutional Networks
- for Visual Recognition Motivation
神经网络在计算机视觉方面的成功得益于卷积神经网络, 然而, 现有的许多成功的神经网络结构都要求输入为一个固定的尺寸(比如 224x224,299x299), 传入一张图像, 需要对它做拉伸或者裁剪, 再输入到网络中进行运算
然而, 裁剪可能会丢失信息, 拉伸会使得图像变形, 这些因素都提高了视觉任务的门槛, 因此, 如果能有一种模型能够接收各种尺度的输入, 应当能够让视觉任务更加容易完成
什么限制了输入的尺寸
深度卷积神经网络中的核心组件有两个, 一个是 CNN, 一个是全连接层, 卷积是用 filter 在图像上平移与图像的局部进行逐位乘法, 多个 filter 则产生多个 feature map(特征 / 特征图), 然后可以用 pooling 操作进一步采样, 得到更小的 feature map; 实际上, 我们并不在意 feature map 有多大, 不同图像的 feature map 完全可以有不同的尺寸; 但是在后边的具体任务中, 比如分类任务, 为了输出 softmax 对应的 one-hot 层, 需要输出固定的尺寸, 为了让不同的输入能共用一套权重参数, 要求全连接层的输入尺寸是一致的, 逆推回去也就限制了 feature map 的大小必须一致; 而不同尺寸的输入图片在使用同一套卷积核 (filter) 的时候, 会产生不同尺寸的 feature map, 因此才需要将不同尺寸的输入图片通过裁剪拉伸调整为相同的尺寸
Solution
因此突破口有两个,
让卷积层能为不同尺寸的输入产生相同尺寸的输出(SPP)
让全连接层能为不同尺寸的输入产生相同尺寸的输出(全卷积)
全卷积和卷积的区别在于最后不是用全连接层进行分类, 而是用卷积层, 假设我们要将一个 16x16 的 feature map 转为 10x1 的 one-hot 分类, 则可以使用 10 个 1x1 卷积核, 每个卷积核对应一个分类, 参数数量少了很多, 但是实验结果表明还挺有效的, 并且, 全卷积 + 反卷积开辟了图像分割的新思路, 可以说是一个开创新的工作了, 感兴趣的同学可以看这篇博客
这里我们详细讲一下 SPP
SPP 中 SP(Spatial Pyramid)的思想来源于 SPM(Spatial Pyramid Matching), 可以参考这篇文章, 正如论文 Conclusion 中说的, Our studies also show that many time-proven techniques/insights in computer vision can still play important roles in deep-networks-based recognition.
SPM 是在不同的分辨率 (尺度) 下, 对图片进行分割, 然后对每个局部提取特征, 将这些特征整合成一个最终的特征, 这个特征有宏观有微观 (多尺度金字塔), 保留了区域特性(不同的区域特征不同), 然后用特征之间的相似度进行图片间的匹配(matching) 先前我们提到过, 每个 filter 会得到一个 feature map,SPP 的输入则是卷积后的这些 feature map, 每次将一个 feature map 在不同尺度下进行分割, 尺度 L 将图片分割为 2^L^ 个小格子(其实格子数也可以自己定, 不一定要分成 2^L^ 个),L 为 0 代表全图; 对每个小格子的做 pooling, 论文中是 max pooling, 实际中也可以用其他, 这里不像 SPM 需要做 SIFT 之类的特征提取, 因为 feature map 已经是卷积层提取过的特征了, 将 pooling 得到的结果拼接起来, 就可以得到固定尺寸的 feature map
举个例子, 一个具有 256 个 filter 的卷积层, 输出了 256 个 feature map, 对于一个 640x320 的图片, 输出的 feature map 可能是 32x16 的, 对于一个 640x640 的图片, 输出的 feature map 可能是 32x32 的, 对 256 个 feature map 中的每个 feature map, 我们在 4 个尺度下对它们做切割, 在最粗糙的尺度下切为 1 个图, 次之切为 2 个子图, 接下来是 4 个子图, 8 个, 对每个子图做 max pooling, 得到其中最大的数, 放到最终的特征里, 可以得到一个 1+2+4+8=15 这么长的特征, 256 个 feature 则可以得到最终 256*15 这么长的特征, 可以看到, 最终的特征尺寸只跟卷积层结构和 SP 尺度 L 有关, 跟输入图片无关, 从而保证了对不同尺寸的图片都输出一样大小的特征
其实看到这里, 你可能发现了, 对不同尺寸输出相同尺寸特征这个特性, 是由 pooling 操作决定的, 像 max pooling,sum pooling 这些, 就是将多个输入聚合为一个值的运算; 而 Spatial Pyramid 只是让特征有更好的组织形式而已当然, 能找到这种有效的特征组织形式也是很值得肯定的但这里有东西仍然值得商榷, max pooling 实际上还是丢了一些信息, 虽然通过多层的特征可以将这些信息弥补回来
实验
然后作者就将这个结构应用到各种网络结构和各种任务里了, 并且都取得了很好的效果(说的轻巧, 复现一堆论文, 改源码, 跑大量实验, 一定超级累); 特别是在检测任务对 RCNN 的改进上, 这个地方比较有意思在 RCNN 中, 需要将每个 Region Proposal 输入卷积层判断属于哪个分类, 而 region proposal 是方形的, 这就导致有很多区域做了重复的卷积运算
在 SPP-net 的实验中,
整张图只过一遍卷积层, 从 conv5 得到整张图对应的 feature map;
然后将 feature map 中每个 region proposal 对应的部分提取出来, 这个位置计算量也不小, 但比算卷积本身还是要快很多, 原图中的一个区域唯一对应于 feature map 中的一个区域, 不过 feature map 中的一个区域实际上对应原图的范围 (所谓感受野) 要大于 region proposal 所在区域, 从这个意义上来讲, 依然是接收了更多不相关信息, 但是好在没有裁剪或变形;
由于 region proposal 形状不一, 对应的 feature map 尺寸也不一致, 这时 SPP 就能充分发挥其特性, 将不同尺寸的 feature map 转为尺寸一致的 feature, 传给全连接层进行分类
原图实际上可以保持原图的宽高比缩放到多种尺度 (文中将宽或高缩放到{480, 576, 688, 864, 1200} 这五个尺寸,), 分别算一个特征, 将不同尺度的特征拼接起来进行分类, 这种 combination 的方式能一定程度上提高精度
这里还有一个小 trick, 可以将原图缩放到面积接近的范围(文中是 224x224), 再输入到网络中, 进一步提升精度, 至于原因文中没有提, 玄学解释是, 输入的尺度更接近, 模型训练更容易吧
由于整张图只过了一遍卷积, 所以比原来的 RCNN 快了很多, 准确率也不差
Summary
严格来讲 SPP-net 不是为 detection 而生的模型, 但是 SPP-net 为 RCNN 进化到 Fast-RCNN 起了很大的借鉴作用, 值得一读 SPP-net 的想法很有意思, SPP(Spatial Pyramid Pooling)是对网络结构的一种改进, 可能因为是华人写的论文, 感觉很好读, 含金量个人感觉没有 RCNN 或者 DPM 的论文高, 但是实验很丰富, 从分类任务和检测任务上的各种网络结构证明 SPP 的有效性
来源: https://www.cnblogs.com/hellocwh/p/8449133.html