Faster RCNN原理分析(二):Region Proposal Networks详解
生活随笔
收集整理的這篇文章主要介紹了
Faster RCNN原理分析(二):Region Proposal Networks详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Region Proposal Networks是Faster RCNN出新提出來的proposal生成網絡。其替代了之前RCNN和Fast RCNN中的selective search方法,將所有內容整合在一個網絡中,大大提高了檢測速度(語文水平差,所以歷史科普請看其他文章T_T)。
縮進在正文前,還要多解釋幾句基礎知識,已經懂的看官老爺跳過就好。
對于單通道圖像+單卷積核做卷積,上一篇文章已經介紹了(參考上文圖4); 對于多通道圖像+多卷積核做卷積,計算方式如下:
圖1 多通道+多卷積核做卷積示意圖(摘自Theano教程) 縮進如圖2,輸入圖像layer m-1有4個通道,同時有2個卷積核w1和w2。對于卷積核w1,先在輸入圖像4個通道分別作卷積,再將4個通道結果加起來得到w1的卷積輸出;卷積核w2類似。所以對于某個卷積層,無論輸入圖像有多少個通道,輸出圖像通道數總是等于卷積核數量!特殊的,對于多通道做1x1卷積,其實就是將輸入圖像于每個通道乘以卷積系數后加在一起。這樣做的結果就是把原圖像中本來各個獨立的通道“聯通”在了一起。
圖2 anchors示意圖 注:關于上面的anchors size,其實是根據檢測圖像設置的。在python demo中,會把任意大小的輸入圖像reshape成800x600(即上文中提到的M=800,N=600)。再回頭來看anchors的大小,anchors中長寬1:2中最大為352x704,長寬2:1中最大736x384,基本是cover了800x600的各個尺度和形狀。 那么這9個anchors是做什么的呢?借用Faster RCNN論文中的原圖,如圖3,遍歷Conv layers計算獲得的feature maps,為每一個點都配備這9種anchors作為初始的檢測框。這樣做獲得檢測框很不準確,不用擔心,后面還有2次bounding box regression可以修正檢測框位置。
圖3 解釋一下上面這張圖的數字。在原文中使用的是ZF model中,其Conv Layers中最后的conv5層num_output=256,對應生成256張特征圖,所以相當于feature map每個點都是256-d 由于輸入圖像M=800,N=600,且Conv Layers做了4次Pooling,feature map的長寬為[M/16, N/16]=[50, 38] 在conv5之后,做了rpn_conv/3x3卷積,num_output=256,相當于每個點使用了周圍3x3的空間信息,同時256-d不變,如圖3紅框,同時對應圖4中的紅框中的3x3卷積 假設一共有k個anchor,而每個anhcor要分foreground和background,所以cls=2k scores;而每個anchor都有[x, y, w, h]對應4個偏移量,所以reg=4k coordinates
圖4
注意,在本文講解中使用的VGG conv5 num_output=512,所以是512d,其他類似.....
圖7 那么經過何種變換才能從圖6中的A變為G'呢? 比較簡單的思路就是: 縮進 1. 先做平移
縮進 2. 再做縮放
縮進觀察上面4個公式發現,需要學習的是dx(A),dy(A),dw(A),dh(A)這四個變換。當輸入的anchor與GT相差較小時,可以認為這種變換是一種線性變換, 那么就可以用線性回歸來建模對窗口進行微調(注意,只有當anchors和GT比較接近時,才能使用線性回歸模型,否則就是復雜的非線性問題了)。對應于Faster RCNN原文,平移量(tx, ty)與尺度因子(tw, th)如下: 縮進接下來的問題就是如何通過線性回歸獲得dx(A),dy(A),dw(A),dh(A)了。線性回歸就是給定輸入的特征向量X, 學習一組參數W, 使得經過線性回歸后的值跟真實值Y(即GT)非常接近,即Y=WX。對于該問題,輸入X是一張經過num_output=1的1x1卷積獲得的feature map,定義為Φ;同時還有訓練傳入的GT,即(tx,?ty, tw, th)。輸出是dx(A),dy(A),dw(A),dh(A)四個變換。那么目標函數可以表示為:
其中Φ(A)是對應anchor的feature map組成的特征向量,w是需要學習的參數,d(A)是得到的預測值(*表示 x,y,w,h,也就是每一個變換對應一個上述目標函數)。為了讓預測值(tx, ty,?tw,?th)與真實值最小,得到損失函數:
函數優化目標為:
圖8 RPN中的bbox reg 先來看一看上圖7中1x1卷積的caffe prototxt定義: layer {name: "rpn_bbox_pred"type: "Convolution"bottom: "rpn/output"top: "rpn_bbox_pred"convolution_param {num_output: 36 # 4 * 9(anchors)kernel_size: 1 pad: 0 stride: 1} }可以看到其num_output=36,即經過該卷積輸出圖像為PxQx36,在caffe blob存儲為[1, 4x9, Q, P]。與上文中fg/bg anchors存儲為[1, 18, Q, P]類似,這里相當于feature maps每個點都有9個anchors,每個anchors又都有4個用于回歸的[dx(A),dy(A),dw(A),dh(A)]變換量。利用上面的的計算公式即可從foreground anchors回歸出proposals。
圖8 縮進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
圖1 多通道+多卷積核做卷積示意圖(摘自Theano教程) 縮進如圖2,輸入圖像layer m-1有4個通道,同時有2個卷積核w1和w2。對于卷積核w1,先在輸入圖像4個通道分別作卷積,再將4個通道結果加起來得到w1的卷積輸出;卷積核w2類似。所以對于某個卷積層,無論輸入圖像有多少個通道,輸出圖像通道數總是等于卷積核數量!特殊的,對于多通道做1x1卷積,其實就是將輸入圖像于每個通道乘以卷積系數后加在一起。這樣做的結果就是把原圖像中本來各個獨立的通道“聯通”在了一起。
(一)anchors
縮進提到RPN網絡,就不能不說anchors。所謂anchors,實際上就是一組由rpn/generate_anchors.py生成的矩形。直接運行generate_anchors.py得到以下輸出: [[ -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.]] 其中每行的4個值[x1,y1,x2,y2]代表矩形左上和右下角點坐標。9個矩形共有3種形狀,長寬比為大約為:width:height = [1:1, 1:2, 2:1]三種,如圖2。實際上通過anchors就引入了檢測中常用到的多尺度方法。圖2 anchors示意圖 注:關于上面的anchors size,其實是根據檢測圖像設置的。在python demo中,會把任意大小的輸入圖像reshape成800x600(即上文中提到的M=800,N=600)。再回頭來看anchors的大小,anchors中長寬1:2中最大為352x704,長寬2:1中最大736x384,基本是cover了800x600的各個尺度和形狀。 那么這9個anchors是做什么的呢?借用Faster RCNN論文中的原圖,如圖3,遍歷Conv layers計算獲得的feature maps,為每一個點都配備這9種anchors作為初始的檢測框。這樣做獲得檢測框很不準確,不用擔心,后面還有2次bounding box regression可以修正檢測框位置。
圖3 解釋一下上面這張圖的數字。
(二)softmax判定foreground與background
縮進在上一篇文章中提到:一副MxN大小的矩陣送入Faster RCNN網絡后,到RPN網絡變為(M/16)x(N/16),不妨設W=M/16,H=N/16。在進入reshape與softmax之前,先做了1x1卷積,如圖5: 圖5 RPN中判定fg/bg網絡結構 該1x1卷積的caffe prototxt定義如下: layer {name: "rpn_cls_score"type: "Convolution"bottom: "rpn/output"top: "rpn_cls_score"convolution_param {num_output: 18 # 2(bg/fg) * 9(anchors)kernel_size: 1 pad: 0 stride: 1} } 可以看到其num_output=18,也就是經過該卷積的輸出圖像為WxHx18大小(注意文章開頭提到的卷積計算方式)。這也就剛好對應了feature maps每一個點都有9個anchors,同時每個anchors又有可能是foreground和background,所有這些信息都保存WxHx(9x2)大小的矩陣。為何這樣做?后面接softmax分類獲得foreground anchors,也就相當于初步提取了檢測目標候選區域box(一般認為目標在foreground anchors中)。 縮進那么為何要在softmax前后都接一個reshape layer?其實只是為了便于softmax分類,至于具體原因這就要從caffe的實現形式說起了。在caffe基本數據結構blob中以如下形式保存數據: blob=[batch_size, channel,height,width] 對應至上面的保存bg/fg anchors的矩陣,其在caffe blob中的存儲形式為[1, 18, H, W]。而在softmax分類時需要進行fg/bg二分類,所以reshape layer會將其變為[1, 2, 9*H, W]大小,即單獨“騰空”出來一個維度以便softmax分類,之后再reshape回復原狀。貼一段caffe softmax_loss_layer.cpp的reshape函數的解釋,非常精辟: "Number of labels must match number of predictions; " "e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), " "label count (number of labels) must be N*H*W, " "with integer values in {0, 1, ..., C-1}."; 綜上所述,RPN網絡中利用anchors和softmax初步提取出foreground anchors作為候選區域。(三)bounding box regression原理
縮進先介紹bounding box regression數學模型及原理。如圖5所示綠色框為飛機的Ground Truth(GT),紅色為提取的foreground anchors,那么即便紅色的框被分類器識別為飛機,但是由于紅色的框定位不準,這張圖相當于沒有正確的檢測出飛機。所以我們希望采用一種方法對紅色的框進行微調,使得foreground anchors和GT更加接近。 圖6 縮進對于窗口一般使用四維向量(x, y, w, h)表示,分別表示窗口的中心點坐標和寬高。對于圖 7,紅色的框A代表原始的Foreground Anchors,綠色的框G代表目標的GT,我們的目標是尋找一種關系,使得輸入原始的anchor A經過映射得到一個跟真實窗口G更接近的回歸窗口G',即:給定A=(Ax, Ay, Aw, Ah),尋找一種映射f,使得f(Ax, Ay, Aw, Ah)=(G'x, G'y, G'w, G'h),其中(G'x, G'y, G'w, G'h)≈(Gx, Gy, Gw, Gh)。圖7 那么經過何種變換才能從圖6中的A變為G'呢? 比較簡單的思路就是: 縮進 1. 先做平移
縮進 2. 再做縮放
縮進觀察上面4個公式發現,需要學習的是dx(A),dy(A),dw(A),dh(A)這四個變換。當輸入的anchor與GT相差較小時,可以認為這種變換是一種線性變換, 那么就可以用線性回歸來建模對窗口進行微調(注意,只有當anchors和GT比較接近時,才能使用線性回歸模型,否則就是復雜的非線性問題了)。對應于Faster RCNN原文,平移量(tx, ty)與尺度因子(tw, th)如下: 縮進接下來的問題就是如何通過線性回歸獲得dx(A),dy(A),dw(A),dh(A)了。線性回歸就是給定輸入的特征向量X, 學習一組參數W, 使得經過線性回歸后的值跟真實值Y(即GT)非常接近,即Y=WX。對于該問題,輸入X是一張經過num_output=1的1x1卷積獲得的feature map,定義為Φ;同時還有訓練傳入的GT,即(tx,?ty, tw, th)。輸出是dx(A),dy(A),dw(A),dh(A)四個變換。那么目標函數可以表示為:
其中Φ(A)是對應anchor的feature map組成的特征向量,w是需要學習的參數,d(A)是得到的預測值(*表示 x,y,w,h,也就是每一個變換對應一個上述目標函數)。為了讓預測值(tx, ty,?tw,?th)與真實值最小,得到損失函數:
函數優化目標為:
(四)對proposals進行bounding box regression
縮進在了解bounding box regression后,再回頭來看RPN網絡第二條線路,如圖8。圖8 RPN中的bbox reg 先來看一看上圖7中1x1卷積的caffe prototxt定義: layer {name: "rpn_bbox_pred"type: "Convolution"bottom: "rpn/output"top: "rpn_bbox_pred"convolution_param {num_output: 36 # 4 * 9(anchors)kernel_size: 1 pad: 0 stride: 1} }可以看到其num_output=36,即經過該卷積輸出圖像為PxQx36,在caffe blob存儲為[1, 4x9, Q, P]。與上文中fg/bg anchors存儲為[1, 18, Q, P]類似,這里相當于feature maps每個點都有9個anchors,每個anchors又都有4個用于回歸的[dx(A),dy(A),dw(A),dh(A)]變換量。利用上面的的計算公式即可從foreground anchors回歸出proposals。
(五)Proposal Layer
縮進Proposal Layer負責綜合所有[dx(A),dy(A),dw(A),dh(A)]變換量和foreground anchors,計算出精準的proposal,送入后續RoI Pooling Layer。還是先來看看Proposal Layer的caffe prototxt定義: layer {name: 'proposal'type: 'Python'bottom: 'rpn_cls_prob_reshape'bottom: 'rpn_bbox_pred'bottom: 'im_info'top: 'rois'python_param {module: 'rpn.proposal_layer'layer: 'ProposalLayer'param_str: "'feat_stride': 16"} }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。 縮進首先解釋im_info。對于一副任意大小PxQ圖像,傳入Faster RCNN前首先reshape到固定MxN,im_info=[M, N, scale_factor]則保存了此次縮放的所有信息。然后經過Conv Layers,經過4次pooling變為(M/16)x(N/16)大小,其中feature_stride=16則保存了該信息。所有這些數值都是為了將proposal映射回原圖而設置的,如圖8,畢竟檢測就是為了在原圖上畫一個框而已~圖8 縮進Proposal Layer forward(caffe layer的前傳函數)按照以下順序依次處理:
RPN網絡結構就介紹到這里,總結起來就是: 生成anchors -> softmax分類器提取fg anchors?-> bbox reg回歸fg anchors -> Proposal Layer生成proposals
總結
以上是生活随笔為你收集整理的Faster RCNN原理分析(二):Region Proposal Networks详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Faster-RCNN学习
- 下一篇: SSD论文阅读(Wei Liu——【EC