自R-CNN出来以后受到了广大的关注和研究,并设法将其优化,解决R-CNN的一些缺点,于是SPP-Net 就出来了。
SPP-Net总体框架图如下
该文章主要改进了以下两点:
1、CNN需要固定输入图像的尺寸,导致不必要的精度损失
2、R-CNN对候选区域进行重复卷积计算,造成计算冗余
1、为什么CNNs要固定输入图像的尺寸?
深度卷积神经网络的基础结构分为:卷积层(conv layers)->池化层(pooling layers)->全连接层(fc layers)。我们在设计网络的时候,全连接层的输入维数必须提前固定。从全连接层往前推的话,就必须保持第一层卷积的输入尺寸是固定的,例如227 * 227(ImageNet)、32 * 32(LenNet)等。这也就要求我们在检测图片时,需要将图片经过crop(裁剪)、warp(拉伸)等操作把图片变换成固定尺寸,才能输入神经网络。这些操作在一定程度上会导致图片信息的丢失或者变形。对此SPP-Net提出的解决方案是在最后一层卷积层后用空间金字塔池化层(Spatial Pyramid Pooling)代替普通池化层。
如下图所示
第一行中的图像即为要求固定尺寸输入的CNN对图像的处理方式
第二行为要求固定尺寸输入的CNN (如R-CNN)的处理流程,先将图片按照类似第一行中的方式进行处理,然后输入卷积以及全连接层,最后输出结果
第三行为SPP-Net的处理方式,不固定图像的大小,直接输入给卷积层处理,卷积出来的特征并不是直接输入给全连接层,而是先给SPP层处理,然后得到一个固定长度的输出传给全连接层,最后输出结果。
2、R-CNN为什么会有计算冗余?
如下图所示
R-CNN对于一张图片,先使用segment seletive方法提取出约2000个候选区域,然后将这两千个候选区域分别送入网络中ÿ