1. 程式人生 > >Fast RCNN多細節詳解

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中存在的問題:

  1. R-CNN網路訓練、測試速度都很慢:R-CNN網路中,一張圖經由selective search演算法提取約2k個建議框【這2k個建議框大量重疊

    】,而所有建議框變形後都要輸入AlexNet CNN網路提取特徵【即約2k次特徵提取】,會出現上述重疊區域多次重複提取特徵,提取特徵操作冗餘;

  2. R-CNN網路訓練、測試繁瑣:R-CNN網路訓練過程分為ILSVRC 2012樣本下有監督預訓練、PASCAL VOC 2007該特定樣本下的微調、20類即20個SVM分類器訓練、20類即20個Bounding-box 迴歸器訓練,該訓練流程繁瑣複雜;同理測試過程也包括提取建議框、提取CNN特徵、SVM分類和Bounding-box 迴歸等步驟,過於繁瑣;

  3. R-CNN網路訓練需要大量儲存空間:20類即20個SVM分類器和20類即20個Bounding-box 迴歸器在訓練過程中需要大量特徵作為訓練樣本,這部分從CNN提取的特徵會佔用大量儲存空間;

  4. 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論文詳解

  1. 任意size圖片輸入CNN網路,經過若干卷積層與池化層,得到特徵圖;
  2. 在任意size圖片上採用selective search演算法提取約2k個建議框;
  3. 根據原圖中建議框到特徵圖對映關係,在特徵圖中找到每個建議框對應的特徵框【深度和特徵圖一致】,並在RoI池化層中將每個特徵框池化到H×W【VGG-16網路是7×7】的size;
  4. 固定H×W【VGG-16網路是7×7】大小的特徵框經過全連線層得到固定大小的特徵向量;
  5. 第4步所得特徵向量經由各自的全連線層【由SVD分解實現】,分別得到兩個輸出向量:一個是softmax的分類得分,一個是Bounding-box視窗迴歸;
  6. 利用視窗得分分別對每一類物體進行非極大值抑制剔除重疊建議框,最終得到每個類別中迴歸修正後的得分最高的視窗。

整體框架大致如上述所示了,對比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 後的特徵,有兩種方法:

  1. 要麼是重新調整 pooling 後的特徵維度,使它適應全聯接層
  2. 要麼是改變全聯接層的結構,使它可以接收任意維度的特徵

後者一個有效的解決方案是 FCN(全卷積網路),不過 Fast RCNN 出來之時還沒有 FCN,因此它採用的是前一種思路。

那要如何調整 pooling 後的特徵呢?論文提出了一種 ROI Pooling Layer 的方法(ROI 指的是 Region of Interest)。事實上,這種方法並不是 Fast RCNN 的原創,而是借鑑了 SPPNet 的思路。關於 SPPNet,網上資料很多,就不再贅述了,所以我開門見山講一下 ROI Pooling Layer 是怎麼處理的。假設首個全聯接層接收的特徵維度是 HWD,例如 VGG16 的第一個 FC 層的輸入是 7 * 7 * 512,其中 512 表示 feature map 的層數。那麼,ROI Pooling Layer 的目標,就是讓 feature map 上的 ROI 區域,在經過 pooling 操作後,其特徵輸出維度滿足 HW。具體做法是,對原本 max pooling 的單位網格進行調整,使得 pooling 的每個網格大小動態調整為 h / Hw / W(假設 ROI 區域的長寬為 hw)。這樣,一個 ROI 區域可以得到 HW 個網格。然後,每個網格內依然採用 max pooling 操作。如此一來,不管 ROI 區域大小如何,最終得到的特徵維度都是 HWD

下圖顯示的,是在一張 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)] 表示 節點是否被候選區域的第個輸出節點選為最大值輸出,若是,則由鏈式規則可知損失函式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.