总体结构:
![](https://img-blog.csdnimg.cn/20200317223059584.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTY4MzI3,size_16,color_FFFFFF,t_70)
在R-CNN中,候选区域需要进过变形缩放,以此适应CNN输入,那么能不能修改网络结构,使得任意大小的图片都能输入到CNN中呢?作者提出了
spatial pyramid pooling(SPP)空间金字塔结构
来适应任何大小的图片输入
。
R-CNN和SPP-Net的处理过程
![](https://img-blog.csdnimg.cn/20200317223057481.png)
spatial pyramid pooling(SPP)层
加在最后一个卷积层与全连接层之间,目的就是为了
输出固定长度的特征
传给要求固定输入的全连接层
网络结构图
![](https://img-blog.csdnimg.cn/20200317223059628.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTY4MzI3,size_16,color_FFFFFF,t_70)
具体做法是,在conv5层得到的特征图是256层,每层都做一次spatial pyramid pooling。先把每个特征图分割成多个不同尺寸的网格,比如网格分别为4*4、2*2、1*1,然后每个网格做max pooling,这样256层特征图就形成了16*256,4*256,1*256维特征,他们连起来就形成了一个固定长度的特征向量,将这个向量输入到后面的全连接层
。
对卷积层可视化发现:输入图片的某个位置的特征反应在特征图上也是在相同位置。基于这一事实,对某个ROI区域的特征提取只需要在特征图上的相应位置提取就可以了。
R-CNN的问题:
R-CNN对于一张图片,先使用segment seletive方法提取出约2000个候选区域,然后将这两千个候选区域分别送入网络中,即一张图片要经历2000次前向传播,这样会造成大量冗余。
SPP-net则提出了一种
从候选区域到全图的特征(feature map)之间的对应映射关系,通过此种映射关系可以直接获取到候选区域的特征向量,不需要重复使用CNN提取特征,从而大幅度缩短训练时间。每张图片只需进行一次前向传播即可.
SPP层的输入:
如下图灰色框所示
最后一层卷积输出的特征(我们称为feature map),feature map为下图的黑色部分表示,SPP层的输入为与候选区域对应的在feature map上的一块区域(
一张图有约2000个候选区域,而对一张图做完卷积后得到feature map,在这个feature map上也有约2000个与候选区域对应的区域)
SPP层的输出:
SPP layer分成1x1,2x2,4x4三个pooling结构(这部分结构如下图所示),对每个输入(这里每个输入大小是不一样的)都作max pooling(论文使用的),出来的特征再连接到一起,就是(16+4+1)x256的特征向量。
![](https://img-blog.csdnimg.cn/20200317223429897.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTY4MzI3,size_16,color_FFFFFF,t_70)
无论输入图像大小如何,出来的特征固定是(16+4+1)x256维度。这样就实现了不管图像中候选区域尺寸如何,SPP层的输出永远是(16+4+1)x256特征向量。
候选区域在原图与feature map之间的映射关系
在CNN中感受野(receptive fields)是指某一层输出结果中一个元素所对应的上一层的区域大小,如下图所示。
![](https://img-blog.csdnimg.cn/20200317223257222.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTY4MzI3,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200317223256800.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTY4MzI3,size_16,color_FFFFFF,t_70)
输入的尺寸大小与输出的尺寸大小有如下关系:
![](https://img-blog.csdnimg.cn/20200317223256805.png)
上面是区域尺寸大小的对应关系,下面看一下坐标点之间的对应关系:
![](https://img-blog.csdnimg.cn/20200317223256803.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTY4MzI3,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200317223256807.png)
SPP-net对上面的坐标对应关系作了一定的简化,简化过程如下:
![](https://img-blog.csdnimg.cn/20200317223256810.png)
而
是坐标值,不可能取小数 所以基本上可以认为
。公式得到了化简:感受野中心点
的坐标只跟前一层
有关。
![](https://img-blog.csdnimg.cn/20200317223543552.png)
![](https://img-blog.csdnimg.cn/20200317223557282.png)
![](https://img-blog.csdnimg.cn/20200317223543552.png)
![](https://img-blog.csdnimg.cn/20200317223646746.png)
那么对于下图的做法,就是SPP-net的映射方法,SPP-net 是把原始ROI的左上角和右下角 映射到 feature map上的两个对应点。 有了feature map上的两队角点就确定了 对应的 feature map 区域(下图中橙色)。
![](https://img-blog.csdnimg.cn/20200317223257280.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTY4MzI3,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200317223808861.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTY4MzI3,size_16,color_FFFFFF,t_70)
后面的处理过程与R-CNN一致
![](https://img-blog.csdnimg.cn/20200317223059588.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMTY4MzI3,size_16,color_FFFFFF,t_70)