RCNN--對象檢測的又一偉大跨越


  最近在實驗室和師兄師姐在做有關RCNN的研究,發現這里面坑很深呀,在網上找了一個大牛的博客,准備下來繼追OPENCV同時,再來追一個RCNN的學習筆記的博文,博文地址如下:http://blog.csdn.net/column/details/ym-alanyannick.html,真的很感謝原作者提供這么好的學習資料,我就站在巨人的肩膀上總結學習下。

  ------------------------------------------------------------

  二次編輯:

  繼上次對RCNN的研究,下來繼續追博文,因為中間有一些畢設答辯之類的事情把思路給打斷了,現在重新沉下心來,安心做學術。

  加油! 2016年6月3日

  為什么感覺所謂的對象檢測,並不是字面意義上的直接探測一副圖片中的對象,而是對框出的區域中的對象進行像素的對比統計。

  就像醫生看病,不是從一些症狀思考患者是什么病,而是從感冒發燒開始一一排除。

  感覺這就像之前知乎上一個問題:現在的人工智能大部分基於統計學方法,那人工智能就看似不是那么智能了。

  本想對這篇RCNN學習筆記進行擴充,但是發現我需要另外學習一個叫SPPnet的網絡,故這篇文章到此結束。

  下篇:Fast RCNN(包括SPPnet、Fast RCNN)

  -------------------------------------------------------------

  在我的上一篇文章中轉載了一個介紹DPM方法的文章,在DPM方法到達瓶頸期的時候,RCNN橫空出世,一統天下。

  多說幾句,經典的對象檢測是提取一些人工設定的特征(Haar,HOG,SIFT,LBP,BoW,DPM等,這個專題在http://blog.csdn.net/zouxy09/article/details/7929570/有詳細解釋)

  本文的RCNN學習筆記主要是對幾篇論文的總結理解和對網上學習筆記的總結,關於RCNN的幾篇論文我也發下鏈接,有興趣可以去下載:

  論文下載傳送門:

http://files.cnblogs.com/files/soulmate1023/RCNN.pdf (RCNN)

http://files.cnblogs.com/files/soulmate1023/RCNN.zip  (Fast rcnn, Faster rcnn)

  RCNN論文所使用的數據庫:

一個較大的識別庫(ImageNet ILSVC 2012):標定每張圖片中物體的類別。一千萬圖像,1000類。 
一個較小的檢測庫(PASCAL VOC 2007):標定每張圖片中,物體的類別和位置。一萬圖像,20類。 
本文使用識別庫進行預訓練,而后用檢測庫調優參數。最后在檢測庫上評測。

廢話不多說,走起。

 

文章簡要介紹RCNN的框架,主要包含:

原圖--》候選區域生成--》對每個候選區域利用深度學習網絡進行特征提取--》特征送入每一類SVM分類器中判別--》回歸器修正候選框位置

經典圖:

這里寫圖片描述

下面對每一個步驟詳細分析:

1.候選區域生成:

 使用Selective Search(選擇性搜索)方法從一張圖片中生成許多小圖,Selective Search是先用過分割手段將圖片完全分割成小圖(小圖生成途徑1),再通過一些合並規則,將小圖均勻的合並,這是合並的小圖相比原圖還是小圖(小圖生成途徑2),這樣合並若干次,直到合並成整張原圖,至此,將所有生成小圖的途徑過程中的小圖全部輸出,就產生了region proposals, 原作者很形象的說道:

例:設有區域a-b-c-d-e-f-g-h。較好的合並方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。 
不好的合並方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh。

這里的a,b,c,d,e,f,g,h,ab,cd,ef,gh,abcd,efgh都是region proposals。這樣的小圖生成策略就叫做Selective Search。為盡可能不遺漏候選區域,上述操作在多個顏色空間中同時進行(RGB,HSV,Lab等)。在一個顏色空間中,使用上述四條規則的不同組合進行合並。所有顏色空間與所有規則的全部結果,在去除重復后,都作為候選區域輸出。作者提供了Selective Search的源碼

 

2.圖片resize:

因為CNN分類器需要輸入的圖片大小一致,所以這一步將圖片都resize成為227*227大小的,論文中試驗了兩種不同的resize處理方法:

@各向異性縮放:

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

@各項同性縮放:

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

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

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

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

 

3.CNN網絡訓練:(這一節只解釋訓練部分,關於CNN的內部結構先當做黑盒使用,下一節再解釋CNN的具體結構)

RCNN網絡訓練包括兩部分:預訓練 & 調優訓練

@預訓練:

      

網絡結構是基本借鑒Hinton 2012年在Image Net上的分類網絡Alexnet,略作簡化。這樣避免了直接從隨機初始化的參數進行訓練,使得網絡開始之前參數都是經過訓練過的參數,該技巧可以大大提高精度,這種方法叫有監督的訓練方式(也稱為遷移學習)。此網絡提取的特征為4096維,之后送入一個4096->1000的全連接(fc)層進行分類。

使用ILVCR 2012的全部數據進行訓練,輸入一張圖片,輸出1000維的類別標號,學習率0.01。

這里寫圖片描述

 

@調優訓練:

 網絡結構同樣使用上述網絡,最后一層換成4096->21的全連接網絡。因為RBG大神說了,通過他們的實驗得出,一般的CNN網絡(eg,S1-S5,F6,F7),前5層是用於特征提取的,卷積層所學到的特征其實就是基礎的共享特征提取層,就類似於SIFT算法一樣,可以用於提取各種圖片的特征,而f6、f7所學習到的特征是用於針對特定任務的特征。所以這里可以將后面的層修改用於對象檢測。 學習率0.001,每一個batch包含32個正樣本(屬於20類)和96個背景的負樣本。

訓練數據為使用PASCAL VOC 2007的訓練集,輸入一張圖片,輸出21維的類別標號,表示20類+背景。 
考察一個候選框和當前圖像上所有標定框(人工標注的候選框)重疊面積最大的一個。如果重疊比例大於0.5,則認為此候選框為此標定的類別;否則認為此候選框為背景。(或者這樣說:在前一步的區域提出中產生的2K+的候選框將作為后面的CNN訓練數據和SVM的訓練數據,將selective search挑選出來的候選框與物體的人工標注矩形框的重疊區域IoU大於0.5,那么我們就把這個候選框標注成物體類別,否則我們就把它當做背景類別。這樣訓練樣本的答案就標出來了,構成訓練數據,直接用於訓練,反復迭代幾次,CNN就訓練好了)

???這里當時我看的時候,有一個疑問,就是既然這里CNN已經訓練好了,可以用於20類+1個背景的分類的,那為什么還需要再把提取的特征用於訓練svm分類器?

這里原作者也給出了解釋:

這個是因為svm訓練和cnn訓練過程的正負樣本定義方式各有不同,導致最后采用CNN softmax輸出比采用svm精度還低。

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

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

總的來說,就是加上一個SVM分類器,識別精度更高了!

 

4.CNN特征提取:(主要解釋CNN內部具體結構)

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

 

5.SVM分類器的訓練:

我們都知道SVM分類器是需要正負樣本的,但這里由於負樣本遠遠大於正樣本的數量,所以采用hard negative mining的方法,其中,正樣本就是原圖中真正標定bounding box的樣本,而負樣本是通過考察每一個候選框,如果和本類所有標定框的重疊都小於0.3,認定其為負樣本。

 

6.SVM類別判斷:

從特征提取步驟中,生成一個4096維特征,將這個向量分別放入每一個SVM分類器中進行二值分類,並輸出對每一個region proposal的4096維特征的得分.(這里的詳細過程為:當我們用CNN提取2000個候選框,可以得到2000*4096這樣的特征向量矩陣,然后我們只需要把這樣的一個矩陣與svm權值矩陣4096*N矩陣乘,得到2000*N的矩陣,就是每一個類對2000個候選框的打分,N為分類類別數目,就可以得到結果了)

最后將得到所有region proposals的對於每一類的分數,再使用貪心的非極大值抑制方法對每一個SVM分類器類去除相交的多余的框。

@非極大值抑制方法(NMS):(這里直接COPY原作者的博文,因為真心覺得原文已經很棒,沒有一個字廢話):

SVM分類器的每一類,會從一張圖片中找出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是我們保留下來的第二個矩形框。

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

非極大值抑制,顧名思義就是抑制不是極大值的元素,搜索局部的極大值。這個局部代表的是一個鄰域,鄰域有兩個參數可變,一是鄰域的維數,二是鄰域的大小。這里不討論通用的NMS算法,而是用於在目標檢測中用於提取分數最高的窗口的。例如在行人檢測中,滑動窗口經提取特征,經分類器分類識別后,每個窗口都會得到一個分數。但是滑動窗口會導致很多窗口與其他窗口存在包含或者大部分交叉的情況。這時就需要用到NMS來選取那些鄰域里分數最高(是行人的概率最大),並且抑制那些分數低的窗口。

 

7.利用回歸器進行bounding box的修復

目標檢測問題的衡量標准是重疊面積(IoU),許多看似准確的檢測結果,往往因為候選框不夠准確,重疊面積很小。故需要一個位置精修步驟。 

如上圖,IOU=(A∩B)/(A∪B)

回歸器 
對每一類目標,使用一個線性脊回歸器進行精修。正則項λ=10000。 
輸入為深度網絡pool5層的4096維特征,輸出為xy方向的縮放和平移。 
訓練樣本 
判定為本類的候選框中,和真值重疊面積大於0.6的候選框。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM