本文爲您解讀SPP-net:網絡
Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition.net
神經網絡在計算機視覺方面的成功得益於卷積神經網絡,然而,現有的許多成功的神經網絡結構都要求輸入爲一個固定的尺寸(好比224x224,299x299),傳入一張圖像,須要對它作拉伸或者裁剪,再輸入到網絡中進行運算。
blog
然而,裁剪可能會丟失信息,拉伸會使得圖像變形,這些因素都提升了視覺任務的門檻,所以,若是能有一種模型可以接收各類尺度的輸入,應當可以讓視覺任務更加容易完成。圖片
深度卷積神經網絡中的核心組件有兩個,一個是CNN,一個是全鏈接層,卷積是用filter在圖像上平移與圖像的局部進行逐位乘法,多個filter則產生多個feature map(特徵/特徵圖),而後能夠用pooling操做進一步採樣,獲得更小的feature map;實際上,咱們並不在乎feature map有多大,不一樣圖像的feature map徹底能夠有不一樣的尺寸;可是在後邊的具體任務中,好比分類任務,爲了輸出softmax對應的one-hot層,須要輸出固定的尺寸,爲了讓不一樣的輸入能共用一套權重參數,要求全鏈接層的輸入尺寸是一致的,逆推回去也就限制了feature map的大小必須一致;而不一樣尺寸的輸入圖片在使用同一套卷積核(filter)的時候,會產生不一樣尺寸的feature map,所以才須要將不一樣尺寸的輸入圖片經過裁剪、拉伸調整爲相同的尺寸。get
所以突破口有兩個,源碼
全卷積和卷積的區別在於最後不是用全鏈接層進行分類, 而是用卷積層,假設咱們要將一個16x16的feature map轉爲10x1的one-hot分類,則可使用10個1x1卷積核,每一個卷積覈對應一個分類,參數數量少了不少,可是…實驗結果代表還挺有效的,而且,全卷積+反捲積開闢了圖像分割的新思路,能夠說是一個開創新的工做了,感興趣的同窗能夠看這篇博客博客
這裏咱們詳細講一下SPP
it
SPP中SP(Spatial Pyramid)的思想來源於SPM(Spatial Pyramid Matching),能夠參考這篇文章,正如論文Conclusion中說的, Our studies also show that many time-proven techniques/insights in computer vision can still play important roles in deep-networks-based recognition.io
SPM是在不一樣的分辨率(尺度)下,對圖片進行分割,而後對每一個局部提取特徵,將這些特徵整合成一個最終的特徵,這個特徵有宏觀有微觀(多尺度金字塔),保留了區域特性(不一樣的區域特徵不一樣),而後用特徵之間的類似度進行圖片間的匹配(matching)。先前咱們提到過,每一個filter會獲得一個feature map,SPP的輸入則是卷積後的這些feature map,每次將一個feature map在不一樣尺度下進行分割,尺度L將圖片分割爲2^L^個小格子(其實格子數也能夠本身定,不必定要分紅2^L^個),L爲0表明全圖;對每一個小格子的作pooling,論文中是max pooling, 實際中也能夠用其餘,這裏不像SPM須要作SIFT之類的特徵提取,由於feature map已是卷積層提取過的特徵了,將pooling獲得的結果拼接起來,就能夠獲得固定尺寸的feature map。ast
舉個例子,一個具備256個filter的卷積層,輸出了256個feature map,對於一個640x320的圖片,輸出的feature map多是32x16的,對於一個640x640的圖片,輸出的feature map多是32x32的,對256個feature map中的每一個feature map,咱們在4個尺度下對它們作切割,在最粗糙的尺度下切爲1個圖,次之切爲2個子圖,接下來是4個子圖,8個, 對每一個子圖作max pooling,獲得其中最大的數,放到最終的特徵裏,能夠獲得一個1+2+4+8=15這麼長的特徵,256個feature則能夠獲得最終256*15這麼長的特徵,能夠看到,最終的特徵尺寸只跟卷積層結構和SP尺度L有關,跟輸入圖片無關,從而保證了對不一樣尺寸的圖片都輸出同樣大小的特徵。
其實看到這裏,你可能發現了,對不一樣尺寸輸出相同尺寸特徵這個特性,是由pooling操做決定的,像max pooling,sum pooling這些,就是將多個輸入聚合爲一個值的運算;而Spatial Pyramid只是讓特徵有更好的組織形式而已。固然,能找到這種有效的特徵組織形式也是很值得確定的。但這裏有東西仍然值得商榷,max pooling實際上仍是丟了一些信息,雖然經過多層的特徵能夠將這些信息彌補回來。
而後做者就將這個結構應用到各類網絡結構和各類任務裏了,而且都取得了很好的效果(說的輕巧,復現一堆論文,改源碼,跑大量實驗,必定超級累);特別是在檢測任務對RCNN的改進上,這個地方比較有意思。在RCNN中,須要將每一個Region Proposal輸入卷積層判斷屬於哪一個分類,而region proposal是方形的,這就致使有不少區域作了重複的卷積運算。
在SPP-net的實驗中,
因爲整張圖只過了一遍卷積,因此比原來的RCNN快了不少,準確率也不差
嚴格來說SPP-net不是爲detection而生的模型,可是SPP-net爲RCNN進化到Fast-RCNN起了很大的借鑑做用,值得一讀。SPP-net的想法頗有意思,SPP(Spatial Pyramid Pooling)是對網絡結構的一種改進,可能由於是華人寫的論文,感受很好讀,含金量我的感受沒有RCNN或者DPM的論文高,可是實驗很豐富,從分類任務和檢測任務上的各類網絡結構證實SPP的有效性