近年來,隨着深度學習的崛起,計算機視覺得到飛速發展。目標檢測作為計算機視覺的基礎算法,也搭上了深度學習的快車。基於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為基准,有沒有網絡可以提供更優的特征?我們驗證了以下幾個網絡。
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處改進:
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位置取平均值的方式更好。 總結
5. 預測技巧
預測階段,我們用了多尺度預測,水平翻轉,和檢測框投票。這些策略的具體實現在很多文獻中都有描述。這里我們可以分享一下多個檢測結果的融合策略。當使用多尺度預測,水平翻轉,還有多模型Ensemble時,對於同一張測試圖像,我們會得到好幾組結果。對於這些結果,最直觀的融合方式就是把所有的檢測框放在一起,然后用非極大值抑制(NMS)處理一下。但是我們發現另一種方式效果更好,就是把RPN和FRCN分開來做。先對RPN做多尺度、水平翻轉、多模型的融合,得到一組固定的Proposal之后,再對FRCN進行多尺度、水平翻轉、多模型的融合。RPN的融合用NMS更好,FRCN的融合用對Proposal的置信度和Bounding Box位置取平均值的方式更好。 總結
本文總結了我們做出的一些Faster R-CNN改進技巧,並分享了算法實現過程中遇到的細節問題。正如諺語所言,”The devil is in the details.” 希望我們的這些算法細節對同行以及相關的算法愛好者們提供一定的幫助和指引。我們拋磚引玉,期待同行們也可以分享自己的經驗