FasterRCNN原理(轉)

在介紹Faster R-CNN以前,先來介紹一些前驗知識,爲Faster R-CNN作鋪墊。

1、基於Region Proposal(候選區域)的深度學習目標檢測算法

Region Proposal(候選區域),就是預先找出圖中目標可能出現的位置,經過利用圖像中的紋理、邊緣、顏色等信息,保證在選取較少窗口(幾千個甚至幾百個)的狀況下保持較高的召回率(IoU,Intersection-over-Union)。git

圖1  IoU定義github

Region Proposal方法比傳統的滑動窗口方法獲取的質量要更高。比較經常使用的Region Proposal方法有:SelectiveSearch(SS,選擇性搜索)、Edge Boxes(EB)。算法

基於Region Proposal目標檢測算法的步驟以下:數組

其中:網絡

CNN方法見http://blog.csdn.net/qq_17448289/article/details/52850223數據結構

邊框迴歸(Bouding Box Regression):是對RegionProposal進行糾正的線性迴歸算法,目的是爲了讓Region Proposal提取到的窗口與目標窗口(Ground Truth)更加吻合。框架

2、R-CNN、Fast R-CNN、Faster R-CNN三者關係

 

圖2  三者關係ide

表1  三者比較函數

 

使用方法性能

缺點

改進

R-CNN

(Region-based Convolutional

Neural Networks)

一、SS提取RP;

二、CNN提取特徵;

三、SVM分類;

四、BB盒迴歸。

一、 訓練步驟繁瑣(微調網絡+訓練SVM+訓練bbox);

二、 訓練、測試均速度慢 ;

三、 訓練佔空間

一、 從DPM HSC的34.3%直接提高到了66%(mAP);

二、 引入RP+CNN

Fast R-CNN

(Fast Region-based Convolutional

Neural Networks)

一、SS提取RP;

二、CNN提取特徵;

三、softmax分類;

四、多任務損失函數邊框迴歸。

一、 依舊用SS提取RP(耗時2-3s,特徵提取耗時0.32s);

二、 沒法知足實時應用,沒有真正實現端到端訓練測試;

三、 利用了GPU,可是區域建議方法是在CPU上實現的。

一、 由66.9%提高到70%;

二、 每張圖像耗時約爲3s。

Faster R-CNN

(Fast Region-based Convolutional

Neural Networks)

一、RPN提取RP;

二、CNN提取特徵;

三、softmax分類;

四、多任務損失函數邊框迴歸。

一、 仍是沒法達到實時檢測目標;

二、 獲取region proposal,再對每一個proposal分類計算量仍是比較大。

一、 提升了檢測精度和速度;

二、  真正實現端到端的目標檢測框架;

三、  生成建議框僅需約10ms。

2.1 R-CNN目標檢測流程介紹

  

具體可參考http://blog.csdn.net/shenxiaolu1984/article/details/51066975

2.2 Fast R-CNN目標檢測流程介紹

 

注意:Fast R-CNN的RegionProposal是在feature map以後作的,這樣能夠不用對全部的區域進行單獨的CNN Forward步驟。

Fast R-CNN框架以下圖:

                                                                                                                                            圖3  Fast R-CNN框架

Fast R-CNN框架與R-CNN有兩處不一樣:

① 最後一個卷積層後加了一個ROI pooling layer;

② 損失函數使用了multi-task loss(多任務損失)函數,將邊框迴歸直接加到CNN網絡中訓練。分類Fast R-CNN直接用softmax替代R-CNN用的SVM進行分類。

Fast R-CNN是端到端(end-to-end)的。

具體可參考http://blog.csdn.net/shenxiaolu1984/article/details/51036677

3、Faster R-CNN目標檢測

3.1 Faster R-CNN的思想

Faster R-CNN能夠簡單地看作「區域生成網絡RPNs + Fast R-CNN」的系統,用區域生成網絡代替FastR-CNN中的Selective Search方法。Faster R-CNN這篇論文着重解決了這個系統中的三個問題:
1. 如何設計區域生成網絡;
2. 如何訓練區域生成網絡;
3. 如何讓區域生成網絡和Fast RCNN網絡共享特徵提取網絡。

在整個Faster R-CNN算法中,有三種尺度:
1. 原圖尺度:原始輸入的大小。不受任何限制,不影響性能。

2. 歸一化尺度:輸入特徵提取網絡的大小,在測試時設置,源碼中opts.test_scale=600。anchor在這個尺度上設定。這個參數和anchor的相對大小決定了想要檢測的目標範圍。
3. 網絡輸入尺度:輸入特徵檢測網絡的大小,在訓練時設置,源碼中爲224*224。

3.2 Faster R-CNN框架介紹

圖4  Faster R-CNN模型

Faster-R-CNN算法由兩大模塊組成:

1.PRN候選框提取模塊;

2.Fast R-CNN檢測模塊。

其中,RPN是全卷積神經網絡,用於提取候選框;Fast R-CNN基於RPN提取的proposal檢測並識別proposal中的目標。

3.3 RPN介紹

3.3.1背景

目前最早進的目標檢測網絡須要先用區域建議算法推測目標位置,像SPPnet和Fast R-CNN這些網絡雖然已經減小了檢測網絡運行的時間,可是計算區域建議依然耗時較大。因此,在這樣的瓶頸下,RBG和Kaiming He一幫人將Region Proposal也交給CNN來作,這才提出了RPN(Region Proposal Network)區域建議網絡用來提取檢測區域,它能和整個檢測網絡共享全圖的卷積特徵,使得區域建議幾乎不花時間。

RCNN解決的是,「爲何不用CNN作classification呢?」

Fast R-CNN解決的是,「爲何不一塊兒輸出bounding box和label呢?」

Faster R-CNN解決的是,「爲何還要用selective search呢?」

3.3.2RPN核心思想

RPN的核心思想是使用CNN卷積神經網絡直接產生Region Proposal,使用的方法本質上就是滑動窗口(只需在最後的卷積層上滑動一遍),由於anchor機制和邊框迴歸能夠獲得多尺度多長寬比的Region Proposal。

RPN網絡也是全卷積網絡(FCN,fully-convolutional network),能夠針對生成檢測建議框的任務端到端地訓練,可以同時預測出object的邊界和分數。只是在CNN上額外增長了2個卷積層(全卷積層cls和reg)。

①將每一個特徵圖的位置編碼成一個特徵向量(256dfor ZF and 512d for VGG)。

②對每個位置輸出一個objectness score和regressedbounds for k個region proposal,即在每一個卷積映射位置輸出這個位置上多種尺度(3種)和長寬比(3種)的k個(3*3=9)區域建議的物體得分和迴歸邊界。

RPN網絡的輸入能夠是任意大小(但仍是有最小分辨率要求的,例如VGG是228*228)的圖片。若是用VGG16進行特徵提取,那麼RPN網絡的組成形式能夠表示爲VGG16+RPN。

VGG16:參考

https://github.com/rbgirshick/py-faster-rcnn/blob/master/models/pascal_voc/VGG16/faster_rcnn_end2end/train.prototxt,能夠看出VGG16中用於特徵提取的部分是13個卷積層(conv1_1---->conv5.3),不包括pool5及pool5後的網絡層次結構。

由於咱們的最終目標是和Fast R-CNN目標檢測網絡共享計算,因此假設這兩個網絡共享一系列卷積層。在論文的實驗中,ZF有5個可共享的卷積層, VGG有13個可共享的卷積層。

RPN的具體流程以下:使用一個小網絡在最後卷積獲得的特徵圖上進行滑動掃描,這個滑動網絡每次與特徵圖上n*n(論文中n=3)的窗口全鏈接(圖像的有效感覺野很大,ZF是171像素,VGG是228像素),而後映射到一個低維向量(256d for ZF / 512d for VGG),最後將這個低維向量送入到兩個全鏈接層,即bbox迴歸層(reg)和box分類層(cls)。sliding window的處理方式保證reg-layer和cls-layer關聯了conv5-3的所有特徵空間。

reg層:預測proposal的anchor對應的proposal的(x,y,w,h)

cls層:判斷該proposal是前景(object)仍是背景(non-object)。

 

圖5  RPN框架

在圖5中,要注意,3*3卷積核的中心點對應原圖(re-scale,源代碼設置re-scale爲600*1000)上的位置(點),將該點做爲anchor的中心點,在原圖中框出多尺度、多種長寬比的anchors。因此,anchor不在conv特徵圖上,而在原圖上。對於一個大小爲H*W的特徵層,它上面每個像素點對應9個anchor,這裏有一個重要的參數feat_stride = 16, 它表示特徵層上移動一個點,對應原圖移動16個像素點(看一看網絡中的stride就明白16的來歷了)。把這9個anchor的座標進行平移操做,得到在原圖上的座標。以後根據ground truth label和這些anchor之間的關係生成rpn_lables,具體的方法論文中有提到,根據overlap來計算,這裏就不詳細說明了,生成的rpn_labels中,positive的位置被置爲1,negative的位置被置爲0,其餘的爲-1。box_target經過_compute_targets()函數生成,這個函數其實是尋找每個anchor最匹配的ground truth box, 而後進行論文中提到的box座標的轉化。http://blog.csdn.net/zhangwenjie89/article/details/52012880

圖6  9種anchor(注意:是不一樣位置)

圖7  Faster R-CNN卷積流程圖

原圖600*1000經CNN卷積後,在CNN最後一層(conv5)得出的是40*60大小的特徵圖,對應文中說的典型值爲2400。若特徵圖大小爲W*H,則須要W*H*K個anchor,本文中須要40*60*9≈2k個。

在RPN網絡中,咱們須要重點理解其中的anchors概念,Loss fucntions計算方式和RPN層訓練數據生成的具體細節。

3.4 RPN的平移不變性

在計算機視覺中的一個挑戰就是平移不變性:好比人臉識別任務中,小的人臉(24*24的分辨率)和大的人臉(1080*720)如何在同一個訓練好權值的網絡中都能正確識別。如果平移了圖像中的目標,則建議框也應該平移,也應該能用一樣的函數預測建議框。

傳統有兩種主流的解決方式:
第1、對圖像或feature map層進行尺度\寬高的採樣;
第2、對濾波器進行尺度\寬高的採樣(或能夠認爲是滑動窗口).

但Faster R-CNN解決該問題的具體實現是:經過卷積核中心(用來生成推薦窗口的Anchor)進行尺度、寬高比的採樣,使用3種尺度和3種比例來產生9種anchor。

3.5 窗口分類和位置精修

分類層(cls_score)輸出每個位置上,9個anchor屬於前景和背景的機率。

窗口迴歸層(bbox_pred)輸出每個位置上,9個anchor對應窗口應該平移縮放的參數(x,y,w,h)。

對於每個位置來講,分類層從256維特徵中輸出屬於前景和背景的機率;窗口迴歸層從256維特徵中輸出4個平移縮放參數。

須要注意的是:並無顯式地提取任何候選窗口,徹底使用網絡自身完成判斷和修正。

3.6 學習區域建議損失函數

3.6.1 標籤分類規定

爲了訓練RPN,須要給每一個anchor分配的類標籤{目標、非目標}。對於positive label(正標籤),論文中給了以下規定(知足如下條件之一便可判爲正標籤):

 

注意,一個GT包圍盒能夠對應多個anchor,這樣一個GT包圍盒就能夠有多個正標籤。

事實上,採用第②個規則基本上能夠找到足夠的正樣本,可是對於一些極端狀況,例如全部的Anchor對應的anchor box與groud truth的IoU不大於0.7,能夠採用第一種規則生成。

negative label(負標籤):與全部GT包圍盒的IoU都小於0.3的anchor。

對於既不是正標籤也不是負標籤的anchor,以及跨越圖像邊界的anchor咱們給予捨棄,由於其對訓練目標是沒有任何做用的。

3.6.2 多任務損失(來自Fast R-CNN)

圖8  multi-task數據結構

Fast R-CNN網絡有兩個同級輸出層(cls score和bbox_prdict層),都是全鏈接層,稱爲multi-task。

① clsscore層:用於分類,輸出k+1維數組p,表示屬於k類和背景的機率。對每一個RoI(Region of Interesting)輸出離散型機率分佈

一般,p由k+1類的全鏈接層利用softmax計算得出。

② bbox_prdict層:用於調整候選區域位置,輸出bounding box迴歸的位移,輸出4*K維數組t,表示分別屬於k類時,應該平移縮放的參數。

k表示類別的索引,是指相對於objectproposal尺度不變的平移,是指對數空間中相對於objectproposal的高與寬。

loss_cls層評估分類損失函數。由真實分類u對應的機率決定:

loss_bbox評估檢測框定位的損失函數。比較真實分類對應的預測平移縮放參數

真實平移縮放參數爲的差異:

其中,smooth L1損失函數爲:

smooth L1損失函數曲線以下圖9所示,做者這樣設置的目的是想讓loss對於離羣點更加魯棒,相比於L2損失函數,其對離羣點、異常值(outlier)不敏感,可控制梯度的量級使訓練時不容易跑飛。

圖9  smoothL1損失函數曲線

最後總損失爲(二者加權和,若是分類爲背景則不考慮定位損失):

 

規定u=0爲背景類(也就是負標籤),那麼艾弗森括號指數函數[u≥1]表示背景候選區域即負樣本不參與迴歸損失,不須要對候選區域進行迴歸操做。λ控制分類損失和迴歸損失的平衡。Fast R-CNN論文中,全部實驗λ=1。

艾弗森括號指數函數爲:

 

源碼中bbox_loss_weights用於標記每個bbox是否屬於某一個類。

3.6.3 Faster R-CNN損失函數

遵循multi-task loss定義,最小化目標函數,FasterR-CNN中對一個圖像的函數定義爲:

其中:

3.6.4 R-CNN中的boundingbox迴歸

下面先介紹R-CNN和Fast R-CNN中所用到的邊框迴歸方法。

1.      爲何要作Bounding-box regression?

圖10  示例

如圖10所示,綠色的框爲飛機的Ground Truth,紅色的框是提取的Region Proposal。那麼即使紅色的框被分類器識別爲飛機,可是因爲紅色的框定位不許(IoU<0.5),那麼這張圖至關於沒有正確的檢測出飛機。若是咱們能對紅色的框進行微調,使得通過微調後的窗口跟Ground Truth更接近,這樣豈不是定位會更準確。確實,Bounding-box regression 就是用來微調這個窗口的。

2.      迴歸/微調的對象是什麼?

 

3.      Bounding-box regression(邊框迴歸)

那麼通過何種變換才能從圖11中的窗口P變爲窗口呢?比較簡單的思路就是:

 


注意:只有當Proposal和Ground Truth比較接近時(線性問題),咱們才能將其做爲訓練樣本訓練咱們的線性迴歸模型,不然會致使訓練的迴歸模型不work(當Proposal跟GT離得較遠,就是複雜的非線性問題了,此時用線性迴歸建模顯然不合理)。這個也是G-CNN: an Iterative Grid Based Object Detector屢次迭代實現目標準肯定位的關鍵。

線性迴歸就是給定輸入的特徵向量X,學習一組參數W,使得通過線性迴歸後的值跟真實值Y(Ground Truth)很是接近。即。那麼Bounding-box中咱們的輸入以及輸出分別是什麼呢?

輸入:這個是什麼?輸入就是這四個數值嗎?其實真正的輸入是這個窗口對應的CNN特徵,也就是R-CNN中的Pool5feature(特徵向量)。(注:訓練階段輸入還包括 Ground Truth,也就是下邊提到的)

輸出:須要進行的平移變換和尺度縮放,或者說是。咱們的最終輸出不該該是Ground Truth嗎?是的,可是有了這四個變換咱們就能夠直接獲得Ground Truth,這裏還有個問題,根據上面4個公式咱們能夠知道,P通過,獲得的並非真實值G,而是預測值

的確,這四個值應該是通過 Ground Truth 和Proposal計算獲得的真正須要的平移量和尺度縮放

這也就是R-CNN中的:



 

那麼目標函數能夠表示爲是輸入Proposal的特徵向量,是要學習的參數(*表示,也就是每個變換對應一個目標函數),是獲得的預測值。咱們要讓預測值跟真實值差距最小,獲得損失函數爲:

函數優化目標爲:

利用梯度降低法或者最小二乘法就能夠獲得

4.      測試階段
   根據3咱們學習到迴歸參數,對於測試圖像,咱們首先通過 CNN 提取特徵,預測的變化就是,最後根據如下4個公式對窗口進行迴歸:

 

3.6.5 Faster R-CNN中的bounding box迴歸

其中:

 

※注意:計算regression loss須要三組信息:

1)     預測框,即RPN網絡測出的proposa;

2)     錨點anchor box:以前的9個anchor對應9個不一樣尺度和長寬比的anchorbox;

3)     GroundTruth:標定的框。

3.7 訓練RPNs

RPN經過反向傳播(BP,back-propagation)和隨機梯度降低(SGD,stochastic gradient descent)進行端到端(end-to-end)訓練。依照FastR-CNN中的「image-centric」採樣策略訓練這個網絡。每一個mini-batch由包含了許多正負樣本的單個圖像組成。咱們能夠優化全部anchor的損失函數,可是這會偏向於負樣本,由於它們是主要的。

採樣

每個mini-batch包含從一張圖像中隨機提取的256個anchor(注意,不是全部的anchor都用來訓練),前景樣本和背景樣本均取128個,達到正負比例爲1:1。若是一個圖像中的正樣本數小於128,則多用一些負樣本以知足有256個Proposal能夠用於訓練。

初始化

新增的2層參數用均值爲0,標準差爲0.01的高斯分佈來進行初始化,其他層(都是共享的卷積層,與VGG共有的層)參數用ImageNet分類預訓練模型來初始化。

參數化設置(使用caffe實現)

在PASCAL數據集上:

前60k個mini-batch進行迭代,學習率設爲0.001;

後20k個mini-batch進行迭代,學習率設爲0.0001;

設置動量momentum=0.9,權重衰減weightdecay=0.0005。

 

3.8 非極大值抑制法

訓練時(eg:輸入600*1000的圖像),若是anchor box的邊界超過了圖像邊界,那這樣的anchors對訓練loss也不會產生影響,咱們將超過邊界的anchor捨棄不用。一幅600*1000的圖像通過VGG16後大約爲40*60,則此時的anchor數爲40*60*9,約爲20k個anchor boxes,再去除與邊界相交的anchor boxes後,剩下約爲6k個anchor boxes,這麼多數量的anchorboxes之間確定是有不少重疊區域,所以須要使用非極大值抑制法(NMS,non-maximum suppression)將IoU>0.7的區域所有合併,最後就剩下約2k個anchor boxes(同理,在最終檢測端,能夠設置將機率大約某閾值P且IoU大約某閾值T的預測框採用NMS方法進行合併,注意:這裏的預測框指的不是anchor boxes)。NMS不會影響最終的檢測準確率,可是大幅地減小了建議框的數量。NMS以後,咱們用建議區域中的top-N個來檢測(即排過序後取N個)。

3.9 RPN與Fast R-CNN特徵共享

Faster-R-CNN算法由兩大模塊組成:

1.PRN候選框提取模塊;

2.Fast R-CNN檢測模塊。

咱們已經描述瞭如何爲生成區域建議訓練網絡,而沒有考慮基於區域的目標檢測CNN如何利用這些建議框。對於檢測網絡,咱們採用Fast R-CNN,如今描述一種算法,學習由RPN和Fast R-CNN之間共享的卷積層。

RPN和Fast R-CNN都是獨立訓練的,要用不一樣方式修改它們的卷積層。所以須要開發一種容許兩個網絡間共享卷積層的技術,而不是分別學習兩個網絡。注意到這不是僅僅定義一個包含了RPN和Fast R-CNN的單獨網絡,而後用反向傳播聯合優化它那麼簡單。緣由是Fast R-CNN訓練依賴於固定的目標建議框,並且並不清楚當同時改變建議機制時,學習Fast R-CNN會不會收斂。

RPN在提取獲得proposals後,做者選擇使用Fast-R-CNN實現最終目標的檢測和識別。RPN和Fast-R-CNN共用了13個VGG的卷積層,顯然將這兩個網絡徹底孤立訓練不是明智的選擇,做者採用交替訓練(Alternating training)階段卷積層特徵共享:

第一步,咱們依上述訓練RPN,該網絡用ImageNet預訓練的模型初始化,並端到端微調用於區域建議任務;

第二步,咱們利用第一步的RPN生成的建議框,由Fast R-CNN訓練一個單獨的檢測網絡,這個檢測網絡一樣是由ImageNet預訓練的模型初始化的,這時候兩個網絡尚未共享卷積層;

第三步,咱們用檢測網絡初始化RPN訓練,但咱們固定共享的卷積層,而且只微調RPN獨有的層,如今兩個網絡共享卷積層了;

第四步,保持共享的卷積層固定,微調Fast R-CNN的fc層。這樣,兩個網絡共享相同的卷積層,構成一個統一的網絡。

注意:第一次迭代時,用ImageNet獲得的模型初始化RPN和Fast-R-CNN中卷積層的參數;從第二次迭代開始,訓練RPN時,用Fast-R-CNN的共享卷積層參數初始化RPN中的共享卷積層參數,而後只Fine-tune不共享的卷積層和其餘層的相應參數。訓練Fast-RCNN時,保持其與RPN共享的卷積層參數不變,只Fine-tune不共享的層對應的參數。這樣就能夠實現兩個網絡卷積層特徵共享訓練。相應的網絡模型請參考https://github.com/rbgirshick/py-faster-rcnn/tree/master/models/pascal_voc/VGG16/faster_rcnn_alt_opt

相關文章
相關標籤/搜索