(SSPNet)Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition! |
文章目錄
- 這篇論文2015年發表在IEEE上的論文,出自華人學者何凱明大神之手。SPPNet論文下載鏈接。
一、爲什麼要固定輸入圖片的大小?
網絡物體檢測,這個網絡成功的引入了卷積網絡來進行特徵提取,但是存在一個問題,就是對需要進行特徵提取圖片大小有嚴格的限制,比如、等,這樣對於我們希望檢測各種大小的圖片的時候,需要經過切割,或者縮放等一系列操作,這樣雖然滿足了對圖片大小的要求,確造成圖片的信息缺失或者變形,會降低圖片識別的正確率。如下圖所示:
補充: 就是從一個大圖扣出網絡輸入大小的(比如),而則是把一個 的內容成 。無論是那種策略,都能很明顯看出有影響網絡訓練的不利因素,比如就有可能出的一個部分,而無法準確訓練出類別,而則會改變的正常寬高比,使得訓練效果變差。
何凱明大神在看到模型,分析了模型的特點後:由卷積部分和全連接兩部分構成,而對於卷積部分而言,比如任意圖片大小,任意的卷積核,默認步長爲1,我們都會得到卷積之後的特徵圖,所以這部分對圖片大小沒有要求,有要求的地方在全連接層(如下圖),全連接層的神經元設定之後是固定的(如圖 神經元個數),而每一個都對應者一個特徵,大神在進入前對圖片進行切割或者縮放處理,就是爲了卷積之後的特徵數,能夠和了全連接層的神經元個數相等。
作爲全連接層,如果輸入的維數不等,那麼參數肯定也會不同,因此,全連接層是必須確定輸入,輸出個數的。
補充: R-CNN爲什麼會有計算冗餘?可以參考1.7小節中的圖像。
- R-CNN對於一張圖片,先使用selective search方法提取出約2000個候選區域,然後將這兩千個候選區域分別送入網絡中,即一張圖片要經歷2000次前向傳播,這樣會造成大量冗餘。
- SPP-net則提出了一種從候選區域到全圖的特徵(feature map)之間的對應映射關係,通過此種映射關係可以直接獲取到候選區域的特徵向量,不需要重複使用CNN提取特徵,從而大幅度縮短訓練時間。每張圖片只需進行一次前向傳播即可。
二、SPP-Net是如何調整網絡結構的?
-在最後一個卷積層後,接入了金字塔池化層,使用這種方式,可以讓網絡輸入任意的圖片,而且還會生成固定大小的輸出。
三、什麼是金字塔池化層?
如下圖在最後的卷積層和全連接層之間加入層,一般設置多個金字塔級別,文中使用了4×4,2×2和1×1三個尺度。
具體做法是,在conv5層得到的特徵圖是256層,每層都做一次 。先把每個特徵圖分割成多個不同尺寸的網格,比如網格分別爲,然後每個網格做 ,這樣256層特徵圖就形成了,他們連起來就形成了一個固定長度的特徵向量,將這個向量輸入到後面的全連接層。
四、金字塔池化的意義是什麼?
總結而言,當網絡輸入的是一張任意大小的圖片,這個時候我們可以一直進行卷積、池化,直到網絡的倒數幾層的時候,也就是我們即將與全連接層連接的時候,就要使用金字塔池化:它使得任意大小的特徵圖都能夠轉換成固定大小的特徵向量,這就是空間金字塔池化的意義(多尺度特徵提取出固定大小的特徵向量)。
注意: :將緊跟最後一個卷積層的池化層使用代替,輸出向量大小爲,
五、網絡訓練階段
5.1、single-sizetraining訓練
理論上說,SPP-net支持直接以多尺度的原始圖片作爲輸入後直接BP即可。實際上,caffe等實現中,爲了計算的方便,GPU,CUDA等比較適合固定尺寸的輸入,所以訓練的時候輸入是固定了尺度了的。
- 以 的輸入爲例:在conv5之後的特徵圖爲,
- 金字塔層,進行滑動窗池化,窗口尺寸爲:_ 向上取整,_ 向下取整。
- 例如論文中給出的參數如下:
- 例如:對於,_ 的計算公式是:向上取整 ,的計算公式是:向下取整。如果輸入改成,這時候出來的 爲,類似的方法,能夠得到新的參數。
注意: 普通的是和固定,滑動出來之後輸出的網格數不固定。這裏是把網格數固定了,根據 大小反推和
5.2、Multi-size training訓練
- Multi-size training訓練:使用兩個尺度進行訓練: 和,訓練的時候,的圖片通過crop得到,的圖片通過縮放的圖片得到。之後,迭代訓練,即用224的圖片訓練一個,之後180的圖片訓練一個,交替地進行。輸出的特徵維度都是,參數是共享的,之後接全連接層即可。 論文中說,這樣訓練的好處是可以更快的收斂。
- 如果原圖輸入是,對於出來後的輸出,是的,可以理解成有256個這樣的,每個r對應一張的 。
- 重點內容如果像上圖那樣將 分成三張子圖,做 後,出來的特徵就是固定長度的那麼多的維度了。如果原圖的輸入不是,出來的特徵依然是
六、網絡測試階段
輸入爲任意大小的圖片,SPP-Net與R-CNN的對比:
1、對於R-CNN,整個過程是:
- 首先通過選擇性搜索(select search方法),對待檢測的圖片進行搜索出大約2000個候選窗口。
- 把這2000個候選窗口的圖片都縮放到,然後分別輸入中,每個 提取出一個特徵向量,也就是說利用對每個進行提取特徵向量。
- 把上面每個候選窗口的對應特徵向量,利用算法進行分類識別。
- 可以看出R-CNN的計算量是非常大的,因爲2000個候選窗口都要輸入到CNN中,分別進行特徵提取。
補充: 想要多瞭解一些RCNN的具體流程,可以參看:第7章視覺探測任務R-CNN,Fast R-CNN,Faster R-CNN,YOLO!
2、對於SPP-Net,整個過程是:
- 首先通過選擇性搜索,對待檢測的圖片進行搜索出2000個候選窗口。這一步和R-CNN一樣。
- 特徵提取階段。這一步就是和R-CNN最大的區別了,這一步驟的具體操作如下:把整張待檢測的圖片,輸入CNN中,進行一次性特徵提取,得到feature maps,然後在feature maps中找到各個候選框的區域,再對各個候選框採用金字塔空間池化,提取出固定長度的特徵向量。而R-CNN輸入的是每個候選框,然後在進入CNN,因爲SPP-Net只需要一次對整張圖片進行特徵提取,速度會大大提升。
- 最後一步也是和R-CNN一樣,採用SVM算法進行特徵向量分類識別。
注意: SPPNet和RCNN最大的不同就在於第二步處理上,對一張圖片只做一次特徵提取,顯然會提高效率,速度得到很大的提升。這個思想後來fast rcnn也採用了,具體細節可以參考:3.1節
6.1、Mapping a Window to Feature Maps
我們知道,在原圖中的,經過多層卷積之後,位置還是相對於原圖不變的(存在映射關係,上面注意的鏈接裏有),如下圖所示。那現在需要解決的問題就是,如何能夠將原圖上的proposal,映射到卷積之後得到的特徵圖上,因爲在此之後我們要對進行金字塔池化。
- 對於映射關係,論文中給出了一個公式: 假設表示特徵圖(CNN出來的)上的座標點,,座標點表示原輸入圖片上的點,那麼它們之間有如下轉換關係,這種映射關心與網絡結構有關:;
- 反過來,我們希望通過座標求解,那麼計算公式如下:
- :
SPP-Net 是把原始ROI的左上角和右下角 映射到 feature map上的兩個對應點。 有了feature map上的兩隊角點就確定了 對應的 feature map 區域(下圖中橙色)。
- 其中公式中的: 就是CNN中所有的的乘積,包含了池化、卷積的。
比如,對於下圖的集中網絡結構,S的計算如下:
- 論文中使用的是
- 對以上公式的理解,要建立在卷積的過程上,我們再看一遍卷積的過程:
- 假設下圖的左上角的點和右下角的點標出的區域就是我們要的候選區域,那麼它對應的feature map即是右圖。我們就是利用這個區域兩個點的座標來求出來feature map上的對應的區域即可,當然feature map上的一個點其實是對應了原圖上的一個區域,我們也稱作感受野。
七、檢測算法
- 對於檢測算法,論文中是這樣做到:使用生成~個候選框,縮放圖像之後提取特徵,每個候選框使用一個4層的空間金字塔池化特徵,網絡使用的是的形式。之後將 維度的特徵輸入全連接層,SVM的輸入爲全連接層的輸出。
- 這個算法可以應用到多尺度的特徵提取:先將圖片到五個尺度:,加自己6個。然後在map window to feature map一步中,選擇 框尺度在{6個尺度}中大小最接近 的那個尺度下的feature maps中提取對應的 。這樣做可以提高系統的準確率。
八、完整的SPP-Net
- 最後,用一張圖來完整的描述SPP-Net。
參考博客
這裏參考了以下作者的文章,這裏表示感謝!