目標檢測(一)——R-CNN
一 R-CNN R-CNN(R. Girshick et al., 2014)是基於region proposal方法的目標檢測算法系列開山之作,其先進行區域搜尋,然後再對候選區域進行分類。在R-CNN中,選用Selective search方法(J.R.R. Uijlings and al. 2012)來生成候選區域,這是一種啟發式搜尋演算法。它先通過簡單的區域劃分演算法將圖片劃分成很多小區域,然後通過層級分組方法按照一定相似度合併它們,最後的剩下的就是候選區域(region proposals),它們可能包含一個物體。選擇性搜尋(Selective Search) step0:生成區域集R step1:計算區域集R裡每個相鄰區域的相似度S={s1,s2,…} (顏色、紋理、尺寸和空間) step2:找出相似度最高的兩個區域,將其合併為新集,新增進R step3:從S中移除所有與step2中有關的子集 step4:計算新集與所有子集的相似度 step5:跳至step2,直至S為空
二、演算法簡述 本文資料集採用pascal VOC,這個資料集的object一共有20個類別。首先用select 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模型結構圖
三、演算法詳解訓練過程:
1、準備region proposal。對於訓練集中的所有影象,採用selective search方式來獲取,最後每個影象得到2000個region proposal。
2、準備正負樣本。如果某個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),重合度越大,說明二者越相近。
3、預訓練。這一步主要是因為檢測問題中帶標籤的樣本資料量比較少,難以進行大規模訓練。採用的是Krizhevsky在2012年的著名網路AlexNet來學習特徵,包含5個卷積層和2個全連線層,在Caffe框架下利用ILSVRC 2012的資料集進行預訓練,其實就是利用大資料集訓練一個分類器,這個ILSVRC 2012資料集就是著名的ImageNet比賽的資料集,也是彩色影象分類。
4、fine-tuning。將2中得到的樣本進行尺寸變換,使得大小一致,這是由於2中得到的region proposal大小不一,所以需要將region proposal變形成227*227。本文中對所有不管什麼樣大小和橫縱比的region proposal都直接拉伸到固定尺寸。然後作為3中預訓練好的網路的輸入,繼續訓練網路,繼續訓練其實就是遷移學習。另外由於ILSVRC 2012是一個1000類的資料集,而本文的資料集是21類(包括20個VOC類別和一個背景類別),遷移的時候要做修改,將最後一個全連線層的輸出由1000改成21,其他結構不變。訓練結束後儲存f7的特徵。
5、針對每個類別訓練一個SVM的二分類器。輸入是f7的特徵,f7的輸出維度是2000*4096,輸出的是是否屬於該類別,訓練結果是得到SVM的權重矩陣W,W的維度是4096*20。這裡負樣本的選定和前面的有所不同,將IOU的閾值從0.5改成0.3,即IOU<0.3的是負樣本,正樣本是Ground Truth。IOU的閾值選擇和前面fine-tuning不一樣,這裡連結3的解釋是:前面fine-tuning需要大量的樣本,所以設定成0.5會比較寬鬆。而在SVM階段是由於SVM適用於小樣本,所以設定0.3會更嚴格一點。
6、迴歸。用pool5的特徵6*6*256維和bounding box的ground truth來訓練迴歸,每種型別的迴歸器單獨訓練。輸入是pool5的特徵,以及每個樣本對的座標和長寬值。另外只對那些跟ground truth的IOU超過某個閾值且IOU最大的proposal迴歸,其餘的region proposal不參與。具體參考連結3。詳細說一下:對於某個region proposal:R,以及其對應的Ground truth:G,我們希望預測結果是:P,那麼我們肯定希望P儘可能接近G。這裡通過對pool5層的特徵X做線性變換WX得到變換函式F(X),這些變換函式作用於R的座標達到迴歸的作用(包括對x,y的平移以及對w,h的縮放)。因此損失函式可以表達為:R和G的差距減去P和G的差距要儘可能小。
看到有的視訊上這樣講解,通過圖來更清晰:
步驟一:訓練(或者下載)一個分類模型(比如AlexNet) 步驟二:對該模型做fine-tuning • 將分類數從1000改為20 • 去掉最後一個全連線層
步驟三:特徵提取 • 提取影象的所有候選框(選擇性搜尋) • 對於每一個區域:修正區域大小以適合CNN的輸入,做一次前向運算,將第五個池化層的輸出(就是對候選框提取到的特徵)存到硬碟
步驟四:訓練一個SVM分類器(二分類)來判斷這個候選框裡物體的類別 每個類別對應一個SVM,判斷是不是屬於這個類別,是就是positive,反之nagative 比如下圖,就是狗分類的SVM
步驟五:使用迴歸器精細修正候選框位置:對於每一個類,訓練一個線性迴歸模型去判定這個框是否框得完美。
測試過程:
1、輸入一張影象,利用selective search得到2000個region proposal。
2、對所有region proposal變換到固定尺寸並作為已訓練好的CNN網路的輸入,得到f7層的4096維特徵,所以f7層的輸出是2000*4096。
3、對每個類別,採用已訓練好的這個類別的svm分類器對提取到的特徵打分,所以SVM的weight matrix是4096*N,N是類別數,這裡一共有20個SVM,N=20注意不是21。得分矩陣是2000*20,表示每個region proposal屬於某一類的得分。
4、採用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。
5、用N=20個迴歸器對第4步得到的20個類別的region proposal進行迴歸,要用到pool5層的特徵。pool5特徵的權重W是在訓練階段的結果,測試的時候直接用。最後得到每個類別的修正後的bounding box。
R-CNN缺點:
(1) 訓練分為多個階段,步驟繁瑣: 微調網路+訓練SVM+訓練邊框迴歸器 (2) 訓練耗時,佔用磁碟空間大:5000張影象產生幾百G的特徵檔案 (3) 速度慢: 使用GPU, VGG16模型處理一張影象需要47s。
(4) 測試速度慢:每個候選區域需要執行整個前向CNN計算 (5) SVM和迴歸是事後操作:在SVM和迴歸過程中CNN特徵沒有被學習更新
參考資料