Fast RCNN多細節詳解
Fast RCNN由來
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%之間.
1.思想
1.1基礎:RCNN
簡單來說,RCNN使用以下四步實現目標檢測:
a. 在影象中確定約1000-2000個候選框
b. 對於每個候選框內影象塊,使用深度網路提取特徵
c. 對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類
d. 對於屬於某一特徵的候選框,用迴歸器進一步調整其位置
更多細節可以參看這篇部落格。
RCNN中存在的問題:
-
R-CNN網路訓練、測試速度都很慢:R-CNN網路中,一張圖經由selective search演算法提取約2k個建議框【這2k個建議框大量重疊
-
R-CNN網路訓練、測試繁瑣:R-CNN網路訓練過程分為ILSVRC 2012樣本下有監督預訓練、PASCAL VOC 2007該特定樣本下的微調、20類即20個SVM分類器訓練、20類即20個Bounding-box 迴歸器訓練,該訓練流程繁瑣複雜;同理測試過程也包括提取建議框、提取CNN特徵、SVM分類和Bounding-box 迴歸等步驟,過於繁瑣;
-
R-CNN網路訓練需要大量儲存空間:20類即20個SVM分類器和20類即20個Bounding-box 迴歸器在訓練過程中需要大量特徵作為訓練樣本,這部分從CNN提取的特徵會佔用大量儲存空間;
-
R-CNN網路需要對建議框進行形變操作後【形變為227×227 size】再輸入CNN網路提取特徵,其實像AlexNet CNN等網路在提取特徵過程中對影象的大小並無要求,只是在提取完特徵進行全連線操作的時候才需要固定特徵尺寸【R-CNN中將輸入影象形變為227×227可正好滿足AlexNet CNN網路最後的特徵尺寸要求】,然後才使用SVM分類器分類,R-CNN需要進行形變操作的問題在Fast R-CNN已經不存在,具體見下。
1.2改進:Fast RCNN
Fast RCNN方法解決了RCNN方法三個問題:
問題一:測試時速度慢
RCNN一張影象內候選框之間大量重疊,提取特徵操作冗餘。
本文將整張影象歸一化後直接送入深度網路。在鄰接時,才加入候選框資訊,在末尾的少數幾層處理每個候選框。
問題二:訓練時速度慢
原因同上。
在訓練時,本文先將一張影象送入網路,緊接著送入從這幅影象上提取出的候選區域。這些候選區域的前幾層特徵不需要再重複計算。
問題三:訓練所需空間大
RCNN中獨立的分類器和迴歸器需要大量特徵作為訓練樣本。
本文把類別判斷和位置精調統一用深度網路實現,不再需要額外儲存。
Fast-RCNN的優點概述:
1. 比R-CNN、SPP-net有更高的檢測質量(mAP);
2. 把多個任務的損失函式寫到一起,實現單級的訓練過程;
3. 在訓練時可更新所有的層;
4. 不需要在磁碟中儲存特徵。
Fast RCNN 的改進可以用下面兩幅圖概括。其中,左圖是原 RCNN 的做法,而右圖則是 Fast RCNN 的做法。
有個很形象直觀的對比圖: R-CNN和SPP-net
FastRCNN改進之後:
2.系統結構
整體框架大致如上述所示,幾句話總結:
1.用selective search在一張圖片中生成約2000個object proposal,即RoI。
2.把影象輸入到卷積網路中,並輸入候選框,在最後一個卷積層上對每個ROI求對映關係,並用一個RoI pooling layer來統一到相同的大小,得到 (fc)feature vector,即一個固定維度的特徵表示。
3.繼續經過兩個全連線層(FC)得到特徵向量。特徵向量經由各自的FC層,得到兩個輸出向量:第一個是分類,使用softmax,第二個是每一類的bounding box迴歸。
具體來講,訓練過程如下:
1、網路首先用幾個卷積層(conv)和最大池化層處理整個影象(224*224)以產生conv特徵圖。
2、然後,對於每個物件建議框(object proposals ,~2000個),感興趣區域(region of interest——RoI)池層從特徵圖提取固定長度的特徵向量。
3、每個特徵向量被輸送到分支成兩個同級輸出層的全連線(fc)層序列中:
其中一層進行分類,對 目標關於K個物件類(包括全部“背景background”類)產生softmax概率估計,即輸出每一個RoI的概率分佈;
另一層進行bbox regression,輸出K個物件類中每一個類的四個實數值。每4個值編碼K個類中的每個類的精確邊界盒(bounding-box)位置,即輸出每一個種類的的邊界盒迴歸偏差。整個結構是使用多工損失的端到端訓練(trained end-to-end with a multi-task loss)。
另外還有一個關於測試過程的總結也寫得不錯:Fast R-CNN論文詳解
- 任意size圖片輸入CNN網路,經過若干卷積層與池化層,得到特徵圖;
- 在任意size圖片上採用selective search演算法提取約2k個建議框;
- 根據原圖中建議框到特徵圖對映關係,在特徵圖中找到每個建議框對應的特徵框【深度和特徵圖一致】,並在RoI池化層中將每個特徵框池化到H×W【VGG-16網路是7×7】的size;
- 固定H×W【VGG-16網路是7×7】大小的特徵框經過全連線層得到固定大小的特徵向量;
- 第4步所得特徵向量經由各自的全連線層【由SVD分解實現】,分別得到兩個輸出向量:一個是softmax的分類得分,一個是Bounding-box視窗迴歸;
- 利用視窗得分分別對每一類物體進行非極大值抑制剔除重疊建議框,最終得到每個類別中迴歸修正後的得分最高的視窗。
整體框架大致如上述所示了,對比SPP-Net,可以看出FRCN大致就是一個joint training版本的SPP-Net,改進如下:
- SPP-Net在實現上無法同時tuning在SPP layer兩邊的卷積層和全連線層。
- SPP-Net後面的需要將第二層FC的特徵放到硬碟上訓練SVM,之後再額外訓練bbox regressor。
3.特徵提取網路
3.1基本結構
Fast RCNN對影象額輸入尺寸沒有嚴格限制,ROI Pooling層的的存在確保全連線層的輸入是固定尺寸。
前五階段是基礎的conv+relu+pooling形式,在第五階段結尾,輸入P個候選區域(影象序號×1+幾何位置×4,序號用於訓練)。
注:文中給出了大中小三種網路,此處示出最大的一種。三種網路基本結構相似,僅conv+relu層數有差別,或者增刪了norm層。
3.2 ROI Pooling Layer
為了讓全聯接層能夠接收 Conv-Pooling 後的特徵,有兩種方法:
- 要麼是重新調整 pooling 後的特徵維度,使它適應全聯接層
- 要麼是改變全聯接層的結構,使它可以接收任意維度的特徵
後者一個有效的解決方案是 FCN(全卷積網路),不過 Fast RCNN 出來之時還沒有 FCN,因此它採用的是前一種思路。
那要如何調整 pooling 後的特徵呢?論文提出了一種 ROI Pooling Layer 的方法(ROI 指的是 Region of Interest)。事實上,這種方法並不是 Fast RCNN 的原創,而是借鑑了 SPPNet 的思路。關於 SPPNet,網上資料很多,就不再贅述了,所以我開門見山講一下 ROI Pooling Layer 是怎麼處理的。假設首個全聯接層接收的特徵維度是 H∗W∗D,例如 VGG16 的第一個 FC 層的輸入是 7 * 7 * 512,其中 512 表示 feature map 的層數。那麼,ROI Pooling Layer 的目標,就是讓 feature map 上的 ROI 區域,在經過 pooling 操作後,其特徵輸出維度滿足 H∗W。具體做法是,對原本 max pooling 的單位網格進行調整,使得 pooling 的每個網格大小動態調整為 h / H∗w / W(假設 ROI 區域的長寬為 h∗w)。這樣,一個 ROI 區域可以得到 H∗W 個網格。然後,每個網格內依然採用 max pooling 操作。如此一來,不管 ROI 區域大小如何,最終得到的特徵維度都是 H∗W∗D。
下圖顯示的,是在一張 feature map 上,對一個 5 * 7 的 ROI 區域進行 ROI Pooling 的結果,最後得到 2 * 2 的特徵。
這時,可能有人會問,如果 ROI 區域太小怎麼辦?比如,拿 VGG16 來說,它要求 Pooling 後的特徵為 7 * 7 * 512,如果碰巧 ROI 區域只有 6 * 6 大小怎麼辦?還是同樣的辦法,每個網格的大小取 6 / 7∗6 / 7=0.85∗0.85,然後,以寬為例,按照這樣的間隔取網格:[0,0.85,1.7,2.55,3.4,4.25,5.1,5.95]
取整後,每個網格對應的起始座標為:[0,1,2,3,3,4,5]
再如將大小不同的區域pooling為3*3:
3.3 Back-propagation through RoI pooling layers. 通過RoI池化層的反向傳播。
從這篇借鑑理解RoI池化層:Fast R-CNN論文詳解
1.首先看普通max pooling層如何求導
設xi為輸入層節點,yi為輸出層節點,那麼損失函式L對輸入層節點xi的梯度為:
其中判決函式δ(i,j)表示輸入i節點是否被輸出j節點選為最大值輸出。
不被選中【δ(i,j)=false】有兩種可能:xi不在yi範圍內,或者xi不是最大值。
若選中【δ(i,j)=true 】則由鏈式規則可知損失函式L相對xi的梯度等於損失函式L相對yi的梯度×(yi對xi的梯度->恆等於1),故可得上述所示公式;
2.RoI max pooling層求導
設xi為輸入層的節點,yri 為第r個候選區域的第j個輸出節點,一個輸入節點可能和多個輸出節點相關連,如下圖所示,輸入節點7和兩個候選區域輸出節點相關連;
該輸入節點7的反向傳播如下圖所示。
對於不同候選區域,節點7都存在梯度,所以反向傳播中損失函式 L 對輸入層節點 xi 的梯度為損失函式 L 對各個有可能的候選區域 r 【 xi 被候選區域r的第j個輸出節點選為最大值 】輸出 yri 梯度的累加,具體如下公式所示:
其中:
判決函式 [i=i∗(r,j)] 表示 i 節點是否被候選區域r 的第j 個輸出節點選為最大值輸出,若是,則由鏈式規則可知損失函式L相對 xi 的梯度等於損失函式 L 相對yri 的梯度×( yrj 對xi 的梯度->恆等於1),上圖已然解釋該輸入節點可能會和不同的yrj有關係,故損失函式L相對xi 的梯度為求和形式。
4.網路引數訓練
4.1引數初始化
網路除去末尾部分如下圖,在ImageNet上訓練1000類分類器。結果引數作為相應層的初始化引數。
其餘引數隨機初始化。
4.2分層資料
在調優訓練時,每一個mini-batch中首先加入N張完整圖片,而後加入從N張圖片中選取的R個候選框。這R個候選框可以複用N張圖片前5個階段的網路特徵。
實際選擇N=2, R=128。
4.3訓練資料構成,Mini-batch sampling.
作者從物件建議框(object proposal)中選擇25%的RoI,這些RoI與ground-truth bbox邊界框至少有0.5的部分交叉重疊,也就是正樣本,即 u >= 1。其餘的RoI選那些IoU重疊區間在[0.1,0.5)的,作為負樣本,即 u = 0,大約為75%。之所以選擇負樣本需要大於0.1的閾值是因為使用啟發式的hard example mining(低於0.1的IoU作為難例挖掘的啟發式)。在訓練期間,影象有0.5的概率水平翻轉。R個候選框的構成方式如下:
類別 | 比例 | 方式 |
---|---|---|
前景 | 25% | 與某個真值重疊在[0.5,1]的候選框 |
背景 | 75% | 與真值重疊的最大值在[0.1,0.5)的候選框 |
5.分類與位置調整
5.1子網路結構
第五階段的特徵輸入到兩個並行的全連層中(稱為multi-task)。
cls_score層用於分類,輸出K+1維陣列p,表示屬於K類和背景的概率。
bbox_prdict層用於調整候選區域位置,輸出4*K維陣列t,表示分別屬於K類時,應該平移縮放的引數。
原始碼中bbox_loss_weights用於標記每一個bbox是否屬於某一個類
5.2 多工損失函式
作者這樣設定的目的是想讓loss對於離群點更加魯棒,控制梯度的量級使得訓練時不容易跑飛。 最後在5.1的討論中,作者說明了Multitask loss是有助於網路的performance的。
smooth L1損失函式曲線如下圖所示,相比於L2損失函式,其對離群點、異常值不敏感,可控制梯度的量級使訓練時不容易跑飛;
5.3 全連線層提速
在實現時,相當於把一個全連線層拆分成兩個,中間以一個低維資料相連。
在github的原始碼中,這部分似乎沒有實現。
6.實驗與結論
實驗過程不再詳述,只記錄結論
- 網路末端同步訓練的分類和位置調整,提升準確度
- 使用多尺度的影象金字塔,效能幾乎沒有提高
- 倍增訓練資料,能夠有2%-3%的準確度提升
- 網路直接輸出各類概率(softmax),比SVM分類器效能略好
- 更多候選窗不能提升效能
##部分公式有亂碼,直接截圖了。
參考資料:
1.tf版本:
https://github.com/zplizzi/tensorflow-fast-rcnn
2.caffe版本,原作者
3.RCNN學習筆記(2):Fast R-CNN
https://blog.csdn.net/wonder233/article/details/53671018
4.RCNN學習筆記(4):fast rcnn
https://blog.csdn.net/u011534057/article/details/51241831
5.【目標檢測】Fast RCNN演算法詳解
https://blog.csdn.net/shenxiaolu1984/article/details/51036677
P:重點參考,詳細具體
6.Fast RCNN演算法詳解
https://blog.csdn.net/u014380165/article/details/72851319
7.論文筆記:Fast(er) RCNN
http://jermmy.xyz/2018/01/15/2018-1-15-paper-notes-fast-er-rcnn/
8.Fast-RCNN
https://blog.csdn.net/zijin0802034/article/details/53055010
9.Fast R-CNN
https://zhuanlan.zhihu.com/p/24780395
Girshick, Ross. “Fast r-cnn.” Proceedings of the IEEE International Conference on Computer Vision. 2015.