目標(biāo)檢測Fast RCNN--2015
這篇博文來介紹Fast RCNN,是RCNN算法的升級版。RCNN系列算法看完后才寫的這篇博客,相信初學(xué)者會比較容易這篇算法。
論文:Fast R-CNN
論文鏈接
解決的問題:
之所以提出Fast R-CNN,主要是因為R-CNN存在以下幾個問題:1、訓(xùn)練分多步。通過上一篇博文我們知道R-CNN的訓(xùn)練先要fine tuning一個預(yù)訓(xùn)練的網(wǎng)絡(luò),然后針對每個類別都訓(xùn)練一個SVM分類器,最后還要用regressors對bounding-box進行回歸,另外region proposal也要單獨用selective search的方式獲得,步驟比較繁瑣。2、時間和內(nèi)存消耗比較大。在訓(xùn)練SVM和回歸的時候需要用網(wǎng)絡(luò)訓(xùn)練的特征作為輸入,特征保存在磁盤上再讀入的時間消耗還是比較大的。3、測試的時候也比較慢,每張圖片的每個region proposal都要做卷積,重復(fù)操作太多。
雖然在Fast RCNN之前有提出過SPPnet算法來解決RCNN中重復(fù)卷積的問題,但是SPPnet依然存在和RCNN一樣的一些缺點比如:訓(xùn)練步驟過多,需要訓(xùn)練SVM分類器,需要額外的回歸器,特征也是保存在磁盤上。因此Fast RCNN相當(dāng)于全面改進了原有的這兩個算法,不僅訓(xùn)練步驟減少了,也不需要額外將特征保存在磁盤上。
基于VGG16的Fast RCNN算法在訓(xùn)練速度上比RCNN快了將近9倍,比SPPnet快大概3倍;測試速度比RCNN快了213倍,比SPPnet快了10倍。在VOC2012上的mAP在66%左右。
算法概要:
算法的主網(wǎng)絡(luò)還是VGG16,按訓(xùn)練過程和測試過程來講會清晰點。
訓(xùn)練的過程:
輸入是224*224,經(jīng)過5個卷積層和2個降采樣層(這兩個降采樣層分別跟在第一和第二個卷積層后面)后,進入ROIPooling層,該層是輸入是conv5層的輸出和region proposal,region proposal的個數(shù)差不多2000。然后再經(jīng)過兩個都是output是4096的全連接層。最后分別經(jīng)過output個數(shù)是21和84的兩個全連接層(這兩個全連接層是并列的,不是前后關(guān)系),前者是分類的輸出,代表每個region proposal屬于每個類別(21類)的得分,后者是回歸的輸出,代表每個region proposal的四個坐標(biāo)。最后是兩個損失層,分類的是softmaxWithLoss,輸入是label和分類層輸出的得分;回歸的是SmoothL1Loss,輸入是回歸層的輸出和target坐標(biāo)及weight。
測試的過程:
與訓(xùn)練基本相同,最后兩個loss層要改成一個softma層,輸入是分類的score,輸出概率。最后對每個類別采用NMS(non-maximun suppression)。
算法詳解:
fast R-CNN的流程圖如下,網(wǎng)絡(luò)有兩個輸入:圖像和對應(yīng)的region proposal。其中region proposal由selective search方法得到,沒有表示在流程圖中。對每個類別都訓(xùn)練一個回歸器,且只有非背景的region proposal才需要進行回歸。

ROI pooling:ROI Pooling的作用是對不同大小的region proposal,從最后卷積層輸出的feature map提取大小固定的feature map。簡單講可以看做是SPPNet的簡化版本,因為全連接層的輸入需要尺寸大小一樣,所以不能直接將不同大小的region proposal映射到feature map作為輸出,需要做尺寸變換。在文章中,VGG16網(wǎng)絡(luò)使用H=W=7的參數(shù),即將一個h*w的region proposal分割成H*W大小的網(wǎng)格,然后將這個region proposal映射到最后一個卷積層輸出的feature map,最后計算每個網(wǎng)格里的最大值作為該網(wǎng)格的輸出,所以不管ROI pooling之前的feature map大小是多少,ROI pooling后得到的feature map大小都是H*W。
因此可以看出Fast RCNN主要有3個改進:1、卷積不再是對每個region proposal進行,而是直接對整張圖像,這樣減少了很多重復(fù)計算。原來RCNN是對每個region proposal分別做卷積,因為一張圖像中有2000左右的region proposal,肯定相互之間的重疊率很高,因此產(chǎn)生重復(fù)計算。2、用ROI pooling進行特征的尺寸變換,因為全連接層的輸入要求尺寸大小一樣,因此不能直接把region proposal作為輸入。3、將regressor放進網(wǎng)絡(luò)一起訓(xùn)練,每個類別對應(yīng)一個regressor,同時用softmax代替原來的SVM分類器。
在實際訓(xùn)練中,每個mini-batch包含2張圖像和128個region proposal(或者叫ROI),也就是每張圖像有64個ROI。然后從這些ROI中挑選約25%的ROI,這些ROI和ground truth的IOU值都大于0.5。另外只采用隨機水平翻轉(zhuǎn)的方式增加數(shù)據(jù)集。
測試的時候則每張圖像大約2000個ROI。
損失函數(shù)的定義是將分類的loss和回歸的loss整合在一起,其中分類采用log loss,即對真實分類(下圖中的pu)的概率取負(fù)log,而回歸的loss和R-CNN基本一樣。分類層輸出K+1維,表示K個類和1個背景類。

這是回歸的loss,其中t^u表示預(yù)測的結(jié)果,u表示類別。v表示真實的結(jié)果,即bounding box regression target。

采用SVD分解改進全連接層。如果是一個普通的分類網(wǎng)絡(luò),那么全連接層的計算應(yīng)該遠不及卷積層的計算,但是針對object detection,F(xiàn)ast RCNN在ROI pooling后每個region proposal都要經(jīng)過幾個全連接層,這使得全連接層的計算占網(wǎng)絡(luò)的計算將近一半,如下圖,所以作者采用SVD來簡化全連接層的計算。另一篇博客鏈接講的R-FCN網(wǎng)絡(luò)則是對這個全連接層計算優(yōu)化的新的算法。

稍微總結(jié)下訓(xùn)練和測試的結(jié)構(gòu),如下面兩個圖,對算法的理解會更清晰。

test結(jié)構(gòu)圖在ROI Pooling層是怎么輸出的畫得比較容易理解。

實驗結(jié)果:
算法在mAP上的提升,這里僅截取VOC07的數(shù)據(jù)集結(jié)果。除了算法本身比其他算法的結(jié)果要好以外,還要注意到增加數(shù)據(jù)集對算法效果的提升也非常明顯!所以你要知道為什么現(xiàn)在數(shù)據(jù)這么值錢!

算法在速度上的提升:

由于本文主要講RCNN多步驟的網(wǎng)絡(luò)結(jié)構(gòu)合并在一起,因此需要實驗證明這種multi-task訓(xùn)練的方式有效,實驗對比結(jié)果如下:一共有S,M,L三個組,每個組有4列,分別表示:1、僅采用分類訓(xùn)練,測試也沒有回歸;2、采用論文中的分類加回歸訓(xùn)練,但是測試時候沒有回歸;3、采用分段訓(xùn)練,測試時候有回歸;4、采用論文中的分類加回歸訓(xùn)練,且測試時候有回歸。
這種multi-task在最近兩年的object detection算法中非常普遍。

然后是多尺度和單尺度的對比:這里多尺度的5表示輸入圖像采用5中不同的尺寸,比如[480,576,688,864,1200],在測試的時候發(fā)現(xiàn)多尺度雖然能在mAP上取得一點提升,但是時間代價也比較大。作者直接給出原因:深度卷積網(wǎng)絡(luò)可以學(xué)習(xí)尺度不變性。這個待研究。

總結(jié):
Fast RCNN將RCNN眾多步驟整合在一起,不僅大大提高了檢測速度,也提高了檢測準(zhǔn)確率。其中,對整張圖像卷積而不是對每個region proposal卷積,ROI Pooling,分類和回歸都放在網(wǎng)絡(luò)一起訓(xùn)練的multi-task loss是算法的三個核心。另外還有SVD分解等是加速的小貢獻,數(shù)據(jù)集的增加時mAP提高的小貢獻。
當(dāng)然Fast RCNN的主要缺點在于region proposal的提取使用selective search,目標(biāo)檢測時間大多消耗在這上面(提region proposal 2~3s,而提特征分類只需0.32s),這也是后續(xù)Faster RCNN的改進方向之一。
