1. 程式人生 > >FasterRCNN之整體框架詳解

FasterRCNN之整體框架詳解

歡迎訪問我的個人主頁
剛接觸物體檢測領域,學習了Faster RCNN的論文及Tensorflow版本的原始碼,不得不說,讀原始碼真的過癮…不過確實能夠幫助理解框架,下面按照Faster RCNN的預測過程介紹其整體流程

整體框架

Faster RCNN整體框架包括4部分:
一. 使用VGG16或者其他成熟的圖片分類模型提取圖片特徵(feature map)
二. 將圖片特徵喂入RPN(Region Proposal Network)網路得到proposals (包含第一次迴歸)
三. 將上兩步的結果:圖片特徵proposals 喂入RoI Pooling層得到綜合的proposals特徵


四. 根據poposals特徵預測物體的bounding box物體的類別 (包含第二次迴歸)

對應下圖: 圖中conv(3,3,512,1,1)對應conv(filter_height,filter_width,output_channels,stride_height,stride_width)
在這裡插入圖片描述

接下來分別介紹這四部分對應的網路結構,以預測過程為例(訓練過程涉及ground truth的構建,會在之後的部落格中具體介紹)

一.獲取圖片特徵

在這裡插入圖片描述
使用預訓練好的VGG16提取圖片特徵,如下圖所示,喂入的圖片(也就是’data’)並沒有經過VGG16所有的流程,而是在得到’conv5_3’這個結果後就停下了,'conv5_3’就是Faster RCNN需要的圖片特徵(feature map)
注意:'conv5_3’的h,w是輸入圖片’data’的1/16
VGG16

二.RPN網路輸出proposals

這是Faster RCNN中最複雜的一部分. 將通過VGG16得到的圖片特徵喂入RPN(Region Proposal Network)網路得到proposals
RPN網路結構如下圖所示
在這裡插入圖片描述
(1) 首先將圖片特徵’conv5_3’餵給卷積層conv(3,3,512,1,1),輸出的圖片特徵 ‘rpn_conv/3x3’ 尺寸和通道數均保持不變.
根據卷積的運算公式,猜測這一層的作用為:該層 每個filter 分別將’conv5_3’的所有通道聯絡起來,也就是說經過卷積後, 'rpn_conv/3x3’的每個通道 都整合了’conv5_3’所有通道的資訊.(這地方說起來比較繞,如果明白卷積的計算過程就容易理解了)
(2.1) 將 ‘rpn_conv/3x3’

餵給conv(1,1,36,1,1)得到 ‘rpn_box_pred’ ,36個通道表示:每個點有9組proposals的迴歸值,每組proposals的迴歸值對應論文中的tx,ty,tw,th.(這裡是第一次迴歸)
這裡要重點注意一下,'rpn_conv/3x3’的尺寸是h,w,也就是’rpn_conv/3x3’有h*w個畫素(不要考慮通道數,舉個例子:平時我們看到的彩色圖是3通道的,假設解析度是1920*1080,這表示有1920*1080個畫素點,而不是3*1920*1080個).針對這h*w個畫素,以每個畫素為中心為每個畫素生成9組proposals的迴歸值,每組迴歸值包含4個資訊.所以每個畫素點需要36個維度去儲存9*4個資訊,這就是輸出通道36的來源!
(2.2.1) 將 ‘rpn_conv/3x3’ 餵給conv(1,1,18,1,1)得到 ‘rpn_cls_score’ ,剛才說了,要為 ‘rpn_conv/3x3’ 的每個畫素生成9個proposals,而每個proposal是有類別的,要麼是foreground proposal(框出物體),要麼是backgroud proposal(框出背景).所以每個proposal需要2個維度來儲存類別得分,因此 ‘rpn_conv/3x3’ 的每個畫素需要9*2=18個維度,這就是輸出通道18的來源.
(2.2.2)接著將 ‘rpn_cls_score’ 依次喂入reshape_layer,softmax,reshape_layer,最終得到 ‘rpn_cls_prob_reshape’ ,這一過程將每個類別得分轉換為概率.
為什麼要經過兩個reshape_layer呢? 這裡引用白裳大神的解釋:

那麼為何要在softmax前後都接一個reshape layer?其實只是為了便於softmax分類,至於具體原因這就要從caffe的實現形式說起了。
在caffe基本資料結構blob中以如下形式儲存資料:blob=[batch_size, channel,height,width]
對應至上面的儲存bg/fg anchors的矩陣,其在caffe blob中的儲存形式為[1, 2x9, H, W]。
而在softmax分類時需要進行fg/bg二分類,所以reshape layer會將其變為[1, 2, 9xH, 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 N*H*W, "
"with integer values in {0, 1, ..., C-1}.";
綜上所述,RPN網路中利用anchors和softmax初步提取出foreground anchors作為候選區域。

(3) 將 ‘rpn_box_pred’‘rpn_cls_prob_reshape’ 以及 im_info 餵給proposal_layer 得到 ‘rois’ ,也就是RPN網路最終輸出的proposals. 這些proposals都是從foreground anchors裡面挑選的, 用到了nms. 接下來還需要對RPN輸出的proposals進行第二次迴歸

三. 通過RoI Pooling層得到綜合的proposals特徵

在這裡插入圖片描述
(1) 將 ‘rois’‘conv5_3’ 餵給roi_pool 得到 ‘pool_5’ , 關於roi_pool的輸入,尺寸是任意大小的,但輸出的特徵都是長度固定的. 具體可參考3分鐘理解ROI Pooling層

四.根據poposals特徵進行框迴歸和物體分類

在這裡插入圖片描述
(1) 將 ‘pool_5’ 連續經過兩個全連線層得到 'fc_7’
(2.1)將 ‘fc_7’ 經過全連線層得到 ‘bbox_pred’ ,這裡是二次迴歸,表示tx,ty,tw,th.用來和 ‘rois’ 相加,從而得到Faster RCNN最終的proposals!
(2.2.1) 將 ‘fc’ 經過全連線層得到 'cls_score’
(2.2.2) 將 ‘cls_score’ 經過softmax層得到 ‘cls_prob’ ,也就是proposal屬於各個物體的概率

以上便是Faster RCNN的4部分,關於模組的實現細節,我過幾天再寫

訓練時迭代了50000次,pascal2007測試結果MAP=0.65,其中,chair的ap最低0.46,horse的ap最高0.81
執行環境:CUDA8,cuDNN7,1070Ti,TensorFlow1.4.0,python2.7
訓練集:voc_2007_trainval 訓練時間148分鐘
測試集:voc_2007_testt 測試時間10分鐘(5000圖)

參考:
白裳