學習fasterrcnn檢測已經有一段時間了,最近才把核心的RPN部分進行的了解和整理,了解的偏差還請各位大神指正,
RPN(RegionProposal Network)區域生成網絡
1. 在五層conv,poolling,relu之後,取出conv5的輸出,送給RPN網絡;
layer {
name: "rpn_conv1"
type: "Convolution"
bottom: "conv5"
top: "rpn_conv1"
param { lr_mult: 1.0 }
param { lr_mult: 2.0 }
convolution_param {
num_output: 256
kernel_size: 3 pad: 1 stride: 1
weight_filler { type: "gaussian" std: 0.01 }
bias_filler { type: "constant" value: 0 }
}
}
layer {
name: "rpn_relu1"
type: "ReLU"
bottom: "rpn_conv1"
top: "rpn_conv1"
}
我們隻需要一個3*3*256*256這樣的一個4維的卷積核,就可以将每一個3*3的sliding window 卷積成一個256維的向量,相當于feature map每個點都是256-d。
anchors。按照尺度變換(128×128, 256*256,512*512,2:1, 1:1, 1:2)計算這256維向量每個像素的9個anchor,所謂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.]]。
2.
計算每個像素256-d的9個尺度下的值,得到9個anchor,我們給每個anchor配置設定一個二進制的标簽(前景背景)。我們配置設定正标簽前景給兩類anchor:1)與某個ground truth(GT)包圍盒有最高的IoU重疊的anchor(也許不到0.7),2)與任意GT包圍盒有大于0.7的IoU交疊的anchor。注意到一個GT包圍盒可能配置設定正标簽給多個anchor。我們配置設定負标簽(背景)給與所有GT包圍盒的IoU比率都低于0.3的anchor。非正非負的anchor對訓練目标沒有任何作用,由此輸出次元為(2*9)18-d,anchor(label和機率)一共18維。
layer {
name: "rpn_cls_score"
type: "Convolution"
bottom: "rpn_conv1"
top: "rpn_cls_score"
param { lr_mult: 1.0 }
param { lr_mult: 2.0 }
convolution_param {
num_output: 18 # 2(bg/fg) *9(anchors)
kernel_size: 1 pad: 0 stride: 1
weight_filler { type: "gaussian" std: 0.01 }
bias_filler { type: "constant" value: 0 }
}
}
對前景anchor使用softmax進行分類,得到anchor類别以及softmax score。
3.
前2.)中已經計算出foreground anchors,使用bounding box regression回歸得到預設anchor-box到ground-truth-box之間的變換參數,即平移(dx和dy)和伸縮參數(dw和dh),由此得到初步确定proposal。
Boundingbox regression原理http://blog.csdn.net/elaine_bao/article/details/60469036
4.
将預proposal利用feat_stride和im_info将anchors映射回原圖,判斷預proposal是否大範圍超過邊界,剔除嚴重超出邊界的。
按照softmax score進行從大到小排序,提取前2000個預proposal,對這個2000個進行NMS(非極大值抑制),将得到的再次進行排序,輸出300個proposal。
繼續:
對300個proposal進行ROIpooling提取出固定長度的特征送入全連接配接層
再進行softmax分類計算得分,進行boundingbox regression得到精确位置。
附上參考的連接配接,
http://www.cnblogs.com/zf-blog/p/7286405.html
http://lib.csdn.net/article/deeplearning/61641
http://blog.csdn.net/mllearnertj/article/details/53709766
如了解有偏差請留言指正!謝謝