天天看點

【目标檢測】Faster RCNN算法解讀

論文位址:https://arxiv.org/abs/1506.01497

代碼位址:https://github.com/rbgirshick/py-faster-rcnn

 Faster RCNN的結構如下:

【目标檢測】Faster RCNN算法解讀
【目标檢測】Faster RCNN算法解讀
【目标檢測】Faster RCNN算法解讀
  • 一張圖像作為輸入,通過CNN提取特征,得到feature map;
  • 将feature map輸入到RPN層,RPN層原理如下,用一個3x3的滑動窗,周遊整個feature map,在周遊的過程中每個視窗的中心按照1:1,1:2,2:1的比例生成9個anchor box,然後利用FC層對anchors做二分類和粗略的邊框回歸,最後輸出比較精确的300個ROI區域框;
  1. 在原文中使用的是ZF model中,其Conv Layers中最後的conv5層num_output=256,對應生成256張特征圖,是以相當于feature map每個點都是256-d;
  2. 在conv5之後,做了rpn_conv/3x3卷積且num_output=256,相當于每個點又融合了周圍3x3的空間資訊(猜測這樣做也許更魯棒?反正我沒測試),同時256-d不變;
  3. 假設在conv5 feature map中每個點上有k個anchor(預設k=9),而每個anhcor要分前景和背景,是以每個點由256d feature轉化為cls=2k scores;而每個anchor都有[x, y, w, h]對應4個偏移量,是以reg=4k coordinates。
【目标檢測】Faster RCNN算法解讀
  • 把經過RPN提取的ROI區域框同步映射到RPN之前CNN輸出的feature map上,并進行ROI pooling,輸出一個固定次元的特征圖;
  • 利用多任務損失函數,進行分類和bounding box回歸。

 各部分算法詳解:

  • CNN層

     以VGG16為例,經過4次下采樣,是以最終輸出為(M/16)x(N/16)。

  • RPN

     RPN網絡實際分為2條線,上面一條通過softmax分類anchors獲得foreground和background(檢測目标是foreground),下面一條用于計算對于anchors的bounding box regression偏移量,以獲得精确的proposal。而最後的Proposal層則負責綜合foreground anchors和bounding box regression偏移量擷取proposals,同時剔除太小和超出邊界的proposals。

bounding box regression原理:

對于視窗一般使用四維向量(x, y, w, h)表示,分别表示視窗的中心點坐标和寬高。對于圖 10,紅色的框A代表原始的Foreground Anchors,綠色的框G代表目标的GT,我們的目标是尋找一種關系,使得輸入原始的anchor A經過映射得到一個跟真實視窗G更接近的回歸視窗G',即:給定anchor A=(Ax, Ay, Aw, Ah),GT=[Gx, Gy, Gw, Gh],尋找一種變換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)。

【目标檢測】Faster RCNN算法解讀

那麼經過何種變換F才能從圖6中的anchor A變為G'呢? 比較簡單的思路就是:

縮進 1. 先做平移

【目标檢測】Faster RCNN算法解讀

縮進 2. 再做縮放

【目标檢測】Faster RCNN算法解讀

縮進觀察上面4個公式發現,需要學習的是dx(A),dy(A),dw(A),dh(A)這四個變換。當輸入的anchor A與GT相差較小時,可以認為這種變換是一種線性變換, 那麼就可以用線性回歸來模組化對視窗進行微調(注意,隻有當anchors A和GT比較接近時,才能使用線性回歸模型,否則就是複雜的非線性問題了)。對應于Faster RCNN原文,平移量(tx, ty)與尺度因子(tw, th)如下:

【目标檢測】Faster RCNN算法解讀

縮進接下來的問題就是如何通過線性回歸獲得dx(A),dy(A),dw(A),dh(A)了。線性回歸就是給定輸入的特征向量X, 學習一組參數W, 使得經過線性回歸後的值跟真實值Y非常接近,即Y=WX。對于該問題,輸入X是一張經過卷積獲得的feature map,定義為Φ;同時還有訓練傳入的GT,即(tx, ty, tw, th)。輸出是dx(A),dy(A),dw(A),dh(A)四個變換。那麼目标函數可以表示為:

【目标檢測】Faster RCNN算法解讀

其中Φ(A)是對應anchor的feature map組成的特征向量,w是需要學習的參數,d(A)是得到的預測值(*表示 x,y,w,h,也就是每一個變換對應一個上述目标函數)。為了讓預測值(tx, ty, tw, th)與真實值差距最小,設計損失函數:

【目标檢測】Faster RCNN算法解讀

函數優化目标為:

【目标檢測】Faster RCNN算法解讀
  • ROI pooling

Proposal Layer forward(caffe layer的前傳函數)按照以下順序依次處理:

  1. 生成anchors,利用[dx(A),dy(A),dw(A),dh(A)]對所有的anchors做bbox regression回歸(這裡的anchors生成和訓練時完全一緻)
  2. 按照輸入的foreground softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)個anchors,即提取修正位置後的foreground anchors。
  3. 利用im_info将fg anchors從MxN尺度映射回PxQ原圖,判斷fg anchors是否大範圍超過邊界,剔除嚴重超出邊界fg anchors。
  4. 進行nms(nonmaximum suppression,非極大值抑制)
  5. 再次按照nms後的foreground softmax scores由大到小排序fg anchors,提取前post_nms_topN(e.g. 300)結果作為proposal輸出。

RoI Pooling layer forward過程:在之前有明确提到:proposal=[x1, y1, x2, y2]是對應MxN尺度的,是以首先使用spatial_scale參數将其映射回(M/16)x(N/16)大小的feature maps尺度(這裡來回多次映射,是有點繞);之後将每個proposal水準和豎直都分為7份,對每一份都進行max pooling處理。這樣處理後,即使大小不同的proposal,輸出結果都是7x7大小,實作了fixed-length output(固定長度輸出)。

【目标檢測】Faster RCNN算法解讀
  • classifer

        Classification部分利用已經獲得的proposal feature maps,通過full connect層與softmax計算每個proposal具體屬于那個類别(如人,車,電視等),輸出cls_prob機率向量;同時再次利用bounding box regression獲得每個proposal的位置偏移量bbox_pred,用于回歸更加精确的目标檢測框。

繼續閱讀