http://closure11.com/rcnn-fast-rcnn-faster-rcnn%E7%9A%84%E4%B8%80%E4%BA%9B%E4%BA%8B/
首先看fast r-cnn這篇論文,中間加入了有些博友的想法。
問題
目標檢測主要面臨兩個問題:過多的候選位置(proposals);必須由這些粗略的候選位置中選出准確的位置。
這篇論文將學習目標proposals分類和精確定位結合起來。
1、 R-CNN和SPPnet存在的問題
(1)R-CNN的問題
訓練需要多階段:先用ConvNet進行微調,再用SVM進行分類,最后通過regression對 bounding box進行微調。在R-CNN中,
20類即20個SVM分類器訓練,20個bounding box回歸器訓練(測試同),非常繁瑣;
訓練代價大:在SVM和regression過程中,一張圖需要2k個proposals(有大量重疊),提取每個proposals的特征
(重疊)並寫入磁盤,耗時耗空間;
R-CNN需要先對proposals進行形變操作(227*227),再輸入CNN提取特征,而AlexNet CNN在特征提取過程中並不
固定圖像的大小,只是在全連接時才需要固定尺寸,然后使用SVM分類。
(2)SPPnet
R-CNN慢是因為其需要對每個proposals進行前向計算而沒有共享,SPPnets通過共享來加速r-cnn,SPPnet先計算
整張圖像的卷積特征圖,然后通過提取特征圖中特征向量對proposals進行分類。使用max pooling將特征映射為固定大
小。不同於R-CNN,微調算法不能更新spatial pyramid pooling前面的卷積層,只能更新后面的全連接層,這限制了其精度。
2、論文工作
(1)通過使用多任務損失,使訓練成為單階段的。
(2)訓練可在所有層中更新
(3)不需要在磁盤中存儲特征
3、如何做到呢
(1)fast r-cnn架構和訓練
輸入為整張圖像和一系列的object proposals(大小不同)。網絡首先用幾層卷積和max pooling處理
整張圖像,生成特征圖;對於每個object proposal,使用RoI pooling從特征圖中提取固定大小的特
征向量;將特征向量送入全連接層(fc layer),進而分出兩支:一支輸出K類物體的softmax 概率+背景,
另一支輸出K個類別的四個值(每個類別框的位置和大小)。那么什么是RoI pooling?
(2)RoI Pooling
RoI pooling層使用 max pooling將不同大小的特征轉為固定大小的小特征(W*H)。那么它是如何做到的呢?
對於一個h*w的區域,將其划分為H * W大小的格子,每個格子中有h/H * w/W個格子,對這些格子做 max pooling
就行了。
(3)預訓練前網絡的初始化
當用fast r-cnn初始化預訓練網絡時,它需要經歷三種變換:
首先用RoI pooling層替代最后一個max pooling層,在送入全連接層前將其變為H*W;
其次,將最后一個全連接層和softmax替換為兩個分支層(參考前文);
這個模型需要兩個輸入,一個為一系列圖像,另一個為這些圖像的一系列RoI(region of intrest)。
(4) 檢測時的微調
首先闡述為啥SPPnet不能在spatial pyramid pooling layer下更新權重:這是因為在訓練網絡時,每個訓練樣本(RoI)來自
於不同的圖像,而bp算法通過SPP layer是遠遠不夠的(?)。這種不夠是因為,每個RoI可能擁有非常大的感受野,經常跨越
整副輸入圖像。因為前向傳輸時必須處理整個感受野,訓練輸入時會很大(通常為整副圖像)。
本文在訓練時通過特征共享來提高效率。在訓練時,SGD分層次采樣,首先采樣N張圖像,然后在每張圖像上采樣R/N個RoI。
來自於同一張圖像的RoIs共享計算和內存,這就將計算量降低了N倍。比如當N=2,R=128時,這種方法大約比在128張圖像上提
取一個RoI(R-CNN和SPPnet的方法)快64倍。
除了分層采樣,本文還采用流水線訓練過程:使用一個微調階段,將softmax分類器和bounding-box regressors聯合優化,而不是
將訓練softmax,SVM和regressors分成三個階段。那個這個過程中的各個組成(包括loss,mini-batch采樣策略,通過RoI pooling層的bp算法和
SGD參數)是怎么樣的呢?
Multi-task loss
該模型包括兩個分支輸出層,第一個輸出每個RoI離散的概率值(由softmax得出),有K+1類;
第二個分支輸出bounding box的offsets,,其中tk表示尺度不變的轉換相對object proposal的log-space的高度/寬度轉換。
每個RoI的標簽為類別u,每個bounding box的regression target記為v,本文對每個RoI使用一個multi-task loss來聯合訓練分類器
和bounding box regression:
其中,第二個損失函數(回歸操作只針對前景)被定義為對於類別u的bounding box 的regression元組(?)。
其中v=,預測元組
。對於bounding box loss:
Mini-batch sampling
在微調階段,每個SGD mini-batch從N=2張圖像中構造,均勻隨機選擇(常見的做法是遍歷數據集的排列)。我們使用的
mini-batch的大小為R=128,每張圖中采樣64個RoI。我們從object proposals中取25%RoIs(正樣本比例為25%),
這些object proposals與bounding box至少有0.5的交集。這些RoI包含前景,剩余的RoI也從object proposals中采樣(負樣本75%),
它們的IoU在0.1至0.5之間,這樣是背景。
Back-propagation through RoI pooling layers
經過RoI pooling層的BP算法如何求導呢?
設xi表示RoI pooling層的第i個激活輸入,yrj表示該層的第r個RoI的第j個輸出,則該層的反向求導為
即反向傳播中,L對輸入層節點x的梯度為損失函數L對各個有可能的候選區域r輸出梯度的累加。
SGD hyper-parameters
全連接層使用softmax分類和bounding box regression,初始化用的是0均值的高斯分布,標准偏差為
0.01和0.001,bias為0。
進行SGD訓練時,R-CNN和SPPnet采用RoI-centric sampling,即從所有圖片的所有候選區域中均勻取樣,這樣
每個SGD的mini-batch中包含了不同圖像的樣本不同圖像之間不能共享卷積計算和內存,運算開銷大;Fast R-CNN中
采用image-centric sampling:mini-batch采用層次采樣,即先對圖像采樣(N個),再在采樣到的圖像中對候選區域采樣
【每個圖像中采樣R/N個,一個mini-batch共計R個候選區域樣本】,同一圖像的候選區域卷積共享計算和內存,降低了運算開銷。
Scale invariance
本文采用兩種方式來達到尺度不變的目標檢測:單一尺度和圖像金字塔。
在單一尺度中,不管是訓練還是測試,每張圖像用固定大小的尺度來處理圖像,希望網絡從訓練數據中直
接學習到尺度不變的特征表達;相比之下,多尺度方法通過圖像金字塔提供了一個近似尺度不變給網絡。在測試
階段,圖像金字塔為每個object proposal提供近似尺度歸一化。在多尺度訓練中,當一副圖像被采樣時,
我們隨機采樣金字塔尺度。最后的實驗表明,多尺度的效果一般。
Fast R-CNN detection
網絡輸入一張圖像和R個object proposals,在測試階段,R=2000。對於每個測試的RoI r,前向傳遞輸出
一個類別的后驗概率分布p,以及一系列的預測bounding box offsets(相對r)。使用估計概率為每個類別k,對
於r,賦於一個檢測置信值,並以每個類別使用非極大值抑制。
Truncated SVD for faster detection
對於整個圖像分類來說,花在全連接層的時間要比卷積層的時間要少。相反,檢測時RoI的數量很大,花費在全連接
層上的時間幾乎是前向傳播的一半。通過truncated SVD可以很容易加速大的全連接層。
對於u*v個權重的矩陣W,它可以近似分解為:
其中U為u*t,中間為t*t的對角陣,V為v*t的矩陣。SVD將參數由u*v減少為(u+v)*t,為了壓縮網絡,這個全連接
層變為兩個全連接層。
SVM VS softmax
實驗表明,采用softmax的效果比SVM的mAP要高。這是因為在softmax在引入了類間競爭,分類效果更好;同時
所有的特征只需存於顯存中,不需要額外的磁盤空間。
仍存在的問題
Fast R-CNN中采用selective search算法提取候選區域,而目標檢測大多數時間都消耗在這里,而且Fast R-CNN並沒有
實現真正意義上的端到端訓練模式。
那有沒有可能使用CNN直接產生候選區域並對其分類呢?Faster R-CNN框架就是符合這樣需求的目標檢測框架,請看Faster R-CNN博客。
參考:http://blog.csdn.net/WoPawn/article/details/52463853