1. 程式人生 > >RCNN學習筆記(2):Fast R-CNN

RCNN學習筆記(2):Fast R-CNN

Fast-RCNN建立在之前的深度卷積神經網路上進行有效的分類及目標檢測。但是它使用了幾個創新點來提高訓練及測試速度,並且也提高了檢測精度。

____________________________________________________________________________________________________________________________________

1 Introduce

相比影象分類、目標檢測是一個更有挑戰性的任務,因為檢測需要物件的準確定位,因此目標檢測有兩個挑戰:
  1. 必須處理許多候選物件位置(通常稱為“proposals ”)。
  2. 這些候選物件只能提供粗糙的定位,但又必須進行完善來實現精確定位。
所以需要更復雜的方法來解決,並且解決這些問題的辦法經常需要對速度,準確性及複雜度進行妥協。 在這篇文章中,作者提出一個單階段訓練演算法,共同學習分類物件我們提出一個單階段訓練演算法,可以同時學習去分類物體建議框並且改善他們的空間位置。 基於區域的卷積網路方法(RCNN)通過使用深層的ConvNet來分類物件建議框,實現了很棒的檢測物件精度。 然而,R-CNN的缺點也很明顯:
  1. Training is a multi-stage pipeline   訓練的時候,R-CNN首先使用log loss 在物件建議框(object proposals )上微調ConvNet  ,然後提取特徵,之後用SVM分類器,最後再進行bounding-box regressors學習。
  2. Training is expensive in space and time   在每張圖片中對物件建議框(object proposals )進行提取來對SVM和bounding-box regressor作訓練,還要寫進磁碟中。訓練時間和空間開銷很大。
  3. Object detection is slow   物件檢測很慢,即測試時間開銷大。
RCNN很慢的原因主要是因為沒有共享計算。SPP-net就通過共享計算提高了速度,它在ConvNet的最後一個卷積層才提取proposal,但是依然有不足之處。和R-CNN一樣,它的訓練要經過多個階段,特徵也要存在磁碟中,另外,SPP中的微調只更新spp層後面的全連線層,因為卷積特徵是線下計算的,從而無法再微調階段反向傳播誤差。對很深的網路這樣肯定是不行的。 Fast-RCNN的優點: 1. 比R-CNN、SPP-net有更高的檢測質量(mAP); 2. 把多個任務的損失函式寫到一起,實現單級的訓練過程; 3. 在訓練時可更新所有的層; 4. 不需要在磁碟中儲存特徵。
____________________________________________________________________________________________________________________________________

2 Fast R-CNN architecture and training

整體框架如 Fig.1 。Fast R-CNN網路輸入一整張圖片及一系列物件建議框(proposal)。 訓練過程如下: 1、網路首先用幾個卷積層(conv)和最大池化層處理整個影象以產生conv特徵圖。 2、然後,對於每個物件建議框(object proposals ),感興趣區域(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)。
1.用selective search在一張圖片中生成約2000個object proposal,即感興趣區域RoI。
2.把它們整體輸入到全卷積的網路中,在最後一個卷積層上對每個ROI求對映關係,並用一個RoI pooling layer來統一到相同的大小-> (fc)feature vector ,即->提取一個固定維度的特徵表示。
3.繼續經過兩個全連線層(FC)得到特徵向量。特徵向量經由各自的FC層,得到兩個輸出向量:
第一個是分類,使用softmax,第二個是每一類的bounding box迴歸。
另外還有一個關於測試過程的總結也寫得不錯: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。
____________________________________________________________________________________________________________________________________

2.1 RoI pooling layer RoI池化層

每一個RoI都由一個四元組(r,c,h,w)表示,其中(r,c)表示左上角,而(h,w)則代表高度和寬度。這一層使用最大池化(max pooling)將RoI區域轉化成固定大小的 H*W 的特徵圖(H和W是取決於任何特定RoI層的超引數)。
RoI 最大池化通過將 h×w RoI視窗劃分為 h / H × w / W個子視窗網格,子視窗大小固定為 H × W ,然後將每個子視窗中的值max pooling到相應的輸出網格單元 。這是SPP pooling層的一個簡化版,即只有一層的“空間金字塔”。
roi_pool層將每個候選區域均勻分成 H × W 塊,對每塊進行max pooling。將特徵圖上大小不一的候選區域轉變為大小統一的資料,送入下一層。

Rol pooling layer的作用主要有兩個:
1.是將image中的rol定位到feature map中對應patch
2.是用一個單層的SPP layer將這個feature map patch下采樣為大小固定的feature再傳入全連線層。即
RoI pooling layer來統一到相同的大小-> (fc)feature vector 即->提取一個固定維度的特徵表示。
____________________________________________________________________________________________________________________________________

2.2 Initializing from pre-trained networks 從預訓練網路進行初始化

作者實驗了三個預訓練的ImageNet 網路:CaffeNet,VGG_CNN_M_1024,VGG-16,每個網路有五個最大池層和五到十三個轉換層。當預訓練網路初始化Fast R-CNN網路時,要經歷三個transformations:
1、最後一個最大池化層由 RoI 池化層代替,該層將 H 和W 設定為與第一個全連線層相容; 2、網路最後的全連線層和softmax(被訓練用於1000路ImageNet分類)被替換為前面描述的兩個同級層:softmax的對K+1個類別的分類層,和bounding box 迴歸層 3、網路輸入修改為兩種資料:一組圖片和每張圖片的一組RoIs ____________________________________________________________________________________________________________________________________

2.3 Fine-tuning for detection 檢測中的微調

Fast R-CNN用反向傳播訓練所有網路權重。首先,作者說明了為什麼SPPnet無法更新空間金字塔池化層之前的層的權重:當每個訓練樣本(即RoI)來自不同的影象時,通過SPP層的反向傳播非常低效。低效源於每個RoI可能具有非常大的感受野(接收區),通常包括整個輸入影象。由於正向傳播必須處理整個感受野,訓練輸入是非常大(通常是整個影象)。
作者提出了一種更有效的訓練方法,利用訓練期間的特徵共享。在Fast RCNN訓練中,隨機梯度下降(SGD)小批量計算被分級取樣,首先隨機取樣N張圖片,然後每張圖片取樣 R / N 個RoIs 。關鍵的是,來自相同影象的RoI在向前和向後傳播中共享計算和記憶體
除了分層取樣,Fast R-CNN使用一個精簡的訓練過程,一次微調中聯合優化softmax分類器和bbox迴歸,而不是在三個獨立的階段訓練softmax分類器,SVM和迴歸因子。看似一步,實際包含了:
多工損失(multi-task loss)、小批量取樣(mini-batch sampling)、RoI pooling層的反向傳播(backpropagation through RoI pooling layers)、SGD超引數(SGD hyperparameters)

Multi-task loss.

Fast R-CNN網路分類損失和迴歸損失如下圖所示【僅針對一個RoI即一類物體說明】,黃色框表示訓練資料,綠色框表示輸入目標:

-cls_score層用於分類,輸出K+1維陣列p,表示屬於K類物體和背景的概率;
-bbox_predict層用於調整候選區域位置,輸出4*K維陣列,也就是說對於每個類別都會訓練一個單獨的迴歸器;
Fast RCNN有兩個輸出層: 一個對每個RoI輸出離散概率分佈: 一個輸出bounding box迴歸的位移: k表示類別的索引,前兩個引數是指相對於object proposal尺度不變的平移,後兩個引數是指對數空間中相對於object proposal的高與寬。
每個訓練的RoI都被標記了ground-truth類別 u 以及ground-truth邊界框迴歸 v 。在每個標記好的RoI上用multi-task loss 函式來級聯的訓練分類和bbox邊界框迴歸:

約定u=0為背景分類,那麼[u≥1] 函式表示背景候選區域即負樣本不參與迴歸損失,不需要對候選區域進行迴歸操作;  第一項是對於 u 類的分類損失(log loss for true class u)。 對於分類loss,是一個N+1路的softmax輸出,其中的N是類別個數,1是背景。
第二項是迴歸損失,是在 u 類的真正邊界框迴歸目標的元組 v 上定義的,是一個 4xN 路輸出的regressor,也就是說對於每個類別都會訓練一個單獨的regressor,評估迴歸損失代價就是比較真實分類 u 對應的預測平移縮放參數和真實平移縮放參數的差距:
其中, 是真實平移縮放參數 對於 u 重新預測bbox迴歸平移縮放參數: 這裡的損失不是L2損失函式,而是smooth L1損失函式,對於離群點不敏感,因為有L2損失的訓練可能需要仔細調整學習率,以防止爆炸梯度(控制梯度的量級使得訓練時不容易跑飛)。 公式如下:

超引數 λ 是用來控制兩個損失函式的平衡的。作者對迴歸目標進行歸一化使其具有零均值及單位權方差(zero mean and unit variance)。所有的函式都設定超引數 λ = 1。

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的概率水平翻轉。
類別 比例 方式
前景 25% 與ground-truth bbox邊界框重疊區間在[0.5,1]
背景 75% 與ground-truth bbox邊界框重疊區間在[0.1,0.5)

Back-propagation through RoI pooling layers.  通過RoI池化層的反向傳播。

說實話,池化層的反向傳播這裡我並沒有看懂,在網上找了很多的論文筆記覺得下面這篇說得最為詳細並能讓人理解,就摘抄過來了。 首先看普通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),故可得上述所示公式;
對於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 j有關係,故損失函式L相對xi 的梯度為求和形式。

SGD hyper-parameters. SGD超引數選擇

除了修改增加的層,原有的層引數已經通過預訓練方式初始化: 用於分類的全連線層以均值為0、標準差為0.01的高斯分佈初始化; 用於迴歸的全連線層以均值為0、標準差為0.001的高斯分佈初始化,偏置都初始化為0; 
針對PASCAL VOC 2007和2012訓練集,前30k次迭代全域性學習率為0.001,每層權重學習率為1倍,偏置學習率為2倍,後10k次迭代全域性學習率更新為0.0001;
動量設定為0.9,權重衰減設定為0.0005。
____________________________________________________________________________________________________________________________________

2.4 Scale invariance 尺度不變性

作者提出了使用兩種方式對規模不變的物件進行檢測:brute-force(單一尺度)和image pyramids(多尺度,影象金字塔)。
單一尺度直接在訓練和測試階段將image預先固定好畫素大小,直接輸入網路訓練就好,然後期望在訓練過程中網路自己能夠學習到尺度不變性scale-invariance; 多尺度在訓練階段隨機從影象金字塔【縮放圖片的scale得到,得到多尺度圖片,相當於擴充資料集】中取樣訓練,通過一個影象金字塔向網路提供一個近似的尺度不變,在測試階段影象金字塔用來對每個object proposal近似尺度歸一化,訓練階段每次取樣一個影象就隨機取樣一個金字塔尺度。
作者在5.2節對單一尺度和多尺度分別進行了實驗,不管哪種方式下都定義影象短邊畫素為s,單一尺度下s=600【維持長寬比進行縮放】,長邊限制為1000畫素;多尺度s={480,576,688,864,1200}【維持長寬比進行縮放】,長邊限制為2000畫素,生成影象金字塔進行訓練測試;實驗結果表明AlexNet【S for small】、VGG_CNN_M_1024【M for medium】下單一尺度比多尺度mAP差1.2%~1.5%,但測試時間上卻快不少,VGG-16【L for large】下僅單一尺度就達到了66.9%的mAP【由於GPU視訊記憶體限制多尺度無法實現】,該實驗證明了深度神經網路善於直接學習尺度不變形,對目標的scale不敏感。
第2中方法的表現確實比1好,但是好的不算太多,大概是1個mAP左右,但是時間要慢不少,所以作者實際採用的是第一個策略,也就是single scale。
____________________________________________________________________________________________________________________________________

3 Fast R-CNN detection

一旦Fast R-CNN網路被微調,檢測相當於執行正向傳播(假設物件建議框object proposal是預先計算的)。 網路將影象(或影象金字塔,編碼為影象列表)和待給得分的 R 物件建議框(object proposal)列表作為輸入。 在測試階段,R 大約為2K個,當使用影象金字塔的時候,每個RoI被指定尺度使得接近224*224。對於每個測試RoI r ,網路輸出關於 r 的一個後驗概率分佈 p 和一系列預測bbox偏移(每個類 [共k個類] 獲得自己的精確bbox預測)。然後使用估計概率給 r 賦予關於 k 個物件類的檢測置信度。最後給每個類都實施一個非極大值抑制。

3.1 Truncated SVD for faster detection 截斷SVD ——>減少檢測時間

影象分類任務中,用於卷積層計算的時間比用於全連線層計算的時間多;
而在目標檢測任務中,要處理的RoI數量比較多,幾乎有一半的前向計算時間被用於全連線層(Fig . 2)。就Fast R-CNN而言,RoI池化層後的全連線層需要進行約2k次【每個RoI都要計算】,因此在Fast R-CNN中可以採用SVD分解加速全連線層計算;
具體如何實現的呢? ①物體分類和bbox迴歸都是通過全連線層實現的,假設全連線層輸入資料為X,輸出資料為Y,全連線層權值矩陣為W,尺寸為 u × v ,那麼該層全連線計算為: Y = W × X ②若將W進行SVD分解(奇異值分解),並用前t個特徵值近似代替,即:
U是 u × t 的左奇異矩陣,Σt 是 t × t 的對角矩陣 ,V是 v × t 的右奇異矩陣。

截斷SVD將引數量由原來的 u × v 減少到 t × (u + v) ,當 t 遠小於 min(u,v) 的時候降低了很大的計算量。 在實現時,相當於把一個全連線層拆分為兩個全連線層,第一個全連線層使用權值矩陣(不含偏置),第二個全連線層使用矩陣U(含偏置);
當RoI的數量大時,這種簡單的壓縮方法有很好的加速。
實驗表明(Fig . 2),SVD分解全連線層能使mAP只下降0.3%的情況下提升30%的速度,同時該方法也不必再執行額外的微調操作。

參考部落格地址: