基於R-CNN的物體檢測

基於R-CNN的物體檢測

原文地址:http://blog.csdn.net/hjimce/article/details/50187029

作者:hjimce

一、相關理論

   本篇博文主要講解2014年CVPR上的經典paper:《Rich feature hierarchies for Accurate Object Detection and Segmentation》,這篇文章的算法思想又被稱之爲:R-CNN(Regions with Convolutional Neural Network Features),是物體檢測領域曾經獲得state-of-art精度的經典文獻。

   這篇paper的思想,改變了物體檢測的總思路,現在好多文獻關於深度學習的物體檢測的算法,基本上都是繼承了這個思想,比如:《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》,所以學習經典算法,有助於我們以後搞物體檢測的其它paper。

    之前剛開始接觸物體檢測算法的時候,老是分不清deep learning中,物體檢測和圖片分類算法上的區別,弄得我頭好暈,終於在這篇paper上,看到了解釋。物體檢測和圖片分類的區別:圖片分類不需要定位,而物體檢測需要定位出物體的位置,也就是相當於把物體的bbox檢測出來,還有一點物體檢測是要把所有圖片中的物體都識別定位出來。

二、基礎知識

1、有監督預訓練與無監督預訓練

(1)無監督預訓練(Unsupervised pre-training)

無監督預訓練這個名詞我們比較熟悉,棧式自編碼、DBM採用的都是採用無監督預訓練。因爲預訓練階段的樣本不需要人工標註數據,所以就叫做無監督預訓練。

(2)有監督預訓練(Supervised pre-training)

所謂的有監督預訓練,我們也可以把它稱之爲遷移學習。比如你已經有一大堆標註好的人臉年齡分類的圖片數據,訓練了一個CNN,用於人臉的年齡識別。然後當你遇到新的項目任務是:人臉性別識別,那麼這個時候你可以利用已經訓練好的年齡識別CNN模型,去掉最後一層,然後其它的網絡層參數就直接複製過來,繼續進行訓練。這就是所謂的遷移學習,說的簡單一點就是把一個任務訓練好的參數,拿到另外一個任務,作爲神經網絡的初始參數值,這樣相比於你直接採用隨機初始化的方法,精度可以有很大的提高。

圖片分類標註好的訓練數據非常多,但是物體檢測的標註數據卻很少,如何用少量的標註數據,訓練高質量的模型,這就是文獻最大的特點,這篇paper採用了遷移學習的思想。文獻就先用了ILSVRC2012這個訓練數據庫(這是一個圖片分類訓練數據庫),先進行網絡的圖片分類訓練。這個數據庫有大量的標註數據,共包含了1000種類別物體,因此預訓練階段cnn模型的輸出是1000個神經元,或者我們也直接可以採用Alexnet訓練好的模型參數。

2、IOU的定義

因爲沒有搞過物體檢測不懂IOU這個概念,所以就簡單介紹一下。物體檢測需要定位出物體的bounding box,就像下面的圖片一樣,我們不僅要定位出車輛的bounding box 我們還要識別出bounding box 裏面的物體就是車輛。對於bounding box的定位精度,有一個很重要的概念,因爲我們算法不可能百分百跟人工標註的數據完全匹配,因此就存在一個定位精度評價公式:IOU。


IOU定義了兩個bounding box的重疊度,如下圖所示:


矩形框A、B的一個重合度IOU計算公式爲:

IOU=(A∩B)/(A∪B)

就是矩形框A、B的重疊面積佔A、B並集的面積比例:

IOU=SI/(SA+SB-SI)

3、非極大值抑制

因爲一會兒講RCNN算法,會從一張圖片中找出n多個可能是物體的矩形框,然後爲每個矩形框爲做類別分類概率:


就像上面的圖片一樣,定位一個車輛,最後算法就找出了一堆的方框,我們需要判別哪些矩形框是沒用的。非極大值抑制:先假設有6個矩形框,根據分類器類別分類概率做排序,從小到大分別屬於車輛的概率分別爲A、B、C、D、E、F。

(1)從最大概率矩形框F開始,分別判斷A~E與F的重疊度IOU是否大於某個設定的閾值;

(2)假設B、D與F的重疊度超過閾值,那麼就扔掉B、D;並標記第一個矩形框F,是我們保留下來的。

(3)從剩下的矩形框A、C、E中,選擇概率最大的E,然後判斷E與A、C的重疊度,重疊度大於一定的閾值,那麼就扔掉;並標記E是我們保留下來的第二個矩形框。

就這樣一直重複,找到所有被保留下來的矩形框。

4、VOC物體檢測任務

這個就相當於一個競賽,裏面包含了20個物體類別:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/examples/index.html  還有一個背景,總共就相當於21個類別,因此一會設計fine-tuning CNN的時候,我們softmax分類輸出層爲21個神經元。

三、算法總體思路 

    開始講解paper前,我們需要先把握總體思路,才容易理解paper的算法。

    圖片分類與物體檢測不同,物體檢測需要定位出物體的位置,這種就相當於迴歸問題,求解一個包含物體的方框。而圖片分類其實是邏輯迴歸。這種方法對於單物體檢測還不錯,但是對於多物體檢測就……

    因此paper採用的方法是:首先輸入一張圖片,我們先定位出2000個物體候選框,然後採用CNN提取每個候選框中圖片的特徵向量,特徵向量的維度爲4096維,接着採用svm算法對各個候選框中的物體進行分類識別。也就是總個過程分爲三個程序:a、找出候選框;b、利用CNN提取特徵向量;c、利用SVM進行特徵向量分類。具體的流程如下圖片所示:


後面我們將根據這三個過程,進行每個步驟的詳細講解。

四、候選框搜索階段

1、實現方式

當我們輸入一張圖片時,我們要搜索出所有可能是物體的區域,這個採用的方法是傳統文獻的算法:《search for object recognition》,通過這個算法我們搜索出2000個候選框。然後從上面的總流程圖中可以看到,搜出的候選框是矩形的,而且是大小各不相同。然而CNN對輸入圖片的大小是有固定的,如果把搜索到的矩形選框不做處理,就扔進CNN中,肯定不行。因此對於每個輸入的候選框都需要縮放到固定的大小。下面我們講解要怎麼進行縮放處理,爲了簡單起見我們假設下一階段CNN所需要的輸入圖片大小是個正方形圖片227*227。因爲我們經過selective search 得到的是矩形框,paper試驗了兩種不同的處理方法:

(1)各向異性縮放

這種方法很簡單,就是不管圖片的長寬比例,管它是否扭曲,進行縮放就是了,全部縮放到CNN輸入的大小227*227,如下圖(D)所示;

(2)各向同性縮放

因爲圖片扭曲後,估計會對後續CNN的訓練精度有影響,於是作者也測試了“各向同性縮放”方案。這個有兩種辦法

A、直接在原始圖片中,把bounding box的邊界進行擴展延伸成正方形,然後再進行裁剪;如果已經延伸到了原始圖片的外邊界,那麼就用bounding box中的顏色均值填充;如下圖(B)所示;

B、先把bounding box圖片裁剪出來,然後用固定的背景顏色填充成正方形圖片(背景顏色也是採用bounding box的像素顏色均值),如下圖(C)所示;


對於上面的異性、同性縮放,文獻還有個padding處理,上面的示意圖中第1、3行就是結合了padding=0,第2、4行結果圖採用padding=16的結果。經過最後的試驗,作者發現採用各向異性縮放、padding=16的精度最高,具體不再囉嗦。

OK,上面處理完後,可以得到指定大小的圖片,因爲我們後面還要繼續用這2000個候選框圖片,繼續訓練CNN、SVM。然而人工標註的數據一張圖片中就只標註了正確的bounding box,我們搜索出來的2000個矩形框也不可能會出現一個與人工標註完全匹配的候選框。因此我們需要用IOU爲2000個bounding box打標籤,以便下一步CNN訓練使用。在CNN階段,如果用selective search挑選出來的候選框與物體的人工標註矩形框的重疊區域IoU大於0.5,那麼我們就把這個候選框標註成物體類別,否則我們就把它當做背景類別。SVM階段的正負樣本標籤問題,等到了svm講解階段我再具體講解。

五、CNN特徵提取階段

1、算法實現

a、網絡結構設計階段

網絡架構我們有兩個可選方案:第一選擇經典的Alexnet;第二選擇VGG16。經過測試Alexnet精度爲58.5%,VGG16精度爲66%。VGG這個模型的特點是選擇比較小的卷積核、選擇較小的跨步,這個網絡的精度高,不過計算量是Alexnet的7倍。後面爲了簡單起見,我們就直接選用Alexnet,並進行講解;Alexnet特徵提取部分包含了5個卷積層、2個全連接層,在Alexnet中p5層神經元個數爲9216、 f6、f7的神經元個數都是4096,通過這個網絡訓練完畢後,最後提取特徵每個輸入候選框圖片都能得到一個4096維的特徵向量。

b、網絡有監督預訓練階段

參數初始化部分:物體檢測的一個難點在於,物體標籤訓練數據少,如果要直接採用隨機初始化CNN參數的方法,那麼目前的訓練數據量是遠遠不夠的。這種情況下,最好的是採用某些方法,把參數初始化了,然後在進行有監督的參數微調,這邊文獻採用的是有監督的預訓練。所以paper在設計網絡結構的時候,是直接用Alexnet的網絡,然後連參數也是直接採用它的參數,作爲初始的參數值,然後再fine-tuning訓練。

網絡優化求解:採用隨機梯度下降法,學習速率大小爲0.001;

C、fine-tuning階段

我們接着採用selective search 搜索出來的候選框,然後處理到指定大小圖片,繼續對上面預訓練的cnn模型進行fine-tuning訓練。假設要檢測的物體類別有N類,那麼我們就需要把上面預訓練階段的CNN模型的最後一層給替換掉,替換成N+1個輸出的神經元(加1,表示還有一個背景),然後這一層直接採用參數隨機初始化的方法,其它網絡層的參數不變;接着就可以開始繼續SGD訓練了。開始的時候,SGD學習率選擇0.001,在每次訓練的時候,我們batch size大小選擇128,其中32個事正樣本、96個事負樣本(正負樣本的定義前面已經提過,不再解釋)。

2、問題解答

OK,看完上面的CNN過程後,我們會有一些細節方面的疑問。首先,反正CNN都是用於提取特徵,那麼我直接用Alexnet做特徵提取,省去fine-tuning階段可以嗎?這個是可以的,你可以不需重新訓練CNN,直接採用Alexnet模型,提取出p5、或者f6、f7的特徵,作爲特徵向量,然後進行訓練svm,只不過這樣精度會比較低。那麼問題又來了,沒有fine-tuning的時候,要選擇哪一層的特徵作爲cnn提取到的特徵呢?我們有可以選擇p5、f6、f7,這三層的神經元個數分別是9216、4096、4096。從p5到p6這層的參數個數是:4096*9216 ,從f6到f7的參數是4096*4096。那麼具體是選擇p5、還是f6,又或者是f7呢?

文獻paper給我們證明了一個理論,如果你不進行fine-tuning,也就是你直接把Alexnet模型當做萬金油使用,類似於HOG、SIFT一樣做特徵提取,不針對特定的任務。然後把提取的特徵用於分類,結果發現p5的精度竟然跟f6、f7差不多,而且f6提取到的特徵還比f7的精度略高;如果你進行fine-tuning了,那麼f7、f6的提取到的特徵最會訓練的svm分類器的精度就會飆漲。

據此我們明白了一個道理,如果不針對特定任務進行fine-tuning,而是把CNN當做特徵提取器,卷積層所學到的特徵其實就是基礎的共享特徵提取層,就類似於SIFT算法一樣,可以用於提取各種圖片的特徵,而f6、f7所學習到的特徵是用於針對特定任務的特徵。打個比方:對於人臉性別識別來說,一個CNN模型前面的卷積層所學習到的特徵就類似於學習人臉共性特徵,然後全連接層所學習的特徵就是針對性別分類的特徵了。

還有另外一個疑問:CNN訓練的時候,本來就是對bounding box的物體進行識別分類訓練,是一個端到端的任務,在訓練的時候最後一層softmax就是分類層,那麼爲什麼作者閒着沒事幹要先用CNN做特徵提取(提取fc7層數據),然後再把提取的特徵用於訓練svm分類器?這個是因爲svm訓練和cnn訓練過程的正負樣本定義方式各有不同,導致最後採用CNN softmax輸出比採用svm精度還低。

事情是這樣的,cnn在訓練的時候,對訓練數據做了比較寬鬆的標註,比如一個bounding box可能只包含物體的一部分,那麼我也把它標註爲正樣本,用於訓練cnn;採用這個方法的主要原因在於因爲CNN容易過擬合,所以需要大量的訓練數據,所以在CNN訓練階段我們是對Bounding box的位置限制條件限制的比較鬆(IOU只要大於0.5都被標註爲正樣本了)

然而svm訓練的時候,因爲svm適用於少樣本訓練,所以對於訓練樣本數據的IOU要求比較嚴格,我們只有當bounding box把整個物體都包含進去了,我們才把它標註爲物體類別,然後訓練svm,具體請看下文。

六、SVM訓練、測試階段

這是一個二分類問題,我麼假設我們要檢測車輛。我們知道只有當bounding box把整量車都包含在內,那才叫正樣本;如果bounding box 沒有包含到車輛,那麼我們就可以把它當做負樣本。但問題是當我們的檢測窗口只有部分包好物體,那該怎麼定義正負樣本呢?作者測試了IOU閾值各種方案數值0,0.1,0.2,0.3,0.4,0.5。最後我們通過訓練發現,如果選擇IOU閾值爲0.3效果最好(選擇爲0精度下降了4個百分點,選擇0.5精度下降了5個百分點),即當重疊度小於0.3的時候,我們就把它標註爲負樣本。一旦CNN f7層特徵被提取出來,那麼我們將爲每個物體累訓練一個svm分類器。當我們用CNN提取2000個候選框,可以得到2000*4096這樣的特徵向量矩陣,然後我們只需要把這樣的一個矩陣與svm權值矩陣4096*N點乘(N爲分類類別數目,因爲我們訓練的N個svm,每個svm包好了4096個W),就可以得到結果了。

OK,就講到這邊吧,懶得打字了,打到手痠。

個人總結:學習這篇文獻最大的意義在於作者把自己的試驗過程都講的很清楚,可以讓我們學到不少的調參經驗,真的是很佩服作者背後的思考。因爲文獻很長、細節非常之多,本人也對物體檢測不感興趣,只是隨便看看文獻、學學算法罷了,所以很多細節沒有細看,比如7.3 bounding box的迴歸過程;最後看這篇文獻好累、十幾頁,細節一大堆,包含作者各種實驗、思考……

參考文獻:

1、《Rich feature hierarchies for Accurate Object Detection and Segmentation》

2、《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》

**********************作者:hjimce   時間:2015.12.3  聯繫QQ:1393852684  原創文章,轉載請保留原文地址、作者等信息***************
發佈了13 篇原創文章 · 獲贊 17 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章