1. 程式人生 > >【目標檢測】FastRCNN演算法詳解

【目標檢測】FastRCNN演算法詳解

摘自沈曉璐
有待補充自己的理解.

繼2014的RCNN之後,推出了FastRCNN ,構思精巧,流程更為緊湊,大幅提升了目標檢測的速度。
同樣使用最大規模的網路,FastRCNN 和RCNN相比,訓練時間從84小時減少為9.5小時,測試時間從47秒,減少為0.32秒,在PASCAL VOC 2007上的準確率相差無幾,約在66%-67%之間.

思想

基礎:RCNN

簡單來說,RCNN使用以下4步實現目標檢測:
a.在影象中確定約1000-2000個候選框
b.對於每個候選框內影象塊,使用深度網路提取特徵
c.對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類
d. 對於屬於某一特徵的候選框,用迴歸器進一步調整其位置

改進:FastRCNN

解決了RCNN的三個問題:

問題一:測試速度慢

**原因:**RCNN一張影象內候選框之間大量重疊,提取特徵操作冗餘
解決:本文將整張影象歸一化後直接送入深度網路。在鄰接時,才加入候選框資訊,在末尾的少數幾層處理每個候選框。

問題二:訓練速度慢

原因同上
解決:在訓練時,本文先將一張影象送入網路,緊接著送入從這幅圖象上提取出的候選區域。這些候選區域的前幾層特徵(不懂)不需要再重複計算。

問題三:訓練所需空間大

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

特徵提取網路

基本結構
影象歸一化為224×224直接送入網路
前5階段是基礎的conv + relu + pooling形式,在第五階段結尾,輸入P個候選區域(影象序號×1+幾何位置×4,序號用於訓練)?
這裡寫圖片描述

注意:文中給出了大中小三種網路,此處是最大的一種,三種網路基本結構相似,僅Conv+Relu層數有差別,或者增刪了norm層

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

roi_pool 層的訓練(backward)

首先考慮普通max pooling層。設

xi為輸入層的節點,yj為輸出層的節點。
這裡寫圖片描述
其中判決函式δ(i,j)表示i結點是否被j節點選為最大值輸出。不被選中有兩種可能:
xi不在yj範圍內;
xi不是最大值
對於roi max pooling,一個輸入節點可能和多個輸出節點相連。設xi為輸入層的節點,yrj為第r個候選區域的第j個輸出節點。
這裡寫圖片描述
這裡寫圖片描述
判決函式表示i節點是否被候選區域r的第j個節點選為最大值輸出。代價對於xi的梯度等於所有相關的後一層梯度和。

網路引數訓練

引數初始化

網路除去末尾部分如下圖,在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維陣列p,表示屬於K類和背景的概率。
bbox_prdict層用於調整候選區域位置,輸出4*k維陣列t,表示分別屬於K類時,應該平移縮放的引數。

代價函式:

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

Lcls=logpu
loss_bbox評估檢測框定位代價,比較真實分類對應的預測引數tu和真實平移縮放參數為v的差別:Lloc=i=14g(tiuvi)
g為Smooth L1誤差,對outlier不敏感:
g(x)={0.5x2|x|<1|x|0.5otherwise
總代價為這兩者加權和,如果分類為背景則不考慮定位代價:
L={Lcls+λLlocuLclsu

原始碼中bbox_loss_weight 用於標記每一個bbox是否屬於某一個類

全連線提速

分類和位置調整都是通過全連線層實現的,設前一級資料為x後一級為y,全連線層引數為W,尺寸為u*v。一次前向傳播即為:

y=Wx
計算複雜度為uv
將W進行SVD分解,並用前t個特徵值近似:
W=UΣVTU(:,1:t)Σ(1:t,1:t)V(:,1:t)T
原來的前向傳播分解成兩步:
y=Wx=U(ΣVT)x=Uz
計算複雜度變為u×t+v×t
在實現時,相當於把一個全連線層拆分成兩個,中間以一個低維資料相連。
這裡寫圖片描述

實驗與結論

–網路末端同步訓練的分類和位置調整,提升準確率;
–使用多尺度的影象金字塔,效能幾乎沒有提高;
–倍增訓練資料,能夠有2%~3%的準確度提升;
–網路直接輸出各類概率(softmax),比SVM分類器效能略好;
–更多候選窗不能提升效能