1. 程式人生 > >pytoch faster rcnn復現系列(一) RPN層輸入輸出維度理解

pytoch faster rcnn復現系列(一) RPN層輸入輸出維度理解

目錄

1.  1*1 FC層

2.  anchor_target_layer_>rpn_data                              ​

     3. 二分類 softmaxloss

     4. 迴歸損失 rpn_loss_bbox

5. softmax 二分類分類概率

6. prosal_layer_>rpn_rois 2000個rpn_rois

7. proposal_target_layer_>roi_data 128個rois


想要復現faster rcnn,理解rpn是必備的,而明白其輸入輸出又是復現的第一步。

以FCN中rpn的caffe模型來講解rpn的過程。

首先是資料讀入操作,假設輸出的data是1*3*600*1000,im_info是1*3[h w  imscale],gt_boxes是1*5[ymin xmin ymax xmax,class],後面的所有維度都是以這個假設為前提。

這裡寫圖片描述

總體理解:

1.  1*1 FC層

 1個共享卷積層之後,緊跟著RPN接面構。最開始是一個512*3*3的conv+relu。

下面緊跟著一個18*1*1,一個36*1*1的全連線功能的層。

2.  anchor_target_layer_>rpn_data

 先說cls這邊。rpn_data層(anchor_target_layer型別的層),輸入 ,輸出分別為以下

  bottom: 'rpn_cls_score'#[1,2*k,H,W] 類似與fc層的輸出
  bottom: 'gt_boxes'
  bottom: 'im_info'#原圖c h w,因為座標迴歸的是原圖座標的xy偏移,需要用hw 過濾不在圖片內部的
  bottom: 'data'
  K表示9個anchor,3*3,HW表示的是rpn第一層卷積的特徵圖的寬高。
  top: 'rpn_labels' # [1,1,k*H,W] 生成rpn的標籤,前景為1,背景為0,然後給softmaxLoss層,
  top: 'rpn_bbox_targets'#[1,4*K,H,W] smooth_l1_loss輸入
  top: 'rpn_bbox_inside_weights'#[1,4*K,H,W]smooth_l1_loss輸入
  top: 'rpn_bbox_outside_weights'#[1,4*K,H,W] smooth_l1_loss輸入

   將 20000 多個候選的 anchor 選出 256 個 anchor 進行分類和迴歸位置。選擇過程如下:

  • 對於每一個 ground truth bounding box (gt_bbox),選擇和它重疊度(IoU)最高的一個 anchor 作為正樣本

  • 對於剩下的 anchor,從中選擇和任意一個gt_bbox重疊度超過 0.7 的 anchor,作為正樣本,正樣本的數目不超過 128 個

  • 機選擇和gt_bbox重疊度小於 0.3 的 anchor 作為負樣本。負樣本和正樣本的總數為 256。例如:正樣本100負樣本156

對於每個 anchor, gt_label 要麼為 1(前景),要麼為 0(背景),而 gt_loc 則是由 4 個位置引數 (tx,ty,tw,th) 組成,這樣比直接回歸座標更好。

                                     

3. 二分類 softmaxloss

求二分類的loss的時候,softmaxloss,輸入是rpn_lables【自己生成的rpn標籤】+rpn_cls_scole【預測的】_>reshape【二分類,每一個特徵圖上的點都是一個二分類,reshape的作用是將格式轉換成和rpn_lables的一樣】

4. 迴歸損失 rpn_loss_bbox

輸入rpn_data 生成的rpn的bbox相關資訊,與fc層rpn_bbox_pred【預測的】一起作為輸入,進行損失計算。

兩個輸入的維度都是[1,4*k,H,W],不需要reshape操作。

5. softmax 二分類分類概率

輸入[1,2,k*H,W]:rpn_cls_scole【預測的】_>reshape後的結果

輸出[1,2,k*H,W]:得到所有anchor的二分類的概率。

6. prosal_layer_>2000個rpn_rois

首先需要softmax的結果,進行reshape[1,2,k*H,W]_>[1,2*k,H,W],這樣與其他的輸入是類似的。

輸出:  rpn_rois [1,5]

  bottom: 'rpn_cls_prob_reshape'#[1,18,H,W]每個框對應的概率
  bottom: 'rpn_bbox_pred'#[1,36,H,W]預測的框運算loss,反向傳播,越來越準
  bottom: 'im_info'
  top: 'rpn_rois' #[1,5]
  • 對於每張圖片,利用它的 feature map, 計算 (H/16)× (W/16)×9(大概 20000)個 anchor 屬於前景的概率,以及對應的位置引數【softmax二分類概率】

  • 選取概率較大的 12000 個 anchor

  • 利用迴歸的位置引數修正這 12000 個 anchor 的位置,得到 rpn_rois

  • 利用非極大值((Non-maximum suppression, NMS)抑制,選出概率最大的 2000 個 rpn_rois

7. proposal_target_layer_> roi_data 128 個RoIs

  bottom: 'rpn_rois'[1,5]
  bottom: 'gt_boxes'[1,4]
  top: 'rois'[1,5,1,1]
  top: 'labels'[1,1,1,1]
  top: 'bbox_targets'[1,8,1,1]儲存的是anchors和最高重疊的gt的(
   x*-xa)/wa,(y*-ya)/ha,log(w*/wa),log(h*/hg),*為gt。
  top: 'bbox_inside_weights'[1,8,1,1]被抽中的正類為1,其他為0;
  top: 'bbox_outside_weights[1,8,1,1]外部權重,目前負例的外部權重=正例的外部權重=np.ones((1, 4)) * 1.0 / 

RPN 會產生大約 2000 個 RoIs,這 2000 個 RoIs 不是都拿去訓練,而是利用ProposalTargetCreator 選擇 128 個 RoIs 用以訓練。選擇的規則如下:

  • RoIs 和 gt_bboxes 的 IoU 大於 0.5 的,選擇一些(比如 32 個)

  • 選擇 RoIs 和 gt_bboxes 的 IoU 小於等於 0(或者 0.1)的選擇一些(比如 128-32=96 個)作為負樣本

為了便於訓練,對選擇出的 128 個 RoIs,還對他們的gt_roi_loc 進行標準化處理(減去均值除以標準差)

對於分類問題, 直接利用交叉熵損失. 而對於位置的迴歸損失, 一樣採用 Smooth_L1Loss, 只不過只對正樣本計算損失. 而且是隻對正樣本中的這個類別 4 個引數計算損失。舉例來說:

  • 一個 RoI 在經過 FC 84 後會輸出一個 84 維的 loc 向量. 如果這個 RoI 是負樣本, 則這 84 維向量不參與計算 L1_Loss

  • 如果這個 RoI 是正樣本, 屬於 label K, 那麼它的第 K×4, K×4+1 ,K×4+2, K×4+3 這 4 個數參與計算損失,其餘的不參與計算損失。

 



RPN網路,RPN網路以一個3*3的卷積核,pad=1,stride=1的512個卷積核的卷積層開始,輸入是res4f層的輸出,res4f層的輸出即conv4_x最後的輸出。該rpn_conv/3*3層的輸出是1*512*38*63。

這裡寫圖片描述

然後是分類層和迴歸層,分類層採用1*1的卷積核,pad=0,stride=1的18(2(back ground/fore ground)*9(anchors))個卷積核的卷積層,分類層的輸出是1*18*38*63。迴歸採用1*1的卷積核,pad=0,stride=1的36(4*9(anchors))個卷積核的卷積層,迴歸層的輸出是1*36*38*63

這裡寫圖片描述

Reshape層對分類層的結果做了一次維度調整,從1*18*38*63變成1*2*342*63,後面的342*63就代表該層所有anchor的數量。

這裡寫圖片描述

anchor_target_layer

input:最開始讀取的資料得到rpn的label和target。

輸出:rpn_labels為1*1*342*63,rpn_bbox_targets為1*36*38*63,rpn_bbox_inside_weights為1*36*38*63,rpn_bbox_outside_weights為1*36*38*63

這裡寫圖片描述

損失函式如下:分類的損失採用SoftmaxWithLoss,輸入是reshape後的預測的類別score(1*2*342*63)和真實的label(1*1*342*63)。迴歸的損失採用SmoothL1Loss,輸入是rpn_bbox_pred(1*36*38*63)即所有anchor的座標相關的預測,rpn_bbox_targets(1*36*38*63),rpn_bbox_inside_weights(1*36*38*63),rpn_bbox_outside_weights(1*36*38*63)。

這裡寫圖片描述

然後是ROI Proposal,先用一個softmax層算出概率(1*2*342*63),然後再reshape到1*18*38*63。

這裡寫圖片描述

然後是生成proposal,維度是1*5。

這裡寫圖片描述

這一層生成rois(1*5*1*1),labels(1*1*1*1),bbox_targets(1*8*1*1),bbox_inside_weights 
(1*8*1*1),bbox_outside_weights(1*8*1*1)。

這裡寫圖片描述

至此RPN網路結束。