論文文獻:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
算法流程圖
1、SPP-Net解決的問題
R-CNN存在的問題
- 在用selective search方法對原圖進行提取了2000個Proposal,在卷積之前要對每個Proposal進行Wrap或Crop,降低了檢測的精确度。
- 對于每一個原圖的Proposal都要進行一次卷積,也就是每張圖2000次,計算量太大。
SPP-Net解決的政策
- 通過Spatial Pyramid Pooling解決了深度網絡固定輸入層尺寸的這個限制,使得網絡可以享受不限制輸入尺寸帶來的好處。
- 對于每一張原圖隻需要整體卷積一次,然後将用selective search方法對原圖進行提取的Proposal區域映射到卷積特征層進而得到全連結的輸入層。
2、SPP-Net相對R-CNN的改進點
- 特征圖上的對應的特征區域的次元不滿足全連接配接層的輸入要求? 作者使用Spatial Pyramid Pooling解決了該問題,也就是在卷積層和全連接配接層之間增加一個Spatial Pyramid Pooling Layer。如上圖所示,假設原圖輸入是224x224,對于conv5出來後的輸出是13x13x256的,可以了解成有256個這樣的Filter,每個Filter對應一張13x13的feature Map。如果像上圖那樣将feature Map分成1x1(金字塔底座),2x2(金字塔中間),4x4(金字塔頂座)三張子圖,分别做Max Pooling後,出來的特征就是(16+4+1)x256 次元。即使原圖的輸入不是224x224,出來的特征依然是(16+4+1)x256次元。這樣就實作了不管圖像尺寸如何池化n的輸出永遠是 (16+4+1)x256 次元。
-
如何從一個region proposal 映射到feature map的位置?
要搞定這個問題,需要首先清楚感受野等概念和計算方法。下面從感受野、感受野上面的坐标映射及原始圖像的ROI如何映射三方面闡述。
- 感受野
-
概念
在卷積神經網絡中,感受野的定義是卷積神經網絡每一層輸出的特征圖(Feature Map)上的像素點在原始圖像上映射的區域大小。
- 計算方法
-
output field size = ( input field size - kernel size + 2*padding ) / stride + 1
其中output field size 是卷積層的輸出,input field size 是卷積層的輸入,也是上一層的感受野,是以,
input field size = (output field size - 1)* stride - 2*padding + kernel size
- 感受野上的坐标映射
-
計算公式
對于Convolution/Pooling Layer:
對于Neuronlayer(ReLU/Sigmoid/…): 其中p_i為第i層的感受野的坐标,s_i為Stride的大小,k_i為感受野的大小。 -
例子
上面是計算任意一個Layer輸入輸出的坐标映射關系,如果是計算任意Feature Map之間的關系,隻需要用 簡單的組合就可以得到,下圖是一個簡單的例子:
-
簡化
何凱明在SPP-NET中使用的是簡化版本,将2小節公式中的Padding都設為 k_i/2 向下取整,然後簡化為:
-
-
原始圖像的ROI如何映射(簡化版)
SPP-NET是把原始ROI的左上角和右下角 映射到Feature Map上的兩個對應點。 有了Feature Map上的兩隊角點就确定了對應的Feature Map 區域(下圖中橙色)。
左上角取 , 右下角的點取 , 。其中S為坐标映射的簡化計算版本,即所有步長的乘積。
SPP-Net的缺點
SPP也需要訓練CNN提取特征,然後訓練SVM分類這些特征。需要巨大的存儲空間,并且分開訓練也很複雜。