論文閱讀筆記:(SSPNet)Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition!

(SSPNet)Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition!

一、爲什麼要固定輸入圖片的大小?

RCNNRCNN網絡物體檢測,這個網絡成功的引入了CNNCNN卷積網絡來進行特徵提取,但是存在一個問題,就是對需要進行特徵提取圖片大小有嚴格的限制,比如224×224(ImageNet)224×224(ImageNet)32×32(LeNet)32×32(LeNet)等,這樣對於我們希望檢測各種大小的圖片的時候,需要經過切割(crop)(crop),或者縮放(warp)(warp)等一系列操作,這樣雖然滿足了CNNCNN對圖片大小的要求,確造成圖片的信息缺失或者變形,會降低圖片識別的正確率。如下圖所示:

補充: cropcrop就是從一個大圖扣出網絡輸入大小的patchpatch(比如227×227227×227),而warpwarp則是把一個boundingbounding boxbox的內容resizeresize227×227227×227 。無論是那種策略,都能很明顯看出有影響網絡訓練的不利因素,比如cropcrop就有可能cropcropobjectobject的一個部分,而無法準確訓練出類別,而warpwarp則會改變objectobject的正常寬高比,使得訓練效果變差。

何凱明大神在看到RCNNRCNN模型,分析了CNNCNN模型的特點後:由卷積部分全連接兩部分構成,而對於卷積部分而言,比如任意圖片大小(w,h)(w,h),任意的卷積核sizesizea,b(a,b),默認步長爲1,我們都會得到卷積之後的特徵圖F(wa+1,hb+1)F(w-a+1,h-b+1),所以這部分對圖片大小沒有要求,有要求的地方在全連接層(如下圖),全連接層的神經元設定之後是固定的(如圖 inputinput layerlayer 神經元個數),而每一個都對應者一個特徵,rgrg大神在進入CNNCNN前對圖片進行切割或者縮放處理,就是爲了卷積之後的特徵數,能夠和了全連接層的神經元個數相等。

作爲全連接層,如果輸入的XX維數不等,那麼參數WW肯定也會不同,因此,全連接層是必須確定輸入,輸出個數的。

補充: R-CNN爲什麼會有計算冗餘?可以參考1.7小節中的圖像。

  • R-CNN對於一張圖片,先使用selective search方法提取出約2000個候選區域,然後將這兩千個候選區域分別送入網絡中,即一張圖片要經歷2000次前向傳播,這樣會造成大量冗餘。
  • SPP-net則提出了一種從候選區域到全圖的特徵(feature map)之間的對應映射關係,通過此種映射關係可以直接獲取到候選區域的特徵向量,不需要重複使用CNN提取特徵,從而大幅度縮短訓練時間。每張圖片只需進行一次前向傳播即可。

二、SPP-Net是如何調整網絡結構的?

SPPSPP-NetNet在最後一個卷積層後,接入了金字塔池化層,使用這種方式,可以讓網絡輸入任意的圖片,而且還會生成固定大小的輸出。

三、什麼是金字塔池化層?

如下圖在最後的卷積層和全連接層之間加入SPPSPP層,一般設置多個金字塔級別,文中使用了4×4,2×2和1×1三個尺度。
具體做法是,在conv5層得到的特徵圖是256層,每層都做一次spatialspatial pyramidpyramid poolingpooling。先把每個特徵圖分割成多個不同尺寸的網格,比如網格分別爲4×42×21×14×4、2×2、1×1,然後每個網格做maxmax poolingpooling,這樣256層特徵圖就形成了16×2564×2561×25616×256,4×256,1×256維特徵,他們連起來就形成了一個固定長度的特徵向量,將這個向量輸入到後面的全連接層。

四、金字塔池化的意義是什麼?

總結而言,當網絡輸入的是一張任意大小的圖片,這個時候我們可以一直進行卷積、池化,直到網絡的倒數幾層的時候,也就是我們即將與全連接層連接的時候,就要使用金字塔池化它使得任意大小的特徵圖都能夠轉換成固定大小的特徵向量,這就是空間金字塔池化的意義(多尺度特徵提取出固定大小的特徵向量)。

注意: SPPSPP:將緊跟最後一個卷積層的池化層使用SPPSPP代替,輸出向量大小爲k×Mk×Mk=filters,M=bins(binsn×n)k=filters,M=bins(其中:bins就是n×n)

五、網絡訓練階段

5.1、single-sizetraining訓練

理論上說,SPP-net支持直接以多尺度的原始圖片作爲輸入後直接BP即可。實際上,caffe等實現中,爲了計算的方便,GPU,CUDA等比較適合固定尺寸的輸入,所以訓練的時候輸入是固定了尺度了的。

  • 224×224224×224 的輸入爲例:在conv5之後的特徵圖爲13×13a×a13×13(a×a)
  • 金字塔層binsn×nbins爲:n×n,進行滑動窗池化,窗口尺寸爲:windowswindows_ size=[a/n]size=[a/n] 向上取整,stridestride_sizesize =[a/n]=[a/n]向下取整。
  • 例如論文中給出的參數如下:
  • 例如:對於pool3×3pool:3×3windowswindows_ size=5size=5 的計算公式是:[13/3][13/3]向上取整=5=5stride=4stride = 4的計算公式是:[13/3][13/3]向下取整。如果輸入改成180×180180×180,這時候conv5conv5出來的reponsereponse mapmap10×1010×10,類似的方法,能夠得到新的poolingpooling參數。

注意: 普通的poolpoolsizesizestridestride固定,滑動出來之後輸出的網格數不固定。這裏是把網格數固定了,根據featurefeature mapmap大小反推sizesizestridestride

5.2、Multi-size training訓練

  • Multi-size training訓練:使用兩個尺度進行訓練:224×224224×224180×180180×180,訓練的時候,224×224224×224的圖片通過crop得到,180×180180×180的圖片通過縮放224×224224×224的圖片得到。之後,迭代訓練,即用224的圖片訓練一個epochepoch,之後180的圖片訓練一個epochepoch,交替地進行。輸出的特徵維度都是(9+4+1)×256(9+4+1)×256,參數是共享的,之後接全連接層即可。 論文中說,這樣訓練的好處是可以更快的收斂。
  • 如果原圖輸入是224×224224×224,對於conv5conv5出來後的輸出,是13×13×25613×13×256的,可以理解成有256個這樣的filterfilter,每個filtefilter對應一張13×1313×13reponsereponse mapmap
  • 重點內容如果像上圖那樣將reponsereponse mapmap分成4×4,2×2,1×14×4 ,2×2, 1×1三張子圖,做maxmax poolingpooling後,出來的特徵就是固定長度的(16+4+1)×256(16+4+1)×256那麼多的維度了。如果原圖的輸入不是224×224224×224,出來的特徵依然是(16+4+1)×256(16+4+1)×256

六、網絡測試階段

輸入爲任意大小的圖片,SPP-Net與R-CNN的對比:

1、對於R-CNN,整個過程是:

  1. 首先通過選擇性搜索(select search方法),對待檢測的圖片進行搜索出大約2000個候選窗口。
  2. 把這2000個候選窗口的圖片都縮放227×227227×227,然後分別輸入CNNCNN中,每個proposalproposal 提取出一個特徵向量,也就是說利用CNNCNN對每個proposalproposal進行提取特徵向量。
  3. 把上面每個候選窗口的對應特徵向量,利用SVMSVM算法進行分類識別。
  • 可以看出R-CNN的計算量是非常大的,因爲2000個候選窗口都要輸入到CNN中,分別進行特徵提取。

補充: 想要多瞭解一些RCNN的具體流程,可以參看:第7章視覺探測任務R-CNN,Fast R-CNN,Faster R-CNN,YOLO!

2、對於SPP-Net,整個過程是:

  1. 首先通過選擇性搜索,對待檢測的圖片進行搜索出2000個候選窗口。這一步和R-CNN一樣。
  2. 特徵提取階段。這一步就是和R-CNN最大的區別了,這一步驟的具體操作如下:把整張待檢測的圖片,輸入CNN中,進行一次性特徵提取,得到feature maps,然後在feature maps中找到各個候選框的區域,再對各個候選框採用金字塔空間池化,提取出固定長度的特徵向量。而R-CNN輸入的是每個候選框,然後在進入CNN,因爲SPP-Net只需要一次對整張圖片進行特徵提取,速度會大大提升。
  3. 最後一步也是和R-CNN一樣,採用SVM算法進行特徵向量分類識別。

注意: SPPNet和RCNN最大的不同就在於第二步處理上,對一張圖片只做一次特徵提取,顯然會提高效率,速度得到很大的提升。這個思想後來fast rcnn也採用了,具體細節可以參考:3.1節

6.1、Mapping a Window to Feature Maps

我們知道,在原圖中的proposalproposal,經過多層卷積之後,位置還是相對於原圖不變的(存在映射關係,上面注意的鏈接裏有),如下圖所示。那現在需要解決的問題就是,如何能夠將原圖上的proposal,映射到卷積之後得到的特徵圖上,因爲在此之後我們要對proposalproposal進行金字塔池化。

  • 對於映射關係,論文中給出了一個公式: 假設(x,y)(x’,y’)表示特徵圖(CNN出來的)上的座標點,,座標點(x,y)(x,y)表示原輸入圖片上的點,那麼它們之間有如下轉換關係,這種映射關心與網絡結構有關:(X,y)=(SX,Sy)(\mathrm{X}, \mathrm{y})=\left(\mathrm{S}^{*} \mathrm{X}^{\prime} \quad, \mathrm{S}^{*} \mathrm{y}^{\prime}\right)
  • 反過來,我們希望通過(x,y)(x,y)座標求解(x,y)(x’,y’),那麼計算公式如下:
  1. left,topleft, top
    x=x/S+1x^{\prime}=\lfloor x / S\rfloor+ 1
  2. right,bottomright, bottomx=x/S1x^{\prime}=\lceil x / S\rceil- 1

SPP-Net 是把原始ROI的左上角和右下角 映射到 feature map上的兩個對應點。 有了feature map上的兩隊角點就確定了 對應的 feature map 區域(下圖中橙色)。

  • 其中公式中的:SS 就是CNN中所有的stridesstrides的乘積,包含了池化、卷積的stridestride
    比如,對於下圖的集中網絡結構,S的計算如下:
  1. 論文中使用的是 ZF5S=2222=16ZF-5:S=2*2*2*2=16
  2. Overfeat5/7S=232=12Overfeat-5/7: S =2*3*2 =12
  • 對以上公式的理解,要建立在卷積的過程上,我們再看一遍卷積的過程:
  • 假設下圖的左上角的點和右下角的點標出的區域就是我們要的候選區域,那麼它對應的feature map即是右圖。我們就是利用這個區域兩個點的座標來求出來feature map上的對應的區域即可,當然feature map上的一個點其實是對應了原圖上的一個區域,我們也稱作感受野

七、檢測算法

  • 對於檢測算法,論文中是這樣做到:使用ssss生成~2k2k個候選框,縮放圖像min(w,h)=smin(w,h)=s之後提取特徵,每個候選框使用一個4層的空間金字塔池化特徵,網絡使用的是ZF5ZF-5SPPNetSPPNet形式。之後將 12800d12800d 維度的特徵輸入全連接層,SVM的輸入爲全連接層的輸出。
  • 這個算法可以應用到多尺度的特徵提取:先將圖片resizeresize到五個尺度:4805766888641200480,576,688,864,1200,加自己6個。然後在map window to feature map一步中,選擇 ROIROI 框尺度在{6個尺度}中大小最接近 224×224224×224 的那個尺度下的feature maps中提取對應的roiroi featurefeature。這樣做可以提高系統的準確率。

八、完整的SPP-Net

  • 最後,用一張圖來完整的描述SPP-Net。

參考博客

這裏參考了以下作者的文章,這裏表示感謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章