1. 程式人生 > >Fast RCNN演算法詳解

Fast RCNN演算法詳解

這篇博文來介紹Fast RCNN,是RCNN演算法的升級版。RCNN系列演算法看完後才寫的這篇部落格,相信初學者會比較容易這篇演算法。

論文:Fast R-CNN
論文連結

解決的問題:

之所以提出Fast R-CNN,主要是因為R-CNN存在以下幾個問題:1、訓練分多步。通過上一篇博文我們知道R-CNN的訓練先要fine tuning一個預訓練的網路,然後針對每個類別都訓練一個SVM分類器,最後還要用regressors對bounding-box進行迴歸,另外region proposal也要單獨用selective search的方式獲得,步驟比較繁瑣。2、時間和記憶體消耗比較大。在訓練SVM和迴歸的時候需要用網路訓練的特徵作為輸入,特徵儲存在磁碟上再讀入的時間消耗還是比較大的。3、測試的時候也比較慢,每張圖片的每個region proposal都要做卷積,重複操作太多。

雖然在Fast RCNN之前有提出過SPPnet演算法來解決RCNN中重複卷積的問題,但是SPPnet依然存在和RCNN一樣的一些缺點比如:訓練步驟過多,需要訓練SVM分類器,需要額外的迴歸器,特徵也是儲存在磁碟上。因此Fast RCNN相當於全面改進了原有的這兩個演算法,不僅訓練步驟減少了,也不需要額外將特徵儲存在磁碟上。

基於VGG16的Fast RCNN演算法在訓練速度上比RCNN快了將近9倍,比SPPnet快大概3倍;測試速度比RCNN快了213倍,比SPPnet快了10倍。在VOC2012上的mAP在66%左右。

演算法概要:

演算法的主網路還是VGG16,按訓練過程和測試過程來講會清晰點。

訓練的過程:
輸入是224*224,經過5個卷積層和2個降取樣層(這兩個降取樣層分別跟在第一和第二個卷積層後面)後,進入ROIPooling層,該層是輸入是conv5層的輸出和region proposal,region proposal的個數差不多2000。然後再經過兩個都是output是4096的全連線層。最後分別經過output個數是21和84的兩個全連線層(這兩個全連線層是並列的,不是前後關係),前者是分類的輸出,代表每個region proposal屬於每個類別(21類)的得分,後者是迴歸的輸出,代表每個region proposal的四個座標。最後是兩個損失層,分類的是softmaxWithLoss,輸入是label和分類層輸出的得分;迴歸的是SmoothL1Loss,輸入是迴歸層的輸出和target座標及weight。

測試的過程:
與訓練基本相同,最後兩個loss層要改成一個softma層,輸入是分類的score,輸出概率。最後對每個類別採用NMS(non-maximun suppression)。

演算法詳解:

fast R-CNN的流程圖如下,網路有兩個輸入:影象和對應的region proposal。其中region proposal由selective search方法得到,沒有表示在流程圖中。對每個類別都訓練一個迴歸器,且只有非背景的region proposal才需要進行迴歸。

這裡寫圖片描述

ROI poolingROI Pooling的作用是對不同大小的region proposal,從最後卷積層輸出的feature map提取大小固定的feature map。簡單講可以看做是SPPNet的簡化版本,因為全連線層的輸入需要尺寸大小一樣,所以不能直接將不同大小的region proposal對映到feature map作為輸出,需要做尺寸變換。在文章中,VGG16網路使用H=W=7的引數,即將一個h*w的region proposal分割成H*W大小的網格,然後將這個region proposal對映到最後一個卷積層輸出的feature map,最後計算每個網格里的最大值作為該網格的輸出,所以不管ROI pooling之前的feature map大小是多少,ROI pooling後得到的feature map大小都是H*W。

因此可以看出Fast RCNN主要有3個改進:1、卷積不再是對每個region proposal進行,而是直接對整張影象,這樣減少了很多重複計算。原來RCNN是對每個region proposal分別做卷積,因為一張影象中有2000左右的region proposal,肯定相互之間的重疊率很高,因此產生重複計算。2、用ROI pooling進行特徵的尺寸變換,因為全連線層的輸入要求尺寸大小一樣,因此不能直接把region proposal作為輸入。3、將regressor放進網路一起訓練,每個類別對應一個regressor,同時用softmax代替原來的SVM分類器。

在實際訓練中,每個mini-batch包含2張影象和128個region proposal(或者叫ROI),也就是每張影象有64個ROI。然後從這些ROI中挑選約25%的ROI,這些ROI和ground truth的IOU值都大於0.5。另外只採用隨機水平翻轉的方式增加資料集。
測試的時候則每張影象大約2000個ROI。

損失函式的定義是將分類的loss和迴歸的loss整合在一起,其中分類採用log loss,即對真實分類(下圖中的pu)的概率取負log,而回歸的loss和R-CNN基本一樣。分類層輸出K+1維,表示K個類和1個背景類。

這裡寫圖片描述

這是迴歸的loss,其中t^u表示預測的結果,u表示類別。v表示真實的結果,即bounding box regression target。

這裡寫圖片描述

採用SVD分解改進全連線層。如果是一個普通的分類網路,那麼全連線層的計算應該遠不及卷積層的計算,但是針對object detection,Fast RCNN在ROI pooling後每個region proposal都要經過幾個全連線層,這使得全連線層的計算佔網絡的計算將近一半,如下圖,所以作者採用SVD來簡化全連線層的計算。另一篇部落格連結講的R-FCN網路則是對這個全連線層計算優化的新的演算法。

這裡寫圖片描述

稍微總結下訓練和測試的結構,如下面兩個圖,對演算法的理解會更清晰。

這裡寫圖片描述

test結構圖在ROI Pooling層是怎麼輸出的畫得比較容易理解。

這裡寫圖片描述

實驗結果:

演算法在mAP上的提升,這裡僅擷取VOC07的資料集結果。除了演算法本身比其他演算法的結果要好以外,還要注意到增加資料集對演算法效果的提升也非常明顯!所以你要知道為什麼現在資料這麼值錢!

這裡寫圖片描述

演算法在速度上的提升:

這裡寫圖片描述

由於本文主要講RCNN多步驟的網路結構合併在一起,因此需要實驗證明這種multi-task訓練的方式有效,實驗對比結果如下:一共有S,M,L三個組,每個組有4列,分別表示:1、僅採用分類訓練,測試也沒有迴歸;2、採用論文中的分類加回歸訓練,但是測試時候沒有迴歸;3、採用分段訓練,測試時候有迴歸;4、採用論文中的分類加回歸訓練,且測試時候有迴歸。
這種multi-task在最近兩年的object detection演算法中非常普遍。

這裡寫圖片描述

然後是多尺度和單尺度的對比:這裡多尺度的5表示輸入影象採用5中不同的尺寸,比如[480,576,688,864,1200],在測試的時候發現多尺度雖然能在mAP上取得一點提升,但是時間代價也比較大。作者直接給出原因:深度卷積網路可以學習尺度不變性。這個待研究。

這裡寫圖片描述

總結:

Fast RCNN將RCNN眾多步驟整合在一起,不僅大大提高了檢測速度,也提高了檢測準確率。其中,對整張影象卷積而不是對每個region proposal卷積,ROI Pooling,分類和迴歸都放在網路一起訓練的multi-task loss是演算法的三個核心。另外還有SVD分解等是加速的小貢獻,資料集的增加時mAP提高的小貢獻。
當然Fast RCNN的主要缺點在於region proposal的提取使用selective search,目標檢測時間大多消耗在這上面(提region proposal 2~3s,而提特徵分類只需0.32s),這也是後續Faster RCNN的改進方向之一。