Rich feature hierarchies for accurate object detection and semantic segmentationhtml
做者: Ross Girshick Jeff Donahue Trevor Darrell Jitendra Malikgit
引用: 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.github
引用次數: 2027(Google Scholar, By 2016/11/23).算法
項目地址: https://github.com/rbgirshick/rcnn (基於MATLAB)網絡
1 介紹
學習
這篇文章是2014年CVPR的一篇文章,就是很出名的RCNN(Regions with CNN Features),利用了深度學習的方法來作目標檢測.測試
本模型主要包含了3 + 1個模塊:spa
模塊一: 生成類別獨立的候選區域翻譯
何爲類別獨立的(category-independent,CI)區域? 好比說咱們想識別一張圖像上的貓和狗,生成的CI區域不能橫跨貓和狗,而只能屬於它們之一,或者乾脆是背景.在一張圖像上生成CI區域的方式有不少,本文采用的是Selective Search的方法,關於這個方法,請參考個人另外一篇博文<論文閱讀筆記--Selective Search for Object Recognition>.3d
模塊二: 利用一個大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