Faster R-CNN演算法解析
論文地址:
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 的意味,即告訴網路關注的區域在哪裡)。
RPN網路
RPN 網路的作用是輸入一張影像,輸出一批候選矩形區域(region proposal),同時輸出的還有區域得分。RPN為全卷積網路,以 ZF 網路或 VGG 網路為 base 網路,下圖是以 ZF-5 為參考的RPN網路結構(圖片是用Netscope線上生成的http://ethereon.github.io/netscope/#/editor)
黑線以上是 ZF-5 網路的卷積過程,黑線以下是 RPN 網路的特有結構。對於 ZF-5 卷積得到的 feature map,採用n*n大小的 sliding window 進行滑動處理(即filter大小為n*n的卷積,文中 n=3),然後通過1*1卷積輸出兩路,分別用於分類和迴歸。
如圖是 sliding window 的處理過程:
圖中的一些解釋
- 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 函式定義為(可惡的簡書不支援公式編輯。。。)
式中,i 是一個 mini-batch 下 anchor 的索引。p_i是 anchor 為目標的概率。當anchor為目標時,p^*_i 為1,否則為0。t_i是預測框的位置座標,t^*_i是ground truth的座標。
L_{cls}是目標與非目標的對數損失,即
L_{reg}則採用 Fast R-CNN 中的平滑 L1 loss,不採用 R-CNN 和 SPP 中平滑 L2 loss 的原因是,在防止梯度爆炸問題上,L1 loss 敏感性較低,學習率更容易調節。L1 loss 的形式為
其中,
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 時,採用以下計算方法
式中,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 種方法用來實現特徵共享:
- 交替訓練。 首先訓練 RPN,用 RPN 輸出的 proposals 訓練 Fast R-CNN。Fast R-CNN 精調後用於初始化 RPN 網路引數,如此迴圈迭代。開源的 matlab 版本就是這種訓練方法。
- 近似聯合訓練。 RPN 和 Fast R-CNN 整合到一個網路裡一起訓練。但是該方法忽略了 wrt 導數,開源的 python 版本就是這麼訓練的,可以減少 25-50% 的訓練時間。為什麼呢?因為 caffe 中所有層都是 c++ 實現的,所以 python_layer 就沒有進行 back_ward,當然訓練的時候必須顯式指定loss_weight:1。
- 聯合訓練。 超出論文範疇,作者未實現。
基於交替訓練法,作者描述了一種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機制~~)。
- 使用更大的MS COCO庫訓練,直接在PASCAL VOC上測試,準確率提升6%。說明faster RCNN遷移性良好,沒有over fitting。
結語
此時可以放出 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網路即是一個例子。
相關文章
- Faster R-CNNASTCNN
- 程式碼實踐——Faster R-CNNASTCNN
- Faster R-CNN: Down the rabbit hole of modern object detectionASTCNNObject
- 目標檢測技術演化:從R-CNN到Faster R-CNNCNNAST
- 一文讀懂目標檢測:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSDCNNASTYOLO
- 深度學習論文翻譯解析(十三):Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks深度學習ASTCNNObject
- TorchVision Faster R-CNN 微調,實戰 Kaggle 小麥檢測ASTCNN
- 深度學習目標檢測(object detection)系列(四) Faster R-CNN深度學習ObjectASTCNN
- Pytorch版Faster R-CNN 原始碼分析+方法流程詳解——訓練篇PyTorchASTCNN原始碼
- CNN--卷積神經網路從R-CNN到Faster R-CNN的理解(CIFAR10分類程式碼)CNN卷積神經網路AST
- 目標檢測入門系列手冊四:Faster R-CNN 訓練教程ASTCNN
- 經典目標檢測方法Faster R-CNN和Mask R-CNN|基於PaddlePaddle深度學習平臺的實戰ASTCNN深度學習
- 深度學習論文翻譯解析(十二):Fast R-CNN深度學習ASTCNN
- 【深度學習】像玩樂高一樣拆解Faster R-CNN:詳解目標檢測的實現過程深度學習ASTCNN
- 【目標檢測】Fast R-CNN演算法實現ASTCNN演算法
- 【Fast R-CNN】Fast R-CNN (2015) 全文翻譯ASTCNN
- Learn English 10 times faster with these tipsAST
- SLAM演算法解析SLAM演算法
- KDE演算法解析演算法
- 排序演算法解析排序演算法
- faster-RCNN臺標檢測ASTCNN
- Faster資料庫研習,一AST資料庫
- python Kmeans演算法解析Python演算法
- 【目標檢測】R-CNNCNN
- godaddy 的 Monitoring performance to make your website fasterGoORMWebAST
- docker(一):Develop faster. Run anywhere.DockerdevAST
- 1.2.1 理解LALR解析演算法演算法
- 主流排序演算法全面解析排序演算法
- LRU演算法原理解析演算法
- 模擬退火演算法解析演算法
- faster rcnn中anchor的生成過程理解ASTCNN
- PostgreSQL DBA(98) - PG 12 Faster float conversion to textSQLAST
- 前端演算法題目解析(一)前端演算法
- R-CNN系列其二:SPP-NetCNN
- 解析:百度演算法之颶風演算法3.0演算法
- 某box平臺演算法解析(wToken)演算法
- 【推薦系統】:LFM演算法解析演算法
- 百度勁風演算法解析演算法