目標檢測(5)-Faster RCNN

前段時間感覺狀態比較差,給自己放了個假,加上剛回到學校事情有些多,拖了幾周沒更新,實在抱歉。

github地址:rbgirshick/py-faster-rcnn

論文地址:Towards Real-Time Object Detection with Region Proposal Networks

RCNN:目標檢測(2)-RCNN - 知乎專欄

Fast RCNN:目標檢測(4)-Fast R-CNN - 知乎專欄

摘要

言歸正傳,目標檢測領域由RCNN開始,通將引入卷積神經網路取得了長足的進展,但是始終未能擺脫傳統區域建議演算法的限制。Fast RCNN提到如果去除區域建議演算法的話,網路能夠接近實時,而selective search方法進行區域建議的時間一般在秒級。產生差異的原因在於卷積神經網路部分運行在GPU上,而selective search運行在CPU上,所以效率自然是不可同日而語。一種可以想到的解決策略是將selective search通過GPU實現一遍,但是這種實現方式忽略了接下來的檢測網路可以與區域建議方法共享計算的問題。因此Faster RCNN從提高區域建議的速度出發提出了region proposal network 用以通過GPU實現快速的區域建議。通過共享卷積,RPN在測試時的速度約為10ms,相比於selective search的秒級簡直可以忽略不計。Faster RCNN整體結構為RPN網路產生區域建議,然後直接傳遞給Fast RCNN。當然重點就是這個RPN網路咯,我們看看RPN如何產生區域候選。下圖是Faster RCNN的整體網路結構:

對於一幅圖片的處理流程為:圖片-卷積特徵提取-RPN產生proposals-Fast RCNN分類proposals。

區域建議的產生

在目標檢測領域,區域建議與後續的檢測往往是分開進行的,而對於區域建議演算法一般分為兩類:基於超像素合併的(selective search、CPMC、MCG等),基於滑窗演算法的,也就是我們在selective search一文中提到的窮舉法。自從卷積網路出現後,滑窗也自然高級了一點,比如說可以在卷積特徵層上滑窗,由於卷積特徵層一般很小,所以得到的滑窗數目也少很多。但是產生的滑窗準確度也就差了很多,畢竟感受野也相應大了很多。Faster RCNN的做法是,既然區域建議的精度不夠,那麼類似於Faster RCNN,給每一個region再來個回歸得到更加精細化的位置就是咯。

RPN對於feature map的每個位置進行滑窗,通過不同尺度以及不同比例的K個anchor產生K個256維的向量,然後分類每一個region是否包含目標以及通過回歸得到目標的具體位置。

  • 這裡使用的滑窗大小為 3*3 ,感覺很小,但是其相對於原圖片的感受野約為200左右個像素。
  • anchor box的作用是產生不同比例及尺度的region proposal,通過將anchor中心點與滑窗中心點對齊,然後以一定的比例及大小裁剪滑窗。比如裁剪一個512*512的大小,比例為1:2的滑窗實現就是對於滑窗中心點向外擴充像素使得對應原圖包含的像素點個數為512*512,比例為1:2。然後對於這一塊進行卷積提取固定維度的特徵。
  • RPN是一個全卷積神經網路的結構,也就是將全連接層通過卷積層去替換(我將在下一篇文章裡面寫FCN)。因此可以接受任意大小的輸入,同時輸出所有的anchors對應的特徵。實驗細節部分會詳細說這一點。
  • 由於採用的是滑窗的方式,因此全連接層(上圖獲得256-d向量的位置)是共享權重的,每個滑窗的權重都是相同的。其實現方式是通過 3*3 的卷積層。

多尺度樣本的產生

由於目標檢測的目標尺度可能相差很大,因此我們需要儘可能產生不同尺寸的region proposals,常見的有兩種方法,加上本文的一共三種方法:

  • 圖像金字塔:通過將圖像放縮到不同的尺寸,然後提取特徵去做。有點類似於RCNN中的實現方式,顯然這樣需要為每一個尺寸重複提取卷積特徵,成本很高。
  • 卷積特徵金字塔:先對於圖像提取卷積特徵,然後將卷積特徵放縮到不同的尺寸。類似於SPP的實現方式。在SPP中我們也看到,這裡面的圖像也需要放縮到幾種尺寸,產生多尺度結果。
  • anchor金字塔:通過不同尺度的anchor在卷積特徵上滑窗相當於是anchor金字塔,不需要圖像有多個尺寸,僅需要有多個尺寸的anchor就好了。文章使用了3種尺度以及3種比例。

感覺區域大小很重要,3尺寸的1比例與3比例相差很小,因為比例準不準沒關係,後面還有回歸層去微調呢,但是如果尺寸不夠那回歸層就無能為力了。

損失函數的設計

RPN包含兩個網路分支,分類層以及回歸層。分類層給出一個二分類label,也就是這個region是否包含目標,回歸層產生目標的位置。其中與任意ground-truth box的IOU大於0.7即認為是包含目標的,而對於任意ground-truth box的IOU都小於0.3則認為是負樣本。對於回歸採用的與Fast RCNN一致。

通過Ncls,Nreg,權衡分類以及回歸的重要性程度。這裡面一切都與Fast RCNN類似,那我們就只用看不同的地方就好了。

  • 分類損失一個是二分類,一個是類別相關的分類。
  • 回歸損失一個是非類別相關的,Fast RCNN是類別相關的。
  • Fast RCNN ROI pooling後面跟著兩個FC然後再到相應的分類或是回歸,RPN則是一個全卷積的過程,包括對於後續的向量全連接操作都是通過 1*1 卷積實現的。而且無論回歸還是分類從256-d向量到後面都只有一個卷積層。
  • 9個anchor的參數不共享,但是每個滑窗位置的參數是共享的。

RPN的訓練過程

  • RPN可以通過BP演算法端到端訓練,為了防止類似樣本向負樣本傾斜,我們在每一個批次中採樣256個anchors,然後這些anchors中正負樣本比例為1:1。
  • RPN與Fast RCNN權重共享訓練

文章使用的四步交替訓練的方法:

  1. 通過預訓練模型初始化RPN網路,然後訓練RPN。
  2. 通過預訓練模型初始化Fast RCNN,並使用RPN產生的proposal訓練RPN。
  3. 通過Fast RCNN初始化RPN中與其共有的網路層,然後固定這些層訓練其他層。
  4. 固定Fast RCNN中的共有層,通過RPN訓練Fast RCNN。

實驗細節

文章對於圖像的預處理是放縮使得短邊為600個像素,以VGG為例,經過四次的池化操作,每個卷積層像素的感受野對應於原圖為16個像素。對於1000*600的圖片,其卷積特徵層尺寸為60*40,所以anchors數量為60*40*9,而去除在邊緣的不完整的anchors,最後能得到6000個anchors,而這些anchors的特徵是同時計算出來的。比如針對一個圖像尺寸128*128,其對應於卷積層特徵尺寸為9*9,然後對於所有的9*9小塊進行卷積得到的feature map就是所有的anchor對應的特徵。RPN產生的region proposal重疊較多,通過NMS去除重疊後大約剩餘2K個proposal,在測試時僅選用前300個proposal,效果也是相當的好。

  • 不同尺度的anchors對應的真實的proposal大小

可以看到,我們的尺寸和比例還是起到了作用的,相應尺寸和比例的proposal也基本符合要求的。

  • proposal個數

可以看到300個proposal其實並沒有降低識別準確率,而且NMS對結果也沒啥影響,所以測試時取前300個proposal,這樣可以大幅提高速度。

  • 分階段權重共享的優點

權重共享大約能夠提升個1.5個百分點,還是很有效果的。同時我們也看到數據集擴充對於識別結果影響最大,通過COCO+07+12訓練然後再07上測試能夠達到78.8%,提高10個點。

  • 時間性能

通過ZF基本可以實現實時的,所以文章標題也是朝著實時目標檢測邁進嘛~

總結

至此,可以說RCNN目標檢測系列已經是相當的完美了,無論是結果還是效率都可以商用了。但是網路的通用性不太好,在最新的網路比如Inception、ResNet系列直接套用Faster RCNN是不合適的,如何使用這些新的網路呢?接下來我們將研究FCN、RFCN這兩個方法。


推薦閱讀:

Udacity的納米學位 (Nano degree)怎麼樣?
論文導讀 | TFX:基於TensorFlow可大規模擴展的機器學習平台
Andrew Ng對 Geoffrey Hinton 的採訪:致敬老爺子的一路堅持!
揭開機器學習的面紗

TAG:深度学习DeepLearning | 目标检测 | 机器学习 |