近年來,隨着深度學習的崛起,計算機視以爲到飛速發展。目標檢測做爲計算機視覺的基礎算法,也搭上了深度學習的快車。基於Proposal的檢測框架,從R-CNN到Faster R-CNN,算法性能愈來愈高,速度愈來愈快。另外一方面,直接回歸Bounding Box的框架,從YOLO到SSD,在保持速度優點的同時,性能也逐漸獲得提高。「深度學習大講堂」往期介紹過這方面的進展,在此再也不贅述。
近期,咱們在PASCAL VOC2012目標檢測上提交的結果mAP性能達到87.9,刷新了世界記錄,排名第一名。算法
方法上,基於Faster R-CNN [1],咱們作了一系列的算法改進,使得性能相比Baseline獲得顯著提高。本文主要給你們分享咱們作出的這些算法上的改進技巧,以及一些工程上的實踐經驗。
1.尋找更優的網絡結構
」Features matter.」 去年MSRA憑藉ResNets [2]取得了多項任務性能上的突破。以ResNet-101爲基準,有沒有網絡能夠提供更優的特徵?咱們驗證瞭如下幾個網絡。
a) 進一步增長網絡深度。在12GB顯存容量的限制下,101層的網絡已是極限。然而,若是把預訓練模型的BN層參數融合進前一層卷積層,而後去掉BN層,則能夠容納ResNet-152。根據咱們的實驗,在ImageNet DET數據集上,去掉BN層的ResNet-152比保留BN層的ResNet-101還要差約1個點。這說明BN層的做用仍是比較重要的。
b) BN層的訓練策略。咱們發現訓練時若是更新BN層的參數,相比固定參數,性能會降低一大截。緣由多是Faster R-CNN訓練時batch size只有1,batch之間的均值/方差變化太大,太不穩定。
c) MSRA和Facebook相繼公開了本身訓練的ResNets模型。後續MSRA又提出了Identity Mapping版本的ResNets [3]。咱們驗證發現,Identity Mapping版本的ResNet-101檢測性能略優於MSRA的原始ResNet-101模型和Facebook的模型。
2. 改進RPN Proposal
在Faster R-CNN框架裏面,RPN提取Proposal和FRCN對Proposal進行分類實際上是2個獨立的問題。針對RPN,咱們作出瞭如下2處改進:
a) 均衡正負Anchor比例。理想狀態下,RPN 正負Anchor的比例是1:1。咱們發現,在batch size比較大(256)的狀況下,這個比例會很是懸殊。特別是目標數量比較少的圖像,正的Anchor數量會很是少。這樣訓練出來的模型會偏向於背景類別,容易漏檢。咱們對這個比例作了限制,讓負樣本數量不超過正樣本的1.5倍,發現Proposal的召回率能夠提升5個點。
b) 級聯RPN。受CRAFT [4]的啓發,咱們設計了本身的級聯RPN。[4]中先獲得標準的RPN Proposal,而後用一個分類性能更強的FRCN分支來改進Proposal質量。咱們則是用了2個標準的RPN(圖 1)。第一個RPN用滑窗獲得的Proposal做爲Anchor,第二個RPN用第一個RPN輸出的Proposal做爲新的Anchor位置。相比[4],咱們的算法優點是實現簡單,額外增長的計算量很是少。對於中大目標,能夠明顯提高Proposal位置的準確度。
圖 1 Cascade RPN網絡結構。其中虛線框表示這一層能夠省略。
3. 全局上下文建模
每一個Proposal對應原始圖像中的一個ROI區域。對這個ROI區域進行分類時, FRCN先把ROI映射到中間特徵圖上,而後在中間特徵圖上作裁剪(RoIPooling)。裁剪出來的小特徵圖輸入到CNN分類器中。能夠看到,CNN分類只使用了ROI區域內的局部特徵。實際上,ROI周圍的上下文信息對於判斷這個ROI類別是頗有幫助的。例如對一個乒乓球分類,很容易和光源混淆。若是知道周圍有乒乓球拍、乒乓球檯等目標,則更容易判斷這是個乒乓球。 全局上下文建模是從整幅圖像提取特徵,而後和每一個Proposal的局部特徵相融合,用於分類。去年MSRA [2]使用全局上下文,獲得了1個點的性能提高。然而他們沒有發佈具體的實現細節。咱們實現的全局上下文網絡結構如圖 2所示。
圖 2 全局上下文建模網絡結構。
咱們發現,對於圖中的全局上下文網絡分支,訓練時若是採用隨機初始化,性能提高很是有限。若是用預訓練的參數初始化,在ImageNet DET驗證集上能夠獲得超過3個點的性能提高。對於ResNets,RoIPooling後面的conv5有9層卷積。而Faster R-CNN finetune時通常初始學習速率又會設得比較小(0.001)。這就致使從頭訓練這9層卷積比較困難。所以,這裏預訓練顯得尤其重要。另外,[2]還把全局上下文特徵同時用於分類和Bounding Box迴歸。咱們發現全局上下文特徵對於Bounding Box迴歸沒有幫助,只對分類有幫助。
4. 訓練技巧
a) 平衡採樣。不少數據集存在樣本不均衡的問題,有些類別特別多,有些類別特別少。訓練模型時,從一個圖像列表中依次讀取樣本訓練。這樣的話,小類樣本參與訓練的機會就比大類少。訓練出來的模型會偏向於大類,即大類性能好,小類性能差。平衡採樣策略就是把樣本按類別分組,每一個類別生成一個樣本列表。訓練過程當中先隨機選擇1個或幾個類別,而後從各個類別所對應的樣本列表中隨機選擇樣本。這樣能夠保證每一個類別參與訓練的機會比較均衡。在PASCAL VOC數據集上,使用平衡採樣性能能夠提高約0.7個點。
b) 難例挖掘(OHEM [5])。使用了難例挖掘後,收斂更快,訓練更穩定。在ImageNet DET數據集上,性能能夠提高1個多點。
c) 多尺度訓練。使用多尺度訓練的話,可讓參與訓練的目標大小分佈更加均衡,使模型對目標大小具備必定的魯棒性。
5. 預測技巧
預測階段,咱們用了多尺度預測,水平翻轉,和檢測框投票。這些策略的具體實如今不少文獻中都有描述。這裏咱們能夠分享一下多個檢測結果的融合策略。當使用多尺度預測,水平翻轉,還有多模型Ensemble時,對於同一張測試圖像,咱們會獲得好幾組結果。對於這些結果,最直觀的融合方式就是把全部的檢測框放在一塊兒,而後用非極大值抑制(NMS)處理一下。可是咱們發現另外一種方式效果更好,就是把RPN和FRCN分開來作。先對RPN作多尺度、水平翻轉、多模型的融合,獲得一組固定的Proposal以後,再對FRCN進行多尺度、水平翻轉、多模型的融合。RPN的融合用NMS更好,FRCN的融合用對Proposal的置信度和Bounding Box位置取平均值的方式更好。 總結
本文總結了咱們作出的一些Faster R-CNN改進技巧,並分享了算法實現過程當中遇到的細節問題。正如諺語所言,」The devil is in the details.」 但願咱們的這些算法細節對同行以及相關的算法愛好者們提供必定的幫助和指引。咱們拋磚引玉,期待同行們也能夠分享本身的經驗網絡