Faster RCNN系列介紹

語言: CN / TW / HK

RCNN網路

RCNN網路是Ross B. Girshick大神2014年提出的,是第一個基於深度學習的目標檢測演算法,是基於深度特徵的。它跟傳統的目標識別不同的就是使用深度學習的特徵代替了傳統的基於低層次的顏色、紋理的特徵提取。

因為RCNN並沒有對整個傳統目標檢測的框架進行改進或者優化,因此RCNN網路依然存在傳統目標檢測演算法所存在的問題,如檢測速度或者效率低下,檢測精度雖然相對於原先的目標檢測演算法有了一定的改善,但是依然難以滿足實際的需要。這也是後續演算法重要的改進方向。

RCNN網路是如何使用深度學習特徵的。

  1. RCNN在使用深度學習特徵的時候並沒有直接使用卷積神經網去進行訓練,而是使用了預訓練模型AlexNet來訓練分類模型,而這個模型是在ImageNet上訓練好的模型。
  2. 在RCNN這個模型的分類任務上進行一個模型的fine-tuning(遷移)。在這個遷移的過程中主要將FC層去掉。因為AlexNet是面向1000個分類任務進行分類的,而在目標檢測或者VOC資料集上,目標數為20,加上背景是21類。因此需要將FC層去掉,因為FC層的引數不同,只保留了主幹網路層,也就是AlexNet卷積層的這些特徵,利用這樣的特徵來進行模型進一步的訓練。針對於CNN提取之後的特徵,RCNN網路依然採用SVM分類器以及Bounding box迴歸的方式來得到最終的候選區域的類別和定位的位置資訊。
  3. 在提取候選區域的時候採用選擇性搜尋策略而不是採用滑動視窗的策略。在採用滑動視窗策略一方面要考慮滑動視窗步長以及滑動視窗的大小,此時如果採用滑動視窗的策略,往往意味著要計算非常多的候選區域,而計算候選區域數量的增大,則直接帶來了計算效能上的下降。整個目標檢測的流程耗時會變得非常大。RCNN採用了選擇性搜尋的策略來提取候選框。
    1. 生成區域集R,具體參考論文《Efficient Graph-Based Image Segmentation》,採用區域分割的模型,進行區域分割之後就能得到一系列分割好的區域,這些區域往往是影象中某些可能的物體。
    2. 計算區域集R裡每個相鄰區域的相似度S={s1,s2,...}
    3. 找出相似度最高的兩個區域,將其合併為新集,新增進R,減少生成的區域的個數。如何判斷兩個區域的相似度,通常也是採用顏色、紋理這樣一些低層次的計算機視覺中的一些特徵。
    4. 從S中移除所有與3中有關的子集
    5. 計算新集與所有子集的相似度
    6. 跳至3,直至S為空,沒有相似區域了,就終止整個迭代的過程。最終得到的子集就是我們需要提取的候選框的集合。
  4. 訓練SVM分類器:每個類別對應一個SVM,有關SVM的內容可以參考機器學習演算法整理(三) 中的支撐向量機SVM
  5. 迴歸器精修候選框位置:利用線性迴歸模型判定框的準確度

對於一個候選區域,可能會存在上圖中給出的一些例子。線性迴歸模型將會對dx、dy、dw、dh這四個值進行迴歸。這四個值,我們可以將其理解為差分的值,差分值表示了當前的候選框的偏移。如果候選框能夠完整且非常規整的檢測到候選目標,那麼此時所有的偏移值都是0。如果候選框往一個方面偏了,那麼此時dx就會預測出來相應的偏差的值,比如上圖中中間的貓預測出來dx值為0.25。如果候選框大了,檢測的目標小,就意味著預測的框的dw或者dh會存在一定的冗餘。比如上圖中第三幅圖中的貓的邊框寬度是明顯大於候選目標的,則dw預測出來的為-0.125表示寬度要減少0.125,而高度是剛好的,則dh為0。

最終通過RCNN就能夠得到一系列的候選框,再通過NMS演算法來對候選框進行進一步的篩選和合並,最終得到目標檢測的輸出。

  • RCNN缺點
  1. 候選框選擇演算法耗時嚴重,很難做到實時計算。
  2. 重疊區域特徵重複計算
  3. 分步驟進行,過程繁瑣。這裡我們最少要分別訓練三個部分——CNN,SVM,Reg。過程相對於一個端到端的網路模型就會變得非常複雜。整個pipleline在搭建時也會存在一個非常複雜的過程,比如在訓練SVM的時候就需要專門去生成SVM的樣本,但是我們生成的樣本可能同我們利用CNN卷積特徵提取出來的樣本會存在一定的差異。這個時候就會存在一個分佈上的問題。我們在採用分步驟再採用獨立模型訓練的時候,將整個模型拼到一起的時候,可能就會存在效能上的一些損失。一個比較好的做法就是將整個pipleline搭起來,將CNN的輸出作為SVM的輸入,將SVM的輸出作為Reg迴歸網路的輸入。此時我們就需要訓練三種不同的模型。這個過程相對於一個完整的端到端的模型而言就會比較複雜。而且我們需要構造相應的樣本,整個過程也會變得相應的繁瑣。

SPPNet

針對RCNN的缺點,SPPNet進行了一定程度的改進。這裡的改進主要體現在其中的一點上,就是如何對卷積特徵進行共享。在SPPNet中提出了一個金字塔池化層,利用這樣一個金字塔池化層就能夠完成卷積特徵的共享。我們來具體看一下這個金字塔池化層是如何實現的。

在上圖中表示了原始的RCNN在進行目標檢測時候,它所要完成的一個特徵提取表示的一個過程。首先我們將輸入影象Image理解為候選區域,針對輸入影象進行候選區域的提取,這裡通常會採用Crop/warp操作。Crop就是對候選區域進行摳圖,然後將圖片resize到一個固定的尺寸。因為採用了摳圖和resize的過程,因此我們獲取到的候選區域可能就會存在一些畸變和扭曲。接下來將resize過的固定尺寸的圖片輸入到卷積神經網中進行特徵的提取,最後通過一個FC層得到一個輸出的向量。這裡採用FC層就意味著卷積層輸出影象的feature map必須保持一致,對於不同的候選區域我們需要保證它輸出的卷積層的feature map的大小保持一致。因為這裡採用了同一個卷積神經網,就意味著卷積神經網的輸入的影象的尺寸必須保持一致,因此必須採用resize的操作來保證輸入的影象在同一個尺寸上。由於採用了resize,就會導致輸入的候選區域進行一定程度的扭曲和拉伸,這樣也會在一定程度上影響最終提取出來的特徵。

另外將候選區域的提取放在了影象輸入的下一步,這裡通常針對不同的候選區域,會分別採用一次卷積來完成這樣一個特徵提取的過程,就意味著會有一些計算量的重複。這也是RCNN網路所面臨的一個非常嚴重的問題,會存在計算量的浪費。

SPPNet針對於上圖的流程給出了一個優化。它的優化主要體現在了這樣的幾點上,一對輸入的影象採用不同的尺寸來進行影象的輸入。採用不同尺寸影象的輸入就會得到不同尺寸的feature map大小的輸出。針對不同尺寸feature map大小的輸入,如何得到一個同樣大小的FC層大小的輸入,這裡就引入了一個spp層。

具體spp層的結構如下

上圖可以看到分別給出了三個不同的尺寸——16*256-d、4*256-d、256-d。對於這三種不同尺寸,我們分別提取不同維度的特徵。如何保證不同尺寸輸入到FC層之後,它們的大小依然是一致的呢?如果我們將卷積層的結果作為FC層的輸入,就意味著輸入影象尺寸大小不一樣的話,得到的三個不同尺度上的影象依然會有一些區別。這樣的一些區別就意味著在輸入FC層的時候,引數量就會存在不同,就會產生錯誤。SPPNet在處理這個問題的時候,實際上將每一個卷積層的輸出固定的通過spp層之後固定的得到一個21維的特徵,這個21維實際上是針對於每一個feature map而言的,每一個channel通道而言的,具體卷積層輸出的特徵數為21*channel數量。針對於其中的一個feature map,如上圖中的第一個16*256-d的特徵圖,我們平均的將它分成一個4*4的網格,這樣的4*4的網格,每一個網格都得到一個特徵點的輸出,無論它的尺寸多大,此時它的輸出都是16;上圖中的第二個4*256-d的特徵圖,我們為了得到4個特徵點的話,就將feature map劃分成2*2的網格,每一個網格得到一個特徵點,這樣的feature map最終能得到4個特徵點,如果是256個通道的話,最終能得到4*256個特徵向量;上圖中的第三個256-d的特徵圖,它只有一個特徵向量,那我們就得到1*256維的特徵向量。通過這樣的一個spp層,我們就能忽略feature map的大小,得到固定尺寸的輸出,這樣固定長度的輸出就能夠作為FC層的輸入。通過這樣一個spp層就能夠對不同候選區域的尺寸來進行整體的處理,得到一個固定的輸出。這個輸出在輸入到FC層之後,就能夠進行後續的全連線層的計算。

具體如何通過這樣一個區域來得到一個特徵值呢?實際上是通過一個池化操作來完成的,我們知道Pooling操作包括Max和Mean這樣的一些運算元,spp層也是一個特殊的池化層,SPPNet就能夠對於不同大小候選框的輸入來得到一個固定的輸出用於後續FC層的計算。SPPNet有一個非常重要的操作——僅對原圖提取一次卷積特徵,這個操作為我們節省了非常多的計算量。在RCNN網路中,在卷積特徵是存在重複計算的問題,因此在SPPNet中就對這個問題就進行了改進。

從SPPNet的流程圖我們也可以看到,對SPPNet的輸入並不是原圖,而是經過卷積之後的feature map,它們可能是多個通道的feature map,另外這個feature map分別採用了不同尺寸的輸入,也就意味著我們會得到多個不同尺寸影象輸入經過卷積之後得到的feature map,此時就和SPPNet的結構圖對應起來了,為什麼通道數是256而不是3,是因為經過卷積之後,它的channel的數量就會非常的高,這裡輸入的數量為256。為什麼會有3個不同的feature map呢,就對應到了CNN的不同尺寸影象的輸入。這樣的過程SPPNet就能夠節省更多的計算量並且解決了原始的RCNN網路中對於候選區域固定尺寸所帶來的圖形扭曲的問題。因此SPPNet相對RCNN能夠帶來更加識別的準確度以及更快的檢索速度。

Fast RCNN

Fast RCNN是RCNN的作者繼RCNN之後提出的一個新的模型。在Fast RCNN中不同於SPPNet,採用了ROI Pooling層來對候選區域進行Crop以及完成固定尺寸輸出。這裡的ROI Pooling我們可以將其理解成一個單層的SPPNet。在Fast RCNN中採用多工網路來解決分類和位置迴歸問題。也就是說在Fast RCNN中將不再採用SVM分類器以及線性迴歸模型來完成候選框類別的判定和位置的迴歸。這裡同樣採用一個神經網路來完成分類和迴歸的任務。

借鑑SPPNet的優點,Fast RCNN同樣採用共享卷積的策略來節省卷積運算的時間,去掉重複的計算。Fast RCNN為Faster RCNN的提出打下了基礎,提供了可能。

Fast RCNN網路結構

Fast RCNN網路相對於SPPNet來說依然包括了一個共享的卷積層,同SPPNet不同的地方在於採用了一個ROI Pooling層來得到FC層的固定輸入。最終FC層得到的結果分別用於Bounding box的迴歸以及候選區域類別的判定。相對於SPPNet來說,主要改進的點就在於一個是ROI Pooling層的提出,另外一個就是多工網路的使用。此時深度學習目標檢測一個基本的框架也就有了一個基本的雛形。只是在Fast RCNN中在候選區域提取的過程依然採用了選擇性搜尋策略,因此也會導致整個網路的過程不是一個完整的端到端的過程,Faster RCNN相對於Fast RCNN的改進就在於RPN網路的提出,通過對候選框推薦演算法來進行改進,使得整個目標檢測的過程由一個完整的深度學習的網路來完成。

  • ROI Pooling:
  1. SPPNet的一種,也是Pooling層的一種。
  2. 為了將proposal摳出來的過程,通過相對的座標來摳取feature map上所對應的候選區域的位置,然後將摳取出的feature map resize到統一的大小。對於resize我們通常會採用一些特定的Pooling的操作來完成這樣一個過程。
  3. 操作如下
    1. 根據輸入的image,將Roi對映到feature map對應的位置。我們通常輸入的候選目標它真值的區域通常是相對於原始的image而言的,而Roi Pooling則是作用在經過卷積之後的feature map上的,因此我們需要計算一個相對座標來得到Roi區域所對應的feature map上相應的位置。然後將所得到的位置摳取出來。
    2. 摳取出來之後,將對映後的區域劃分成相同大小的sections(sections數量和輸出的維度相同),或者叫block,或者叫塊、網格結構。具體包含的網格數和輸出維度保持相同。
    3. 對每個section進行max pooling操作得到最終的固定尺寸的輸出。

ROI Pooling作用在不同大小的候選區域能夠得到一個固定的輸出,這個固定的輸出就能夠用於後續的FC層來完成接下來的網路的位置的迴歸和類別的判定。

  • Fast RCNN網路效能提升:

在上圖中,我們可以看到,Fast RCNN相比於RCNN在訓練時間和測試時間均有了非常大的提升。Fast RCNN在整個訓練的時間可能需要9.5小時,而RCNN則需要84小時。相對於RCNN,Fast RCNN在訓練速度上能夠得到一個非常大的提升,大概提升了8倍左右。而在測試時間上,RCNN完成單張圖的檢測通常需要消耗47秒,而Fast RCNN在處理單張圖片的時候,完成一個檢測的過程只需要0.32秒,整個檢測的過程速度提高了146倍。

Fast RCNN在效能上的提升意味著深度學習目標檢測演算法能夠達到實時處理的可能性,為後續的研究帶來了曙光。