【目標檢測】Fast RCNN算法詳解

轉載來自:https://blog.csdn.net/shenxiaolu1984/article/details/51036677

Girshick, Ross. “Fast r-cnn.” Proceedings of the IEEE International Conference on Computer Vision. 2015.

繼2014年的RCNN之後,Ross Girshick在15年推出Fast RCNN,構思精巧,流程更爲緊湊,大幅提升了目標檢測的速度。在Github上提供了源碼

同樣使用最大規模的網絡,Fast RCNN和RCNN相比,訓練時間從84小時減少爲9.5小時,測試時間從47秒減少爲0.32秒。在PASCAL VOC 2007上的準確率相差無幾,約在66%-67%之間.

思想

基礎:RCNN

簡單來說,RCNN使用以下四步實現目標檢測: 
a. 在圖像中確定約1000-2000個候選框 
b. 對於每個候選框內圖像塊,使用深度網絡提取特徵 
c. 對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類 
d. 對於屬於某一特徵的候選框,用迴歸器進一步調整其位置 
更多細節可以參看這篇博客

改進:Fast RCNN

Fast RCNN方法解決了RCNN方法三個問題:

問題一:測試時速度慢 
RCNN一張圖像內候選框之間大量重疊,提取特徵操作冗餘。 
本文將整張圖像歸一化後直接送入深度網絡。在鄰接時,才加入候選框信息,在末尾的少數幾層處理每個候選框。

問題二:訓練時速度慢 
原因同上。 
在訓練時,本文先將一張圖像送入網絡,緊接着送入從這幅圖像上提取出的候選區域。這些候選區域的前幾層特徵不需要再重複計算。

問題三:訓練所需空間大 
RCNN中獨立的分類器和迴歸器需要大量特徵作爲訓練樣本。 
本文把類別判斷和位置精調統一用深度網絡實現,不再需要額外存儲。

以下按次序介紹三個問題對應的解決方法。

特徵提取網絡

基本結構

圖像歸一化爲224×224直接送入網絡。

前五階段是基礎的conv+relu+pooling形式,在第五階段結尾,輸入P個候選區域(圖像序號×1+幾何位置×4,序號用於訓練)?。 
這裏寫圖片描述

注:文中給出了大中小三種網絡,此處示出最大的一種。三種網絡基本結構相似,僅conv+relu層數有差別,或者增刪了norm層。

roi_pool層的測試(forward)

roi_pool層將每個候選區域均勻分成M×N塊,對每塊進行max pooling。將特徵圖上大小不一的候選區域轉變爲大小統一的數據,送入下一層。 
這裏寫圖片描述

roi_pool層的訓練(backward)

首先考慮普通max pooling層。設xixi爲輸入層的節點,yjyj爲輸出層的節點。 

∂L∂xi={0∂L∂yjδ(i,j)=falseδ(i,j)=true∂L∂xi={0δ(i,j)=false∂L∂yjδ(i,j)=true

 

其中判決函數δ(i,j)δ(i,j)表示i節點是否被j節點選爲最大值輸出。不被選中有兩種可能:xixi不在yjyj範圍內,或者xixi不是最大值。

對於roi max pooling,一個輸入節點可能和多個輸出節點相連。設xixi爲輸入層的節點,yrjyrj爲第rr個候選區域的第jj個輸出節點。 
這裏寫圖片描述 

∂L∂xi=Σr,jδ(i,r,j)∂L∂yrj∂L∂xi=Σr,jδ(i,r,j)∂L∂yrj

 

判決函數δ(i,r,j)δ(i,r,j)表示i節點是否被候選區域r的第j個節點選爲最大值輸出。代價對於xixi的梯度等於所有相關的後一層梯度之和。

網絡參數訓練

參數初始化

網絡除去末尾部分如下圖,在ImageNet上訓練1000類分類器。結果參數作爲相應層的初始化參數。 
這裏寫圖片描述 
其餘參數隨機初始化。

分層數據

在調優訓練時,每一個mini-batch中首先加入N張完整圖片,而後加入從N張圖片中選取的R個候選框。這R個候選框可以複用N張圖片前5個階段的網絡特徵。 
實際選擇N=2, R=128。

訓練數據構成

N張完整圖片以50%概率水平翻轉。 
R個候選框的構成方式如下:

類別 比例 方式
前景 25% 與某個真值重疊在[0.5,1]的候選框
背景 75% 與真值重疊的最大值在[0.1,0.5)的候選框

分類與位置調整

數據結構

第五階段的特徵輸入到兩個並行的全連層中(稱爲multi-task)。 
這裏寫圖片描述
cls_score層用於分類,輸出K+1維數組pp,表示屬於K類和背景的概率。 
bbox_prdict層用於調整候選區域位置,輸出4*K維數組tt,表示分別屬於K類時,應該平移縮放的參數。

代價函數

loss_cls層評估分類代價。由真實分類uu對應的概率決定: 

Lcls=−logpuLcls=−log⁡pu

 

loss_bbox評估檢測框定位代價。比較真實分類對應的預測參數tutu和真實平移縮放參數爲vv的差別: 

Lloc=Σ4i=1g(tui−vi)Lloc=Σi=14g(tiu−vi)


g爲Smooth L1誤差,對outlier不敏感: 

g(x)={0.5x2|x|−0.5|x|<1otherwiseg(x)={0.5x2|x|<1|x|−0.5otherwise

 

總代價爲兩者加權和,如果分類爲背景則不考慮定位代價: 

L={Lcls+λLlocLclsu爲前景u爲背景L={Lcls+λLlocu爲前景Lclsu爲背景

 

源碼中bbox_loss_weights用於標記每一個bbox是否屬於某一個類

全連接層提速

分類和位置調整都是通過全連接層(fc)實現的,設前一級數據爲xx後一級爲yy,全連接層參數爲WW,尺寸u×vu×v。一次前向傳播(forward)即爲: 

y=Wxy=Wx


計算複雜度爲u×vu×v。

 

將WW進行SVD分解,並用前t個特徵值近似: 

W=UΣVT≈U(:,1:t)⋅Σ(1:t,1:t)⋅V(:,1:t)TW=UΣVT≈U(:,1:t)⋅Σ(1:t,1:t)⋅V(:,1:t)T

 

原來的前向傳播分解成兩步: 

y=Wx=U⋅(Σ⋅VT)⋅x=U⋅zy=Wx=U⋅(Σ⋅VT)⋅x=U⋅z


計算複雜度變爲u×t+v×tu×t+v×t。 
在實現時,相當於把一個全連接層拆分成兩個,中間以一個低維數據相連。 
這裏寫圖片描述

 

在github的源碼中,這部分似乎沒有實現。

實驗與結論

實驗過程不再詳述,只記錄結論 
- 網絡末端同步訓練的分類和位置調整,提升準確度 
- 使用多尺度圖像金字塔,性能幾乎沒有提高 
倍增訓練數據,能夠有2%-3%的準確度提升 
- 網絡直接輸出各類概率(softmax),比SVM分類器性能略好 
更多候選窗不能提升性能

同年作者團隊又推出了Faster RCNN,進一步把檢測速度提高到準實時,可以參看這篇博客。 
關於RCNN, Fast RCNN, Faster RCNN這一系列目標檢測算法,可以進一步參考作者在15年ICCV上的講座Training R-CNNs of various velocities

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