Faster R-CNN演算法解析

weixin_33936401發表於2018-07-03

論文地址:
Faster R-CNN: Towards Real-Time ObjectDetection with Region Proposal Networks
Python實現:
https://github.com/rbgirshick/py-faster-rcnn

簡介

Fast R-CNN演算法採用 SppNet 的思想解決了R-CNN中影像warp操作,並且避免了特徵的重複計算(參見 ROI Pooling的相關理解及Fast R-CNN與R-CNN的簡單對比),使區域 + 分類/迴歸的檢測框架有了實時的可能。但是 region proposal 的生成仍是演算法的一個速度瓶頸。

為了解決這一問題,作者提出了 Region Proposal Network(RPN),RPN 網路共享輸入影像的卷積特徵,能夠快速生成候選區域,計算代價小。生成的候選區送入Fast R-CNN網路進行 detection。因此 Faster R-CNN 也可以理解為 RPN + Fast R-CNN(文中作者稱 RPN 具有 attention 的意味,即告訴網路關注的區域在哪裡)。

9389734-8ec6a511fef06722.png
Faster R-CNN

RPN網路

RPN 網路的作用是輸入一張影像,輸出一批候選矩形區域(region proposal),同時輸出的還有區域得分。RPN為全卷積網路,以 ZF 網路或 VGG 網路為 base 網路,下圖是以 ZF-5 為參考的RPN網路結構(圖片是用Netscope線上生成的http://ethereon.github.io/netscope/#/editor

9389734-aa28e7d6e7e781ca.png
rpn結構

黑線以上是 ZF-5 網路的卷積過程,黑線以下是 RPN 網路的特有結構。對於 ZF-5 卷積得到的 feature map,採用n*n大小的 sliding window 進行滑動處理(即filter大小為n*n的卷積,文中 n=3),然後通過1*1卷積輸出兩路,分別用於分類和迴歸。

如圖是 sliding window 的處理過程:

9389734-75766e49317bf468.png

圖中的一些解釋

  • 256-d:ZF-5 的最後一層輸出 filter 的個數是256,因此每一個滑動窗輸出是一個256維的向量。
  • 2k 和 4k:首先解釋一下k,在每一個滑動視窗的中心位置,預測k個候選區,這些候選區被稱為 anchor(後文會解釋)。2k是因為分類層的輸出為目標為 foreground 和 background 的概率,4k則是每個 anchor box 包含4 個位置座標。

Anchor 的解釋

Anchor 是 RPN 網路的核心,後續的一些目標檢測網路如 YOLOv2、SSD、YOLOv3 也借鑑了這一機制。

在 ZF-5 輸出的 feature map 上進行滑窗操作,是為了獲取滑窗對應的感受野內是否存在目標(概率,以及目標的位置座標),由於目標大小和長寬比例可能不一,因此需要多個視窗。Anchor 的機制是,以滑動窗的中心為取樣點,採用不同的 scale 和 ratio,生成不同大小共 k 個 anchor 視窗。對於一個W*H大小的 feature map 來說,生成的 anchor 總數為W*H*k。例如 scale 為(128,256,512),ratio 為(1:2,1:1,2:1)時,則生成 9 種 anchor。

注:目標識別任務應具有平移不變性和尺度不變性,傳統的做法是採用 image pyramid 或 filter pyramid,anchor 的機制滿足這樣的要求,且相比較兩種做法更加的 cost-efficient

採用 Anchor 機制能夠從整圖的 feature map 上直接提取候選區域(對映到原圖)及其特徵,相比較 R-CNN 和 Fast R-CNN 中 selective search(或EdgeBoxes) 的方法,避免了大量的額外運算,且整個過程融合到一個網路中,方便訓練和測試

訓練

RPN 網路的 loss 函式同樣是一個多工的loss,包含兩個部分,classification 的 loss 和 regression 的 loss。

首先,對於 classification來說,論文中將滿足以下兩種規則的 anchor 判定為 positive:1)anchor 與任一目標的 ground truth box 的IoU值最大;2)anchor 與任一目標的 ground truth box 的IoU值 > 0.7。因此,存在一個 ground truth 對應多個 anchor 的情況。當 IoU 值 < 0.3 時,則認為 anchor 為 non-positive,即背景。除此之外,其他的 anchor 不參與訓練。

如此,loss 函式定義為(可惡的簡書不支援公式編輯。。。)

9389734-19e04c7a8ff52689.png

式中,i 是一個 mini-batch 下 anchor 的索引。p_i是 anchor 為目標的概率。當anchor為目標時,p^*_i 為1,否則為0。t_i是預測框的位置座標,t^*_i是ground truth的座標。
L_{cls}是目標與非目標的對數損失,即

9389734-dda369d7ac767c65.png

L_{reg}則採用 Fast R-CNN 中的平滑 L1 loss,不採用 R-CNN 和 SPP 中平滑 L2 loss 的原因是,在防止梯度爆炸問題上,L1 loss 敏感性較低,學習率更容易調節。L1 loss 的形式為

9389734-ebd7f28f0b54ea3f.png

其中,

9389734-a9975ffebba544a8.png

p^*_iL_{reg}表示 regression loss 只在 anchor 為 positive 時有效。

L_{cls}L_{reg}分別由N_{cls}N_{reg}進行歸一化,同時乘上係數\lambda。論文作者釋出的程式碼中,N_{cls}為mini-batch的大小(如N_{cls} = 256),N_{reg}為anchor的數量(如N_{cls} ~ 2400)。另外,設定\lambda為10,則 cls 項和 reg 項的權重大體一致(事實上 \lambda 的影響不大,如下表所示)。

λ 0.1 1 10 100
mAP(%) 67.2 68.9 69.9 69.1

在計算 bbox 的 regression 時,採用以下計算方法

9389734-3b4cbe0290554234.png

式中,x,y,w,h表示框的中心座標及寬高。x,x_a,x^*分別表示預測框,anchor 框和 ground truth 框(y,w,h同理)。

RPN 通過 Back Propagation 和 SGD 的方法進行端到端的訓練。參照Fast R-CNN 中 “image - centric” 的取樣策略。每個 mini-batch 由包含很多影像的單張影像組成,如果採用所有的 anchors 優化 loss 函式,可能會向負樣本傾斜,因為它們比重較大。因而,論文中採取隨機從一張影像中取樣 256 個 anchors 的做法來訓練一個 mini-batch,256個 anchors 中正負樣本的比重是1:1。如果正樣本數少於128,則用負樣本填充。

新增層的引數用均值為0,標準差為0.01的高斯分佈來進行初始化,其餘層(都是共享的卷積層,與VGG共有的層)引數用 ImageNet 分類預訓練模型來初始化。前60k個mini-batch進行迭代,學習率設為0.001;後20k個mini-batch進行迭代,學習率設為 0.0001;設定動量momentum = 0.9,權重衰減 weightdecay = 0.0005。實現方式為Caffe。

RPN 和 Fast R-CNN特徵共享

以上描述瞭如何訓練 RPN 網路,而沒有考慮基於 region proposal 的目標檢測網路如何利用這些 proposals。對於檢測網路,作者採用了 Fast R-CNN。RPN 和 Fast R-CNN 如果都獨立訓練,需要單獨修改它們的卷積層。因此有需要開發一種允許兩個網路間共享卷積層的技術,而不是分別學習兩個網路。論文中作者描述了 3 種方法用來實現特徵共享:

  1. 交替訓練。 首先訓練 RPN,用 RPN 輸出的 proposals 訓練 Fast R-CNN。Fast R-CNN 精調後用於初始化 RPN 網路引數,如此迴圈迭代。開源的 matlab 版本就是這種訓練方法。
  2. 近似聯合訓練。 RPN 和 Fast R-CNN 整合到一個網路裡一起訓練。但是該方法忽略了 wrt 導數,開源的 python 版本就是這麼訓練的,可以減少 25-50% 的訓練時間。為什麼呢?因為 caffe 中所有層都是 c++ 實現的,所以 python_layer 就沒有進行 back_ward,當然訓練的時候必須顯式指定loss_weight:1。
  3. 聯合訓練。 超出論文範疇,作者未實現。

基於交替訓練法,作者描述了一種4-step的訓練方式:

step 1. 訓練 RPN 網路,採用 ImageNet 預訓練的模型進行初始化,並進行微調
step 2. 利用 step1 的RPN生成 proposal,由 Fast R-CNN 訓練一個單獨的檢測網路,該網路同樣由ImageNet預訓練模型進行初始化。此時,兩個網路還未共享卷積層
step 3. 用檢測網路初始化 RPN 訓練,固定共享的卷積層,只微調 RPN 獨有的層,現在兩個網路實現了卷積層共享
step 4. 保持共享的卷積層固定,微調 Fast R-CNN 的 fc 層。這樣,兩個網路共享相同的卷積層,構成一個統一的網路

實現細節

訓練時(eg:600*1000的影像),如果 anchor box 的邊界超過了影像邊界,我們將其捨棄不用,因為這樣的 anchor 會導致訓練無法收斂。一幅 600*1000 的影像經過 VGG16 後大約為 40*60,則此時的 anchor 數為 40*60*9,約為 20k 個 anchor boxes,再去除與邊界相交的 anchor boxes 後,剩下約為 6k 個,這麼多數量的anchor boxes之間肯定是有很多重疊區域,因此需要使用非極大值抑制法(NMS,non-maximum suppression)將 IoU>0.7 的區域全部合併,最後就剩下約 2k 個 anchor boxes(同理,在最終檢測端,可以設定將概率大約某閾值P且IoU大約某閾值T的預測框採用 NMS 方法進行合併,注意:這裡的預測框指的不是 anchor boxes)。NMS不會影響最終的檢測準確率,但是大幅地減少了建議框的數量。NMS之後,我們用建議區域中的top-N個來檢測。

實驗結果

  • 與Selective Search方法(黑線SS)相比,當每張圖生成的proposal從2000減少到300時,RPN方法(紅藍)的召回率下降不大。說明RPN方法的目的性更明確(attention機制~~)。
9389734-007f300a99e6b574.png
Recall vs IoU
  • 使用更大的MS COCO庫訓練,直接在PASCAL VOC上測試,準確率提升6%。說明faster RCNN遷移性良好,沒有over fitting。
9389734-274b3feaf631e5ba.png

結語

此時可以放出 R-CNN、Fast R-CNN、Faster R-CNN的對比了。如下所示(此處表格參考https://blog.csdn.net/qq_17448289/article/details/52871461

名稱 方法 缺點 優點
R-CNN 1、SS提取RP;
2、CNN提取特徵;
3、SVM分類;
4、BBox迴歸。
1、 訓練步驟繁瑣(微調網路+訓練SVM+訓練bbox);
2、 訓練、測試均速度慢 ;
3、 訓練佔空間
1、 從DPM HSC的34.3%直接提升到了66%(mAP);
2、 引入RP+CNN
Fast R-CNN 1、SS提取RP;
2、CNN提取特徵;
3、softmax分類;
4、多工損失函式邊框迴歸。
1、 依舊用SS提取RP(耗時2-3s,特徵提取耗時0.32s);
2、 無法滿足實時應用,沒有真正實現端到端訓練測試;
3、 利用了GPU,但是區域建議方法是在CPU上實現的。
1、 由66.9%提升到70%;
2、 每張影像耗時約為3s。
Faster R-CNN 1、RPN提取RP;
2、CNN提取特徵;
3、softmax分類;
4、多工損失函式邊框迴歸。
1、 還是無法達到實時檢測目標;
2、 獲取region proposal,再對每個proposal分類計算量還是比較大。
1、 提高了檢測精度和速度;
2、 真正實現端到端的目標檢測框架;
3、 生成建議框僅需約10ms。

Faster R-CNN 將 two-stage 的檢測框架在實時的程式中推進了一大步,但是仍有提升的空間。由Microsoft Research的Jifeng Dai等人提出的R-FCN網路即是一個例子。

相關文章