Faster R-CNN

code-life發表於2018-06-15
這三篇就夠了

引用

1、
2、
3、
一、簡介:





二、比較:

三、訓練過程:
第一步,我們依上述訓練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不共享的層對應的引數。這樣就可以實現兩個網路卷積層特徵共享訓練。
四、預測過程

五、細節
1、rpn視窗迴歸

    RPN網路中bounding-box迴歸的實質其實就是計算出預測視窗。這裡以anchor視窗為基準,計算Ground Truth對其的平移縮放變化引數,以及預測視窗【可能第一次迭代就是anchor】對其的平移縮放引數,因為是以anchor視窗為基準,所以只要使這兩組引數越接近,以此構建目標函式求最小值,那預測視窗就越接近Ground Truth,達到迴歸的目的;
2、理清anchors的數目

   文中提到對於1000×600的一張影象,大約有20000(~60×40×9)個anchors,忽略超出邊界的anchors剩下6000個anchors,利用非極大值抑制去掉重疊區域,剩2000個區域建議用於訓練(訓練的時候投給fast r-cnn); 測試時在2000個區域建議中選擇Top-N【文中為300】個區域建議用於Fast R-CNN檢測。
3、終於整清楚rpn的原理了
大概是根據特徵圖上的每一個特徵在原圖上產生9個anchors,這樣所有特徵一起就會產生很多的anchors,然後根據前面卷積的strides對映回原圖(對映的是中心點)根據比例,確定原圖上所有anchors的區域,後面根據最後兩個全連線層的出來的,是否為前景的得分 ,以及座標寬高的偏移引數精修這些anchors的位置,最後篩選掉那些超出邊界的anchors,並根據得分排序,選擇前多少個anchors作為最後的也就是要輸入給fast r-cnn的roi層的候選框。當然給他的是候選框在原圖上的座標,後面可以根據原圖的座標,然後根據fast的卷積特徵得出對映規則,在fast的特徵圖上對映出這些框,繼續往下進行。

 Proposal Layer

縮排Proposal Layer負責綜合所有[dx(A),dy(A),dw(A),dh(A)]變換量和foreground anchors,計算出精準的proposal,送入後續RoI Pooling Layer。還是先來看看Proposal Layer的caffe prototxt定義:
  1. layer {  
  2.   name: 'proposal'  
  3.   type: 'Python'  
  4.   bottom: 'rpn_cls_prob_reshape'  
  5.   bottom: 'rpn_bbox_pred'  
  6.   bottom: 'im_info'  
  7.   top: 'rois'  
  8.   python_param {  
  9.     module: 'rpn.proposal_layer'  
  10.     layer: 'ProposalLayer'  
  11.     param_str: "'feat_stride': 16"  
  12.   }  
  13. }  
Proposal Layer有3個輸入:fg/bg anchors分類器結果rpn_cls_prob_reshape,對應的bbox reg的[dx(A),dy(A),dw(A),dh(A)]變換量rpn_bbox_pred,以及im_info;另外還有引數feat_stride=16,這和圖4是對應的。
縮排首先解釋im_info。對於一副任意大小PxQ影象,傳入Faster RCNN前首先reshape到固定MxN,im_info=[M, N, scale_factor]則儲存了此次縮放的所有資訊。然後經過Conv Layers,經過4次pooling變為WxH=(M/16)x(N/16)大小,其中feature_stride=16則儲存了該資訊。所有這些數值都是為了將proposal對映回原圖而設定的,如圖12,畢竟檢測就是為了在原圖上畫一個框而已~
圖12
縮排Proposal Layer forward(caffe layer的前傳函式)按照以下順序依次處理:
再次生成anchors,並對所有的anchors做bbox reg位置迴歸(注意這裡的anchors生成順序和之前是即完全一致的)
按照輸入的foreground softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)個anchors。即提取修正位置後的foreground anchors
利用feat_stride和im_info將anchors對映回原圖,判斷fg anchors是否大範圍超過邊界,剔除嚴重超出邊界fg anchors。
進行nms(nonmaximum suppression,非極大值抑制)
再次按照nms後的foreground softmax scores由大到小排序fg anchors,提取前post_nms_topN(e.g. 300)結果作為proposal輸出。
之後輸出proposal=[x1, y1, x2, y2],注意,由於在第三步中將anchors對映回原圖判斷是否超出邊界,所以這裡輸出的proposal是對應MxN輸入影象尺度的,這點在後續網路中有用。另外我認為,嚴格意義上的檢測應該到此就結束了,後續部分應該屬於識別了~

RPN網路結構就介紹到這裡,總結起來就是:
生成anchors -> softmax分類器提取fg anchors -> bbox reg迴歸fg anchors -> Proposal Layer生成proposals
六、疑問
為什麼需要 設定3*3的滑動視窗?就是用來卷積的。

相關文章