天天看點

目标檢測之RPN

參考:https://blog.csdn.net/u011746554/article/details/74999010

(Region Proposal Network)區域生成網絡

目标檢測之RPN

RPN網絡中利用anchors和softmax初步提取出foreground anchors作為候選區域。

1)

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

}

}

那麼為何要在softmax前後都接一個reshape layer?

便于softmax分類,

從caffe的實作形式說起,在caffe基本資料結構blob中以如下形式儲存資料:

blob=[batch_size, channel,height,width]

對應至上面的儲存bg/fg anchors的矩陣,其在caffe blob中的存儲形式為[1, 29, H, W]。

而在softmax分類時需要進行fg/bg二分類,是以reshape layer會将其變為[1, 2, 9H, 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 NHW, "

“with integer values in {0, 1, …, C-1}.”;

2)

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

}

}

生成anchors -> softmax分類器提取fg anchors -> bbox reg回歸fg anchors -> Proposal Layer生成proposals

Faster-RCNN = Fast-RCNN + RPN

RPN(FCN):

任意分辨率的圖像,經過RPN,得到一個feature map。

feature map上的每一個點映射回原圖,得到這些點的坐标。

然後這些點周圍取一些提前設定好的區域,如選取每個點周圍5x5的一個區域,這些選好的區域可以用來訓練RPN。

假設我們對feature map上的每個點選取了K個anchor,feature map的大小為HWC,那麼我們再對這個feature map做兩次卷積操作,輸出分别是HWnum_classK和HW4K,分别對應每個點每個anchor屬于每一類的機率以及它所對應的物體的坐标。

那麼怎麼訓練這個網絡呢?

網絡的loss function:一個用于分類的softmax loss、一個用于回歸的smooth L1 loss

輸出對應的ground truth也很好得到,對于每個anchor,如果它和圖檔中某個物體的IOU(面積的交/面積的并)大于一個門檻值,就認為它屬于這一類,否則認為是背景,對于那些是背景的anchor回歸的loss就是0,其他anchor位置的ground truth就是它們所對應的物體的位置。

RPN其實就是關鍵的地方就在于選取了一些anchor然後進行pixel-wise的學習

RPN缺點:

最大的問題就是對小物體檢測效果很差。

假設輸入為512512,經過網絡後得到的feature map是3232,那麼feature map上的一個點就要負責周圍至少是16*16的一個區域的特征表達,那對于在原圖上很小的物體它的特征就難以得到充分的表示,是以檢測效果比較差。

SSD: Single Shot MultiBox Detector很好的解決了這個問題。

SSD可以了解為multi-scale版本的RPN,它和RPN最大的不同在于RPN隻是在最後的feature map上預測檢測的結果,而最後一層的feature map往往都比較抽象,對于小物體不能很好地表達特征,而SSD允許從CNN各個level的feature map預測檢測結果,這樣就能很好地适應不同scale的物體,對于小物體可以由更底層的feature map做預測。這就是SSD和RPN最大的不同,其他地方幾乎一樣。