本文是使用深度学习进行目标检测系列的第二篇,主要介绍SPP-net:Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition,即空间金字塔池化网络,用以解决卷积神经网络中固定输入大小的问题。es6
1. 传统的卷积神经网络的输入一般是一个固定大小(好比\(224x224\)的图像,所以当咱们任意输入一张图像时须要对其进行缩放,做者认为这种手动的缩放可能会下降识别精度;算法
2. 在目标识别方面,使用深度神经网络对每一个候选区域(如RCNN)抽取特征的时候,都须要重复的丢进网络里,即每来一个候选区域都进行warp(上文中RCNN用的方法,能够当作对候选区域进行缩放)操做获得相同的输入,放进CNN里抽取新的特征,这样致使计算量很是大:对于一张原始图像的候选区域有接近2000个,无疑开销很大。网络
3. 做者认为在卷积神经网络中卷积层并不须要固定大小的输入,而在全链接阶段须要保证输入具备固定的大小。这一点比较比较好理解,由于卷积层仅仅对图像进行局部链接,无论输入怎么能进行卷积操做,只是让特征图输出的大小和输入有关系;可是全链接层就不同了,若是输入大小不固定确定会出现矩阵维数不匹配的状况。ide
图1 传统的“crop”和“warp”方法与SPP的作法进行对比学习
为了展现卷积滤波器对于不一样尺寸图像的做用状况,做者作了一个实验,使用AlexNet可视化第五个卷积层中某些滤波器获得的特征图的语义特征,如图2所示,图中(a)是Pascal VOC2007中的两张图像,(b)是某些滤波器获得的特征图,蓝色的箭头表示特征图中激活值比较强烈的区域以及对应的原始图像中的区域;(c)是使用相同的滤波器在ImageNet的图像中的响应状况,绿色框表示滤波器强烈的区域对应的感觉野,这里的实验并无输入一样大小的图像尺寸,可是能够看出这些滤波器依然可以反映出语义内容,好比左图的两个滤波器分别对车窗上方或者相似的区域、车胎附近圆形的或者相似的区域有强烈的反应;右图则对衣服的腋下或者相似的区域、盒子拐角处或者相似的区域有强烈的反应。测试
图2 特征图可视化es5
基于以上几点,做者设计了一个SPP层从最后的卷积层中提取特征,并统一处理大小使其适配全链接层的输入。spa
如第一部分所说,CNN中卷积层可以接受任意尺寸大小的输入,可是全链接层不能够,所以做者提出在CNN的最后一个卷积层后接入一个SPP(Spatial Pyramid Pooling)层代替咱们日常使用的Max pooling层,SPP最主要的做用是接受任意尺寸的特征图,而后把特征图的像素按比例转化为一些固定数量的bin(能够),而后在这些bins里面进行池化。具体能够参见图3:设计
图3 SPP层示意blog
从图中能够发现,SPP用了三种不一样方式来进行pooling,即对每张输入的特征图分别分红16个bins、4个bins和1个bins,而后再对每一个bin里作池化,把这三种池化后的特征组合在一块儿就拼接成了一个新向量。有意思的是这里的1个bins刚好是某些paper中提到的“global pooling”层,可以起到降维、防止过拟合、提高精度等等做用。SPP层进行多尺度提取特征的方式其实借鉴了一些传统,好比SIFT;同时SPP自己也借鉴了BOW(Bag of Words,图像词袋模型)、SPM(Spatial Pyramid Matching)方法,这些其实不少多年前使用到的传统的特征提取或者匹配方法。
原始的RCNN进行检测时间开销的最大瓶颈在于特征提取阶段:对selective search抽取的约2000个候选框都须要重复的丢进整个网络;相比较而言,SPP对于整张图像在特征抽取阶段只须要作一次,即完整的图像先丢进网络,而后在特征图层面对selective search选取的候选区域使用SPP层进行池化,获取固定大小的维数,而后再进行全链接的计算,如图4所示,须要注意的是图4和图3很是像,实际上做者同时介绍了SPP在分类和目标检测中的应用,图3的示意更适用于分类,即对整张图像进行SPP池化获取统一的输出维度丢进全链接层;而图4更适用于目标检测,即在特征图层面对某个候选区域进行SPP池化,也就是图中的这个“window”。
图4 SPP层用于目标检测示意
能够看出SPP进行目标检测时须要进行原始图像中候选区域的位置和特征图中候选区域位置的一个映射关系。为简化计算过程,简单来讲,对于某一层大小为\(p\)的滤波器,进行\(\left \lfloor \frac{p}{2} \right \rfloor\)(符号的意思是进行向下取整)的填充,那么对于特征图中响应中心坐标\((x{}',y{}')\),其对应原始图像中的坐标\((x,y)=(Sx{}',Sy{}')\),其中\(S\)为前面那些层的stride步伐的乘积。而对于给定的图像中的区域,获取特征图响应的左上角坐标为\(x{}'=\left \lfloor \frac{x}{s} \right \rfloor+1\),右下角坐标为\(x{}'=\left \lceil \frac{x}{s} \right \rceil-1\),而在padding不是\(\left \lfloor \frac{p}{2} \right \rfloor\)的状况下须要添加关于\(x\)的偏移量。
SPP在基于RCNN的基础上改进进行目标检测,具体以下:
(1)使用“fast”模式的selective search对每张图像生成2000左右的候选区域;
(2)对每一个候选区域利用SPP进行4个级别bins的池化,分别是\(1\times1\)、\(2\times2\)、\(3\times3\)及\(6\times6\)的总共50个bins进行池化,如此对于最后一个特征图的256个卷积核能够获得\(256\times50\)的特征表示;
(3)把第二步中获得的特征接到全链接层中,而后对全链接层的输出使用二分类的SVM进行分类。
在训练SVM过程当中,SVM的正类样本是真实的物体,而负类样本定义为和正类样本的IOU比最高不超过30%而且和其余的负类不超过70%的样本,和RCNN相似,SPP也选择使用hard negative mining模式的SVM进行训练,整个用于20个类训练SVM的时间小于1个小时;在测试阶段使用训练好的SVM为候选区域打分,最后使用阈值为0.3的NMS进行过滤。
在训练网络的过程当中,分为前面的特征图的预训练和后接入的全链接层的微调,对于预训练部分做者提到了使用多尺度输入的训练方法,即resize原始图像成为不一样尺度的输入\(min(w,h)=s\inS={480,576,688,864,1200}\),而后获得第五个卷积层的特征图,接着进行特征融合再进行SPP池化;另一种更好的方式是选择候选区域大小最接近\(240\times240\)的那张图像进行输入并进行SPP提取特征。
为简化训练过程,微调仅针对全链接层。在第五个卷积层以后接入两个全链接层,最后再接入一个全链接层进行分类,类别数为21,即20+1,1是背景;对于最后一个全链接层使用标准差为0.01的高斯分布初始化参数,学习率由\(1e-4\)浮动到\(1e-5\);在微调阶段的正类样本定义为那些和真实的目标区域IOU比为\([0.5,1)\)的样本,负类为\([0.1,0.5)\)的样本,在每轮的mini-batch包含25%的正类样本;最后相似于RCNN也使用了bounding box回归进行误差修正。最后做者给出了在VOC2007上的实验结果,如图5所示,其中sc表示做者使用的多尺度的训练方式,下图是做者在SPP的预训练模型上进行训练获得的结果(即做者先使用了SPP进行分类,而后拿分类的网络模型来进行检测微调)。能够看出SPP相比较RCNN最大的特色是训练速度的巨大提高。
图5 VOC上SPP和RCNN实验比较
另外做者还针对试验中的其余对比方法进行了时间复杂度的分析,这里再也不细说,参见原始paper。
SPP用于目标检测实际是在RCNN的基础上进行改进的,能够看出主要的目的是在时间上的巨大提高,可是从本质来看算法的精度并无什么提高。须要注意的是SPP一样能够用于分类,做者花了很大篇幅讨论分类的SPP方法,考虑到本文是目标检测系列因此没有介绍到,下一篇主要介绍一个比较大的改进方法fast-rcnn。