天天看點

SPP Net 空間金字塔池化(Spatial Pyramid Pooling, SPP)原理

        最近從頭捋一下R-CNN系列的目标檢測算法,在R-CNN首次将CNN與目标檢測練習到一起之後,為了彌補它效率慢、不是端到端的神經網絡、輸入圖檔大小resize不準确等問題,各路神仙在後面陸續推出了SPP Net、Fast R-CNN、Faster R-CNN、R-FCN等R-CNN系列的模型。

        在我将R-CNN弄清楚原理及流程之後就開始學習何凱明團隊推出的SPP Net的網絡模型。SPP Net的核心思想是空間金字塔池化(Spatial Pyramid Pooling, SPP)。讀到這個SPP子產品的時候,我知道它的作用是想把原本R-CNN的crop/warp的操作去掉,可以大大的提升網絡傳遞效率。但是看了挺久對這個技術弄的不是太明白,怎麼辦呢?那肯定是求助我們的搜尋引擎了。希望各路大神的部落格、知乎、CSDN等等的講解,在這也記錄這一天的折騰吧。

一、為什麼要引入空間金字塔池化

       在了解空間金字塔之前,我們肯定要知道我們為什麼要引入空間金字塔。在R-CNN網絡中,要對原始圖檔經過selective search方式産生大概2000個候選區域圖,但是很多場景所得到資料并不是固定大小的,得到的圖檔的size很多是不一緻的。因為在AlexNet對輸入圖像的大小要求一緻,是以在将候選區域輸入CNN網絡之前,要将候選區域進行固定尺寸的縮放。經過selective search和AlexNet對2000張圖檔的提取,所花費的時間和資源可想而知,可以參看下圖友善了解。

SPP Net 空間金字塔池化(Spatial Pyramid Pooling, SPP)原理

        那麼,為了解決圖檔size不一緻的問題,SPP Net引入了空間金字塔層(Spatial Pyramid Pooling, SPP)。引入SPP之後,我們可以至今将圖檔輸入到我們的神經網絡,經過SPP層将圖檔特征圖轉為統一,下圖就是引入SPP層之後網絡模型圖:

SPP Net 空間金字塔池化(Spatial Pyramid Pooling, SPP)原理

        圖中,a是原有R-CNN的過程,SPP Net加入SPP之後變為b所示,去掉了之前花費大量時間和資源的selective search和AlexNet和2000張圖檔的拟合過程。

        總結一下,引入SPP層将原有多個不同尺寸的圖檔可以統一輸入到網絡。目的是去掉R-CNN的crop/warp的過程,并且将原有對2000張圖檔特征提取的過程統一整合為對一幅圖的拟合。

二、為什麼空間金字塔可以起作用

        其實網上很多對空間金字塔的解釋非常容易了解,但是網上查了很多這方面的解釋,感覺沒有解釋到重點,我始終不知道為什麼空間金字塔可以提到作用,算了進入正題吧。

        在CNN做圖像分類,我們在最後的卷積操作之後,會加入全連接配接層,将卷積提取的特征進行特征分類。SPP的作用是為了将szie不同的圖檔輸入到CNN中。是以,首先我們要知道的是,為什麼CNN不允許size不同的圖檔輸入到網絡中。其實,卷積操作是允許多個不同尺寸圖檔進行操作的,CNN中不允許圖檔size不同的是全連接配接層。網上很多的解釋都是說因為全連接配接層需要固定參數,但是輸入圖檔大小不一緻會導緻全連接配接參數不一緻導緻網絡無法訓練。其實,解釋到這種程度,我真是不明白為什麼輸入圖檔不一樣導緻全連接配接參數不同。全連接配接層裡面的神經元不是固定了嗎?比如AlexNet中全連接配接固定位4096個。就因為這個問題困擾我了一天,導緻我這一天就沒明白SPP到底是怎麼解決輸入圖檔大小不一緻的問題。其實,SPP解決的就是全連接配接層參數要求統一的問題。如果有些小夥伴跟我一樣對這兒不太明确的話,請繼續往下看,我們繼續分析。

2.1 為什麼全連接配接層需要相同尺寸的圖檔輸入

        下圖是我借用他人部落格中的一張圖來解釋為什麼全連接配接層需要固定參數的輸入。

SPP Net 空間金字塔池化(Spatial Pyramid Pooling, SPP)原理

        圖中,有兩個全連接配接層,我們隻看最後的卷積操作(圖中包含了最後的池化層4*4)和第一個全連接配接層的計算過程(之後的全連接配接層我統一指第一個全連接配接層)。最後卷積層經過池化後得到(50,4,4)的feature map。那麼卷積層的輸出參數就是50*4*4=800。全連接配接層為(500,1,1),是以全連接配接層的參數為500,那麼卷積和全連接配接層之前的參數為800*500=400000,即權值參數W和500個偏置參數b,我們這裡忽略b。

        我們解釋一下全連接配接正向傳播的過程,這裡再借用一下全連接配接操作的部落格的講解,如果有深入想了解全連接配接反向傳播過程的可以進去再詳細看一下,我們這裡隻借用講解一下全連接配接為什麼需要固定參數。

SPP Net 空間金字塔池化(Spatial Pyramid Pooling, SPP)原理

其中,x1、x2、x3為全連接配接層的輸入,a1、a2、a3為輸出,根據我前邊在筆記1中的推導,有

SPP Net 空間金字塔池化(Spatial Pyramid Pooling, SPP)原理

可以寫成如下矩陣形式:

SPP Net 空間金字塔池化(Spatial Pyramid Pooling, SPP)原理

是以,全連接配接層的計算過程的權重參數和偏置的數量是固定好的。到這大家應該明白全連接配接層為什麼需要固定參數了吧。

        再回到我們的CNN中,我們的全連接配接層的參數是卷積矩陣(500,4,4)和全連接配接矩陣(500,1,1)進行計算。全連接配接矩陣(500,1,1)是固定的,卷積矩陣500也固定到我們的網絡中,唯一受輸入圖檔影響的就是單層的feature map(4,4),因為根據卷積公式,卷積操作受輸入、卷積核、輸出、padding、步長的影響,我們這裡訓練中動态改變的就是輸入圖檔的資料,是以,帶有全連接配接層的CNN需要統一的圖檔輸入。看到這,各位小夥伴應該明白為什麼在SPP Net中我們要利用SPP層進行圖檔size統一了吧。

2.2 空間金字塔池化層為什麼可以解決全連接配接統一參數

        我們知道了為什麼要全連接配接需要圖檔的size統一,那麼為了解決全連接配接層需要參數統一的問題,我們就要知道為什麼SPP可以解決全連接配接層統一呢。這也是我在網上找了很久沒發現想要的答案,還有跟我一樣困惑的小夥伴跟我繼續往下而分析。

       首先,我們介紹一下空間金字塔池化(Spatial Pyramid Pooling, SPP),請看下圖:

SPP Net 空間金字塔池化(Spatial Pyramid Pooling, SPP)原理

 上圖是原文中給出的示意圖,需要從下往上看:

  • 首先是輸入層(input image),其大小可以是任意的
  • 進行卷積運算,到最後一個卷積層(圖中是conv5)輸出得到該層的特征映射(feature maps),其大小也是任意的
  • 下面進入SPP層
    • 我們先看最左邊有16個藍色小格子的圖,它的意思是将從conv5conv5得到的特征映射分成16份,另外16X256中的256表示的是channel,即SPP對每一層都分成16份(不一定是等比分,原因看後面的内容就能了解了)。
    • 中間的4個綠色小格子和右邊1個紫色大格子也同理,即将特征映射分别分成4X256和1X256份

那麼将特征映射分成若幹等分是做什麼用的呢? 我們看SPP的名字就是到了,是做池化操作,一般選擇MAX Pooling,即對每一份進行最大池化。我們看上圖,通過SPP層,特征映射被轉化成了16X256+4X256+1X256 = 21X256的矩陣,在送入全連接配接時可以擴充成一維矩陣,即1X10752,是以第一個全連接配接層的參數就可以設定成10752了,這樣也就解決了輸入資料大小任意的問題了。(注意上面劃分成多少份是可以自己是情況設定的,例如我們也可以設定成3X3等,但一般建議還是按照論文中說的的進行劃分)

        上面這個解釋也是參考部落格的解釋,解釋的挺好的。其實可以從這列可以看出來,SPP是通過将輸入圖檔經過三個池化子產品,分别提取每個子產品裡面具體劃分的特征圖進行contect,這個組合的過程有點類似Inception的意思。經過contect之後形成了(m,1,1)的矩陣,其輸入參數就是m*1*1,進而達到了固定參數的作用。

三、總結

      最後做一下總結吧,SSP Net通過将不同的輸入圖檔經過卷積操作,利用SSP層将全連接配接層的參數固定,進而達到CNN網絡可以訓練size不同圖檔的作用,解決了R-CNN需要經過selective search後訓練多個圖檔的問題。最後,達到可以将原始圖檔直接送入網絡進行訓練,加速了R-CNN系列網絡實作端到端的目标檢測的過程。

      至于SPP Net其他的改進網上部落格解釋的都非常好,小夥伴們可以參考其他部落格結合論文進行學習。

繼續閱讀