1. 程式人生 > >【深度學習:目標檢測】RCNN學習筆記(1):Rich feature hierarchies for accurate object detection and semantic segmentat

【深度學習:目標檢測】RCNN學習筆記(1):Rich feature hierarchies for accurate object detection and semantic segmentat

轉載:http://blog.csdn.net/u011534057/article/details/51218218

rcnn主要作用就是用於物體檢測,就是首先通過selective search 選擇2000個候選區域,這些區域中有我們需要的所對應的物體的bounding-box,然後對於每一個region proposal 都wrap到固定的大小的scale,227*227(AlexNet Input),對於每一個處理之後的圖片,把他都放到CNN上去進行特徵提取,得到每個region proposal的feature map,這些特徵用固定長度的特徵集合feature vector來表示。最後對於每一個類別,我們都會得到很多的feature vector,然後把這些特徵向量直接放到svm現行分類器去判斷,當前region所對應的實物是background還是所對應的物體類別,每個region 都會給出所對應的score,因為有些時候並不是說這些region中所包含的實物就一點都不存在,有些包含的多有些包含的少,包含的多少還需要合適的bounding-box,所以我們才會對於每一region給出包含實物類別多少的分數,選出前幾個對大數值,然後再用非極大值抑制canny來進行邊緣檢測,最後就會得到所對應的bounding-box啦,整個

架構如下圖所示:


這篇paper中作者指出兩個在inference的時候的關鍵點:第一:全部的引數在每種class類別都是共享的。第二點:和其他的方法相比較,我們最後的feature vector的維度都是相對較低的

       還有一個注意的地方:CNN中每層的引數都是如何訓練出來的呢?首先:我們在ILSVRC 2012的資料集上進行分類訓練,主要模擬的CNN模型是利用AlexNet進行分類,雖然最後的結果精度會有所降低,只是因為有些小小的改變而已,無傷大雅。這個過程是"pre-traing",如下圖所示:


        然後需要做的就是"fine-runing",主要就是對上面得到的model進行稍微的改動。首先改變了資料集的大小,前面用的資料集是比較大的,主要適用於進行分類,這裡我們主要使用的是相對較小的,並且是通過selective search之後的region proposal 作為網路的輸入。如果當前region  proposal的IOU大於0.5,把他標記為positive,其餘的是作為negtive,去訓練detection網路

。並且對SGD的引數進行的適當的修改。



這個時候,上面的model中訓練好了,之後,就需要對每一個region proposal進行特徵集合feature vector訓練好了,得到了特徵就可以對每一個得到的特徵輸入到SVM進行分類看看這個feature vector所對應的region proposal是需要的物體呢?還是無關的實物(background),排序,canny邊界檢測之後就得到了我們需要的bounding-box啦.如下所示


conclusion:

整個系統分為三個部分:1.產生不依賴與特定類別的region proposals,這些region proposals定義了一個整個檢測器可以獲得的候選目標2.一個大的卷積神經網路,對每個region產生一個固定長度的特徵向量

3.一系列特定類別的線性SVM分類器

2.1模組設計

  1. region proposals 作者指出近幾年有很多的產生region proposals的方法,而RCNN中使用的是【J. Uijlings, K. van de Sande, T. Gevers, and A. Smeulders. Selectivesearch for object recognition. IJCV, 2013.】和【X. Wang, M. Yang, S. Zhu, and Y. Lin. Regionlets for generic objectdetection. In ICCV, 2013.】中的方法。
  2. Feature extraction 對於region proposals的特徵提取,作者使用的是caffe框架,所使用的模型是在Imagenet資料集上的Alexnet模型。因為卷積神經網路要求輸入的圖片都是一樣尺寸的,所以在計算每個region proposals的特徵前會對每個region都歸到一樣大。

2.2測試階段的檢測

測試階段,使用selective search的方法在測試圖片上提取2000個region propasals ,將每個region proposals歸一化到227x227,然後再CNN中正向傳播,將最後一層得到的特徵提取出來。然後對於每一個類別,使用為這一類訓練的SVM分類器對提取的特徵向量進行打分,得到測試圖片中對於所有region proposals的對於這一類的分數,再使用貪心的非極大值抑制去除相交的多餘的框。非極大值抑制(NMS)先計算出每一個bounding box的面積,然後根據score進行排序,把score最大的bounding box作為選定的框,計算其餘bounding box與當前最大score與box的IoU,去除IoU大於設定的閾值的bounding box。然後重複上面的過程,直至候選bounding box為空,然後再將score小於一定閾值的選定框刪除得到一類的結果。作者提到花費在region propasals和提取特徵的時間是13s/張-GPU和53s/張-CPU,可以看出時間還是很長的,不能夠達到及時性。

2.3訓練階段

  1. 有監督預訓練 作者使用caffe框架利用ILSVRC 2012的資料集(應該就是imagenet吧)對網路模型進行了訓練,使網路模型中的引數都是經過訓練過的引數,而不是剛開始那樣隨機初始化的引數
  2. 特定領域的fine-tuning 為了適應不同場合的識別需要,如VOC,對網路繼續使用從VOC圖片集上對region proposals歸一化後的圖片進行訓練。網路只需要將最後的1000類的分類層換成21類的分類層(20個VOC中的類別和1個背景類),其他都不需要變。為了保證訓練只是對網路的微調而不是大幅度的變化,網路的學習率只設置成了0.001。計算每個region proposal與人工標註的框的IoU,IoU重疊閾值設為0.5,大於這個閾值的作為正樣本,其他的作為負樣本,然後在訓練的每一次迭代中都使用32個正樣本(包括所有類別)和96個背景樣本組成的128張圖片的batch進行訓練(這麼做的主要原因還是正樣本圖片太少了)
  3. 特定類別的分類器  對每個類都訓練一個線性的SVM分類器,訓練SVM需要正負樣本檔案,可以想象得到,剛好包含某一類物體的region proposal應該是正樣本,完全不包含的region proposal應該是負樣本,但是對於部分包含某一類物體的region proposal該如何訓練呢,作者同樣是使用IoU閾值的方法,這次的閾值為0.3,計算每一個region proposal與標準框的IoU,大於這個閾值的作為正樣本,小於的作為負樣本。由於訓練樣本比較大,作者使用了standard hard negative mining method(具體reference to hard negative mining of my blog)來訓練分類器。作者表示在補充材料中討論了為什麼fine-tuning和訓練SVM時所用的正負樣本標準不一樣(0.5和0.3),以及為什麼不直接用卷積神經網路的輸出來分類而要單獨訓練SVM來分類(see the folowing bolg, and it will make it done) 。


總之感覺:r-cnn有點麻煩,他要先過一次classification得到分類的model,繼而在得到的model上進行適當的改變又得到了detection的model,最後才開始在detection model cnn上進行邊界檢測。好麻煩,因為rcnn首先需要在AlexNet上進行分類的訓練model,得到AlexNet之後才能進行分類(Pretrained procedure->SoftMax2SVM)。分類之後在改一下AxlexNet model (fc: 1000->21)得到detection model(training)->(testing)
然後在上面利用SVM進行二分類判斷當前的region有沒有包含我們需要的物體(對結果進行排序,取前面的IOU最大的那幾個(nms)),在對這些進行canny邊緣檢測,才可以得到bounding-box(then B-BoxRegression)。

      簡單地說:就是r-cnn需要兩次進行跑cnn model,第一次得到classification的結果,第二次才能得到(nms+b-box regression)bounding-box。但是r-cnn也不是一事無成,人家還是有自己的特點嘛,就提在原來的架構上提出為啥不用CNN來進行特徵提取,而是用那些老套的sift,hog呢?當然科研界的大牛還是很厲害的啦,在r-cnn的基礎上就提出了fast-rcnn,它解決了rcnn中跑了兩次cnn才分別得到classification和bounding-box,牛掰之處在於ROI層的提出,下片再來看看。