1. 程式人生 > >SPP-Net論文學習(2)

SPP-Net論文學習(2)

部落格地址:http://blog.csdn.net/u011534057/article/details/51219959

CNN網路需要固定尺寸的影象輸入,SPPNet將任意大小的影象池化生成固定長度的影象表示,提升R-CNN檢測的速度24-102倍。

固定影象尺寸輸入的問題,擷取的區域未涵蓋整個目標或者縮放帶來影象的扭曲。事實上,CNN的卷積層不需要固定尺寸的影象,全連線層是需要固定大小輸入的,因此提出了SPP層放到卷積層的後面,改進後的網路如下圖所示:
這裡寫圖片描述

SPP是BOW的擴充套件,將影象從精細空間劃分到粗糙空間,之後將區域性特徵聚集。在CNN成為主流之前,SPP在檢測和分類的應用比較廣泛。SPP的優點:1)任意尺寸輸入,固定大小輸出,2)層多,3)可對任意尺度提取的特徵進行池化。

說下池化,其實池化很容易理解,先看圖:


R-CNN提取特徵比較耗時,需要對每個warp的區域進行學習,而SPPNet只對影象進行一次卷積,之後使用SPPNet在特徵圖上提取特徵。結合EdgeBoxes提取的proposal,系統處理一幅影象需要0.5s。

SPP層的結構如下,將緊跟最後一個卷積層的池化層使用SPP代替,輸出向量大小為kM,k=#filters,M=#bins,作為全連線層的輸入。至此,網路不僅可對任意長寬比的影象進行處理,而且可對任意尺度的影象進行處理。尺度在深層網路學習中也很重要。
這裡寫圖片描述

網路訓練: 
multi-size訓練,輸入尺寸在[180,224]之間,假設最後一個卷積層的輸出大小為a

×a,若給定金字塔層有n×n 個bins,進行滑動窗池化,視窗尺寸為win=a/n,步長為str=a/n,使用一個網路完成一個完整epoch的訓練,之後切換到另外一個網路。只是在訓練的時候用到多尺寸,測試時直接將SPPNet應用於任意尺寸的影象。


如果原圖輸入是224x224,對於conv5出來後的輸出,是13x13x256的,可以理解成有256個這樣的filter,每個filter對應一張13x13的reponse map
如果像上圖那樣將reponse map分成4x4 2x2 1x1三張子圖,做max pooling後,出來的特徵就是固定長度的(16+4+1)x256那麼多的維度了。
如果原圖的輸入不是224x224,出來的特徵依然是(16+4+1)x256


直覺地說,可以理解成將原來固定大小為(3x3)視窗的pool5改成了自適應視窗大小,視窗的大小和reponse map成比例,保證了經過pooling後出來的feature的長度是一致的

Conclusion:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

輸入層:一張任意大小的圖片,假設其大小為(w,h)。

輸出層:21個神經元。

也就是我們輸入一張任意大小的特徵圖的時候,我們希望提取出21個特徵。空間金字塔特徵提取的過程如下:


圖片尺度劃分

如上圖所示,當我們輸入一張圖片的時候,我們利用不同大小的刻度,對一張圖片進行了劃分。上面示意圖中,利用了三種不同大小的刻度,對一張輸入的圖片進行了劃分,最後總共可以得到16+4+1=21個塊,我們即將從這21個塊中,每個塊提取出一個特徵,這樣剛好就是我們要提取的21維特徵向量。

第一張圖片,我們把一張完整的圖片,分成了16個塊,也就是每個塊的大小就是(w/4,h/4);

第二張圖片,劃分了4個塊,每個塊的大小就是(w/2,h/2);

第三張圖片,把一整張圖片作為了一個塊,也就是塊的大小為(w,h)

空間金字塔最大池化的過程,其實就是從這21個圖片塊中,分別計算每個塊的最大值,從而得到一個輸出神經元。最後把一張任意大小的圖片轉換成了一個固定大小的21維特徵(當然你可以設計其它維數的輸出,增加金字塔的層數,或者改變劃分網格的大小)。上面的三種不同刻度的劃分,每一種刻度我們稱之為:金字塔的一層,每一個圖片塊大小我們稱之為:windows size了。如果你希望,金字塔的某一層輸出n*n個特徵,那麼你就要用windows size大小為:(w/n,h/n)進行池化了。

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


-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Note :BoW -> SPM

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SPPNet對ImageNet2012分類結果 


1).對已有網路增加SPP層提升系能,包括ZF-5,Convnet-5,Overfeat-5/7,單尺度和多尺度輸入影象的實驗結果top-1及top-5 error如下表所示,第一個提出多尺度輸入影象訓練網路
這裡寫圖片描述

2).使用全圖作為SPPNet的輸入及224*224影象中心的crop對比,網路使用ZF-5,Overfeat-7,結果如下表 
這裡寫圖片描述

3).與其他方法在ImageNet分類的對比 
這裡寫圖片描述

SPPNet for Object Detection 
R-CNN重複使用深層卷積網路在~2k個視窗上提取特徵,特徵提取非常耗時。SPPNet比較耗時的卷積計算對整幅影象只進行一次,之後使用spp將視窗特徵圖池化為一個固定長度的特徵表示。

檢測演算法使用ss生成~2k個候選框,縮放影象min(w,h)=s之後提取特徵,每個候選框使用一個4層的空間金字塔池化特徵,網路使用的是ZF-5的SPPNet形式。之後將12800d的特徵輸入全連線層,SVM的輸入為全連線層的輸出。SVM如下使用,正樣本為groundtruth,負樣本與正樣本的IoU<0.3,訓練20類樣本只需1h。使用ZF-5與R-CNN對比實驗結果如下:
這裡寫圖片描述

如何訓練網路

理論上說,SPP-net支援直接以多尺度的原始圖片作為輸入後直接BP即可。實際上,caffe等實現中,為了計算的方便,輸入是固定了尺度了的。
所以為了使得在固定輸出尺度的情況下也能夠做到SPP-net的效果,就需要定義一個新的SSP-layer
作者以輸入224x224舉例,這時候conv5出來的reponse map為13x13,計算出來的步長如下圖所示。

具體的計算方法,看一眼2.3的Single-size training部分就明白了。
如果輸入改成180x180,這時候conv5出來的reponse map為10x10,類似的方法,能夠得到新的pooling引數。
兩種尺度下,在SSP後,輸出的特徵維度都是(9+4+1)x256,之後接全連線層即可。
訓練的時候,224x224的圖片通過隨機crop得到,180x180的圖片通過縮放224x224的圖片得到。之後,迭代訓練,即用224的圖片訓練一個epoch,之後180的圖片訓練一個epoth,交替地進行。

如何測試網路

作者說了一句話:Note that the above single/multi-size solutions are for training only. At the testing stage, it is straightforward to apply SPP-net on images of any sizes.
筆者覺得沒有那麼簡單吧,畢竟caffe對於test網路也是有固定尺度的要求的。

實驗

之後是大量的實驗。

分類實驗

如下圖,一句話概括就是,都有提高。

一些細節:

  • 為了保證公平,test時候的做法是將圖片縮放到短邊為256,然後取10crop。這裡的金字塔為{6x6 3x3 2x2 1x1}(筆者注意到,這裡算是增加了特徵,因為常規pool5後來說,只有6x6;這裡另外多了9+4+1個特徵)
  • 作者將金字塔減少為{4x4 3x3 2x2 1x1},這樣子,每個filter的feature從原來的36減少為30,但依然有提高。(筆者認為這個還是保留意見比較好)
  • 其實這部分的實驗比較多,詳見論文,不在這裡寫了。
  • 在ILSVRC14上的cls track,作者是第三名

定位實驗

這裡詳細說說筆者較為關心的voc07上面的定位實驗
用來對比的物件是RCNN。
方法簡述:

  • 提取region proposal部分依然用的是selective search
  • CNN部分,結構用的是ZF-5(單尺度訓練),金字塔用了{6x6 3x3 2x2 1x1},共50個bin
  • 分類器也是用了SVM,後處理也是用了cls-specific regression

所以主要差別是在第二步,做出的主要改進在於SPP-net能夠一次得到整個feature map,大大減少了計算proposal的特徵時候的運算開銷。
具體做法,將圖片縮放到s∈{480,576,688,864,1200}的大小,於是得到了6個feature map。儘量讓region在s集合中對應的尺度接近224x224,然後選擇對應的feature map進行提取。(具體如何提取?後面的附錄會說)

最後效果如圖:

準確率從58.5提高到了59.2,而且速度快了24x
如果用兩個模型綜合,又提高了一點,到60.9

附錄

如何將影象的ROI對映到feature map?

說實話,筆者還是沒有完全弄懂這裡的操作。先記錄目前能夠理解的部分。
總體的對映思路為:In our implementation, we project the corner point of a window onto a pixel in the feature maps, such that this corner point (in the image
domain) is closest to the center of the receptive field of that pixel.
略繞,我的理解是:

  • 對映的是ROI的兩個角點,左上角和右下角,這兩個角點就可以唯一確定ROI的位置了。
  • 將feature map的pixel映射回來圖片空間
  • 從映射回來的pixel中選擇一個距離角點最近的pixel,作為對映。

如果以ZF-5為例子,具體的計算公式為:

這裡有幾個變數

  • 139代表的是感受野的直徑,計算這個也需要一點技巧了:如果一個filter的kernelsize=x,stride=y,而輸出的reponse map的長度是n,那麼其對應的感受野的長度為:n+(n-1)*(stride-1)+2*((kernelsize-1)/2)
  • 16是effective stride,這裡筆者理解為,將conv5的pixel對映到圖片空間後,兩個pixel之間的stride。(計算方法,所有stride連乘,對於ZF-5為2x2x2x2=16)
  • 63和75怎麼計算,還沒有推出來

SPP詳解
Reference Link:http://blog.csdn.net/xyy19920105/article/details/50817725

SPP網路,我不得不要先說,這個方法的思想在Fast RCNN, Faster RCNN上都起了舉足輕重的作用。SPP網路主要是解決深度網路固定輸入層尺寸的這個限制,也從各個方面說明了不限制輸入尺寸帶來的好處。文章在一開始的時候就說明了目前深度網路存在的弊端:如果固定網路輸入的話,要麼選擇crop策略,要麼選擇warp策略,crop就是從一個大圖扣出網路輸入大小的patch(比如227×227),而warp則是把一個bounding box的內容resize成227×227 。無論是那種策略,都能很明顯看出有影響網路訓練的不利因素,比如crop就有可能crop出object的一個部分,而無法準確訓練出類別,而warp則會改變object的正常寬高比,使得訓練效果變差。接著,分析了出深度網路需要固定輸入尺寸的原因是因為有全連結層,不過在那個時候,還沒有FCN的思想,那如何去做才能使得網路不受輸入尺寸的限制呢?Kaiming He 大神就想出,用不同尺度的pooling 來pooling出固定尺度大小的feature map,這樣就可以不受全連結層約束任意更改輸入尺度了。下圖就是SPP網路的核心思想:
通過對feature map進行相應尺度的pooling,使得能pooling出4×4, 2×2, 1×1的feature map,再將這些feature map concat成列向量與下一層全連結層相連。這樣就消除了輸入尺度不一致的影響。訓練的時候就用常規方法訓練,不過由於不受尺度的影響,可以進行多尺度訓練,即先resize成幾個固定的尺度,然後用SPP網路進行訓練,學習。這裡講了這麼多,實際上我想講的是下面的 東西, SPP如何用在檢測上面。論文中實際上我覺得最關鍵的地方是提出了一個如何將原圖的某個region對映到conv5的一種機制,雖然,我並不是太認可這種對映機制,等下我也會說出我認為合理的對映方法。論文中是如何對映的,實際上我也是花了好久才明白。
首先,我想先說明函式這個東東,當然我不是通過嚴謹的定義來說明。什麼是y=f(x),我認為只要輸入x,有一組固定的操作f,然後產生一個對應的y,這樣子就算是函式。根據輸入有一個一一對應的輸出,這就是函式。這樣理解的話,卷積也是函式,pooling也是函式。當然我並不想說明函式是什麼,什麼是函式,實際上我想強調的是一一對應這樣的關係。大家都知道,現在默許的無論是卷積還是pooling(無stride),都會加相應的pad,來使得卷積後的尺寸與卷積前相同,當然這種做法還個好處就是使得邊緣不會只被卷積一次就消失了~這樣子的話,實際上原圖與卷積後的圖就是一一對應的關係。原圖的每一個點(包括邊緣)都可以卷積得到一個新的點,這就是一一對應了。如下圖所示(自己畫得太醜):
這裡寫圖片描述這裡寫圖片描述
綠色部分是圖片,紫色部分是卷積核。 
這裡寫圖片描述 
如上圖可以看出,藍色的區域是原圖區域,而紅色的區域是padding區域,紫色的是卷積核。卷積後得到的區域與原區域是一一對應的。而卷積或pooling增加stride的話就相當與原圖先進行卷積或池化,再進行sampling,這還是能一一對應的,就這樣原圖的某個區域就可以通過除以網路的所有stride來對映到conv5後去區域。終於把這裡講出來了,大家如果直接按照函式的一一對應關係去理解,很容易理解為什麼原圖的區域除以所有的stride就是對映到conv5的區域。這樣子就可以在原圖上的一些操作放在conv5上進行,這樣可以減小任務複雜度。不過,我並不是太認可這種對映機制,這種對映只能是點到點的關係,不過我覺得從原圖的某個區域R對映到conv5的區域r,應該r對R敏感,換句話說,應該r感受野應該與R有交集。這樣子的話,示意圖如下:
這裡寫圖片描述 
其中藍色的為conv的神經元感受野,紅色的是原圖的某個感興趣區域,而黑色框我才認為是要對映到conv5的區域。 
使用SPP進行檢測,先用提候選proposals方法(selective search)選出候選框,不過不像RCNN把每個候選區域給深度網路提特徵,而是整張圖提一次特徵,再把候選框對映到conv5上,因為候選框的大小尺度不同,對映到conv5後仍不同,所以需要再通過SPP層提取到相同維度的特徵,再進行分類和迴歸,後面的思路和方法與RCNN一致。實際上這樣子做的話就比原先的快很多了,因為之前RCNN也提出了這個原因就是深度網路所需要的感受野是非常大的,這樣子的話需要每次將感興趣區域放大到網路的尺度才能卷積到conv5層。這樣計算量就會很大,而SPP只需要計算一次特徵,剩下的只需要在conv5層上操作就可以了。當然即使是這麼完美的演算法,也是有它的瑕疵的,可能Kaiming He大神太投入 SPP的功效了,使得整個流程框架並沒有變得更加完美。首先在訓練方面,SPP沒有發揮出它的優勢,依舊用了傳統的訓練方法,這使得計算量依舊很大,而且分類和bounding box的迴歸問題也可以聯合學習,使得整體框架更加完美。這些Kaiming He都給忽略了,這樣也就有了第二篇神作 Fast RCNN。

Reference Link http://zhangliliang.com/2014/09/13/paper-note-sppnet/