1. 程式人生 > >R-CNN演算法詳解

R-CNN演算法詳解

這是一篇比較早的Object Detection演算法,發表在2014年的CVPR,也是R-CNN系列演算法的開山之作,網上可以搜到很多相關的部落格講解,本篇博文沒有按論文順序來講述,而是結合自己經驗來看這個演算法,希望給初學者一個直觀的感受,細節方面不需要太糾結,因為很多部分在後來的演算法中都改進了。

論文:Rich feature hierarchies for accurate object detection and semantic segmentation

論文連結

一、解決的問題

本文主要講R-CNN(Regions with CNN features)這個演算法,該演算法是用來做object detection的經典演算法,2014年提出。object detection的問題簡單講就是兩方面:localization和recognition,即知道object在哪,以及這個object是什麼。

R-CNN在pascal VOC 2012資料集上取得了mAP 53.3%的成績,在當時已經很不錯了。

二、演算法簡述

本文資料集採用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的特徵和每個樣本對的座標即長寬。

三、演算法詳解

訓練過程:

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的差距要儘可能小。

測試過程:

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流程較多,包括region proposal的選取,訓練卷積神經網路(softmax classifier,log loss),訓練SVM(hinge loss)和訓練 regressor(squared loss),這使得訓練時間非常長(84小時),佔用磁碟空間也大。在訓練卷積神經網路的過程中對每個region proposal都要計算卷積,這其中重複的太多不必要的計算,試想一張影象可以得到2000多個region proposal,大部分都有重疊,因此基於region proposal卷積的計算量太大,而這也正是之後Fast R-CNN主要解決的問題,留在下一篇部落格講解。