Girshick, Ross, et al. “Rich feature hierarchies for accurate object detection and semantic segmentation.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2014.
R-CNN的全稱是Region-CNN,它可以說是第一個成功將深度學習應用到目標檢測上的算法。后面要講到的Fast R-CNN、Faster R-CNN全部都是建立在R-CNN基礎上的。
傳統的目標檢測算法大多數以圖像識別為基礎。一般可以在圖片上使用窮舉法或者滑動窗口選出所有物體可能出現的區域框,對這些區域框提取特征並進行使用圖像識別分類方法,得到所有分類成功的區域后,通過非極大值抑制輸出結果。
一 R-CNN思路
R-CNN遵循傳統目標檢測的思路,同樣采用提取框,對每個框提取特征、圖像分類、非極大值抑制四個步驟進行目標檢測、只不過進行了部分改進。
- 經典的目標檢測算法使用滑動窗法依次判斷所有可能的區域。而這里預先提取一系列較可能是物體的候選區域,之后僅在這些候選區域上提取特征,進行判斷,大大減少了計算量。
- 將傳統的特征(如SIFT,HOG特征等)換成了深度卷積網絡提取特征。
在訓練時使用兩個數據庫:
一個較大的識別庫(ImageNet ILSVC 2012):標定每張圖片中物體的類別。一千萬圖像,1000類。
一個較小的檢測庫(PASCAL VOC 2007):標定每張圖片中,物體的類別和位置。一萬圖像,20類。
使用識別庫進行預訓練,而后用檢測庫調優參數。最后在檢測庫上評測。
二 算法簡述
數據集采用pascal VOC,這個數據集的object一共有20個類別。首先用selective search方法在每張圖像上選取約2000個region proposal,region proposal就是object有可能出現的位置。然后根據這些region proposal構造訓練和測試樣本,注意這些region proposal的大小不一,另外樣本的類別是21個(包括了背景)。
然后是預訓練,即在ImageNet數據集下,用AlexNet進行訓練。然后再在我們的數據集上fine-tuning,網絡結構不變(除了最后一層輸出由1000改為21),輸入是前面的region proposal進行尺寸變換到一個統一尺寸227*227,保留f7的輸出特征2000*4096維。
針對每個類別(一共20類)訓練一個SVM分類器,以f7層的輸出作為輸入,訓練SVM的權重4096*20維,所以測試時候會得到2000*20的得分輸出,且測試的時候會對這個得分輸出做NMS(non-maximun suppression),簡單講就是去掉重復框的過程。同時針對每個類別(一共20類)訓練一個回歸器,輸入是pool5的特征和每個樣本對的坐標即長寬。
三 訓練步驟
R-CNN的訓練可以分成以下步驟:
- 准備region proposal。對於訓練集中的所有圖像,采用selective search方式來獲取,最后每個圖像得到2000個region proposal。
- 准備正負樣本。如果某個region proposal和當前圖像上的所有ground truth(標記)重疊面積最大的那個的IOU大於等於0.5,則該region proposal作為這個ground truth類別的正樣本,否則作為負樣本。另外正樣本還包括了Ground Truth。因為VOC一共包含20個類別,所以這里region proposal的類別為20+1=21類,1表示背景。簡單說下IOU的概念,IOU是計算矩形框A、B的重合度的公式:IOU=(A∩B)/(A∪B),重合度越大,說明二者越相近。
- 預訓練。這一步主要是因為檢測問題中帶標簽的樣本數據量比較少,難以進行大規模訓練。采用的是Krizhevsky在2012年的著名網絡AlexNet來學習特征,包含5個卷積層和2個全連接層,在Caffe框架下利用ILSVRC 2012的數據集進行預訓練,其實就是利用大數據集訓練一個分類器,這個ILSVRC 2012數據集就是著名的ImageNet比賽的數據集,也是彩色圖像分類。
- fine-tuning。將2中得到的樣本進行尺寸變換,使得大小一致,這是由於2中得到的region proposal大小不一,所以需要將region proposal變形成227*227(如何變形參考R-CNN論文詳解)。本文中對所有不管什么樣大小和橫縱比的region proposal都直接拉伸到固定尺寸。然后作為3中預訓練好的網絡的輸入,繼續訓練網絡,繼續訓練其實就是遷移學習。另外由於ILSVRC 2012是一個1000類的數據集,而本文的數據集是21類(包括20個VOC類別和一個背景類別),遷移的時候要做修改,將最后一個全連接層的輸出由1000改成21,其他結構不變。訓練結束后保存f7的特征。
- 針對每個類別訓練一個SVM的二分類器。輸入是f7的特征,f7的輸出維度是2000*4096,輸出的是是否屬於該類別,訓練結果是得到SVM的權重矩陣W,W的維度是4096*20。這里負樣本的選定和前面的有所不同,將IOU的閾值從0.5改成0.3,即IOU<0.3的是負樣本,正樣本是Ground Truth。IOU的閾值選擇和前面fine-tuning不一樣,主要是因為:前面fine-tuning需要大量的樣本,所以設置成0.5會比較寬松。而在SVM階段是由於SVM適用於小樣本,所以設置0.3會更嚴格一點。
- 回歸。用pool5的特征6*6*256維和bounding box的ground truth來訓練回歸,每種類型的回歸器單獨訓練。輸入是pool5的特征,以及每個樣本對的坐標和長寬值。另外只對那些跟ground truth的IOU超過某個閾值且IOU最大的proposal回歸,其余的region proposal不參與。詳細說一下:對於某個region proposal:R,以及其對應的Ground truth:G,我們希望預測結果是:P,那么我們肯定希望P盡可能接近G。這里通過對pool5層的特征X做線性變換WX得到變換函數F(X),這些變換函數作用於R的坐標達到回歸的作用(包括對x,y的平移以及對w,h的縮放)。因此損失函數可以表達為:R和G的差距減去P和G的差距要盡可能小。
R-CNN的測試可以分成以下步驟:
-
輸入一張圖像,利用selective search得到2000個region proposal。
-
對所有region proposal變換到固定尺寸並作為已訓練好的CNN網絡的輸入,得到f7層的4096維特征,所以f7層的輸出是2000*4096。
-
對每個類別,采用已訓練好的這個類別的svm分類器對提取到的特征打分,所以SVM的weight matrix是4096*N,N是類別數,這里一共有20個SVM,N=20注意不是21。得分矩陣是2000*20,表示每個region proposal屬於某一類的得分。
-
采用non-maximun suppression(NMS)對得分矩陣中的每一列中的region proposal進行剔除,就是去掉重復率比較高的幾個region proposal,得到該列中得分最高的幾個region proposal。NMS的意思是:舉個例子,對於2000*20中的某一列得分,找到分數最高的一個region proposal,然后只要該列中其他region proposal和分數最高的IOU超過某一個閾值,則剔除該region proposal。這一輪剔除完后,再從剩下的region proposal找到分數最高的,然后計算別的region proposal和該分數最高的IOU是否超過閾值,超過的繼續剔除,直到沒有剩下region proposal。對每一列都這樣操作,這樣最終每一列(即每個類別)都可以得到一些region proposal。
- 用N=20個回歸器對第4步得到的20個類別的region proposal進行回歸,要用到pool5層的特征。pool5特征的權重W是在訓練階段的結果,測試的時候直接用。最后得到每個類別的修正后的bounding box。
四 優缺點
盡管R-CNN的識別框架與傳統方法區別不是很大,但是得益於CNN優異的特征提取能力,R-CNN的效果還是比傳統方法好很多。如在VOC2007數據集上,傳統方法最高的平均精確度mAp為40%左右,而R-CNN的mAp達到了58.5%。
R-CNN的缺點是計算量大。R-CNN流程較多,包括region proposal的選取,訓練卷積神經網絡(softmax classifier,log loss),訓練SVM(hinge loss)和訓練 regressor(squared loss),這使得訓練時間非常長(84小時),占用磁盤空間也大。在訓練卷積神經網絡的過程中對每個region proposal都要計算卷積,這其中重復的太多不必要的計算,試想一張圖像可以得到2000多個region proposal,大部分都有重疊,因此基於region proposal卷積的計算量太大,而這也正是之后Fast R-CNN主要解決的問題。
參考文章
[1]R-CNN算法詳解
[2]RCNN算法詳解
[3]http://www.robots.ox.ac.uk/~tvg/publications/talks/fast-rcnn-slides.pdf
[4]R-CNN詳解
[5]R-CNN論文詳解(推薦,講解很詳細)
[6]Rich feature hierarchies for accurate object detection and semantic segmentation
[7]基於深度學習的目標檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNN(強烈推薦)
[9]https://github.com/AlpacaDB/selectivesearch(代碼)
[10]目標檢測(2)-RCNN