R-CNN系列其二:SPP-Net

solution發表於2021-09-09

介紹

我們平時用於做物體分類或檢測的CNN網路多是由兩部分來組成,前端的CNN層構成的網路用於圖片特徵的抽象化提取與後端的FC層構成的網路用於具體的問題處理如分類或物體位置識別。因為模型中後端FC層的存在,意味著它只能接受固定大小的輸入即每次輸入tensor的維數必須相同。這帶來一個問題即我們只能使用統一大小的圖片作為網路輸入,如此才能在前端CNN網路層的最後輸出具有一致維數大小的資料特徵集合(feature map)給接下來的網路層使用。為此很多時候,我們的網路在圖片輸入之前不得不對其進行一些處理如剪下(crop)或失真式變行(Warp),這些處理或會導致圖片解析度有變化,甚至可能使得輸入影像有內容損失。

來自微軟Sun, Jian老師的團隊想到了一種可對任意大小的feature map輸入進行Pooling處理來生成固定大小的空間金字塔式層化方法(Spatial pyramid pooling,簡稱SPP)。此種SPP層化方法被加在前端CNN層網路的最後一級feature map輸出後可生成固定大小的特徵來。這樣就實現了CNN網路結構與圖片輸入大小之間的解耦。。理論上我們可以使用任意大小的圖片作用CNN網路的輸入了即使在網路的最後我們有FC層。

如下圖中可以看到使用此層所能解決的CNN網路對輸入圖片大小存在依賴的問題。

圖片描述

CNN網路使用SPP層前後對輸入圖片所進行的處理

金字塔式池化層(Spatial Pyramid Pooling)

如以上介紹本質上金字塔式池化層也是一種池化層結構,只是它被巧妙的設計用來處理任意維度的輸入Tensor,這樣最終經過此層處理後,我們能夠得到固定長度的結果向量。下圖中我們能清晰地看到它是如何實現的。

圖片描述

帶有金字塔式池化層的CNN網路

訓練帶有金字塔式池化層的CNN網路

理論上有了金字塔式池化層後,我們訓練CNN網路模型將可以使用做任意大小(Size)的圖片資料了。可因為當下像Caffe / Tensorflow等流行深度學習框架在設計之初都對固定大小的輸入圖片有假設,因此它們處理起來固定大小輸入的模型訓練更加友好。作者也先嚐試使用了固定大小的輸入圖片來進行訓練。但為了發揮其能使用多種大小圖片進行模型訓練的優勢,他們使用遷移學習或者說多階段學習的辦法來進行模型訓練。即使用180x180與224x224大小的圖片交叉著訓練CNN網路。。最終得到了與只使用單一大小圖片輸入一致的收斂速率。

SPP層在CNN檢測網路中的應用

根據我們上篇對R-CNN網路的瞭解可以知道,我們的前端CNN網路需要對不同大小的ROI視窗進行特徵提取。而為了保證最終得到一樣大小的特徵向量(因為接下來的SVM分類器與要對目標框進行位置較正的邏輯迴歸模型都需要固定大小的輸入),我們一般會將原本具有不同大小的ROI強制轉換為固定的大小(如180x180或224x224),如此以來可能會對ROI的輸入對比度等造成破化,極有可能因此而影響我們分類器對正確物體的特徵認識。
若將SPP層來代替普通的MaxPool或AvgPool層來使用,則可完美地解決輸入的ROI視窗大小不一致的問題,從而有可能提高我們CNN模型+SVM 目標檢測框架的準確性。下圖中可看出SPP層是如何應用在此CNN網路+SVM分類模型的目標檢測框架中的。

圖片描述

SPP層在目標檢測框架中的應用

SPP層對CNN檢測網路帶來的好處

以下表格中可看到SPP層的使用所能給我們的R-CNN檢測框架帶來的模型準確率與速度上的好處。

圖片描述

SPP層的使用對R-CNN檢測框架帶來的提升

  • SPP層的使用可以讓我們使用整幅圖片作用前端CNN網路的輸入,在最後的CNN層輸出中,我們再提取出不同ROI視窗所對應的特徵向量。這樣以來,因為平均一幅圖上面約有2000個ROI視窗,因此向對於普通R-CNN檢測框架,我們能夠省2000倍的計算量;

  • 為了增加模型檢測的精度,作者有使用不同scale的輸入圖片來提取ROI的特徵,這樣使用一種類似於特徵的組合的模式提高接下來的SVM分類模型的準確率。

SPP在Caffe中的實現

--------------------------layer spm------------------------

layer {   name: "pool5_spm6"
   type: "pool"
   pool_param{
        kernel_size: 3
        stride: 2
        pool: MAX
   } bottom: "conv5" top: "pool5_spm6"
}layer {   name: "pool5_spm6_flatten"
   type: "flatten"
   bottom: "pool5_spm6"
   top: "pool5_spm6_flatten"}layer {   name: "pool5_spm3"
   type: "pool"
   pool_param{
        kernel_size: 5
        stride: 4
        pool: MAX
   }   bottom: "conv5"   top: "pool5_spm3"
}layer {   name: "pool5_spm3_flatten"
   type: "flatten"
   bottom: "pool5_spm3"
   top: "pool5_spm3_flatten"}layer {   name: "pool5_spm2"
   type: "pool"
   pool_param{
        kernel_size: 7
        stride: 7
        pool: MAX
   }   bottom: "conv5"   top: "pool5_spm2"
}layer {   name: "pool5_spm2_flatten"
   type: "flatten"
   bottom: "pool5_spm2"
   top: "pool5_spm2_flatten"}layer {   name: "pool5_spm1"
   type: "pool"
   pool_param{
        kernel_size: 13
        stride: 13
        pool: MAX
   }   bottom: "conv5"   top: "pool5_spm1"
}layer {   name: "pool5_spm1_flatten"
   type: "flatten"
   bottom: "pool5_spm1"
   top: "pool5_spm1_flatten"}layer {   name: "pool5_spm"
   type: "concat"
   concat_param{
        concat_dim: 1
   }   bottom: "pool5_spm1_flatten"   bottom: "pool5_spm2_flatten"   bottom: "pool5_spm3_flatten"   bottom: "pool5_spm6_flatten"   top: "pool5_spm"
}



作者:manofmountain
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2459/viewspace-2818257/,如需轉載,請註明出處,否則將追究法律責任。

相關文章