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張圖片的提取,所花費的時間和資源可想而知,可以參看下圖方便理解。
? ? ? ? 那么,為了解決圖片size不一致的問題,SPP Net引入了空間金字塔層(Spatial Pyramid Pooling, SPP)。引入SPP之后,我們可以至今將圖片輸入到我們的神經網絡,經過SPP層將圖片特征圖轉為統一,下圖就是引入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 為什么全連接層需要相同尺寸的圖片輸入
? ? ? ? 下圖是我借用他人博客中的一張圖來解釋為什么全連接層需要固定參數的輸入。
? ? ? ? 圖中,有兩個全連接層,我們只看最后的卷積操作(圖中包含了最后的池化層4*4)和第一個全連接層的計算過程(之后的全連接層我統一指第一個全連接層)。最后卷積層經過池化后得到(50,4,4)的feature map。那么卷積層的輸出參數就是50*4*4=800。全連接層為(500,1,1),所以全連接層的參數為500,那么卷積和全連接層之前的參數為800*500=400000,即權值參數W和500個偏置參數b,我們這里忽略b。
? ? ? ? 我們解釋一下全連接正向傳播的過程,這里再借用一下全連接操作的博客的講解,如果有深入想了解全連接反向傳播過程的可以進去再詳細看一下,我們這里只借用講解一下全連接為什么需要固定參數。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
其中,x1、x2、x3為全連接層的輸入,a1、a2、a3為輸出,根據我前邊在筆記1中的推導,有
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
可以寫成如下矩陣形式:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ?
所以,全連接層的計算過程的權重參數和偏置的數量是固定好的。到這大家應該明白全連接層為什么需要固定參數了吧。
? ? ? ? 再回到我們的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),請看下圖:
?
?上圖是原文中給出的示意圖,需要從下往上看:
- 首先是輸入層(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其他的改進網上博客解釋的都非常好,小伙伴們可以參考其他博客結合論文進行學習。
總結
以上是生活随笔為你收集整理的SPP Net 空间金字塔池化(Spatial Pyramid Pooling, SPP)原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 100ml干胶能带上地铁吗_100ml发
- 下一篇: 中国农业大学计算机研究生专业课,2020