sppnet

1.Introduction

         R-CNN 作爲CNN引入目標檢測的開篇之作,後來又出現了sppnet ,fast R-CNN,faster R-CNN等一系列目標檢測算法,本次主要學習的是sppnet

         首先介紹一下R-CNN的流程:

         每張圖片通過selectivesearch選出大約2000張候選框,每個候選框單獨輸入CNN做卷積操作,在使用SVM分類,以及最後位置的精修。sppnet就提出能不能在整張圖上提取候選框特徵,這樣在整幅圖上只進行一次卷積。

         總的過程還是:使用selectivesearch得到候選區域---CNN提取候選區域特徵---分類------位置的精修。其中一個亟待解決的就是如何將原始圖像的候選區域映射到特徵圖,在後面我會說到這個問題。第二個問題就是特徵區域在特徵圖上對應得維度不能滿足全連接層的輸入怎麼辦?

之前流行的cnn網絡一般都需要一個固定的輸入尺寸,例如:alexnet(224*224)。而固定的尺寸一般都是通過crop和warp得到,crop可能會獲取不到完整的物體,warp可能會導致物體的扭曲,這兩種方法都有可能導致識別精確率的下降。 cnn之所以需要一個固定的輸入尺寸,是因爲最後的全連接層,卷積層並不需要固定的圖片尺寸。因此本文介紹了spp 層來去除神經網絡對固定尺寸的限制。我們在最後一個卷積層之後加上spp層,然後是全連接層。這樣在網絡的開始就不需要對圖片進行裁剪(crop)或者扭曲(warp)。

下面是spp-net網絡結構:


 spp有幾個突出的優點:

 (1)spp能在輸入尺寸任意的情況下產生固定大小的輸出。
 (2)spp使用多層次的空間箱(bin),而滑動窗口池化只用了一個窗口尺寸。多層次池化對物體的變形十分魯棒

 (3)由於輸入尺寸的靈活性,spp可以池化從各種尺度抽取出特徵。

         spp-net不僅在測試階段允許任意尺寸的輸入能夠產生表示,也允許在訓練階段有各種尺度,多尺寸訓練可以提高縮放不變性以及減少過擬合。我們開發了一個簡單的多尺度訓練方法: 爲了使一個單一網絡可以接受不同尺寸的輸入,我們通過共享所有參數的多個網絡來近似它,這些網絡中的每一個都是使用固定輸入大小來訓練。在每一個epoch,使用一個給定輸入大小去訓練網絡,下一個epoch時切換到另一個輸入大小。實驗表明,這種多尺度訓練比傳統的但尺度訓練一樣收斂,並導致更好的測試精度。(我覺得應該就是同一個網絡在不同的epoch切換不同的輸入尺度)

 spp-net在圖像檢測方面也表現優異。目前領先的物體檢測方法時R-CNN,但時R-CNN使用selctivesearch方式選擇了多個候選區域,對於每個候選區域都會單獨使用一次卷積神經網絡,因此是費時的。而在本文中,我們只需要在整張圖上運行一次卷積神經網絡,然後使用spp-net在特徵圖上抽取特徵,這個方法大大降低了耗時。


2.空間金字塔池化層( the spatial pooling layer )

要適應不同的尺寸輸入,我們在最後的卷積層之後加上spp 層。因爲對於不同的尺寸輸入,在卷積層之後會有不同尺寸的輸入,我們通過spp層替換掉最後的池化層,爲全連接層獲得固定的輸入大小的向量。金字塔的輸出是KM維向量,M代表塊的數量,K代表最後一層卷積層的過濾器的數量,這個固定維度的向量就是全連接層的輸入。



下面給出一個對空間金字塔具體解釋的事例,如下圖:


所謂金字塔池化,就是沿着金字塔的底端向頂端一層一層做池化。對於一個給定尺寸的圖像,我們先計算空間金字塔池化所需要的塊的大小,試想一個尺寸是a*a(也就是13*13)的conv5之後的特徵圖,對於n*n塊的金字塔級,我們實現一個滑動窗口池化的過程,windows=上取整[a/n],  stride=下取整[a/n],對於L層金字塔,我們實現 L個這樣的層,然後將L個層的輸出進行連接輸出給全連接層。

        下圖中是一個3層金字塔(分別是1*1塊,2*2塊,3*3塊)的實例,一個conv5後特徵圖尺寸爲13*13*256,如果像下圖這樣將feature map分成1*1(金字塔底座),2*2(金字塔中間),3*3(金字塔頂)三張子圖,分別做max pooling後,當然每個池化的stride和filter大小可能不同,出來的特徵是(1*1+2*2+3*3)*256 =3584維,單個窗口將產生輸出向量3584維。 這個表示將傳遞給全連接層。無論輸入尺度是多大,都得到固定的輸出尺度,即3584,只不過每次窗口大小可能不同,就像之前所說的那樣。輸入是a*a,輸出是n*n,windows=上取整[a/n],  stride=下取整[a/n],

  



3.訓練網絡

        我們實現了但尺度的訓練和多尺度訓練,但尺度訓練是224*224大小,多尺度訓練先考慮了兩個尺寸:180*180,224*224,我們使用的是縮放,而不是裁剪,即把224*224縮放到180*180,這樣不同尺度的區域僅僅是分辨率的不同,內容和佈局上並沒有不同。對於180*180的網絡,我們實現了另一個固定尺寸的網絡,conv5輸出的特徵圖是a*a=10*10,windows=上取整[a/n],  stride=下取整[a/n],因此,最終180網絡的空間金字塔的輸出大小和224*224網絡的金字塔輸出大小相同。多尺度訓練時,爲了降低一個從一個網絡到另一個網絡的開銷,我們再每個網絡上訓練一個完整的epoch(權重保留),實驗中,我們發現多尺度訓練的收斂速度和但尺寸差不多。

       多尺度訓練主要是 爲了保證充分利用已經優化好的固定尺寸網絡的同時,模擬不同的輸入尺寸。除了上述兩個尺度的實現,我們還在每個epoch中測試了不同的輸入大小,從180到224均勻選取。

       當然,上述單尺度或者多尺度只是針對於訓練。在測試階段,是直接對各種尺寸的圖像應用spp-net的。


4.實驗結果:

  (1)多層次池化提升準確率

 (2)多尺寸訓練提升準確率

        (3)全圖像表示提升準確率


5.目標檢測

      使用spp進行目標檢測,先用selectiveserach的fast模式對每張圖片獲取2000個候選區域。不過,不像R-CNN把每個候選區域送入神經網絡提取特徵,而是把整張圖提一次特徵,再把候選框映射到conv5層上,由於候選框的大小不同,映射到conv5後仍有不同,因此需要spp層提取相同的維度,再進行分類和迴歸,後面的與R-CNN類似。由於spp-net只需要對整張圖提取一次特徵,剩下的只需要再conv5層上操作就可以了。

        回答開頭的第一個問題,如何將原始圖像的候選區域映射到特徵圖?

此處的映射概念跟overfeat網絡是一樣的,overfeat也是從卷積特徵圖中抽取特徵,不同的是overfeat需要預定義好窗口尺寸,而spp-net的特徵抽取可以在任意尺寸的深度卷積特徵圖上。

這裏我對映射的概念做出解釋,如下圖:

  第一行中對14*14*3的圖片進行卷積,池化,最後獲得了1*1*4,也就是整張圖被提取相應的特徵維度爲1*1*4

          第二行中對16*16*3的圖片檢測,先使用14*14卷積核卷積,經過一系列步驟獲得2*2*4,對於左上角藍色的部分,最終被映射爲2*2*4的左上角的1*1*4部分, 也就是它對應的特徵圖。步長爲2,窗口向右滑動,藍色的部分最終被映射爲右上角1*1*4部分。。。。

         由於第二行對一張16*16的圖片 分成了4部分,每部分分別進行了運行了一次卷積神經網絡,這樣是非常耗時的。

         第三行就引出了我們不需要把圖片分成多個子集,而是把他們作爲整張圖輸入給卷積神經網絡進行計算,這樣輸入圖片的區域還是會對應feature map上相應的區域,這種映射是一一對應的。也就產生了爲什麼sppnet中可以對整張圖進行卷積,而不同的候選區域可以映射到conv5層(特徵圖)的不同位置了。


     




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