論文題目:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
論文連接:https://arxiv.org/pdf/1506.01497.pdf
Faster RCNN是為了改進Fast R-CNN而提出來的。因為在Fast R-CNN文章中的測試時間是不包括search selective時間的,而在測試時很大的一部分時間要耗費在候選區域的提取上。
1.輸入測試圖像;
2.將整張圖片輸入CNN,進行特征提取;沒有再對region proposal做特殊處理,直接無腦將圖片輸入backbone CNN提取特征即feacture map。
3.用RPN網絡生成一堆Anchor box,對其進行裁剪過濾后通過softmax判斷anchors屬於前景(foreground)或者后景(background),即是物體or不是物體,所以這是一個二分類;同時,另一分支bounding box regression修正anchor box,形成較精確的proposal(注:這里的較精確是相對於后面全連接層的再一次box regression而言)
4.把region proposal映射到CNN的最后一層卷積feature map上;
5.通過ROI pooling層使每個ROI生成固定尺寸的feature map;
6.利用Softmax Loss(探測分類概率) 和Smooth L1 Loss(探測邊框回歸)對分類概率和邊框回歸(Bounding box regression)聯合訓練.
相比Fast-RCNN,主要兩處不同:
(1)使用RPN(Region Proposal Network)代替原來的Selective Search方法產生region proposal;
(2)產生建議窗口的CNN和目標檢測的CNN共享
總體網絡宏觀如圖
如果放大細節來看如下圖
注:圖片引用自MichaelLiu_dev
1)卷積層(conv layers),用於提取圖片的特征,輸入為整張圖片,輸出為提取出的特征稱為feature maps
2)RPN網絡(Region Proposal Network),用於推薦候選區域region proposal,這個網絡是用來代替之前的selective search的。輸入為圖片( 因為這里RPN網絡和Fast R-CNN共用同一個CNN,所以這里輸入也可以認為是featrue maps),輸出為多個候選區域,這里的細節會在后面詳細介紹。
3)ROI pooling,和Fast R-CNN一樣,將不同大小的輸入轉換為固定長度的輸出,輸入輸出和Faste R-CNN中ROI pooling一樣。
4)分類和回歸,這一層的輸出是最終目的,輸出候選區域所屬的類,和候選區域在圖像中的精確位置。
1. RPN網絡(Region Proposal Networks)
原文中RPN網絡為CNN后面接一個3×3的卷積層,再接兩個1×1的卷積層(原文稱這兩個卷積層的關系為sibling),其中一個是用來給softmax層進行分類,另一個用於給候選區域精確定位。
到這里其實有個疑問沒有說清楚,也算是理解這篇文章的重點,通過CNN得到的feature map怎么可以通過RPN得到與原圖對應的候選區域的,換句話說,RPN輸出的候選區域和softmax的結構怎么與原圖中的區域進行對應的。要解決這個疑問就得先理解anchors的概念。
2. 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×h,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,其他類似。
RPN訓練中對於正樣本文章中給出兩種定義。第一,與ground truth box有最大的IoU的anchors作為正樣本;第二,與ground truth box的IoU大於0.7的作為正樣本。文中采取的是第一種方式。文中定義的負樣本為與ground truth box的IoU小於0.3的樣本。
訓練RPN的loss函數定義如下:
$L\left(\left\{p_{i}\right\},\left\{t_{i}\right\}\right)=\frac{1}{N_{c l s}} \sum_{i} L_{c l s}\left(p_{i}, p_{i}^{*}\right)+\lambda \frac{1}{N_{r e g}} \sum_{i} p_{i}^{*} L_{r e g}\left(t_{i}, t_{i}^{*}\right)$
看過 Fast R-CNN文章詳細解讀文章的會發現,這部分的loss函數和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特有的層)。
[3] https://web.cs.hacettepe.edu.tr/~aykut/classes/spring2016/bil722/slides/w05-FasterR-CNN.pdf
[4] https://zhuanlan.zhihu.com/p/31426458