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

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

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

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

思想

基礎:R-CNN + SPP-Net

R-CNN

  • R-CNN具有幾個顯著的缺點:
    • 訓練分爲多個階段,步驟繁瑣 : 微調網絡+訓練SVM+訓練邊框迴歸器
    • 訓練耗時,佔用磁盤空間大:5000張圖像產生幾百G的特徵文件
    • 速度慢:因爲其要將每一張圖片約2000個region proposals,都輸入網絡執行正向傳遞+SVM分類+邊框迴歸,而不共享計算。其實際上對一張圖像進行了約2000次提取特徵和分類的過程。在使用GPU, VGG16模型處理一張圖像需要47s。
      (具體細節請看這篇博客

SPP-Net

  • SPP-Net利用sharing computation對 RCNN進行了加速:

    • 提出一種將region proposals,映射到 conv5_3+relu5_3輸出的feature map上的映射關係。只需要將一張圖片輸入網絡,提取一次卷積層特徵,然後通過這種映射關係,可將region proposals映射到對應的feature map上,即可獲取每個region proposals的卷積特徵。無需重複使用CNN提取特徵,從而大幅度縮短訓練時間。
    • 由於FC層需要固定長度的輸入,作者通過使用SPP(Spatial Pyramid Pooling)層,可以接受任意大小的卷積特徵向量,並輸出固定長度的輸出向量,就可以直接輸入到FC層進行後續操作。即SPP-Net可接受任意大小的輸入圖片,不需要對圖像做crop/wrap操作。
      (即經過 映射+SPP轉換 ,共享了計算,速度和進度都有一定提升) 具體細節請看這篇博客
  • SPP-Net 也有明顯的缺點:

    • 像R-CNN一樣,訓練分爲多個階段,步驟繁瑣, : 微調網絡+訓練SVM+訓練訓練邊框迴歸器
    • SPP-NET在微調網絡的時候固定了卷積層,只對全連接層進行微調,而對於一個新的任務,有必要對卷積層也進行微調。(分類的模型提取的特徵更注重高層語義,而目標檢測任務除了語義信息還需要目標的位置信息)

    針對以上兩個問題,RBG提出了該Fast R-CNN,一個精簡快速的檢測框架。

改進:Fast RCNN這裏寫圖片描述

與R-CNN框架圖對比,可以發現主要有兩處不同:一是最後一個卷積層後加了一個ROI pooling layer,二是損失函數使用了多任務損失函數(multi-task loss),將邊框迴歸直接加入到CNN網絡中訓練。

  • ROI pooling layer實際上是SPP-Net的一個精簡版,SPP-Net對每個proposal使用了不同大小的金字塔映射,而ROI pooling layer只需要下采樣到一個7x7的特徵圖。對於VGG16網絡conv5_3有512個特徵圖,這樣所有region proposal對應了一個7x7x512維度的特徵向量作爲全連接層的輸入。
  • R-CNN訓練過程分爲了三個階段,而Fast R-CNN直接使用softmax替代SVM分類,同時利用多任務損失函數邊框迴歸也加入到了網絡中,這樣整個的訓練過程是端到端的(除去region proposal提取階段)。
  • Fast R-CNN在網絡微調的過程中,將部分卷積層也進行了微調,取得了更好的檢測效果。

特徵提取網絡

基本結構

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

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

roi_pool層的測試(forward)

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

代碼層理解:ROI Pooling層解析

roi_pool層的訓練(backward)

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

yxi={0δ(i,j)=falseLyjδ(i,j)=true

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

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

Lxi=r,jδ(i,r,j)Lyrj

判決函數 δ(i,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類和背景的概率。對每個RoI(Region of Interesting)輸出離散型概率分佈 p=(p0, p1, ..., pk)
bbox_prdict層用於調整候選區域位置,輸出bounding box迴歸的位移,輸出4*K維數組 t ,表示分別屬於K類時,應該平移縮放的參數。tk=(txk, tyk, twk, thk)

k表示類別的索引, txk, tyk 是指相對於object proposal的ground truth尺度不變的平移, twk, thk 是指對數空間中相對於object proposal的ground truth的高與寬。

代價函數

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

Lcls= log pu

loss_bbox層評估檢測框定位代價。比較真實分類對應的預測參數 tu 和真實平移縮放參數爲 v 的差別:
Lloc=i=14g(tiuvi)

gSmoothL1 誤差,函數圖像如下,其在(-1, 1)之間爲二次函數,其他區域爲線性函數。作者這樣設置的目的是想讓loss對於離羣點更加魯棒,相比於 L2 損失函數,其對利羣點,異常值(outlier)不敏感,可控制梯度的量級使訓練時不容易跑飛。
g(x)={0.5x2|x|<1|x|0.5otherwise
這裏寫圖片描述
總代價爲兩者加權和,如果分類爲背景則不考慮定位代價:
L={Lcls+λLlocuLclsu

規定 u=0 爲背景類(也就是負標籤),那麼艾弗森括號指數函數 [u1] 表示背景候選區域即負樣本不參與迴歸損失,不需要對候選區域進行迴歸操作。λ 控制分類損失和迴歸損失的平衡。Fast R-CNN論文中,所有實驗λ=1

艾弗森括號指數函數爲:

[u1]={1u10otherwise

源碼中幾個參數說明:

cls_score : cls_score分類層的輸出結果,CNN計算的每個rois (bbox)屬於[K類前景+1背景]的概率得分。 [1x(K+1)]
label : 原始輸入的每個rois所屬的類別標籤。 [1*1]
bbox_pred : bbox_prdict層輸出的,CNN計算的每個rois需要進行bounding box迴歸的平移縮放參數。[1x4x(K+1)] (注意,這是源碼中的維度,上圖中的寫成了維度[1x4]是爲了易於理解損失loss的計算)
bbox_targets : 使用原始數據rois和ground truth計算好了的,每個前景rois迴歸到其對應的ground truth所需要做的平移尺度變換,背景不需要bounding box迴歸,對應的值爲0。 [1x4x(K+1)]
bbox_loss_weights : 標記每個rois是否屬於某一個類。 [1x4x(K+1)]:屬於的類別4個位置標誌爲1,不屬於的爲都爲0

全連接層提速

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

y=Wx
計算複雜度爲 u×v
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
在實現時,相當於把一個全連接層拆分成兩個,中間以一個低維數據相連。
這裏寫圖片描述

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

實驗與結論

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

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

Reference:

【目標檢測】Fast RCNN算法詳解
ROI Pooling層解析
深度學習論文筆記:Fast R-CNN
http://chuansong.me/n/353443351445

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