1. 程式人生 > >【筆記】Faster-R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

【筆記】Faster-R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

論文程式碼:

重要:

訓練檔案.prototxt說明:http://blog.csdn.net/Seven_year_Promise/article/details/60954553

從RCNN到fast RCNN,再到本文的faster RCNN,目標檢測的四個基本步驟(候選區域生成,特徵提取,分類,位置精修)終於被統一到一個深度網路框架之內。所有計算沒有重複,完全在GPU中完成,大大提高了執行速度。

0、摘要:

引入了RPN(region proposal network),和detection network共享整個影象的卷積特徵,RPN被訓練生成高質量的區域推薦(region proposal),同時預測物體的bound和objectness scores,之後將RPN+Fast RCNN結合成一個single network,用attention (注意力)機制共享卷積特徵,。


1、簡介

       Faster R-CNN(其中R對應於“Region(區域)” )是基於深度學習R-CNN系列目標檢測最好的方法。使用VOC2007+2012訓練集訓練,VOC2007測試集測試mAP達到73.2%,目標檢測的速度可以達到每秒5幀。

       技術上將RPN網路和Fast R-CNN網路結合到了一起,將RPN獲取到的proposal直接連到ROI pooling層,是一個CNN網路實現端到端目標檢測的框架。

faster RCNN可以簡單地看做“區域生成網路+fast RCNN“的系統,用區域生成網路代替fast RCNN中的Selective Search方法。本篇論文著重解決了這個系統中的三個問題: 


1. 如何設計區域生成網路 
2. 如何訓練區域生成網路 
3. 如何讓區域生成網路和fast RCNN網路共享特徵提取網路

2、R-CNN系列方法對比

3、Fast R-CNN目標檢測系統框圖


4、Faster R-CNN

卷積階段


  RPN的核心思想是使用卷積神經網路直接產生region proposal,使用的方法本質上就是滑動視窗。RPN網路結構圖如上所示(ZF模型:256維),假設給定600*1000的輸入影象,經過卷積操作得到最後一層的卷積feature map(大小約為40*60),最後一層卷積層共有256個feature map。

Region ProposalNetwork(RPN)


  在這個特徵圖上使用3*3的卷積核(滑動視窗)與特徵圖進行卷積,那麼這個3*3的區域卷積後可以獲得一個256維的特徵向量。因為這個3*3的區域上,每一個特徵圖上得到一個1維向量,256個特性圖即可得到256維特徵向量。

       3*3滑窗中心點位置,對應預測輸入影象3種尺度(128,256,512),3種長寬比(1:1,1:2,2:1)的regionproposal,這種對映的機制稱為anchor,產生了k=9個anchor。即每個3*3區域可以產生9個region proposal。所以對於這個40*60的feature map,總共有約20000(40*60*9)個anchor,也就是預測20000個region proposal。

       後邊接入到兩個全連線層,即cls layer和reglayer分別用於分類和邊框迴歸。clslayer包含2個元素,用於判別目標和非目標的估計概率。reglayer包含4個座標元素(x,y,w,h),用於確定目標位置。cls:正樣本,與真實區域重疊大於0.7,負樣本,與真實區域重疊小於0.3。reg:返回區域位置。

      最後根據region proposal得分高低,選取前300個region proposal,作為Fast R-CNN的輸入進行目標檢測。

5、訓練4步階段:

(1)使用在ImageNet上預訓練的模型初始化RPN網路引數,微調RPN網路;

(2) 使用(1)中RPN網路提取region proposal訓練Fast R-CNN網路,也用ImageNet上預訓練的模型初始化該網路引數;(目前兩個網路相對獨立)

(3) 使用(2)的Fast R-CNN網路重新初始化RPN, 固定卷積層進行微調,微調RPN網路;

(4) 固定(2)中Fast R-CNN的卷積層,使用(3)中RPN提取的region proposal對Fast R-CNN網路進行微調。

區域生成網路:結構

基本設想是:在提取好的特徵圖上,對所有可能的候選框進行判別。由於後續還有位置精修步驟,所以候選框實際比

較稀疏。 
這裡寫圖片描述

特徵提取

原始特徵提取(上圖灰色方框)包含若干層conv+relu,直接套用ImageNet上常見的分類網路即可。本文試驗了兩種

網路:5層的ZF[3],16層的VGG-16[4]。額外新增一個conv+relu層,輸出51*39*256維特徵(feature)。

候選區域(anchor)

特徵可以看做一個尺度51*39的256通道影象,對於該影象的每一個位置,考慮9個可能的候選視窗:三種面積


{128 2 , 256  2 ,  512    2    } ×三種比例{1:1,1:2,2:1}。這些候選視窗稱為anchors。下圖示出51*39個anchor中

心,以及9種anchor示例。 

這裡寫圖片描述

在整個faster RCNN演算法中,有三種尺度。

 
原圖尺度:原始輸入的大小。不受任何限制,不影響效能。 


歸一化尺度:輸入特徵提取網路的大小,在測試時設定,原始碼中opts.test_scale=600。anchor在這個尺度上設

定。這個引數和anchor的相對大小決定了想要檢測的目標範圍。 


網路輸入尺度:輸入特徵檢測網路的大小,在訓練時設定,原始碼中為224*224。

視窗分類和位置精修

分類層(cls_score)輸出每一個位置上,9個anchor屬於前景和背景的概率;視窗迴歸層(bbox_pred)輸出每一個

位置上,9個anchor對應視窗應該平移縮放的引數。 


對於每一個位置來說,分類層從256維特徵中輸出屬於前景和背景的概率;視窗迴歸層從256維特徵中輸出4個平移縮

放參數。

就區域性來說,這兩層是全連線網路;就全域性來說,由於網路在所有位置(共51*39個)的引數相同,所以實際用尺寸

為1×1的卷積網路實現。

需要注意的是:並沒有顯式地提取任何候選視窗,完全使用網路自身完成判斷和修正。

區域生成網路:訓練樣本

考察訓練集中的每張影象:

a. 對每個標定的真值候選區域,與其重疊比例最大的anchor記為前景樣本 


b. 對a)剩餘的anchor,如果其與某個標定重疊比例大於0.7,記為前景樣本;如果其與任意一個標定的重疊比例都小

於0.3,記為背景樣本 


c. 對a),b)剩餘的anchor,棄去不用。 


d. 跨越影象邊界的anchor棄去不用

代價函式

同時最小化兩種代價:

 
a. 分類誤差 

b. 前景樣本的視窗位置偏差 

超引數

原始特徵提取網路使用ImageNet的分類樣本初始化,其餘新增層隨機初始化。

 
每個mini-batch包含從一張影象中提取的256個anchor,前景背景樣本1:1. 


前60K迭代,學習率0.001,後20K迭代,學習率0.0001。 


momentum設定為0.9,weight decay設定為0.0005。

共享特徵

區域生成網路(RPN)和fast RCNN都需要一個原始特徵提取網路(下圖灰色方框)。這個網路使用ImageNet的分類

庫得到初始引數W0,但要如何精調引數,使其同時滿足兩方的需求呢?本文講解了三種方法。 
這裡寫圖片描述

輪流訓練

a. 從W0開始,訓練RPN。用RPN提取訓練集上的候選區域 
b. 從W0開始,用候選區域訓練Fast RCNN,引數記為W1 
c. 從W1開始,訓練RPN… 


具體操作時,僅執行兩次迭代,並在訓練時凍結了部分層。論文中的實驗使用此方法。

近似聯合訓練

直接在上圖結構上訓練。在backward計算梯度時,把提取的ROI區域當做固定值看待;在backward更新引數時,來自

RPN和來自Fast RCNN的增量合併輸入原始特徵提取層。 


此方法和前方法效果類似,但能將訓練時間減少20%-25%。

聯合訓練

直接在上圖結構上訓練。但在backward計算梯度時,要考慮ROI區域的變化的影響。

實驗

  • 與Selective Search方法(黑)相比,當每張圖生成的候選區域從2000減少到300時,本文RPN方法(紅藍)的召回

  • 率下降不大。說明RPN方法的目的性更明確。 

    這裡寫圖片描述
  • 使用更大的Microsoft COCO庫[7]訓練,直接在PASCAL VOC上測試,準確率提升6%。說明faster RCNN遷移性良

  • ,沒有over fitting。 

  • 這裡寫圖片描述
  1. learning rate-控制增量和梯度之間的關係;
  2. momentum-保持前次迭代的增量;
  3. weight decay-每次迭代縮小引數,相當於正則化。 
  4. 實驗結果:



  5. Faster R-CNN 是在 Fast R-CNN的基礎改進的。Fast R-CNN 主要存在的問題就是 region proposal step 是在CPU跑的,比較耗時。CNN通過GPU加速,那麼region proposal step能否也可以通過GPU來加速。

    Faster R-CNN 通過提出 Region Proposal Networks (RPNs) 實現了快速提取region proposal 。 RPNs 被設計成有效預測候選區域,在一個比較大的尺度和寬高比範圍內。 
    針對尺度問題,我們採用多個尺度的reference boxes 
    這裡寫圖片描述

    3 Faster R-CNN 包括兩個部分:1)RPNs,深度全卷積網路用於提取候選區域,2) Fast R-CNN 檢測器用於物體檢測。 
    the RPNs module tells the Fast R-CNN module where to look 
    這裡寫圖片描述

    3.1 Region Proposal Networks

    RPN 將一幅任意尺寸影象作為輸入,輸出若干矩形框,每個矩形框有一個 objectness score。為了與Fast R-CNN檢測網路共享計算,我們對RPN使用卷積網路, we assume that both nets share a common set of convolutional layers。在我們的實驗中, Zeiler and Fergus model(ZF)有5個 shareable convolutional layers,VGG-16 有13個 shareable convolutional layers。

    為了生成候選區域,我們在卷積特徵層(最後一個共享卷積層的輸出)上滑動一個小的網路。這個小的網路將卷積特徵層的 n*n領域視窗作為輸入,將其對映到一個低維的特徵(256-d for ZF and 512-d for VGG, with ReLU [33]following),然後將這個特徵輸入給兩個 sibling 全連結層:a box-regression layer (reg) and a box-classification layer (cls)。這裡我們使用 n=3,對應輸入影象的尺寸是 171 and 228 pixels for ZF and VGG, respectively。因為對於所有的位置,全連結層是共享的,所以架構可以如下實現:n*n卷積層,接著是兩個 sibling 1*1卷積層。

    這裡寫圖片描述

    3.1.1 Anchors 
    對於每個小網路的滑動視窗位置,我們同時預測k個矩形區域,對應不同尺度和寬高比。本文采用3個尺度,3個寬高比,所以每個位置我們檢測3*3=9個矩形區域,每個區域計算其是否含有 object( a two-class softmax layer,這是二分類,也可以進行K分類)

    Translation-Invariant Anchors 
    我們這個方法一個很重要的特徵就是平移不變性,就是對於同一個object,在影象不同位置出現,同樣的 anchors and the functions 可以提出該 object。MultiBox 方法則沒有這個特徵。 
    平移不變性也降低了模型的大小。

    Multi-Scale Anchors as Regression References 
    多個不同尺度的Anchors 可以很好(速度快)的解決 object 尺度問題。以前解決尺度問題的計算量比較大。

    3.1.2 Loss Function 
    在訓練 RPNs時,我們對每個 anchor 賦予一個二類標記(是不是 object)。對於以下兩類 anchor,我們賦予正標記:1)最大IoU 的anchor,2)IoU 超過0.7的 anchor。對所有 ground-truth boxes 的IoU 都小於0.3的anchor 標記為負值。 既不是正值,也不是負值的anchor 對訓練函式沒有貢獻。

    我們的損失函式定義如下:
    

    這裡寫圖片描述

    3.1.3 Training RPNs 
    RPN的訓練採用 back-propagation and stochastic gradient descent (SGD), 採用文獻【2】中的 “image-centric”的取樣策略。

    3.2 Sharing Features for RPN and Fast R-CNN 
    怎麼共享RPN and Fast R-CNN 的卷積層,文中討論了三種方式: 
    1)Alternating training 交替訓練,先訓練RPN,然後用RPN得到的候選區域訓練Fast R-CNN,得到的Fast R-CNN用於初始化RPN,這樣交替訓練,本文所有的實驗都是採用這種方式。 
    2) Approximate joint training 
    這裡我們將兩個網路融合成一個網路訓練,如圖2所示。在每個SGD迭代步驟中,前向計算產生候選區域,然後假定這些候選區域固定,用於訓練Fast R-CNN。後向傳播計算像以前一樣,對於共享網路,兩個網路的損失被結合起來候選誤差傳播 。這種方式實現比較簡單,但是它忽略了 the derivative w.r.t. the proposal boxes’ coordinates that are also network responses,所以它是近似的,與交替訓練相比,該方式的訓練時間減少 25-50%。在python 程式碼中我們給出了這種方法的實現。

    (iii) Non-approximate joint training 
    這種方法主要是將上個方法忽略的矩形框的梯度問題考慮進來。所以是非近似的。本文沒有實現改方法。

    4-Step Alternating Training 
    1):使用 ImageNet-pre-trained 模型初始化網路,然後訓練RPN 
    2):使用1)產生的候選區域,訓練一個單獨的 Fast R-CNN檢測網路,該 
    網路也是使用 ImageNet-pre-trained模型初始化的。 
    3):使用檢測網路初始化RPN訓練,固定共享卷積層,只微調與RPN特有 
    的網路層,這樣兩個網路就共享了卷積層 
    4):固定共享卷積層,微調Fast R-CNN特有網路層 
    可以做更多的交替訓練,但是沒有提升效果

    補充Anchor:
  6. 首先我們需要知道anchor的本質是什麼,本質是SPP(spatial pyramid pooling)思想的逆向。而SPP本身是做什麼的呢,就是將不同尺寸的輸入resize成為相同尺寸的輸出。所以SPP的逆向就是,將相同尺寸的輸出,倒推得到不同尺寸的輸入。

    接下來是anchor的視窗尺寸,這個不難理解,三個面積尺寸(128^2,256^2,512^2),然後在每個面積尺寸下,取三種不同的長寬比例(1:1,1:2,2:1).這樣一來,我們得到了一共9種面積尺寸各異的anchor。

    下面是整個faster RCNN結構的示意圖:


    利用anchor是從第二列這個位置開始進行處理,這個時候,原始圖片已經經過一系列卷積層和池化層以及relu,得到了這裡的 feature:51x39x256(256是層數)

    在這個特徵引數的基礎上,通過一個3x3的滑動視窗,在這個51x39的區域上進行滑動,stride=1,padding=2,這樣一來,滑動得到的就是51x39個3x3的視窗。

    對於每個3x3的視窗,作者就計算這個滑動視窗的中心點所對應的原始圖片的中心點。然後作者假定,這個3x3視窗,是從原始圖片上通過SPP池化得到的,而這個池化的區域的面積以及比例,就是一個個的anchor。換句話說,對於每個3x3視窗,作者假定它來自9種不同原始區域的池化,但是這些池化在原始圖片中的中心點,都完全一樣。這個中心點,就是剛才提到的,3x3視窗中心點所對應的原始圖片中的中心點。如此一來,在每個視窗位置,我們都可以根據9個不同長寬比例、不同面積的anchor,逆向推匯出它所對應的原始圖片中的一個區域,這個區域的尺寸以及座標,都是已知的。而這個區域,就是我們想要的 proposal。所以我們通過滑動視窗和anchor,成功得到了 51x39x9 個原始圖片的proposal。接下來,每個proposal我們只輸出6個引數:每個 proposal 和 ground truth 進行比較得到的前景概率和背景概率(2個引數)(對應圖上的 cls_score);由於每個 proposal 和 ground truth 位置及尺寸上的差異,從 proposal 通過平移放縮得到 ground truth 需要的4個平移放縮引數(對應圖上的 bbox_pred)。

    所以根據我們剛才的計算,我們一共得到了51 x 39 x 9 = 17900個anchor box。