1. 程式人生 > >基於空間金字塔池化的卷積神經網路物體檢測(SPPNET)(Spatial Pyramid Pooling)

基於空間金字塔池化的卷積神經網路物體檢測(SPPNET)(Spatial Pyramid Pooling)

1.解決的問題

當前的CNN輸入圖片尺寸是固定的,但是當進行圖片預處理的時候,往往會降低檢測的準確度。而SPPNET則可以輸入任意尺寸的圖片,並且使得最後的精度有所提升。 CNN中圖片的固定尺寸是受到全連線層的影響。因為全連線層我們的連線權值矩陣的大小W,經過訓練後,就是固定的大小了,它要把輸入的所有畫素點連線起來,需要指定輸入層神經元個數和輸出層神經元個數,所以需要規定輸入的feature的大小。比如我們從卷積到全連層,輸入和輸出的大小,分別是50、30個神經元,那麼我們的權值矩陣(50,30)大小的矩陣了。因此空間金字塔池化,要解決的就是從卷積層到全連線層之間的一個過度。一般空間金子塔池化層,都是放在卷積層到全連線層之間的一個網路層。

2.金字塔池化

      黑色圖片代表卷積之後的特徵圖,接著我們以不同大小的塊來提取特徵,分別是4*4,2*2,1*1,將這三張網格放到下面這張特徵圖上,就可以得到16+4+1=21種不同的塊(Spatial bins),我們從這21個塊中,每個塊提取出一個特徵,這樣剛好就是我們要提取的21維特徵向量。這種以不同的大小格子的組合方式來池化的過程就是空間金字塔池化(SPP)。比如,要進行空間金字塔最大池化,其實就是從這21個圖片塊中,分別計算每個塊的最大值,從而得到一個輸出單元,最終得到一個21維特徵的輸出

3.與R-CNN的對比

對於R-CNN,整個過程是:

(1)首先通過選擇性搜尋,對待檢測的圖片進行搜尋出~2000個候選視窗。  (2)把這2k個候選視窗的圖片都縮放到227*227,然後分別輸入CNN中,每個proposal提取出一個特徵向量,也就是說利用CNN對每個proposal進行提取特徵向量。  (3)把上面每個候選視窗的對應特徵向量,利用SVM演算法進行分類識別。 

可以看出R-CNN的計算量是非常大的,因為2k個候選視窗都要輸入到CNN中,分別進行特徵提取。

而對於SPP-Net,整個過程是:

(1)首先通過選擇性搜尋,對待檢測的圖片進行搜尋出2000個候選視窗。這一步和R-CNN一樣。 (2)特徵提取階段,這一步就是和R-CNN最大的區別了,這一步驟的具體操作如下:把整張待檢測的圖片,輸入CNN中,進行一次性特徵提取,得到feature maps,然後在feature maps中找到各個候選框的區域,再對各個候選框採用金字塔空間池化,提取出固定長度的特徵向量。而R-CNN輸入的是每個候選框,然後在進入CNN,因為SPP-Net只需要一次對整張圖片進行特徵提取,速度會大大提升。 (3)最後一步也是和R-CNN一樣,採用SVM演算法進行特徵向量分類識別。