sppNet論文學習


Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 深度神經網絡中用於視覺識別的空間金字塔池化

 

 1.INTRODUCTION

一般的深度神經網絡都會設定一個固定的輸入圖片大小,比如 224*224,因此一般在數據處理時我們會將輸入的數據進行裁剪或按比例縮放,在這種情況下就會導致輸入的圖片出現目標內容缺失或者是目標內容發生形變,即尺度誤差或者形變誤差,導致檢測精確度的下降

所以提出了一種帶着另一種池化策略——空間金字塔池化的網絡,用來減少上面固定圖片大小的需要。該新的網絡結構叫做SPP-net,不管輸入圖片的大小/比例是什么,都能夠生成固定長度的表征representation。金字塔池化對目標變形是魯棒的。因為這些優點,SPP-net應該改善所有基於CNN的圖像分類方法。在ImageNet 2012數據集中,我們證明了SPP-net能夠增強各種各樣的有着不同設計的CNN網絡結構的精度,在PASCAL VOC 2007和Caltech101數據集中,SPP-net使用單一的完整圖像表示並且不使用微調,得到了最優的分類結果

SPP-net對於目標檢測也同樣十分重要。使用SPP-net,我們僅從整個圖像中計算一次feature maps,然后在隨機區域(即子圖片sub-images)上池化特征,用來為訓練這個detectors生成固定長度的表征representation。該方法避免了重復計算卷積特征。在處理測試圖像時,該方法比R-CNN快24-102倍,並且在PASCAL VOC 2007數據集中獲得更好的效果

在ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 2014比賽中,一共有38個隊伍,該方法在目標檢測中排名第二,在圖片分類中排名第三

 

該方法解決了一個CNNs在訓練和測試時都會遇見的技術問題:就是需要輸入一個固定的圖片大小(如224*224),其限制了圖片的寬高比(aspect ratio)和輸入圖片的大小。所以當提供的是任意大小的圖片時,目前主要的方法就是將圖片修改為固定大小,要么通過裁剪圖片,要么通過變形圖片來得到這個效果,如下圖所示:

但是剪切的區域可能並不 完全包含整個目標,就像上面的車一樣,只有一部分的車身;同時變形的內容可能會導致不想要的幾何扭曲。因為內容的缺失和扭曲,識別精度也可能會損失。除此之外,一個預先定義好的大小在目標大小不同時就不適用了。因此固定的輸入大小忽視了上面這些關於大小的問題

為什么CNN要固定輸入大小呢?一個CNN主要包含兩個部分:卷積層和接下來的全連接層。卷積層使用滑動窗口方法進行操作,輸出的feature maps表示了activation的空間布置,如下圖對feature maps的可視化:

 

實際上卷積層是不需要固定的輸入圖片大小的,並且能夠生成任意大小的feature maps。

在另一方面,根據全連接層的定義,它們需要固定的大小/長度輸入。因此固定大小的限制僅來自在網絡更深階段的全連接層。

 

所以我們將介紹SPP(spatial pyramid pooling)這個能夠網絡移除固定大小限制的方法。具體來說,我們將添加一個SPP層在最后一個卷積層的后面。該SPP層吃話卷積層的輸出feature,並生成固定長度的輸出,用該輸出作為全連接層(或其他分類器)的輸入。換句話說,我們在網絡層次的較深階段(即卷積層和全連接層之間)執行"聚合"來避免在一開始對輸入圖片的剪切和變形的需要。下圖就展示了該網絡結構添加SPP層后的變化,該網絡結構叫做SPP-net:

 

spatial pyramid pooling(別名有spatial pyramid matching和SPM)作為在機器視覺領域最成功方法之一的Bag-of-Words(BoW)模型的一個擴展。它從精細到粗糙,將圖片划分成一個個小部分,並將本地特征集合到上面。在目前的CNNs流行之前,SPP在一段時間內是用於分類和檢測的,具有領先地位並在競爭中獲勝的系統中重要的成分。然而SPP並沒有被考慮作為CNNs的內容。可見SPP對於深度CNNs有着幾個顯著的特性:

  • 不管輸入大小是什么,SPP都能夠生成固定長度的輸出。然而之前深度網絡的滑動窗口池化方法是做不到這點的
  • SPP使用了多級空間箱(multi-level spatial bins),然后滑動窗口池化方法僅使用一個窗口大小。多級池化方法顯示對目標變形有着較強的魯棒性
  • 多虧輸入大小的靈活性,SPP能夠池化從不同大小中抽取出來的特征

實驗證明以上因素提高了深度網絡的檢測精度

 

SPP-net不僅讓從隨機大小圖片/窗口生成用於測試的表征representation成為可能,還允許在訓練時使用不同大小和比例的圖像。使用不同大小圖片訓練能夠增加scale-invariance和減少過擬合。

對於接受不同輸入大小的一個單一網絡,我們通過共享所有參數的多個網絡來近似它,然而這些網絡中的每一個都使用固定的輸入。即雖然SPPnet能夠接受任意尺度圖片的輸入,但是訓練的難點在於現在所有的深度學習框架都需要固定的輸入,所以這里提出了一個簡單的多尺度訓練方法。在每一個迭代中,使用給定的輸入大小訓練網絡,並且在下一個迭代中轉換成另一個輸入大小。實驗表明,該多尺度訓練與傳統的單尺度訓練一樣進行了收斂,且測試精度較高

 

SPP在優勢在於對於具體的CNN設計是正交的。在ImageNet 2012數據集中,一系列使用沒有SPP的對應項進行的的控制實驗證明了SPP改進了目前發布的4個不同CNN結構。這些結構有不同的過濾器的數量/大小、strides、深度或其他設計。因此,我們有理由推測SPP應該能夠改進更復雜(更深入和更大)的卷積架構。

 

SPP-net在目標檢測中

在主要的目標檢測方法R-CNN[7]中,通過深度卷積網絡提取候選窗口的特征。該方法對VOC和ImageNet數據集均有較好的檢測精度。但是R- CNN的特征計算是費時的,因為它反復地將深度卷積網絡應用到每幅圖像數千個扭曲區域的原始像素上。

在本文中,我們證明了我們只需要在整個圖像上運行卷積層一次(無論窗口的數量),然后通過SPP-net在特征圖feature maps上提取特征。這種方法的速度比R-CNN快100多倍。注意,在特征圖feature maps(而不是圖像區域)上訓練/運行檢測器detector實際上是一個更流行的想法。但是SPP-net繼承了深度CNN特征圖feature maps的強大功能,以及SPP對任意窗口大小的靈活性,使其具有出色的准確性和效率。在我們的實驗中,基於spp-net的系統(建立在R-CNN管道上)的計算速度比R-CNN快24-102倍,但具有更好或相近的精度。采用最新的EdgeBoxes[25]快速提案方法,我們的系統處理一個圖像需要0.5秒(包括所有步驟)。這使得我們的方法在實際應用中很實用。

 

2.DEEP NETWORKS WITH SPATIAL PYRA- MID POOLING

1)Convolutional Layers and Feature Maps

考慮使用最流行的7層結構,前五層為卷積層,並且每個卷積層后面都跟着池化層,后兩層是全連接層,然后是N個輸出的softmax,N為類別的數量。這種深度網絡需要固定的輸入大小,可是我們注意到需要固定的大小只是因為全連接層要求固定長度向量作為輸入。在另一方面,卷積層接受任意大小的輸入。卷積層使用滑動過濾器,而且他們的輸出和輸入有着完全相同的寬高比(aspect ratio),該輸出被叫做feature maps,即特征圖——它們不僅涉及回應的強度,而且還涉及它們的空間位置

在figure 2中,我們可視化了一些特征圖。他們被conv5層的一些過濾器生成。c圖展示了在ImageNet數據集中這些過濾器中的最強的激活圖片。我們可以看見一個過濾器能夠被一些語義內容所激活。比如第55個過濾器(即左邊b圖下面的那張)更容易被一些圓形所激活;第66個過濾器(即右邊b圖上面的那張)更容易被∧這樣的形狀所激活;第118個過濾器(即右邊b圖下面的那張)更容易被∨這樣的形狀所激活。在輸入圖像(即a圖中)中的這些形狀將在相應的位置激活特征圖(即剪頭指向處)。其實就是第55個filter會激活圖像中的圓形,第175個過濾器會激活類似車窗的部分,所以亮光表明處其實就是輸入圖像的車輪和車窗的位置

值得注意的是我們在Figure 2中生成的特征圖是沒有使用固定的輸入大小的。這些通過深卷積層生成的特征圖類似於在傳統方法中的特征圖。在那些方法中,SIFT向量或圖像patches被稀疏抽取並編碼,比如通過向量量化、稀疏編碼或Fisher kernels。這些編碼特征組成了特征圖,然后被Bag-of-words(BoW)池化或空間金字塔。類似地,深層卷積特性也可以用類似的方式進行池化

 

2)The Spatial Pyramid Pooling Layer

卷積層接受任意輸入大小,但是他們生成不同大小的輸出。分類器(SVM/softmax)或全連接層需要固定長度的向量。這樣的向量可以通過Bag-of-words(BoW)方法將這些特征池化在一起來生成。空間金字塔池化方法將BoW改進成能通過在本地空間bins中池化來保持空間信息。這些空間bins有着與圖片大小成比例的大小,所以不管圖片大小是多少,bins的數量是固定的。這與以前深度網絡的滑動窗口池化方法是相反的,以前方法的滑動窗口數量是取決於輸入大小的

為了對任意大小的圖片采用深度網路,我們將替換最后一個池化層,即最后一個卷積層后面的pool5層為空間金字塔池化層。下圖將闡述該方法:

注意:上面的三種不同刻度的划分,即4*4、2*2和1*1,每一種刻度我們稱之為:金字塔的一層

在每一個空間bins中,我們將池化每個過濾器的回應(該論文中使用的是Max pooling)。該空間金字塔池化的輸出是kM維的向量,M為bins的數量,k是上一層卷積層的過濾器數量,這里是256。該固定維度的向量是全連接層的輸入。

 從上圖我們可以看見左邊的bins有16個,中間的bins有4個,右邊的bins有1個,所以計算得到最后的向量維度為 16*256 + 4*256 + 1*256 = 21*256維。這樣無論conv5卷積層的輸出是11*11或13*13或等等,都能夠讓其變為21*256這一個固定長度的向量,作為全連接層的輸入

使用空間金字塔池化后,輸入圖像可以為任何大小。這不僅允許任意寬高比,而且允許任意大小的圖像。我們可以調整輸入圖像為任意大小(比如min(w,h)=180,224,即寬高的最小值),並使用相同的深度網絡。當輸入圖像是不同的大小時,網絡(有着相同過濾器大小)將在不同的大小中抽取特征。大小在傳統方法中起着重要作用,比如SIFT向量經常從多個大小(取決於patches的大小和高斯過濾器)中抽取出來。我們將展示大小scales對深度網絡精度的重要性

有趣的是,最粗糙的金字塔級別僅有1個bins,能夠包含整個圖像。這實際上相當於一個‘global pooling’操作,該操作也在一些並行的工作中進行了研究。在[31]中,[32]采用全局平均池來減小模型大小,同時減小過擬合;在[33]中,在所有fc層之后的測試階段使用全局平均池化,以提高准確性;在[34]中,全局最大池化用於弱監督對象識別。全局池化操作對應於傳統的Bag-of-words方法。

 

3)Training the Network

理論上,上面的網絡結構可以使用標准的后向傳播來進行訓練,不管輸入圖像的大小。但實際上,GPU實現(如cuda-convnet[3]和Caffe[35])最好在固定的輸入圖像上運行。接下來,我們描述了我們的訓練解決方案,它利用了這些GPU實現,同時仍然保留了空間金字塔池化特性。

Single-size training

和之前的工作一樣,我們首先考慮一個網絡,它包含從圖像中截取的固定大小的輸入(224×224)。裁剪是為了增加數據。對於給定大小的圖像,我們可以預先計算空間金字塔池所需的bins大小。考慮conv5之后的特征圖,其大小為a×a(如13×13)。使用金字塔級別的n*n個bins來實現將該池化級別作為滑動窗口池化,窗口的大小為win=⌈a/n⌉,步長為str = ⌊a/n⌋ ,⌈·⌉ 和 ⌊·⌋ 表示向上和向下取整。l級別的金字塔代表實現l個這樣的層。因此下一個全連接層fc6將串聯l個輸出。下面的圖顯示在cuda-convnet風格中配置為3級別的金字塔池化(3*3,2*2,1*1):

因為上一個卷積層conv5的輸出為13*13,所以當pool為3*3時,窗口大小為5*5,步長為4,才能讓輸出為3*3的輸出,以此類推。

我們單一大小single-size訓練的主要目的是支持多級池化行為。實驗表明,這是提高精度的原因之一。

 

Multi-size training

我們的網絡與SPP預計將適用於任何大小的圖像。為了解決訓練中圖像大小變化的問題,我們考慮了一組預定義的大小。我們考慮兩種尺寸:180×180加到224×224。訓練的時候224*224通過裁剪得到,我們沒有選擇從224*224裁剪一個更小的180×180區域,而是將上述224×224區域調整resize為180×180。因此,這兩種尺度下的區域僅在分辨率上不同,而在內容/布局上是相同的。為了使網絡能夠接受180×180的輸入,我們實現了另一個固定大小輸入為180×180的網絡。 在這個例子中,conv5卷積層的輸出特征圖大小為a*a=10*10。然后我們仍然使用公式win=⌈a/n⌉,步長為str = ⌊a/n⌋來實現每個金字塔池化級別。這個180*180輸入網絡的空間金字塔池化層的輸出有着與224*224網絡相同的固定長度。因此,這個180*180輸入網絡有着和224*224網絡每一層完全相同的參數。從另一方面來說,在訓練中我們通過兩個共享參數的固定大小的網絡實現了不同輸入大小的SPP網絡

為了減少從一個網絡(例如,224)切換到另一個網絡(例如,180)的開銷,我們在一個網絡上訓練每個完整迭代epoch,然后切換到另一個網絡(保留所有權重),以完成下一個完整迭代。在實驗中,我們發現這種多尺度訓練的收斂速度與上述單尺度訓練相似。其實就是兩種尺寸的網絡是共享了所有的參數,即用兩種尺寸的輸入訓練出一個網絡,該兩種尺寸圖片輪流訓練網絡,更新參數,以得到該網絡。即先用224*224的圖像訓練一個epoch,再用180*180的圖像訓練一個epoch

我們的多尺寸培訓的主要目的是模擬不同的輸入大小,同時仍然可以利用現有的優化過的固定尺寸的網絡實現。除了上述兩種尺度的實現外,我們還測試了一個變量,該變量使用s×s作為輸入,s在每個epoch中隨機且均勻地從[180,224]采樣。我們在實驗部分報告了這兩種變量的結果。

注意上面單一/多種大小解決方案只用於訓練。在測試階段,就直接將任意大小的圖像應用到SPP網絡中

 

4.SPP-NET FOR OBJECT DETECTION

 上面的部分主要講的是SPP-net在圖像分類中的應用,即在之前的分類網絡中添加一層SPP層即可

下面講的是講其用在目標檢測上,與R-CNN做對比:

參考https://blog.csdn.net/qq_35451572/article/details/80273222

一次特征提取
RCNN是多個regions+多次CNN+單個pooling,而SPP則是單個圖像+單次CNN+多個region+多個pooling

 

 

算法流程:

  • 首先通過選擇性搜索,對待檢測的圖片進行搜索出2000個候選窗口。這一步和R-CNN一樣。
  • 特征提取階段。這一步就是和R-CNN最大的區別了,同樣是用卷積神經網絡進行特征提取,但是SPP-Net用的是金字塔池化。這一步驟的具體操作如下:把整張待檢測的圖片,輸入CNN中,進行一次性特征提取,得到feature maps,然后在feature maps中找到各個候選框的區域,再對各個候選框采用金字塔空間池化,提取出固定長度的特征向量。而R-CNN輸入的是每個候選框,然后在進入CNN,因為SPP-Net只需要一次對整張圖片進行特征提取,速度是大大地快啊。江湖傳說可一個提高100倍的速度,因為R-CNN就相當於遍歷一個CNN兩千次,而SPP-Net只需要遍歷1次。
  • 最后一步也是和R-CNN一樣,采用SVM算法進行特征向量分類識別。

在特征提取上,速度提升了好多,R-CNN是直接從原始圖片中提取特征,它在每張原始圖片上提取2000個Region Proposal,然后對每一個候選區域框進行一次卷積計算,差不多要重復2000次,而SPP-net則是在卷積原始圖像之后的特征圖上提取候選區域的特征。所有的卷積計算只進行了一次,效率大大提高。
缺點
  SPP已有一定的速度提升,它在ConvNet的最后一個卷積層才提取proposal,但是依然有不足之處。和R-CNN一樣,它的訓練要經過多個階段,特征也要存在磁盤中,另外,SPP中的微調只更新spp層后面的全連接層,對很深的網絡這樣肯定是不行的。

5.結論

SPP是一個靈活的解決方案,可以處理不同的規模、大小和寬高比。這些問題在視覺識別中很重要,但在深度網絡環境中卻很少被考慮。提出了一種利用空間金字塔池化層訓練深度網絡的方法。結果表明,該網絡在分類/檢測任務中具有較高的精度,大大加快了基於神經網絡的檢測速度。我們的研究還表明,在基於深度網絡的識別中,許多經過時間檢驗的計算機視覺技術/見解仍然可以發揮重要作用。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM