1. 程式人生 > >Faster R-CNN文章詳細解讀

Faster R-CNN文章詳細解讀

文章《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》是為了改進Fast R-CNN而提出來的。因為在Fast R-CNN文章中的測試時間是不包括search selective時間的,而在測試時很大的一部分時間要耗費在候選區域的提取上。(對於Fast R-CNN的詳細知識,請檢視Fast R-CNN文章詳細解讀。)Faster R-CNN正是為解決這個問題而提出來的。

為了更好的理解Faster R-CNN的內容,先來看一下Faster R-CNN的整體結構,如下圖所示

更為詳細的圖,如下

通過上面兩張圖可以看出Faster R-CNN由四個部分組成:
1)卷積層(conv layers),用於提取圖片的特徵,輸入為整張圖片,輸出為提取出的特徵稱為feature maps
2)RPN網路(Region Proposal Network),用於推薦候選區域,這個網路是用來代替之前的search selective的。輸入為圖片(因為這裡RPN網路和Fast R-CNN共用同一個CNN,所以這裡輸入也可以認為是featrue maps),輸出為多個候選區域,這裡的細節會在後面詳細介紹。
3)RoI pooling,和Fast R-CNN一樣,將不同大小的輸入轉換為固定長度的輸出,輸入輸出和Faste R-CNN中RoI pooling一樣。
4)分類和迴歸,這一層的輸出是最終目的,輸出候選區域所屬的類,和候選區域在影象中的精確位置。

1.RPN
通過上述介紹可以知道,Faster R-CNN與Fast R-CNN最大的區別就是提出了一個叫RPN(Region Proposal Networks)的網路,專門用來推薦候選區域的,RPN可以理解為一種全卷積網路,該網路可以進行end-to-end的訓練,最終目的是為了推薦候選區域,如下圖所示。
這裡寫圖片描述
原文中RPN網路為CNN後面接一個3*3的卷積層,再接兩個1*1的卷積層(原文稱這兩個卷積層的關係為sibling),其中一個是用來給softmax層進行分類,另一個用於給候選區域精確定位。

到這裡其實有個疑問沒有說清楚,也算是理解這篇文章的重點,通過CNN得到的feature map怎麼可以通過RPN得到與原圖對應的候選區域的,換句話說,RPN輸出的候選區域和softmax的結構怎麼與原圖中的區域進行對應的。要解決這個疑問就得先理解anchors的概念。

2.anchors
anchors可以理解為一些預設大小的框,anchors的種類用k表示,在原文中k=9,由3種面積( 128 2 , 256 2 , 512 2 )和3種長寬比(1:1,1:2,2:1)組成,這裡anchors的大小選取是根據檢測時的影象定義,在檢測時會將最小邊縮放到600,最大邊不超過1000(我看的是tf版本的程式碼)。生成anchors如下

[[ -84.  -40.   99.   55.]
 [-176.  -88.  191.  103.]
 [-360. -184.  375.  199.]
 [ -56.  -56.   71.   71.]
 [-120. -120.  135.  135.]
 [-248. -248.  263.  263.]
 [ -36.  -80.   51.   95.]
 [ -80. -168.   95.  183.]
 [-168. -344.  183.  359.]]

因為提出的候選區域是在原圖上的區域,所以要清楚anchors在原圖中的位置。假設CNN得到的feature map大小為 w h ,那總的anchors個數為 9 w h ,9為上述的9種anchors。假設原圖大小為 W H ,由SPP-net文章詳細解讀 W = S w , H = S s ,S為之前所有層的stride size相乘,所以feature map上的點乘以S即為anchors的原點位置,得到所有框的原點位置以及大小就可以得到原圖上的anchors區域了。

那RPN的輸出跟anchors是什麼關係呢,通過下圖進行討論

解釋一下上面這張圖:

1)在原文中使用的是ZF model中,其Conv Layers中最後的conv5層num_output=256,對應生成256張特徵圖(feature maps),所以相當於feature map每個點都是256-dimensions
2)在conv5之後,做了rpn_conv/3x3卷積且num_output=256,相當於每個點又融合了周圍3x3的空間資訊),同時256-d不變
3)假設在conv5 feature map中每個點上有k個anchor(原文如上k=9),而每個anhcor要分foreground和background,所以每個點由256d feature轉化為cls=2k scores;而每個anchor都有[x, y, w, h]對應4個偏移量,所以reg=4k coordinates(scores和coordinates為RPN的最終輸出)
4)補充一點,全部anchors拿去訓練太多了,訓練程式會在合適的anchors中隨機選取128個postive anchors+128個negative anchors進行訓練(至於什麼是合適的anchors接下來RPN的訓練會講)

注意,在tf版本的程式碼中使用的VGG conv5 num_output=512g,所以是512d,其他類似。

3.RPN訓練
RPN訓練中對於正樣本文章中給出兩種定義。第一,與ground truth box有最大的IoU的anchors作為正樣本;第二,與ground truth box的IoU大於0.7的作為正樣本。文中採取的是第一種方式。文中定義的負樣本為與ground truth box的IoU小於0.3的樣本。
訓練RPN的loss函式定義如下:
L ( { p i } , { t i } ) = 1 N c l s i L c l s ( p i , p i ) + λ 1 N r e g i p i L r e g ( t i , t i )
其中,i表示mini-batch中第i個anchor, p i 表示第i個anchor是前景的概率,當第i個anchor是前景時 p i 為1反之為0, t i 表示預測的bounding box的座標, t i 為ground truth的座標。
看過Fast R-CNN文章詳細解讀文章的會發現,這部分的loss函式和Fast R-CNN一樣,除了正負樣本的定義不一樣,其他表示時一樣的。

4.RPN網路與Fast R-CNN網路的權值共享
RPN最終目的是得到候選區域,但在目標檢測的最終目的是為了得到最終的物體的位置和相應的概率,這部分功能由Fast R-CNN做的。因為RPN和Fast R-CNN都會要求利用CNN網路提取特徵,所以文章的做法是使RPN和Fast R-CNN共享同一個CNN部分。
Faster R-CNN的訓練方法主要分為兩個,目的都是使得RPN和Fast R-CNN共享CNN部分,如下圖所示

一個是迭代的,先訓練RPN,然後使用得到的候選區域訓練Fast R-CNN,之後再使用得到的Fast R-CNN中的CNN去初始化RPN的CNN再次訓練RPN(這裡不更新CNN,僅更新RPN特有的層),最後再次訓練Fast R-CNN(這裡不更新CNN,僅更新Fast R-CNN特有的層)。
還有一個更為簡單的方法,就是end-to-end的訓練方法,將RPN和Fast R-CNN結合起來一起訓練,tf版本的程式碼有這種方式的實現。

參考
1.https://github.com/endernewton/tf-faster-rcnn
2.https://web.cs.hacettepe.edu.tr/~aykut/classes/spring2016/bil722/slides/w05-FasterR-CNN.pdf
3.https://zhuanlan.zhihu.com/p/31426458