目标检测--Rich feature hierarchies for accurate object detection and semantic segmentation(CVPR 2014)
Rich feature hierarchies for accurate object detection and semantic segmentation
作者:?Ross Girshick Jeff Donahue Trevor Darrell Jitendra Malik
引用:?Girshick, Ross, et al. "Rich feature hierarchies for accurate object detection and semantic segmentation."?Proceedings of the IEEE conference on computer vision and pattern recognition. 2014.
引用次數:?2027(Google Scholar, By 2016/11/23).
項目地址:?https://github.com/rbgirshick/rcnn?(基于MATLAB)
1 介紹
這篇文章是2014年CVPR的一篇文章,就是很出名的RCNN(Regions with CNN Features),利用了深度學習的方法來做目標檢測.
本模型主要包含了3 + 1個模塊:
模塊一: 生成類別獨立的候選區域
何為類別獨立的(category-independent,CI)區域? 比如說我們想識別一張圖像上的貓和狗,生成的CI區域不能橫跨貓和狗,而只能屬于它們之一,或者干脆是背景.在一張圖像上生成CI區域的方式有很多,本文采用的是Selective Search的方法,關于這個方法,請參考我的另一篇博文<論文閱讀筆記--Selective Search for Object Recognition>.
模塊二: 利用一個大CNN來提取每個候選區域的特征向量
模塊三: 利用CNN特征為每個類別訓練一個二分類線性SVMs?
可選模塊:?利用CNN特征來做Bounding-box回歸
2 訓練和測試流程圖
2.1 本文模型訓練流程圖
訓練的過程從前到后可分成五個部分:
第一部分: 訓練集構造(用于對CNN進行微調)
給定一系列的輸入圖像,如何構造訓練集?我認為也是先用Selective Search的方法在每個圖像上生成很多的候選區域(具體多少文中好像沒有講),然后在每張圖上依次計算每個候選區域與圖中目標的ground-truth box之前的重疊程度(IoU),如果重疊程度大于0.5則標記這個區域為此目標的正樣本,否則,為負樣本.對所有的訓練圖像執行這樣的操作,可以把得到的所有的候選區域保存下來以備使用.假如說有20個目標,對每個目標我們都有一些屬于它這個類的正樣本,統稱為正樣本,其他的不屬于任何類的區域圖像稱之為負樣本.
第二部分: 訓練CNN來抽取候選區域深度特征
CNN采用了AlexNet的網絡結構,模型使用Caffe來實現;AlexNet網絡的結構如下圖所示:中間層我們不關注,我們主要看它的輸入和輸出.輸入是224*224大小的圖像,提取到的特征是一個4096維度的特征向量,由于是1000類的分類任務,因此最后一層的節點數目為1000.
OK,上面回顧了一下典型的AlexNet網絡,現在我們看作者是如何借鑒這個網絡的.首先是輸入,本文的輸入當然是第一部分里面提取到的候選區域,但是這些候選區域的大小都是不相同的,因此首先要把每個區域都resize到規定大小(224*224);對于每個區域提取的深度特征的維度依舊是4096維;最后一層的輸出要根據任務的不同做出相應的改變,原本AlexNet中最后一層的1000的含義是1000類的分類任務,到了這里,如果是對VOC數據集,則要把最后一層的節點數目設置為20+1(20表示有20個待識別目標,1表示背景類);對ILSVRC2013來說,要設置為200+1.
假如說對于VOC數據集,第一部分已經把訓練數據集構造好了,共有21個類,每個類都有自己對應的樣本區域,而且這些區域是類別獨立的.然后就可以輸入到改進版的AlexNet進行訓練了,AlexNet的最后一層依舊是Softmax層,這個時候的訓練可以看做有監督地訓練一個21-way的圖像分類網絡.
CNN網絡的具體訓練方法是:先用ILSCRC2012數據集對網絡進行有監督預訓練,然后使用第一部分里面提取的訓練集進行微調;微調的時候采用SGD的方法,學習率設置為預訓練時候的十分之一(具體為0.001),這樣使得網絡慢慢地收斂.mini-batch的大小為128(從第一部分保存下來的候選區域里,每次隨機抽取32個正樣本(在所有類別上),96個負樣本(背景類)).
第三部分: 訓練集構造(用于訓練多個SVM分類器)
第一部分介紹了如何構造訓練集來對預訓練后的CNN進行微調,那里面與GT Boxes之間的IoU重疊程度大于0.5的都被標定為正樣本.現在到了這一步,CNN已經訓練完成了,我們現在要為每個類別(比如貓,狗,...)單獨訓練一個二分類SVM分類器,比如"SVM_貓"就是專門來檢測貓這個目標,"SVM_狗"就是專門來檢測狗這個目標,這時候對每個二分類SVM分類器如何構造它的訓練集呢? 以貓這個目標為例,本文的做法就是以每張圖像上貓這個目標的GT Boxes作為正樣本,然后在圖像上生成很多候選區域,考察每個區域與貓目標的GT boxes之間的IoU,如果IoU小于0.3,那么就認定這個區域為負樣本,重疊度在0.3~1之間的不用做訓練.可以想象,對于訓練"SVM_貓"來說,正樣本都是包含貓的區域,負樣本有可能是背景,也有可能包含了其他目標,比如狗,但是無論怎么樣,這個區域只要不包含貓,或者講包含了一部分貓,但是重疊度小于0.3,都會被標記為負樣本.
第四部分: 為每個類訓練一個binary SVM分類器
假如有20個類,那么就要訓練20個binary分類器,第三部分講述了如何為每一個兩分類SVM構造相應的訓練集,訓練集里面的正樣本和負樣本都要使用上面已經訓練好的CNN來提取各自的4.96維度的特征向量,然后再對分類器進行訓練.
第五部分: 進行Bounding-box回歸
類似于第四部分中為每個類別訓練一個二分類SVM,本文這里為每個類別構造一個Bounding-box回歸器來提升檢測的準確率.
具體做法:假如下圖中的綠色box用P來表示,P=(Px,Py,Pw,Ph),這四個值分別表示這個box的中心點橫坐標,中心點縱坐標,box寬度以及box高度.紅色框為目標的真實box,設為G,G=(Gx,Gy,Gw,Gh),每個元素的含義和P中相同,現在的目的就是想學習到一種變換,這個變換可以將P映射到G.
如何對這個變換進行建模? 作者給出了一種變換關系如下圖所示:
? ??
訓練回歸器的時候,對于輸入: 訓練box的P=(Px,Py,Pw,Ph)肯定是要參與的,但是不僅僅是這個.前面我們訓練得到了CNN,我們這里可以使用已經訓練的CNN計算區域的pool5層的特征(即Φ5(P))來參與訓練,w_{x,y,h,w}為待學習的回歸器參數,因此,我們的問題變得很直接: 就是通過一定的方法把w_{x,y,h,w}求出來,就得到了回歸器.思路講清楚了,具體的求解過程見論文中所述.
注意事項:我在想,就比如上面那個檢測狼的那張圖,真實的邊緣box就一個,而候選的box卻可能有很多,那么也就是說,對于這張圖像上的樣本,它們的輸入雖然不一樣,但是輸出確實相同的,這合理嗎?但是轉念一想,訓練的時候圖像的數目是很多的,從這些圖像上抽取的所有樣本一起參與訓練,一張圖像上的影響可能并不那么大.文中提示我們需要注意的一點也在訓練集的構造上面,如果P這個區域距離G太遠的話,那么回歸可能變得沒有意義,一次構造訓練集時候要選擇哪些距離G比較近的候選區域,怎么考量這個近的程度呢? 當然還是使用IoU了,文章中選擇那些與GTbox的IoU在0.6以上的區域來進行回歸(0.6這個值使用交叉驗證確定的),至于其他的候選區域,直接丟掉就是了.?
2.2 本文模型測試過程
測試過程基本上和訓練的過程是相同的: 給定一張測試圖像 --> 利用SS方法抽取大約2000個候選區域 --> 將每個區域都resize到224*224大小 --> 利用訓練好的CNN得到每個區域的深度特征 --> 將每個區域對應的深度特征向量分別送到那幾十個訓練好的二分類SVM當中,輸出每個區域屬于每個類的概率(SVM軟分類).假如類別數目N=20,就會得到一個2000*20的矩陣,每一行數據表示的是一個候選區域屬于20個類的概率值.每一列表示所有的候選區域屬于那一列類別的概率值(比如,一張圖像上的2000個候選區域屬于貓這個類別的概率). --> 對于每一類別(也就是每一列的數據)使用貪婪非最大值抑制的方法來對這些區域進行篩選. --> 對這2000個候選區域,用回歸器預測bounding box.
(問題1: 貪婪非最大值抑制這點還沒有完全理解,具體是怎么進行的?)
(問題2: 最后怎么得到最終結果的?)
總結
1.?上面的模型,即使把第三部分和第四部分去掉也能得到檢測的結果,也就是說,直接運用CNN的softmax分類器就可以當做是一個目標檢測器,那么為什么還要再構造訓練集,再訓練多個SVM分類器呢??如果只是用CNN+Softmax來做目標檢測器,那么這篇論文的思路就和<論文閱讀筆記--Selective Search for Object Recognition>差不多了,就是把Selective Search算法里面的HOG+BOW特征換成了CNN特征,SVM分類器換成了Softmax,這樣的話,這篇論文的創新性便不能體現!而且,據作者文中所說,如果只使用第一和第二部分的話,在VOC2007數據集上的表現將從54.2%下降到50.9%.
每個模型都有自己的優點和缺點,這篇為人所道的缺點就是它需要訓練多個SVM分類器,計算復雜度較高,這一點在那些只需要訓練一個分類器的文章中經常能看到.
2.?Ross Girshick大神在RCNN改進版<Fast RCNN>里面對RCNN的幾個缺點進行了闡述,只要包括:
(1) RCNN的訓練是一個multi-stage pipeline.這句話的意思是說RCNN的三個模塊是一條流水線下來,而不是有機地結合在了一起;具體來說就是: RCNN首先利用object proposals樣本,借助log loss(Softmax)來微調一個ConvNet --> 然后使用ConvNet的特征來訓練多個二分類SVMs --> 最后再訓練一個bounding-box回歸器.
(2) 訓練在空間和時間上都耗費巨大.RCNN需要訓練多個SVM分類器,也要訓練多個回歸器,訓練所用的特征向量都是深度特征向量,維度是很高的,這些特征保存到硬盤上很占空間,而且訓練比較耗時.
(3) 測試的時候速度很慢. 測試的時候,先在圖像上生成region proposal,然后提取每個proposal的深度特征,然后再分類,在GPU上測試是47s/image,達不到實時的要求.
?
本博文不是對文章的逐字翻譯,而是盡量對其思想進行理解,因此難免有一些誤解或者不當之處, 敬請留言指教, 謝謝!
?
參考文獻:
[1] 項目的MATLAB源碼:https://github.com/rbgirshick/rcnn
總結
以上是生活随笔為你收集整理的目标检测--Rich feature hierarchies for accurate object detection and semantic segmentation(CVPR 2014)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 目标检测--Selective Sear
- 下一篇: 目标检测--Spatial pyrami