Faster-RCNN演算法精讀
論文:《Faster R-CNN: Towards Real-Time ObjectDetection with Region Proposal Networks》
摘要:演算法主要解決兩個問題:
1、提出區域建議網路RPN,快速生成候選區域;
2、通過交替訓練,使RPN和Fast-RCNN網路共享引數。
一、 RPN網路結構
RPN網路的作用是輸入一張影象,輸出一批矩形候選區域,類似於以往目標檢測中的Selective Search一步。網路結構是基於卷積神經網路,但輸出包含二類softmax和bbox迴歸的多工模型。網路結果如下(以ZF網路為參考模型):
其中,虛線以上是ZF網路最後一層卷積層前的結構,虛線以下是RPN網路特有的結構。首先是3*3的卷積,然後通過1*1卷積輸出分為兩路,其中一路輸出是目標和非目標的概率,另一路輸出box相關的四個引數,包括box的中心座標x和y,box寬w和長h。
(至於之前為什麼要用3*3的卷積核,我覺得是和感受野大小相對應的。在原來的ZF模型中,3*3卷積核對應map比例是3/13,相當於在型如1000*600的圖片中採用180左右的感受野。對於1000*600的圖片中大部分目標而言,這個大小的感受野是比較合適的吧。)
從卷積運算本身而言,卷積相當於滑窗。假如輸入影象是1000*600,則經過了幾次stride後,map大小縮小了16倍,最後一層卷積層輸出大約為60*40大小,那麼相當於用3*3的視窗滑窗(注意有padding),對於左邊一支路而言,輸出18個通道,每個通道map大小仍為60*40,代表每個滑窗中心對應感受野記憶體在目標與否的概率。右支路同理。
二、 anchor機制
anchor是rpn網路的核心。剛剛說到,需要確定每個滑窗中心對應感受野記憶體在目標與否。由於目標大小和長寬比例不一,需要多個尺度的窗。Anchor即給出一個基準窗大小,按照倍數和長寬比例得到不同大小的窗。例如論文中基準窗大小為16,給了(8、16、32)三種倍數和(0.5、1、2)三種比例,這樣能夠得到一共9種尺度的anchor,如圖(摘自http://blog.csdn.net/shenxiaolu1984/article/details/51152614)。
因此,在對60*40的map進行滑窗時,以中心畫素為基點構造9種anchor對映到原來的1000*600影象中,對映比例為16倍。那麼總共可以得到60*40*9大約2萬個anchor。
三、 訓練
RPN網路訓練,那麼就涉及ground truth和loss function的問題。對於左支路,ground truth為anchor是否為目標,用0/1表示。那麼怎麼判定一個anchor內是否有目標呢?論文中採用了這樣的規則:1)假如某anchor與任一目標區域的IoU最大,則該anchor判定為有目標;2)假如某anchor與任一目標區域的IoU>0.7,則判定為有目標;3)假如某anchor與任一目標區域的IoU<0.3,則判定為背景。所謂IoU,就是預測box和真實box的覆蓋率,其值等於兩個box的交集除以兩個box的並集。其它的anchor不參與訓練。
於是,代價函式定義為:
代價函式分為兩部分,對應著RPN兩條支路,即目標與否的分類誤差和bbox的迴歸誤差,其中Leg(ti,ti*) = R(ti-ti*)採用在Fast-RCNN中提出的平滑L1函式,作者認為其比L2形式的誤差更容易調節學習率。注意到迴歸誤差中Leg與pi相乘,因此bbox迴歸只對包含目標的anchor計算誤差。也就是說,如果anchor不包含目標,box輸出位置無所謂。所以對於bbox的groundtruth,只考慮判定為有目標的anchor,並將其標註的座標作為ground truth。此外,計算bbox誤差時,不是比較四個角的座標,而是tx,ty,tw,th,具體計算如下:
四、 聯合訓練
作者採用四步訓練法:
1) 單獨訓練RPN網路,網路引數由預訓練模型載入;
2) 單獨訓練Fast-RCNN網路,將第一步RPN的輸出候選區域作為檢測網路的輸入。具體而言,RPN輸出一個候選框,通過候選框擷取原影象,並將擷取後的影象通過幾次conv-pool,然後再通過roi-pooling和fc再輸出兩條支路,一條是目標分類softmax,另一條是bbox迴歸。截止到現在,兩個網路並沒有共享引數,只是分開訓練了;
3) 再次訓練RPN,此時固定網路公共部分的引數,只更新RPN獨有部分的引數;
4) 那RPN的結果再次微調Fast-RCNN網路,固定網路公共部分的引數,只更新Fast-RCNN獨有部分的引數。
至此,網路訓練結束,網路集檢測-識別於一體,測試階段流程圖如下:
有一些實現細節,比如RPN網路得到的大約2萬個anchor不是都直接給Fast-RCNN,因為有很多重疊的框。文章通過非極大值抑制的方法,設定IoU為0.7的閾值,即僅保留覆蓋率不超過0.7的區域性最大分數的box(粗篩)。最後留下大約2000個anchor,然後再取前N個box(比如300個)給Fast-RCNN。Fast-RCNN將輸出300個判定類別及其box,對類別分數採用閾值為0.3的非極大值抑制(精篩),並僅取分數大於某個分數的目標結果(比如,只取分數60分以上的結果)。