深度學習筆記之基於R-CNN的物體檢測

 

 

    很少說,直接上乾貨!html

 

基於R-CNN的物體檢測
mysql

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

做者:hjimcesql

 

 

1、相關理論數據庫

    本篇博文主要講解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檢測出來,還有一點物體檢測是要把全部圖片中的物體都識別定位出來。架構

 

 

 

2、基礎知識學習

一、有監督預訓練與無監督預訓練測試

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

  無監督預訓練這個名詞咱們比較熟悉,棧式自編碼、DBM採用的都是採用無監督預訓練。由於預訓練階段的樣本不須要人工標註數據,因此就叫作無監督預訓練。

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

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

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

 

 

二、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)

 

 

 

三、非極大值抑制

  由於一下子講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是咱們保留下來的第二個矩形框。

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

 

 

四、VOC物體檢測任務

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

 

 

 

3、算法整體思路 

    開始講解paper前,咱們須要先把握整體思路,才容易理解paper的算法。

    圖片分類與物體檢測不一樣,物體檢測須要定位出物體的位置,這種就至關於迴歸問題,求解一個包含物體的方框。而圖片分類實際上是邏輯迴歸。這種方法對於單物體檢測還不錯,可是對於多物體檢測就……

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


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

 

 

 

4、候選框搜索階段

一、實現方式

  當咱們輸入一張圖片時,咱們要搜索出全部多是物體的區域,這個採用的方法是傳統文獻的算法:《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處理,上面的示意圖中第一、3行就是結合了padding=0,第二、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講解階段我再具體講解。

 

 

5、CNN特徵提取階段

一、算法實現

  a、網絡結構設計階段

網絡架構咱們有兩個可選方案:第一選擇經典的Alexnet;第二選擇VGG16。通過測試Alexnet精度爲58.5%,VGG16精度爲66%。VGG這個模型的特色是選擇比較小的卷積核、選擇較小的跨步,這個網絡的精度高,不過計算量是Alexnet的7倍。後面爲了簡單起見,咱們就直接選用Alexnet,並進行講解;Alexnet特徵提取部分包含了5個卷積層、2個全鏈接層,在Alexnet中p5層神經元個數爲921六、 f六、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個事負樣本(正負樣本的定義前面已經提過,再也不解釋)。

二、問題解答

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

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

  據此咱們明白了一個道理,若是不針對特定任務進行fine-tuning,而是把CNN當作特徵提取器,卷積層所學到的特徵其實就是基礎的共享特徵提取層,就相似於SIFT算法同樣,能夠用於提取各類圖片的特徵,而f六、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,具體請看下文。

 

 

 

6、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的迴歸過程;最後看這篇文獻好累、十幾頁,細節一大堆,包含做者各類實驗、思考……

 

 

 

 

參考文獻:

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

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

**********************做者:hjimce   時間:2015.12.3  聯繫QQ:1393852684  原創文章,轉載請保留原文地址、做者等信息***************

相關文章
相關標籤/搜索