基于R-CNN的物体检测-CVPR 2014
轉(zhuǎn)載自:http://blog.csdn.net/hjimce/article/details/50187029
一、相關(guān)理論
? ?本篇博文主要講解2014年CVPR上的經(jīng)典paper:《Rich feature hierarchies?for?Accurate Object Detection and Segmentation》,這篇文章的算法思想又被稱之為:R-CNN(Regions with Convolutional Neural Network Features),是物體檢測領(lǐng)域曾經(jīng)獲得state-of-art精度的經(jīng)典文獻。
? ?這篇paper的思想,改變了物體檢測的總思路,現(xiàn)在好多文獻關(guān)于深度學習的物體檢測的算法,基本上都是繼承了這個思想,比如:《Spatial Pyramid Pooling in Deep Convolutional?Networks for Visual Recognition》,所以學習經(jīng)典算法,有助于我們以后搞物體檢測的其它paper。
? ? 之前剛開始接觸物體檢測算法的時候,老是分不清deep learning中,物體檢測和圖片分類算法上的區(qū)別,弄得我頭好暈,終于在這篇paper上,看到了解釋。物體檢測和圖片分類的區(qū)別:圖片分類不需要定位,而物體檢測需要定位出物體的位置,也就是相當于把物體的bbox檢測出來,還有一點物體檢測是要把所有圖片中的物體都識別定位出來。
二、基礎(chǔ)知識
1、有監(jiān)督預訓練與無監(jiān)督預訓練
(1)無監(jiān)督預訓練(Unsupervised pre-training)
無監(jiān)督預訓練這個名詞我們比較熟悉,棧式自編碼、DBM采用的都是采用無監(jiān)督預訓練。因為預訓練階段的樣本不需要人工標注數(shù)據(jù),所以就叫做無監(jiān)督預訓練。
(2)有監(jiān)督預訓練(Supervised pre-training)
所謂的有監(jiān)督預訓練,我們也可以把它稱之為遷移學習。比如你已經(jīng)有一大堆標注好的人臉年齡分類的圖片數(shù)據(jù),訓練了一個CNN,用于人臉的年齡識別。然后當你遇到新的項目任務是:人臉性別識別,那么這個時候你可以利用已經(jīng)訓練好的年齡識別CNN模型,去掉最后一層,然后其它的網(wǎng)絡(luò)層參數(shù)就直接復制過來,繼續(xù)進行訓練。這就是所謂的遷移學習,說的簡單一點就是把一個任務訓練好的參數(shù),拿到另外一個任務,作為神經(jīng)網(wǎng)絡(luò)的初始參數(shù)值,這樣相比于你直接采用隨機初始化的方法,精度可以有很大的提高。
圖片分類標注好的訓練數(shù)據(jù)非常多,但是物體檢測的標注數(shù)據(jù)卻很少,如何用少量的標注數(shù)據(jù),訓練高質(zhì)量的模型,這就是文獻最大的特點,這篇paper采用了遷移學習的思想。文獻就先用了ILSVRC2012這個訓練數(shù)據(jù)庫(這是一個圖片分類訓練數(shù)據(jù)庫),先進行網(wǎng)絡(luò)的圖片分類訓練。這個數(shù)據(jù)庫有大量的標注數(shù)據(jù),共包含了1000種類別物體,因此預訓練階段cnn模型的輸出是1000個神經(jīng)元,或者我們也直接可以采用Alexnet訓練好的模型參數(shù)。
2、IOU的定義
因為沒有搞過物體檢測不懂IOU這個概念,所以就簡單介紹一下。物體檢測需要定位出物體的bounding box,就像下面的圖片一樣,我們不僅要定位出車輛的bounding box 我們還要識別出bounding box 里面的物體就是車輛。對于bounding box的定位精度,有一個很重要的概念,因為我們算法不可能百分百跟人工標注的數(shù)據(jù)完全匹配,因此就存在一個定位精度評價公式:IOU。
IOU定義了兩個bounding box的重疊度,如下圖所示:
矩形框A、B的一個重合度IOU計算公式為:
IOU=(A∩B)/(A∪B)
就是矩形框A、B的重疊面積占A、B并集的面積比例:
IOU=SI/(SA+SB-SI)
3、非極大值抑制
因為一會兒講RCNN算法,會從一張圖片中找出n多個可能是物體的矩形框,然后為每個矩形框為做類別分類概率:
就像上面的圖片一樣,定位一個車輛,最后算法就找出了一堆的方框,我們需要判別哪些矩形框是沒用的。非極大值抑制:先假設(shè)有6個矩形框,根據(jù)分類器類別分類概率做排序,從小到大分別屬于車輛的概率分別為A、B、C、D、E、F。
(1)從最大概率矩形框F開始,分別判斷A~E與F的重疊度IOU是否大于某個設(shè)定的閾值;
(2)假設(shè)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個類別,因此一會設(shè)計fine-tuning CNN的時候,我們softmax分類輸出層為21個神經(jīng)元。
三、算法總體思路?
? ? 開始講解paper前,我們需要先把握總體思路,才容易理解paper的算法。
? ? 圖片分類與物體檢測不同,物體檢測需要定位出物體的位置,這種就相當于回歸問題,求解一個包含物體的方框。而圖片分類其實是邏輯回歸。這種方法對于單物體檢測還不錯,但是對于多物體檢測就……
? ? 因此paper采用的方法是:首先輸入一張圖片,我們先定位出2000個物體候選框,然后采用CNN提取每個候選框中圖片的特征向量,特征向量的維度為4096維,接著采用svm算法對各個候選框中的物體進行分類識別。也就是總個過程分為三個程序:a、找出候選框;b、利用CNN提取特征向量;c、利用SVM進行特征向量分類。具體的流程如下圖片所示:
后面我們將根據(jù)這三個過程,進行每個步驟的詳細講解。
四、候選框搜索階段
1、實現(xiàn)方式
當我們輸入一張圖片時,我們要搜索出所有可能是物體的區(qū)域,這個采用的方法是傳統(tǒng)文獻的算法:《search for object recognition》,通過這個算法我們搜索出2000個候選框。然后從上面的總流程圖中可以看到,搜出的候選框是矩形的,而且是大小各不相同。然而CNN對輸入圖片的大小是有固定的,如果把搜索到的矩形選框不做處理,就扔進CNN中,肯定不行。因此對于每個輸入的候選框都需要縮放到固定的大小。下面我們講解要怎么進行縮放處理,為了簡單起見我們假設(shè)下一階段CNN所需要的輸入圖片大小是個正方形圖片227*227。因為我們經(jīng)過selective search 得到的是矩形框,paper試驗了兩種不同的處理方法:
(1)各向異性縮放
這種方法很簡單,就是不管圖片的長寬比例,管它是否扭曲,進行縮放就是了,全部縮放到CNN輸入的大小227*227,如下圖(D)所示;
(2)各向同性縮放
因為圖片扭曲后,估計會對后續(xù)CNN的訓練精度有影響,于是作者也測試了“各向同性縮放”方案。這個有兩種辦法
A、直接在原始圖片中,把bounding box的邊界進行擴展延伸成正方形,然后再進行裁剪;如果已經(jīng)延伸到了原始圖片的外邊界,那么就用bounding box中的顏色均值填充;如下圖(B)所示;
B、先把bounding box圖片裁剪出來,然后用固定的背景顏色填充成正方形圖片(背景顏色也是采用bounding box的像素顏色均值),如下圖(C)所示;
對于上面的異性、同性縮放,文獻還有個padding處理,上面的示意圖中第1、3行就是結(jié)合了padding=0,第2、4行結(jié)果圖采用padding=16的結(jié)果。經(jīng)過最后的試驗,作者發(fā)現(xiàn)采用各向異性縮放、padding=16的精度最高,具體不再啰嗦。
OK,上面處理完后,可以得到指定大小的圖片,因為我們后面還要繼續(xù)用這2000個候選框圖片,繼續(xù)訓練CNN、SVM。然而人工標注的數(shù)據(jù)一張圖片中就只標注了正確的bounding box,我們搜索出來的2000個矩形框也不可能會出現(xiàn)一個與人工標注完全匹配的候選框。因此我們需要用IOU為2000個bounding box打標簽,以便下一步CNN訓練使用。在CNN階段,如果用selective?search挑選出來的候選框與物體的人工標注矩形框的重疊區(qū)域IoU大于0.5,那么我們就把這個候選框標注成物體類別,否則我們就把它當做背景類別。SVM階段的正負樣本標簽問題,等到了svm講解階段我再具體講解。
五、CNN特征提取階段
1、算法實現(xiàn)
a、網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計階段
網(wǎng)絡(luò)架構(gòu)我們有兩個可選方案:第一選擇經(jīng)典的Alexnet;第二選擇VGG16。經(jīng)過測試Alexnet精度為58.5%,VGG16精度為66%。VGG這個模型的特點是選擇比較小的卷積核、選擇較小的跨步,這個網(wǎng)絡(luò)的精度高,不過計算量是Alexnet的7倍。后面為了簡單起見,我們就直接選用Alexnet,并進行講解;Alexnet特征提取部分包含了5個卷積層、2個全連接層,在Alexnet中p5層神經(jīng)元個數(shù)為9216、 f6、f7的神經(jīng)元個數(shù)都是4096,通過這個網(wǎng)絡(luò)訓練完畢后,最后提取特征每個輸入候選框圖片都能得到一個4096維的特征向量。
b、網(wǎng)絡(luò)有監(jiān)督預訓練階段
參數(shù)初始化部分:物體檢測的一個難點在于,物體標簽訓練數(shù)據(jù)少,如果要直接采用隨機初始化CNN參數(shù)的方法,那么目前的訓練數(shù)據(jù)量是遠遠不夠的。這種情況下,最好的是采用某些方法,把參數(shù)初始化了,然后在進行有監(jiān)督的參數(shù)微調(diào),這邊文獻采用的是有監(jiān)督的預訓練。所以paper在設(shè)計網(wǎng)絡(luò)結(jié)構(gòu)的時候,是直接用Alexnet的網(wǎng)絡(luò),然后連參數(shù)也是直接采用它的參數(shù),作為初始的參數(shù)值,然后再fine-tuning訓練。
網(wǎng)絡(luò)優(yōu)化求解:采用隨機梯度下降法,學習速率大小為0.001;
C、fine-tuning階段
我們接著采用selective?search?搜索出來的候選框,然后處理到指定大小圖片,繼續(xù)對上面預訓練的cnn模型進行fine-tuning訓練。假設(shè)要檢測的物體類別有N類,那么我們就需要把上面預訓練階段的CNN模型的最后一層給替換掉,替換成N+1個輸出的神經(jīng)元(加1,表示還有一個背景),然后這一層直接采用參數(shù)隨機初始化的方法,其它網(wǎng)絡(luò)層的參數(shù)不變;接著就可以開始繼續(xù)SGD訓練了。開始的時候,SGD學習率選擇0.001,在每次訓練的時候,我們batch?size大小選擇128,其中32個事正樣本、96個事負樣本(正負樣本的定義前面已經(jīng)提過,不再解釋)。
2、問題解答
OK,看完上面的CNN過程后,我們會有一些細節(jié)方面的疑問。首先,反正CNN都是用于提取特征,那么我直接用Alexnet做特征提取,省去fine-tuning階段可以嗎?這個是可以的,你可以不需重新訓練CNN,直接采用Alexnet模型,提取出p5、或者f6、f7的特征,作為特征向量,然后進行訓練svm,只不過這樣精度會比較低。那么問題又來了,沒有fine-tuning的時候,要選擇哪一層的特征作為cnn提取到的特征呢?我們有可以選擇p5、f6、f7,這三層的神經(jīng)元個數(shù)分別是9216、4096、4096。從p5到p6這層的參數(shù)個數(shù)是:4096*9216?,從f6到f7的參數(shù)是4096*4096。那么具體是選擇p5、還是f6,又或者是f7呢?
文獻paper給我們證明了一個理論,如果你不進行fine-tuning,也就是你直接把Alexnet模型當做萬金油使用,類似于HOG、SIFT一樣做特征提取,不針對特定的任務。然后把提取的特征用于分類,結(jié)果發(fā)現(xiàn)p5的精度竟然跟f6、f7差不多,而且f6提取到的特征還比f7的精度略高;如果你進行fine-tuning了,那么f7、f6的提取到的特征最會訓練的svm分類器的精度就會飆漲。
據(jù)此我們明白了一個道理,如果不針對特定任務進行fine-tuning,而是把CNN當做特征提取器,卷積層所學到的特征其實就是基礎(chǔ)的共享特征提取層,就類似于SIFT算法一樣,可以用于提取各種圖片的特征,而f6、f7所學習到的特征是用于針對特定任務的特征。打個比方:對于人臉性別識別來說,一個CNN模型前面的卷積層所學習到的特征就類似于學習人臉共性特征,然后全連接層所學習的特征就是針對性別分類的特征了。
還有另外一個疑問:CNN訓練的時候,本來就是對bounding?box的物體進行識別分類訓練,是一個端到端的任務,在訓練的時候最后一層softmax就是分類層,那么為什么作者閑著沒事干要先用CNN做特征提取(提取fc7層數(shù)據(jù)),然后再把提取的特征用于訓練svm分類器?這個是因為svm訓練和cnn訓練過程的正負樣本定義方式各有不同,導致最后采用CNN softmax輸出比采用svm精度還低。
事情是這樣的,cnn在訓練的時候,對訓練數(shù)據(jù)做了比較寬松的標注,比如一個bounding?box可能只包含物體的一部分,那么我也把它標注為正樣本,用于訓練cnn;采用這個方法的主要原因在于因為CNN容易過擬合,所以需要大量的訓練數(shù)據(jù),所以在CNN訓練階段我們是對Bounding box的位置限制條件限制的比較松(IOU只要大于0.5都被標注為正樣本了);
然而svm訓練的時候,因為svm適用于少樣本訓練,所以對于訓練樣本數(shù)據(jù)的IOU要求比較嚴格,我們只有當bounding?box把整個物體都包含進去了,我們才把它標注為物體類別,然后訓練svm,具體請看下文。
六、SVM訓練、測試階段
這是一個二分類問題,我么假設(shè)我們要檢測車輛。我們知道只有當bounding?box把整量車都包含在內(nèi),那才叫正樣本;如果bounding box 沒有包含到車輛,那么我們就可以把它當做負樣本。但問題是當我們的檢測窗口只有部分包好物體,那該怎么定義正負樣本呢?作者測試了IOU閾值各種方案數(shù)值0,0.1,0.2,0.3,0.4,0.5。最后我們通過訓練發(fā)現(xiàn),如果選擇IOU閾值為0.3效果最好(選擇為0精度下降了4個百分點,選擇0.5精度下降了5個百分點),即當重疊度小于0.3的時候,我們就把它標注為負樣本。一旦CNN f7層特征被提取出來,那么我們將為每個物體累訓練一個svm分類器。當我們用CNN提取2000個候選框,可以得到2000*4096這樣的特征向量矩陣,然后我們只需要把這樣的一個矩陣與svm權(quán)值矩陣4096*N點乘(N為分類類別數(shù)目,因為我們訓練的N個svm,每個svm包好了4096個W),就可以得到結(jié)果了。
OK,就講到這邊吧,懶得打字了,打到手酸。
個人總結(jié):學習這篇文獻最大的意義在于作者把自己的試驗過程都講的很清楚,可以讓我們學到不少的調(diào)參經(jīng)驗,真的是很佩服作者背后的思考。因為文獻很長、細節(jié)非常之多,本人也對物體檢測不感興趣,只是隨便看看文獻、學學算法罷了,所以很多細節(jié)沒有細看,比如7.3 bounding box的回歸過程;最后看這篇文獻好累、十幾頁,細節(jié)一大堆,包含作者各種實驗、思考……
參考文獻:
1、《Rich feature hierarchies?for?Accurate Object Detection and Segmentation》
2、《Spatial Pyramid Pooling in Deep Convolutional?Networks for Visual Recognition》
總結(jié)
以上是生活随笔為你收集整理的基于R-CNN的物体检测-CVPR 2014的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Batch Normalization
- 下一篇: Stanford机器学习笔记-1.线性回