Faster R-CNN最突出的貢獻在於提出Region Proposal Network(RPN)替換了選擇性搜索(Selective Search),在保證對象檢測的準確率的條件下,將檢測時間降低了10倍左右,實現了實時的對象檢測。
從上表中可以看出,SS平均耗費約1.5s來計算Proposal,而Faster R-CNN的Proposal+Detection過程耗費198ms,通過共享卷積特徵層,RPN獲取Proposal的過程僅僅耗時10ms。
RPN網絡
RPN網絡生成Region Proposal的過程如下:
we slide a small network over the conv feature map output by the last shared conv layer。
Region Proposal Network
RPN網絡結構:3x3的卷積層 + 兩個1x1的卷積網絡(reg + cls)。
conv layer,slim.conv2d的激活函數是ReLU:
rpn = slim.conv2d(net_conv,
cfg.RPN_CHANNELS,
[3, 3],
trainable=is_training,
weights_initializer=initializer,
scope="rpn_conv/3x3")
cls layer:
rpn_cls_score = slim.conv2d(rpn,
self._num_anchors * 2,
[1, 1],
trainable=is_training,
weights_initializer=initializer,
padding='VALID',
activation_fn=None,
scope='rpn_cls_score')
reg layer:
rpn_bbox_pred = slim.conv2d(rpn,
self._num_anchors * 4,
[1, 1],
trainable=is_training,
weights_initializer=initializer,
padding='VALID',
activation_fn=None,
scope='rpn_bbox_pred')
由於採用滑動窗口的模式,所以整個Feature Map共享相同的參數。
RPN生成ROI
RPN的Anchor機制相當於對暴力窮舉,論文中,設置stride=16,那麼1000x16的圖片就生成大約60x40x9=20000個Anchor Boxes,如此多的Anchor Boxes,需要經過一定篩選機制,剔除重複和無效的Anchor Boxes,以得到更好的Region Proposal。
_proposal_layer:
通過神經網絡產生的rpn_bbox_pred是參數化的Bounding Box,首先需要轉換到圖像座標框,並且裁剪掉超出邊界的部分。
parameterization of the bounding box coordinate
然後採用nms(非最大值抑制),按照Score大小返回前Top N的rois;
非最大值抑制(NMS)
非最大值抑制的過程如下,將所有的Proposal按照score排序,然後去除重疊區域大於閾值的候選框。
_anchor_target_layer:
該函數過濾在圖片範圍之外的Anchor,通過IoU計算正負樣本,最終返回rpn_labels, rpn_bbox_targets, rpn_bbox_inside_weights,和rpn_bbox_outside_weights.
_proposal_target_layer:
訓練過程中每個Batch輸入一張圖片,在一張圖片中包含需要許多正樣本和負樣本的Anchors,一般情況下,不會把所有的樣本都參與訓練,因為通常都是負樣本佔據多數,會誤導整個網絡。論文中,會隨機的在一張圖片中採樣256個Anchor(正樣本和負樣本數量為1:1),如果正樣本的數量少於128個,會用負樣本來補充。該函數會所有的ROI、用於迴歸的Box以及用於Loss計算的bbox_inside_weights和bbox_outside_weights。
閱讀更多 半杯茶的小酒杯 的文章