SPP-Net
全称Spatial Pyramid Pooling Networks
,翻译过来就是空间金字塔池化网络。为什么这里会插进来一个SPP-Net
呢?因为SPP-Net
对R-CNN
的进化有着比较大的影响。主要改进有以下两点:
特征映射,只需要做一次卷积池化操作。
金字塔池化层,可以适应任意尺寸的输入。
那我们就一起来看一下SPP-Net
是怎么做到的?
1. SPP-Net和R-CNN框架区别
SPP-Net
的作者是何凯明。我们从上期知道,R-CNN
最大的瓶颈就是经过SS
算法选出来的每一个候选区域都要经过一次CNN
,如下图中上面的框架,输入是原始图片经过SS
算法选取候选区域后,由于后面全连接层的限制,所以候选区域必须得先进行尺寸固定,固定到相同尺寸,才能输入到网络。也就是说,R-CNN
不能适应不同尺寸的输入。
我们知道图像经过缩放裁剪之后,会丢失很多信息,所以SPP-Net
认为,既然卷积层可以适应任意尺寸,那么在最后的特征图与全连接层之间加入一种特殊的机制转换一下,也应该可以适应不同尺寸的输入。
就如上图中的下面的框架,原图像经过SS
算法选取候选区域,然后经过卷积层后,再经过一个金字塔池化层来达到将不同尺寸的特征图转换为固定的特征数量,进而输入到全连接层,使得网络可以适应不同尺寸的输入。上面流程只是大致上的区别,接下来,我们深入学习一下,这玩意儿到底是怎么玩的?
2. SPP-Net通俗步骤
这里我们仅从SPP-Net
的步骤以及与R-CNN
不同的地方着手,重点学习下,其他跟R-CNN
相同的地方还请移步上一期文章。
SPP-Net步骤
SPP-Net
的大致步骤还是跟R-CNN
比较类似,
a. 首先也是通过
SS
算法进行候选框选取;b. 接着将原图进行卷积池化进行特征提取,得到特征图;
c. 然后根据候选框的位置通过卷积池化层层映射,映射到特征图相应的区域
d. 接着将映射到特征图的区域输入到金字塔卷积池化层,进行特征数量固定;
e. 接着将固定好的特征输入到全连接层中,得到输出,进而训练网络。
f. 最后将网络训练好之后,将金字塔池化层得到的特征拿去做
SVM
的训练以及将卷积池化层的特征拿去做边框回归。
其中根据SS
算法进行候选框选取,如何通过卷积池化得到特征图以及怎么讲特征进行SVM
训练和边框回归,这里都不在赘述,跟R-CNN
是一样的,详情见上一期文章:
目标检测的里程碑R-CNN通俗详解
注意,这里并不是将SS
算法选取的每个候选框都经过卷积池化操作,而是直接在原图上进行卷积池化操作。那么问题来了,既然不是在候选区域图上进行卷积池化操作,那么候选框的特征怎么来?
特征映射
R-CNN
中候选框的特征是直接对每个候选框进行卷积池化操作得到的,那既然SPP-Net
不对候选区域进行卷积池化操作,那么特征如何得到?
这里SPP-Net
用了一种巧妙的方法,通过映射的方法来获取了每个候选框的特征。首先,通过可视化卷积层发现,输入图片某一个位置的特征,反应在特征图上也是相应的位置。如下图:
上图中,左侧是输入图片,中间是原图经过卷积池化层后得到的特征图的可视化图片,比如输入图片中右下角区域有一辆车,那么反应在特征图上右下角区域就比较亮一些。而右图则表示类似区域都会在特征图上产生强信号值。再如下图:
同样,上图中输入图片为一个人坐在凳子上,可视化特征图后即可发现,存在同样的特征映射关系。
所以这里就将SS
算法选取的候选区域的位置记录下来,通过卷积池化层的比例映射到特征图上,提取出候选区域的特征图,然后输入到金字塔池化层中,进而训练网络。SPP-Net
通过如此特征映射的手段进行了,快速特征提取,而不必向R-CNN
那样,需要对每个候选区域进行卷积池化特征提取。
候选框区域的特征通过特征映射的方法进行获得,但是候选框大小不一,所以得到的特征图也是不同尺寸的,那么不同尺寸的特征图怎样输入到全连接层呢?接下来我们一起学习下金字塔池化是怎么回事儿。
金字塔池化
不同尺寸的特征图如何进入全连接层,直接看下图,下图中对任意尺寸的特征图直接进行固定尺寸的池化,来得到固定数量的特征。
如上图,以3个尺寸的池化为例,对特征图进行一个最大值池化,即一张特征图得取其最大值,得到1*d
(d
是特征图的维度)个特征;对特征图进行网格划分为2x2
的网格,然后对每个网格进行最大值池化,那么得到4*d
个特征;同样,对特征图进行网格划分为4x4
个网格,对每个网格进行最大值池化,得到16*d
个特征。
接着将每个池化得到的特征合起来即得到固定长度的特征个数(特征图的维度是固定的),接着就可以输入到全连接层中进行训练网络了。
3. 小结
由于SPP-Net
设计的特征映射方法,不用每个候选区域都去训练特征,大大提高了检测效率,速度约是R-CNN
速度的100
倍。由于采用同样SVM
的分类方法,所以mAP
值跟R-CNN
相差不多。SPP-net
缺点也很明显,它仍然是R-CNN
的框架,离我们需要的端到端的检测还差很多。既然端到端如此困难,那就先统一后面的几个模块吧,把SVM
和边框回归去掉,由CNN
直接得到类别和边框可不可以?于是就有了Fast R-CNN
,我们下期见。
点个“再看”支持一下!
本文分享自微信公众号 - 智能算法(AI_Algorithm)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。