經典神經網絡 | Faster R-CNN論文解析
論文題目:Faster R-CNN: T owards Real-Time Object Detection with Region Proposal Networks
論文鏈接:https://arxiv.org/abs/1506.01497
研究目標
Faster R—CNN網絡介紹
Faster R—CNN結構
Faster R—CNN具體可分為四個結構:
Conv layers:作為一種CNN網絡目標檢測方法,Faster RCNN首先使用一組基礎的conv+relu+pooling層提取image的feature maps。該feature maps被共享用于后續RPN層和全連接層。
Region Proposal Networks:RPN網絡用于生成region proposals。該層通過softmax判斷anchors屬于 positive或者 negative,再利用bounding box regression修正anchors獲得精確的proposals。
Roi Pooling:該層收集輸入的feature maps和proposals,綜合這些信息后提取proposal feature maps,送入后續全連接層判定目標類別。
Classification:利用proposal feature maps計算proposal的類別,同時再次bounding box regression獲得檢測框最終的精確位置。
下圖是VGG16模型中的faster_rcnn_test.pt的網絡結構,可以清晰的看到該網絡對于一副任意大小PxQ的圖像,首先縮放至固定大小MxN,然后將MxN圖像送入網絡;而Conv layers中包含了13個conv層+13個relu層+4個pooling層;RPN網絡首先經過3x3卷積,再分別生成positive anchors和對應bounding box regression偏移量,然后計算出proposals;而Roi Pooling層則利用proposals從feature maps中提取proposal feature送入后續全連接和softmax網絡作classification。
python版本中的VGG16模型中的faster_rcnn_test.pt的網絡結構。Conv layers部分共有13個conv層,13個relu層,4個pooling層
Conv layers
Conv layers包含了conv,pooling,relu三種層。所有的conv層都是:kernel_size=3,pad=1,stride=1。所有的pooling層都是:kernel_size=2,pad=1,stride=1。
Region Proposal NetWork(RPN)
經典的檢測方法生成檢測框都非常耗時,如R-CNN使用SS(Selective Search)方法生成檢測框。而Faster RCNN則拋棄了傳統的滑動窗口和SS方法,直接使用RPN生成檢測框,這也是Faster R-CNN的巨大優勢,能極大提升檢測框的生成速度。
RPN網絡結構
上圖展示了RPN網絡的具體結構。可以看到RPN網絡實際分為2條線,上面一條通過softmax分類anchors獲得positive和negative分類,下面一條用于計算對于anchors的bounding box regression偏移量,以獲得精確的proposal。而最后的Proposal層則負責綜合positive anchors和對應bounding box regression偏移量獲取proposals,同時剔除太小和超出邊界的proposals。其實整個網絡到了Proposal Layer這里,就完成了相當于目標定位的功能。
Anchor
在每個滑動窗口的位置,我們同時預測多個Region Proposal,每個位置最大可能的Proposal設置為k。每個回歸層輸出4k個坐標(即x,y,w,h),分類層輸出2k個Scores。RPN默認設置為3 Scale,3 aspect ratios,因此每個位置輸出9個anchor。對于大小為W×H(通常為2400)的卷積特征圖,總共有W Hkanchor。如下圖所示:
注意:全部anchors拿去訓練太多了,訓練程序會在合適的anchors中隨機選取128個postive anchors+128個negative anchors進行訓練
Loss Function
我們定義在faster r-cnn中,最小化多任務損失,公式如下:
公式中,i是mini-batch中anchor的索引,是如果框出來的anchor是目標的概率。如果anchor是positive的話,ground-truth label為1,否則為0。是預測框的參數化向量。是標注的框。
和通過參數來平衡。在論文的設置中,=256,=2400,=10。
對于bounding box regression,我們采用如下的四個坐標,具體含義可以參照原文:
訓練RPN
RPN可以通過反向傳播和隨機梯度下降(SGD)進行端到端的訓練。我們遵循“以圖像為中心”的采樣策略來訓練這個網絡。每個小批都來自一個包含許多正面和負面示例anchor的圖像。我們可以對所有anchor的損失函數進行優化,但這將偏向于負樣本,因為它們占主導地位。相反,我們在一張圖像中隨機抽取256個錨點來計算一個小批量的損失函數,其中抽樣的正錨點和負錨點的比例高達1:1。如果一個圖像中有少于128個positive樣本,我們用negative樣本填充這個小批。
ROI Polling
ROI Pooling的作用是對不同大小的region proposal,從最后卷積層輸出的feature map提取大小固定的feature map。因為全連接層的輸入需要尺寸大小一樣,所以不能直接將不同大小的region proposal映射到feature map作為輸出,需要做尺寸變換。即將一個hw的region proposal分割成HW大小的網格,然后將這個region proposal映射到最后一個卷積層輸出的feature map,最后計算每個網格里的最大值作為該網格的輸出,所以不管ROI pooling之前的feature map大小是多少,ROI pooling后得到的feature map大小都是H*W。
下面是ROI polling layer層的一個經典動圖:從圖中可以直接看到ROI polling是怎樣使輸出都是固定的形狀。
classification
Classification部分利用已經獲得的proposal feature maps,通過full connect層與softmax計算每個proposal具體屬于那個類別(如人,車,電視等),輸出cls_prob概率向量;同時再次利用bounding box regression獲得每個proposal的位置偏移量bbox_pred,用于回歸更加精確的目標檢測框。Classification部分網絡結構如下圖所示。
從RoI Pooling獲取到7x7=49大小的proposal feature maps后,送入后續網絡,可以看到做了如下2件事:
1、通過全連接和softmax對proposals進行分類,這實際上已經是識別的范疇了
2、再次對proposals進行bounding box regression,獲取更高精度的rect box
Faster RCNN訓練
Faster R-CNN的訓練,是在已經訓練好的model(如VGG_CNN_M_1024,VGG,ZF)的基礎上繼續進行訓練。實際中訓練過程分為6個步驟:
在已經訓練好的model上,訓練RPN網絡,對應stage1_rpn_train.pt
利用步驟1中訓練好的RPN網絡,收集proposals,對應rpn_test.pt
第一次訓練Fast RCNN網絡,對應stage1_fast_rcnn_train.pt
第二訓練RPN網絡,對應stage2_rpn_train.pt
再次利用步驟4中訓練好的RPN網絡,收集proposals,對應rpn_test.pt
第二次訓練Fast RCNN網絡,對應stage2_fast_rcnn_train.pt
下面是一張訓練過程流程圖:
Faster R-CNN在各項數據集上的表現
開源代碼
https://github.com/rbgirshick/py-faster-rcnn
神經網絡
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。