【個人整理】faster-RCNN的訓練過程以及關鍵點總結

CNN 人工智能 文章 技術 馬士兵尚學堂 2019-04-19

前言:faster-RCNN是區域卷積神經網絡(RCNN系列)的第三篇文章,是為了解決select search方法找尋region proposal速度太慢的問題而提出來的,整個faster-RCNN的大致框架依然是沿襲了fast-RCNN的基本能結構,只不過在region proposal的產生上面應用了專門的技術手段——區域推薦網絡(region proposal network,即RPN),這是整個faster最難以理解的地方,本文也將以他為重點進行說明。鑑於篇幅較長,本次系列文章將分為3篇來說明:

第一篇:faster-RCNN的背景、結構以及大致實現架構

第二篇:faster-RCNN的核心構件——RPN區域推薦網絡

第三篇:faster-RCNN的訓練以及補充

本次為系列文章第三篇。

四、RoIHead與Fast R-CNN的進一步訓練

4.1 ROIHead的網絡結構

4.2 訓練

4.3 生成預測結果

4.4 模型架構圖

五、faster-RCNN裡面的幾個重要概念(四個損失三個creator)

5.1 四類損失

5.2 三個creator


四、RoIHead與Fast R-CNN的進一步訓練

RPN只是給出了2000個候選框,RoI Head在給出的2000候選框之上繼續進行分類和位置參數的迴歸。其實所謂的ROIHead就是對生成的候選框進行處理,這個地方與前面的fast-RCNN是一樣的。

4.1 ROIHead的網絡結構

【個人整理】faster-RCNN的訓練過程以及關鍵點總結


由於RoIs給出的2000個候選框,分別對應feature map不同大小的區域。首先利用ProposalTargetCreator 挑選出128個sample_rois, 然後使用了RoIPooling 將這些不同尺寸的區域全部pooling到同一個尺度(7×7)上。下圖就是一個例子,對於feature map上兩個不同尺度的RoI,經過RoIPooling之後,最後得到了3×3的feature map.

【個人整理】faster-RCNN的訓練過程以及關鍵點總結


RoIPooling,其實這裡的ROIPooling跟fast-RCNN裡面的是一樣的。

RoI Pooling 是一種特殊的Pooling操作,給定一張圖片的Feature map (512×H/16×W/16) ,和128個候選區域的座標(128×4),RoI Pooling將這些區域統一下采樣到 (512×7×7),就得到了128×512×7×7的向量。可以看成是一個batch-size=128,通道數為512,7×7的feature map。

為什麼要pooling成7×7的尺度?是為了能夠共享權重。在之前講過,除了用到VGG前幾層的卷積之外,最後的全連接層也可以繼續利用。當所有的RoIs都被pooling成(512×7×7)的feature map後,將它reshape 成一個一維的向量,就可以利用VGG16預訓練的權重,初始化前兩層全連接。最後再接兩個全連接層,分別是:

FC 21 用來分類,預測RoIs屬於哪個類別(20個類+背景)

FC 84 用來回歸位置(21個類,每個類都有4個位置參數)

4.2 訓練

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

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

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

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

(4)對於分類問題,直接利用交叉熵損失. 而對於位置的迴歸損失,一樣採用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個數參與計算損失,其餘的不參與計算損失。

4.3 生成預測結果

測試的時候對所有的RoIs(大概300個左右) 計算概率,並利用位置參數調整預測候選框的位置。然後再用一遍極大值抑制(之前在RPN的ProposalCreator用過)。

注意:

在RPN的時候,已經對anchor做了一遍NMS,在RCNN測試的時候,還要再做一遍

在RPN的時候,已經對anchor的位置做了迴歸調整,在RCNN階段還要對RoI再做一遍

在RPN階段分類是二分類,而Fast RCNN階段是21分類

4.4 模型架構圖

最後整體的模型架構圖如下:

【個人整理】faster-RCNN的訓練過程以及關鍵點總結


需要注意的是: 藍色箭頭的線代表著計算圖,梯度反向傳播會經過。而紅色部分的線不需要進行反向傳播(論文了中提到了ProposalCreator生成RoIs的過程也能進行反向傳播,但需要專門的算法)。

五、faster-RCNN裡面的幾個重要概念(四個損失三個creator)

5.1 四類損失

雖然原始論文中用的4-Step Alternating Training 即四步交替迭代訓練。然而現在github上開源的實現大多是採用近似聯合訓練(Approximate joint training),端到端,一步到位,速度更快。

在訓練Faster RCNN的時候有四個損失:

(1)RPN 分類損失:anchor是否為前景(二分類)

(2)RPN位置迴歸損失:anchor位置微調

(3)RoI 分類損失:RoI所屬類別(21分類,多了一個類作為背景)

(4)RoI位置迴歸損失:繼續對RoI位置微調

四個損失相加作為最後的損失,反向傳播,更新參數。

5.2 三個creator

(1)AnchorTargetCreator : 負責在訓練RPN的時候,從上萬個anchor中選擇一些(比如256)進行訓練,以使得正負樣本比例大概是1:1. 同時給出訓練的位置參數目標。 即返回gt_rpn_loc和gt_rpn_label。

(2)ProposalTargetCreator: 負責在訓練RoIHead/Fast R-CNN的時候,從RoIs選擇一部分(比如128個)用以訓練。同時給定訓練目標, 返回(sample_RoI, gt_RoI_loc, gt_RoI_label)

(3)ProposalCreator: 在RPN中,從上萬個anchor中,選擇一定數目(2000或者300),調整大小和位置,生成RoIs,用以Fast R-CNN訓練或者測試。

其中AnchorTargetCreator和ProposalTargetCreator是為了生成訓練的目標,只在訓練階段用到,ProposalCreator是RPN為Fast R-CNN生成RoIs,在訓練和測試階段都會用到。三個共同點在於他們都不需要考慮反向傳播(因此不同框架間可以共享numpy實現)

相關推薦

推薦中...