RCNN系列學習記錄

一、RCNN


第一階段 分類

1)selective search 選擇2000個候選區域
2)對於每一個region proposal 都wrap到固定的大小的scale,227*227(AlexNet Input)
3)對於每一個處理之後的圖片,把他都放到CNN上去進行特徵提取,得到每個region proposal的feature map,這些特徵用固定長度的特徵集合feature vector來表示。最後對於每一個類別,我們都會得到很多的feature vector。
4)把這些特徵向量直接放到svm現行分類器去判斷,每個region 都會給出所對應的score。打分是指region proposals對於各個類別的分數。

第二階段 邊緣檢測

用非極大值抑制canny來進行邊緣檢測
非極大值抑制(NMS)先計算出每一個bounding box的面積,然後根據score進行排序,把score最大的bounding box作爲選定的框,計算其餘bounding box與當前最大score與box的IoU,去除IoU大於設定的閾值的bounding box。然後重複上面的過程,直至候選bounding box爲空,然後再將score小於一定閾值的選定框刪除得到一類的結果

總結:

1)首先需要在AlexNet上進行分類的訓練model,得到AlexNet之後才能進行分類(Pretrained procedure->SoftMax2SVM)。
2)分類之後再改一下AxlexNet model (fc: 1000->21)得到detection model(training)->(testing),然後在上面利用SVM進行二分類判斷當前的region有沒有包含我們需要的物體
3)(對結果進行排序,取前面的IOU最大的那幾個(nms),在對這些進行canny邊緣檢測,纔可以得到bounding-box(then B-BoxRegression)。


二、SSP-NET

CNN網絡需要固定尺寸的圖像輸入,SPPNet將任意大小的圖像池化生成固定長度的圖像表示。事實上,CNN的卷積層不需要固定尺寸的圖像,全連接層是需要固定大小輸入的,因此提出了SPP層放到卷積層的後面。


如果原圖輸入是224x224,對於conv5出來後的輸出,是13x13x256的,可以理解成有256個這樣的filter,每個filter對應一張13x13的reponse map。
如果像上圖那樣將reponse map分成4x4 2x2 1x1三張子圖,做max pooling後,出來的特徵就是固定長度的(16+4+1)x256那麼多的維度了。

如果原圖的輸入不是224x224,出來的特徵依然是(16+4+1)x256


SPP層其實就說一個特殊的池化層。空間金字塔最大池化的過程,其實就是從這21個圖片塊中,分別計算每個塊的最大值,從而得到一個輸出神經元。最後把一張任意大小的圖片轉換成了一個固定大小的21維特徵(當然你可以設計其它維數的輸出,增加金字塔的層數,或者改變劃分網格的大小)。上面的三種不同刻度的劃分,每一種刻度我們稱之爲:金字塔的一層,每一個圖片塊大小我們稱之爲:windows size了。如果你希望,金字塔的某一層輸出n*n個特徵,那麼你就要用windows size大小爲:(w/n,h/n)進行池化了。

關鍵機制:如何將圖像的ROI映射到feature map

原圖的某個區域就可以通過除以網絡的所有stride來映射到conv5後去區域
缺點

SPP中的微調只更新spp層後面的全連接層,對很深的網絡這樣肯定是不行的。


三、Fast-RCNN

與RCNN對比改進

1. 比R-CNN更高的檢測質量(mAP); 
2. 把多個任務的損失函數寫到一起,實現單級的訓練過程; 
訓練的時候,pipeline是隔離的,先提proposal,然後CNN提取特徵,之後用SVM分類器,最後再做bbox regression。FRCN實現了end-to-end的joint training(提proposal階段除外)
3. 在訓練時可更新所有的層; 
RCNN中ROI-centric的運算開銷大,所以FRCN用了image-centric的訓練方式來通過卷積的share特性來降低運算開銷;
FRCN進一步通過single scale(pooling->spp just for one scale) testing和SVD(降維)分解全連接來提速。
4. 不需要在磁盤中存儲特徵。 

RCNN提取特徵給SVM訓練時候需要中間要大量的磁盤空間存放特徵,FRCN去掉了SVM這一步,所有的特徵都暫存在顯存中,就不需要額外的磁盤空間了

與SPP對比

對比回來SPP-Net,可以看出FRCN大致就是一個joint training版本的SPP-Net,改進如下:
1.改進了SPP-Net在實現上無法同時tuning在SPP layer兩邊的卷積層和全連接層   

2.SPP-Net後面的需要將第二層FC的特徵放到硬盤上訓練SVM,之後再額外訓練bbox regressor

整體框架

如果以AlexNet(5個卷積和3個全連接)爲例,大致的訓練過程可以理解爲:
1.selective search在一張圖片中得到約2k個object proposal(這裏稱爲RoI)
2.縮放圖片的scale得到圖片金字塔,FP得到conv5的特徵金字塔。
3.對於每個scale的每個ROI,求取映射關係,在conv5中crop出對應的patch。並用一個單層的SPP layer(這裏稱爲Rol pooling layer)來統一到一樣的尺度(對於AlexNet是6x6)。
4.繼續經過兩個全連接得到特徵,這特徵有分別share到兩個新的全連接,連接上兩個優化目標。第一個優化目標是分類,使用softmax,第二個優化目標是bbox regression,使用了一個smooth的L1-loss.
(除了1,上面的2-4是joint training的。測試時候,在4之後做一個NMS即可。)

Rol pooling layer

Rol pooling layer的作用主要有兩個:
1.是將image中的rol定位到feature map中對應patch
2.是用一個單層的SPP layer將這個feature map patch下采樣爲大小固定的feature再傳入全連接層。即
RoI pooling layer來統一到相同的大小-> (fc)feature vector 即->提取一個固定維度的特徵表示。

RoI-centric sampling與image-centric sampling

RoI-centric sampling:從所有圖片的所有RoI中均勻取樣,這樣每個SGD的mini-batch中包含了不同圖像中的樣本。(SPPnet採用) 

image-centric sampling: (solution)mini-batch採用層次取樣,先對圖像取樣,再對RoI取樣,同一圖像的RoI共享計算和內存。 


四、Faster-RCNN

從RCNN到fast RCNN,再到本文的faster RCNN,目標檢測的四個基本步驟(候選區域生成,特徵提取,分類,位置精修)終於被統一到一個深度網絡框架之內。所有計算沒有重複,完全在GPU中完成,大大提高了運行速度。 

faster RCNN可以簡單地看做“區域生成網絡+fast RCNN“的系統,用區域生成網絡代替fast RCNN中的Selective Search方法。本篇論文着重解決了這個系統中的三個問題: 
1. 如何設計區域生成網絡 
2. 如何訓練區域生成網絡 
3. 如何讓區域生成網絡和fast RCNN網絡共享特徵提取網絡


個人理解

RPN網絡是從fast-rcnn變化出來的,fast-rcnn需要Selective Search方法提供候選區域,如果我們先用某種機制選出候選區域,儘管這個機制選出來的候選區域不太準確,但經過RPN網絡的bbox regression輸出後會精準許多,特別是RPN網絡經過訓練後(輪流訓練或者聯合訓練)。這個機制在文章中就是在conv5層中的feature map的每一個點都反映射到原圖中,作爲候選區域的中心點,然後3*3滑動窗口中的9種anchors是候選區域的大小和比例,這樣就確定了初始給出的候選區域了。候選區域包含邊界的或者與grouth truth的IOU小於thresh的都要去掉。


區域生成網絡:訓練

樣本

考察訓練集中的每張圖像: 
a. 對每個標定的真值候選區域,與其重疊比例最大的anchor記爲前景樣本 
b. 對a)剩餘的anchor,如果其與某個標定重疊比例大於0.7,記爲前景樣本;如果其與任意一個標定的重疊比例都小於0.3,記爲背景樣本 
c. 對a),b)剩餘的anchor,棄去不用。 
d. 跨越圖像邊界的anchor棄去不用

代價函數

同時最小化兩種代價: 
a. 分類誤差 

b. 前景樣本的窗口位置偏差 

超參數

原始特徵提取網絡使用ImageNet的分類樣本初始化,其餘新增層隨機初始化。 
每個mini-batch包含從一張圖像中提取的256個anchor,前景背景樣本1:1. 
前60K迭代,學習率0.001,後20K迭代,學習率0.0001。 
momentum設置爲0.9,weight decay設置爲0.0005。


共享特徵

區域生成網絡(RPN)和fast RCNN都需要一個原始特徵提取網絡(下圖灰色方框)。這個網絡使用ImageNet的分類庫得到初始參數W0,但要如何精調參數,使其同時滿足兩方的需求呢?本文講解了三種方法。

輪流訓練

a. 從W0開始,訓練RPN。用RPN提取訓練集上的候選區域 
b. 從W0開始,用候選區域訓練Fast RCNN,參數記爲W1 
c. 從W1開始,訓練RPN… 
具體操作時,僅執行兩次迭代,並在訓練時凍結了部分層。論文中的實驗使用此方法。 
如Ross Girshick在ICCV 15年的講座Training R-CNNs of various velocities中所述,採用此方法沒有什麼根本原因,主要是因爲”實現問題,以及截稿日期“。


近似聯合訓練

直接在上圖結構上訓練。在backward計算梯度時,把提取的ROI區域當做固定值看待;在backward更新參數時,來自RPN和來自Fast RCNN的增量合併輸入原始特徵提取層。 
此方法和前方法效果類似,但能將訓練時間減少20%-25%。公佈的python代碼中包含此方法。


聯合訓練

直接在上圖結構上訓練。但在backward計算梯度時,要考慮ROI區域的變化的影響。推導超出本文範疇,請參看15年NIP論文。


參考文獻

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章