为明年的研究生学习打点基础,准备全面的补一下目标检测的相关知识。
因为目的性较强,所以会忽视目标检测外的一些内容,比如针对图像分类的内容,但实际上图像分类也可以看做目标检测的一部分,所以不会对整体理解造成很大影响。
详情参看原论文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition(https://arxiv.org/pdf/1406.4729.pdf)
发现问题
作者团队考虑到CNNs具有要求输入图像的尺寸一定的特性,而在现实生活中这样的要求往往很难满足。
当时的研究人员的普遍做法是将图像Crop / Wrop,即裁剪或者变形,最终得到固定大小的图像;这样做显然会带来一些问题:裁剪会导致丢失一部分语义,变形则会导致几何失真;
同时,当面对多种多样尺寸的目标时,模型预先设定好的统一尺寸未必合适。单纯地使用固定尺寸的输入忽视了那些由目标尺寸带来的问题。
分析问题
文中还提到了为什么CNN的输入图像需要固定尺寸:
CNN包括卷积层和全连接层,全连接层的定义要求输入向量的维度必须固定,而单单卷积层作为特征提取层实际上可以接受任意尺寸的输入(当然针对不同尺寸的输入,输出的形状也不同)。
解决问题 && SPP-net
针对以上问题,作者团队提出了一种新的网络结构Spatial pyramid pooling layer,插在卷积神经网络的最后一层卷积层和全连接层之间,做到即使网络的输入尺寸不同(即最后一层卷积层的输入尺寸不同),仍能输出一个定长的特征向量作为全连接层的输入。
Spatial pyramid pooling layer
Spatial pyramid pooling layer的结构其实非常简单,如下图所示,就是多个平行的池化层,对卷积层生成的特征图进行多尺度的池化,最终将池化后的特征向量拼接起来作为Spatial pyramid pooling layer的输出。
但如果输入图像的尺度不同的话,一般来说池化后的特征向量的维度不是也不同吗?那它怎么做到生成一个定长的输出呢?
让池化框(原文中称为bins,即上图中每个蓝色、绿色和灰色的框)的尺寸不再是一个规矩的正方形,而是与输入图像的尺寸成比例不就好了嘛!
思路启发
其实Spatial pyramids的想法并不是作者团队原创,而是早就在传统计算机视觉领域中大放异彩,而他们将Spatial pyramids首次应用到了卷积神经网络中,并取得了很好的效果。
作者团队注意到SPP有三个值得注意的属性使得它天然地适合应用在CNN上:
- SPP能够无视输入尺寸生成定长的输出;
- SPP利用多尺度的池化框进行池化,而多尺度池化已经证明对目标的形变具有一定鲁棒性;
- 多亏有了对输入尺寸的灵活性,SPP可以同时对从多种输入尺寸提取的特征池化;
以上三点,简单的滑窗池化都无法做到。
SPP-net对目标检测的贡献
在当时提到卷积神经网络在目标检测中的应用很难离得开R-CNN。
在R-CNN中,对于每张图片,它的特征提取实际上是将每一个region proposal看做一个输入,即只针对一张图片却需要计算上千个很可能存在重叠的region proposal的特征,其中的冗余计算量可想而知;
而引入Spatial pyramids pooling layer,就可以仅对整张图片计算特征图,随后再在特征图上对region proposal区域池化进而得到每个region proposal的特征,最终进行分类。从而达到只“看”一次,就能得到所有region proposal的特征。
这种想法后来也被继承到faster R-CNN中。