RCNN系列文章之RCNN詳解
RCNN系列的文章主要是RCNN,Fast RCNN, Faster RCNN, Mask RCNN, Cascade RCNN,這一系列的文章是目標檢測two-stage演算法的代表,這系列的演算法精度高,效果好,是一類重要的方法。
論文地址:Rich feature hierarchies for accurate object detection and semantic segmentation
主要介紹
用於目標檢測與語義分割的豐富特徵層次結構
RCNN文章是two-stage演算法的開篇之作,奠定了一個基礎。在RCNN之前,很多效果好的演算法主要是採用融合多個低層次的影像特徵與高層次的上下文資訊的複雜ensamble(集成)的系統。
RCNN是一種簡單可放縮的目標檢測演算法,在VOC2012上得到最好的MAP53.3%,演算法的兩個關鍵的因素:
- 使用一個CNN網路來自頂而下的提取候選區域的特徵,用於目標檢測和分割物體
- 當數據集的規模較小時,採用其他輔助任務的預訓練遷移學習,性能能夠獲得很大的提升。
RCNN首次在PASCAL VOC數據集上說明了對比基於HOG特徵的演算法CNN在目標檢測上可以獲得更高的表現,實現這個工作需要解決兩個主要的問題:用深度網路定位目標,利用少量的標註數據訓練一個高性能的CNN網路。
CNN實現定位又兩種方法第一種是將定位看作一個回歸問題,這種方法效果不好精度較差,另一種方法是採用滑窗的方法,但是隨著網路的加深,高層的神經元有非常大的感受野,這很難利用滑窗產生精確的定位資訊。
RCNN使用區域的方法進行識別解決了CNN定位的問題。測試的時候,RCNN生成2000個類別獨立的建議區域(region proposal),每個區域採用cnn提取特徵,然後使用線性SVM及逆行分類。不考慮區域的大小,將所有的區域resize到固定尺寸的CNN輸入。
由於RCNN在區域上進行操作,因此可以很容易的拓展到語義分割任務中,進行簡單的修正之後,RCNN在PASCAL VOC語義分割數據集上獲得了最優的結果47.9%.
演算法細節介紹
RCNN包含了三個主要的模組:
- 生成類別獨立的regoin proposal(區域建議),為感知器定義候選區域
- CNN提取固定長度的特徵
- 線性SVM分類器進行類別的分類
Region Proposal
採用selective search(SS,選擇性搜索)來進行region proposal的選取。
Feature Extraction
採用AlexNet作為backbone來進行特徵提取,從中提取4096維的特徵向量,由於需要產生固定尺度的特徵向量,需要將每個特徵區域都縮放到CNN網路所需要的輸入尺度,無論生成的region proposal是什麼形狀或者長寬比,直接將其縮放到固定的尺寸(227×227),在縮放之前,擴大了被縮放的區域,使得在縮放後,原始區域邊界到現有區域邊界寬度為p像素,然後直接resize到特定的尺寸。
測試時檢測
在測試時,使用selective search在測試影像中生成2000個建議區域,resize這些區域然後輸入CNN網路,從特定的層提取特徵,對於每一個類利用SVM來給提取得到的特徵向量得分。在得到所有的特徵區域的得分之後,採用貪婪非極大抑制的方法消除重複的框。
運行時特性分析
有兩個特點使得RCNN演算法高效:
- 所有的CNN參數共享
- CNN得到的特徵向量是低維的
訓練
先使用ImageNet上的預訓練參數模型,然後在VOC數據集上進行微調。
首先,去掉AlexNet的最後的分類層,將1000維的輸出更換為21維的輸出,然後使用resize後的region proposal作為輸入影像進行訓練。在每次的SGD迭代中,取樣得到32個正例的region proposal(包含所有的類別)和96個背景的regoin(採用128的batch size),由於正例數目相比較背景類的數目相對較少,因此通常對正例樣本進行過取樣。
分類器, 對於檢測汽車的二分類器。一個緊緊包裹著一輛汽車的影像區域就是正例。同樣的,沒有汽車的就是背景區域,也就是負例。較為不明確的是怎樣標註哪些只和汽車部分重疊的區域。可以採用IoU重疊閾值來解決這個問題,低於這個閾值的就是負例。這個閾值我們選擇了0.3,這個閾值是在驗證集上基於{0, 0.1, … 0.5}通過網格搜索得到的。我們發現認真選擇這個閾值很重要。如果設置為0.5,可以降低mAP5個點,設置為0,就會降低4個點。正例就嚴格的是標註的框。(歸結起來就是與ground truth重疊度低於0.3的就是負例,正例就是嚴格的ground truth)。
得到特徵向量之後,就訓練線性SVM分類器。由於訓練數據太大不能完全的載入記憶體,採用標準的困難樣本挖掘來進行處理,採用hard negative mining演算法收斂的非常快。
注意:這裡有兩個問題:
1. 為什麼在訓練cnn的時候正例負例定義與訓練SVM時不一致?
2. 為什麼不直接採用softmax而是採用SVM?
- 訓練CNN的時候,IOU大於0.5標記為正樣本,其他的標記為背景,而在訓練SVM的時候,IOU小於0.3的標記為負樣本,ground truth為正樣本,其他的丟棄。在訓練CNN的時候對正例樣本定義相對寬鬆,會在一定程度上加大正例的數據量,防止網路的過擬合,而SVM這種演算法的機制,適合小樣本的訓練,因此對真樣本限制嚴格。
- 作者嘗試了採用softmax直接進行訓練,但是效果很差,作者認為當IOU大於0.5就認為是正樣本會導致定位準確度的下降,而又需要採用IOU閾值0.5來訓練CNN,因此採用CNN+SVM結合的方法來完成演算法。
可視化分析
RCNN中採用了可視化的方法來查看CNN的特徵提取效果以及作用,同時採用一種檢測分析方式來理解調參對於各層網路的影響,可參考:
D. Hoiem, Y. Chodpathumwan, and Q. Dai. Diagnosing error in object detectors. In *ECCV*. 2012.