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分以上的結果)。
總結
以上是生活随笔為你收集整理的Faster-RCNN算法精读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R-FCN每秒30帧实时检测3000类物
- 下一篇: ROI Pooling层解析