【個人整理】faster-RCNN的關鍵點(區域推薦網絡RPN)詳解

作者寫的很好。。可惜有些廣告,而且有些圖也沒有放全。。

在這裏插入圖片描述

前言:faster-RCNN是區域卷積神經網絡的第三篇文章,是爲了解決select search方法找尋region proposal速度太慢的問題而提出來的,整個faster-RCNN的大致框架依然是沿襲了fast-RCNN的基本能結構,只不過在region proposal的產生上面應用了專門的技術手段——區域推薦網絡(region proposal network,即RPN),這是整個faster最難以理解的地方,本文也將以他爲重點進行說明。

一、 faster-RCNN的背景

Faster R-CNN 發表於 NIPS 2015,其後出現了很多改進版本,後面會進行介紹.

R-CNN - Rich feature hierarchies for accurate object detection and semantic segmentation 是 Faster R-CNN 的啓發版本. R-CNN 是採用 Selective Search 算法來提取(propose)可能的 RoIs(regions of interest) 區域,然後對每個提取區域採用標準 CNN 進行分類.

出現於 2015 年早期的 Fast R-CNN 是 R-CNN 的改進,其採用興趣區域池化(Region of Interest Pooling,RoI Pooling) 來共享計算量較大的部分,提高模型的效率.

Faster R-CNN 隨後被提出,其是第一個完全可微分的模型. Faster R-CNN 是 R-CNN 論文的第三個版本.

R-CNNFast R-CNN 和 Faster R-CNN 作者都有 Ross Girshick.

二、faster-RCNN的網絡結構

Faster R-CNN 的結構是複雜的,因爲其有幾個移動部件. 這裏先對整體框架宏觀介紹,然後再對每個部分的細節分析.

問題描述:

針對一張圖片,需要獲得的輸出有:

  • 邊界框(bounding boxes) 列表,即一幅圖像有多少個候選框(region proposal),比如有2000個;
  • 每個邊界框的類別標籤,比如候選框裏面是貓?狗?等等;
  • 每個邊界框和類別標籤的概率。

2.1 faster-RCNN的基本結構

除此之外,下面的幾幅圖也能夠較好的描述發圖爾-RCNN的一般結構:

2.2 faster-RCNN的大致實現過程

整個網絡的大致過程如下:

(1)首先,輸入圖片表示爲 Height × Width × Depth 的張量(多維數組)形式,經過預訓練 CNN 模型的處理,得到卷積特徵圖(conv feature map)。即將 CNN 作爲特徵提取器,送入下一個部分。這種技術在遷移學習(Transfer Learning)中比較普遍,尤其是,採用在大規模數據集訓練的網絡權重,來對小規模數據集訓練分類器. 後面會詳細介紹.

(2)然後,RPN(Region Propose Network) 對提取的卷積特徵圖進行處理. RPN 用於尋找可能包含 objects 的預定義數量的區域(regions,邊界框)。這是整個文章最核心的改進,也是本文會着重介紹的點。

        基於深度學習的目標檢測中,可能最難的問題就是生成長度不定(variable-length)的邊界框列表. 在構建深度神經網絡時,最後的網絡輸出一般是固定尺寸的張量輸出(採用RNN的除外). 例如,在圖片分類中,網絡輸出是 (N, ) 的張量,N 是類別標籤數,張量的每個位置的標量值表示圖片是類別 labeli{ label_i }labeli​ 的概率值.

         在 RPN 中,通過採用 anchors 來解決邊界框列表長度不定的問題,即,在原始圖像中統一放置固定大小的參考邊界框. 不同於直接檢測 objects 的位置,這裏將問題轉化爲兩部分:

對每一個 anchor 而言,

  • anchor 是否包含相關的 object?
  • 如何調整 anchor 以更好的擬合相關的 object?

這裏可能不容易理解,後面會深入介紹anchor以及RPN相關的實現原理。

(3)當獲得了可能的相關objects 和其在原始圖像中的對應位置之後,問題就更加直接了. 採用 CNN 提取的特徵和包含相關 objects 的邊界框,採用 RoI Pooling 處理,並提取相關 object 的特徵,得到一個新的向量.

最後,基於 R-CNN 模塊,得到:

  • 對邊界框內的內容進行分類,(或丟棄邊界框,採用 background 作爲一個 label.)
  • 調整邊界框座標,以更好的使用 object.

上面的過程沒有涉及到一些重要的細節信息. 但包括了 Faster R-CNN 的大致實現過程。

2.3 faster-RCNN的基本組成

faster-RCNN其實就是油幾個基本的網絡架構組成的。

Faster R-CNN的整體流程如下圖所示。

 

從上面的圖形中可以看出,Faster R-CNN主要分爲四部分(圖中四個綠色框)

(1)Dataset數據。提供符合要求的數據格式(目前常用數據集是VOC和COCO);

(2)Extractor卷積神經網絡。 利用CNN提取圖片特徵features(原始論文用的是ZF和VGG16,後來人們又用ResNet101);

(3)RPN(Region Proposal Network)。 負責提供候選區域rois(每張圖給出大概2000個候選框);

(4)RoIHead。 負責對由RPN產生的ROI進行分類和微調。對RPN找出的ROI,判斷它是否包含目標,並修正框的位置和座標。

Faster R-CNN整體的流程可以分爲三步:

(1)提特徵。 圖片(img)經過預訓練的網絡(Extractor),提取到了圖片的特徵(feature)

(2)Region Proposal。 利用提取的特徵(feature),經過RPN網絡,找出一定數量的rois(region of interests)。

(3)分類與迴歸。將rois和圖像特徵features,輸入到RoIHead,對這些rois進行分類,判斷都屬於什麼類別,同時對這些rois的位置進行微調。

就是第二步是關鍵所在,第一步和第三部同fast-RCNN一樣。

三、區域推薦網絡RPN詳解

3.1 邊框的位置到底用什麼表示?

         目標檢測之所以難,是因爲每一個物體的區域大小是不一樣的,每一個區域框有着不同的大小size(也稱之爲scale)和不同的長寬比(aspect ratios)

         現在假設,已經知道圖片中有兩個 objects,首先想到的是,訓練一個網絡,輸出 8 個值:兩對元組 (xmin,ymin,xmax,ymax)、(xmin,ymin,xmax,ymax)分別定義了每個 object 的邊界框.。這種方法存在一些基本問題. 例如,

(1)當圖片的尺寸和長寬比不一致時,良好訓練模型來預測,會非常複雜;(這裏不是很理解,望有大神告知!)

(2)另一個問題是無效預測:預測 xmin和xmax​ 時,需要保證 xmin​<xmax​;

       事實上,有一種更加簡單的方法來預測 objects 的邊界框,即,學習相對於參考boxes 的偏移量. 假設參考 box的位置由以下確定:(xcenter,ycenter,width,height),則需要預測量爲:( Δxcenter,Δycenter,Δwidth,Δheight),它們的取值一般都是很小的值,以調整參考 box 更好的擬合所需要的。

3.2 RPN網絡的基本結構

首先看到這幅圖的時候我是一臉懵逼,看了半天又是一知半解,後面我會結合這幅圖詳細來說,這裏暫且先放一副結構圖。我們發現,其實整個RPN的網絡很淺很簡單,但是爲什麼要這樣設計呢?這樣設計能達到什麼樣的效果呢?

3.3 RPN的核心概念——anchor

       anchor,中文意思是錨點的意思,那到底什麼是anchor?有很多不同的解釋,其實不能說那種解釋完全標準,主要是站在不同的角度進行解釋的,都有道理,本文會將各種解釋綜合起來,儘量說得易懂一點。

3.3.1 知識回顧

       要理解什麼是anchor,就要知道我們爲什麼搞出一個RPN這種東西,回顧一下前面三種目標檢測架構RCNN、SPPNet、fast-RCNN,

(1)RCNN是在原始圖像中使用select search方法選擇大約2000個候選框,然後對每個候選框進行卷積運算;

(2)SPPNet和fast-RCNN是先讓整個圖片經過CNN,然後在得到的特徵圖上使用select search選擇2000個左右的候選框,其實我們真正需要的還是在原始圖像上的候選區域,那爲什麼在卷積之後的特徵圖上也可以這麼做呢?這是因爲卷積之後的特徵圖和原始圖像之間存在的映射關係,在特徵圖上的候選區可以映射到原始圖像上。

總而言之:我們要使用RPN的目的也就是要產生(原始圖像上的)候選框。而且這裏有一個重要的信息,就是卷積之後的feature map和原始圖像之間是有一個映射關係的,如果我能夠在feature map上面找到響應候選框,也就代表了在原始圖像上找到了候選框。

3.3.2 RPN的輸入與輸出

輸入:RPN是接在feature map之後的,因此它的輸入是feature map;

輸出:我希望得到的是候選區域,因此輸出的是候選區域,這樣說沒錯,但是在網絡中其實流動的都是數據啊,這一個框框嗯麼表示呢?當然也是通過數據的形式來表示了,還有一點就是這個框框裏面有目標還是沒有目標,這也是通過數據來表示的。

3.3.3 到底什麼是anchor?

有很多文獻中這樣說道:Anchor是大小和尺寸固定的候選框,個人感覺這種說法是很不準確的,只是一個表象而已。在回答什麼           是anchor之前,我們先看一下RPN網絡的一個第一步運算,RPN的第一步運算實際上就是一個3*3*256的卷積運算,我們稱3*3爲一個滑動窗口(sliding window)。假設RPN的輸入是13*13*256的特徵圖,然後使用3*3*256的卷積核進行卷積運算,最後依然會得到一個a*a*256的特徵圖,這裏的a與卷積的步幅有關。

         在原始論文中,我們選定了3種不同scale、3種不同長寬比(aspect ratios)的矩形框作爲“基本候選框(這是我起的名字)”,

三種scale/size是{128,256,512}

三種比例{1:1 , 1:2 , 2:1}

故而一共是3x3=9種,有很多文獻說這就是9個anchors,之所以我覺得不準確是因爲下面的兩個方面

(1)anchor顧名思義爲錨點,這這是一個矩形框,與錨點本身的含義是不符合的;

(2)很明顯,這9個基本候選框的長寬遠遠大於特徵圖的長寬,所以這9個指的應該是原始圖像,結合論文中要對原始圖像進行縮放到600*1000左右的大小,更加確定了這一點,有的人說錨點是特徵圖上的某一個點或者是候選框,既然這9個根本就不是特徵圖上的候選框,那自然不存在錨點之說了。

3.3.4 anchor錨點的本質

錨點的真實含義:應該是特徵圖的某一個像素與對應在原始圖像的某一個像素,即它本質上指的是特徵圖上當前滑窗的中心在原像素空間的映射點稱爲anchor,即anchor是在原始圖像上的

然後以這個錨點爲中心,配上規定的9個基本候選框,這就正確了,所以在原始圖像上的圖像大致如下:

這裏寫圖片描述

其中每一個黑色的點是anchor錨點,以及畫出的以這些錨點爲中心的9個基本候選框。

3.3.5 爲什麼這樣子設計可行?

依然以上面的例子進行說明,假定輸出特徵圖爲13*13*256,然後在該特徵圖上進行3*3*256的卷積,默認進行了邊界填充

那麼每一個特徵圖上一共有13*13=169個像素點,由於採用了邊界填充,所以在進行3*3卷積的時候,每一個像素點都可以做一次3*3卷積核的中心點,那麼整個卷積下來相當於是有169個卷積中心,這169個卷積中心在原始圖像上會有169個對應的錨點,然後每個錨點會有9個默認大小的基本候選框,這樣相當於原始圖像中一共有169*9=1521個候選框,這1521個候選框有9種不同的尺度,中心又到處都分佈,所以足以覆蓋了整個原始圖像上所有的區域,甚至還有大量的重複區域。

這個映射過程如下所示(自己畫的,不好請包涵):

補充:

關於特徵圖和原始圖像的映射關係,這裏有一點需要補充,假定原始的圖像長寬分別是W*H,特徵圖的長寬是w*h,則有如下關係:

w=W/r

h=W/r

這裏的r稱之爲下采樣率,即各個卷積層和池化層步幅的乘積,在VGG中,r=19.

但是我們說了,網絡學習的是數據,這裏的候選框是抽象的結果,數據到底是怎樣的呢?

其實我們需要的並不是這個候選框本身,我們需要的數據是每一個候選框的位置信息(x,y,w,h)和目標信息(有,沒有),我們可以這樣理解,每一個候選框都包含這6個信息,也可以說成是是6個特徵,特徵圖上的每一個像素都對應於原始圖像上的一個“錨點anchor”,而每一個anchor又包含了9個尺寸比例各不相同的標準候選框,每一個候選框又包含着這6個基本信息,所以現在相當於是對每一個特徵像素進行學習,也就間接的學習到了原始圖像上大量的錨點以及大量的候選框的信息,這樣理解不就更好了嗎(個人理解,有錯誤請大佬糾正!)

總結歸納:

當前滑窗的中心在原像素空間的映射點稱爲anchor,以此anchor爲中心,生成k(paper中default k=9, 3 scales and 3 aspect ratios)個proposals。雖然 anchors 是基於卷積特徵圖定義的,但最終的 anchos 是相對於原始圖片的.

RPN的本質是 “ 基於滑窗的無類別obejct檢測器 ”

3.4 生成anchor的作用和目的
        要知道,訓練RPN網絡是有監督訓練,需要有數據、還要有相應的類標籤,輸入小網絡的是512個通道的3*3滑窗,類標籤沒有給定,沒有類標籤就無法計算Loss損失函數,無法訓練網絡。以3*3滑窗中心對應原圖的位置作爲中心點,在原圖生成9個不同尺度長寬比的anchor,然後每個anchor都會被分配到相應的類標籤,有正樣本(1)、負樣本(0),也有不參與訓練的框(not used),對正樣本計算,就是迴歸的類標籤,負樣本不計算迴歸loss。0,1是二分類的標籤。所以在原圖生成anchor的目的之一是得到類標籤。這裏只得到了分類的標籤(0,1),還有正樣本的迴歸標籤需要確定,該正樣本的迴歸標籤是其對應的ground truth計算出來的。負樣本不計算迴歸損失沒有迴歸標籤。   
 

3.5 RPN的訓練過程

上面只討論了RPN的第一步運算——實際上就是卷積運算,接下來考慮後面的運算步驟,如下:

上面的用黑色圈出來的部分是第一步運算,用紅色圈圈圈出來的是第二步運算,我們將第二步運算單獨拿出來看,如下圖所示:

注意:這裏圖片的和上面的稍微有所區別,但是沒關係,只要能理解清楚意思就好。

        RPN 是全卷積(full conv) 網絡,其採用基礎網絡輸出的卷積特徵圖作爲輸入. 首先,採用 512 channel,3×3 kernel 的卷積層(上面的例子採用的是256個channel,但是不影響理解),然後是兩個並行的 1×1 kernel 的卷積層,該卷積層的 channels 數量取決每個點(每個anchor)所對應的的 標準候選框K 的數量,在這兩個並行的1x1卷積中,左側的是進行分類的,這裏的分類只是分有和無兩類,即候選框中有目標還是沒有目標,至於目標到底是什麼先不管,由於每一個anchor對應k個候選框,每一個候選框有兩個取值(即有和無,用概率大小表示)所以每一個anchor對應的輸出應該爲一個2K維度的向量,故而左側的分類卷積使用2K個channel;

        同樣的道理,右側是獲取邊框位置信息的卷積網絡,由於每一個anchor對應k個候選框,每一個候選框有4個位置取值(x,y,w,h)所以每一個anchor對應的輸出應該爲一個4K維度的向量,故而右側的卷積使用4K個channel;

這裏的理解是很重要的。

那究竟RPN網絡是如何進行訓練的呢?
RPN訓練中對於正樣本文章中給出兩種定義。第一,與ground truth box有最大的IoU的anchors作爲正樣本;第二,與ground truth box的IoU大於0.7的作爲正樣本。文中採取的是第一種方式。文中定義的負樣本爲與ground truth box的IoU小於0.3的樣本。 
訓練RPN的loss函數定義如下: 

其中,i表示mini-batch中第i個anchor,pi表示第i個anchor是前景的概率,當第i個anchor是前景時pi爲1反之爲0,ti表示預測的bounding box的座標,ti∗爲ground truth的座標。 
看過Fast R-CNN文章詳細解讀文章的會發現,這部分的loss函數和Fast R-CNN一樣,除了正負樣本的定義不一樣,其他表示時一樣的。一個是交叉熵損失,一個是smooth_L1損失函數。

3.6 RPN是如何產生ROI的?

      RPN在自身訓練的同時,還會提供RoIs(region of interests)給Fast RCNN(RoIHead)作爲訓練樣本。RPN生成RoIs的過程(ProposalCreator)如下:

(1)對於每張圖片,利用它的feature map, 計算 (H/16)× (W/16)×9(大概20000)個anchor屬於前景的概率,以及對應的位置參數。(這裏的W、H表示原始圖像的寬和高,前面已經有說過了)

(2)選取概率較大的12000個anchor,利用迴歸的位置參數,修正這12000個anchor的位置,得到RoIs,利用非極大值((Non-maximum suppression, NMS)抑制,選出概率最大的2000個RoIs

注意:在inference的時候,爲了提高處理速度,12000和2000分別變爲6000和300.

注意:這部分的操作不需要進行反向傳播,因此可以利用numpy/tensor實現。

RPN的輸出:RoIs(形如2000×4或者300×4的tensor)

3.7 RPN網絡與Fast R-CNN網絡的權值共享 
        RPN最終目的是得到候選區域,但在目標檢測的最終目的是爲了得到最終的物體的位置和相應的概率,這部分功能由Fast R-CNN做的。因爲RPN和Fast R-CNN都會要求利用CNN網絡提取特徵,所以文章的做法是使RPN和Fast R-CNN共享同一個CNN部分。 
      Faster R-CNN的訓練方法主要分爲兩個,目的都是使得RPN和Fast R-CNN共享CNN部分,如下圖所示 :

         一個是迭代的,先訓練RPN,然後使用得到的候選區域訓練Fast R-CNN,之後再使用得到的Fast R-CNN中的CNN去初始化RPN的CNN再次訓練RPN(這裏不更新CNN,僅更新RPN特有的層),最後再次訓練Fast R-CNN(這裏不更新CNN,僅更新Fast R-CNN特有的層)。 
        還有一個更爲簡單的方法,就是end-to-end的訓練方法,將RPN和Fast R-CNN結合起來一起訓練,tf版本的代碼有這種方式的實現。

四、RoIHead與Fast R-CNN的進一步訓練

RPN只是給出了2000個候選框,RoI Head在給出的2000候選框之上繼續進行分類和位置參數的迴歸。其實所謂的ROIHead就是對生成的候選框進行處理,這個地方與前面的fast-RCNN是一樣的。

4.1 ROIHead的網絡結構

由於RoIs給出的2000個候選框,分別對應feature map不同大小的區域。首先利用ProposalTargetCreator 挑選出128個sample_rois, 然後使用了RoIPooling 將這些不同尺寸的區域全部pooling到同一個尺度(7×7)上。下圖就是一個例子,對於feature map上兩個不同尺度的RoI,經過RoIPooling之後,最後得到了3×3的feature map.

RoIPooling,其實這裏的ROIPooling跟fast-RCNN裏面的是一樣的。

RoI Pooling 是一種特殊的Pooling操作,給定一張圖片的Feature map (512×H/16×W/16) ,和128個候選區域的座標(128×4),RoI Pooling將這些區域統一下采樣到 (512×7×7),就得到了128×512×7×7的向量。可以看成是一個batch-size=128,通道數爲512,7×7的feature map。

爲什麼要pooling成7×7的尺度?是爲了能夠共享權重。在之前講過,除了用到VGG前幾層的卷積之外,最後的全連接層也可以繼續利用。當所有的RoIs都被pooling成(512×7×7)的feature map後,將它reshape 成一個一維的向量,就可以利用VGG16預訓練的權重,初始化前兩層全連接。最後再接兩個全連接層,分別是:

FC 21 用來分類,預測RoIs屬於哪個類別(20個類+背景)

FC 84 用來回歸位置(21個類,每個類都有4個位置參數)

4.2 訓練

前面講過,RPN會產生大約2000個RoIs,這2000個RoIs不是都拿去訓練,而是利用ProposalTargetCreator 選擇128個RoIs用以訓練。選擇的規則如下:

RoIs和gt_bboxes 的IoU大於0.5的,選擇一些(比如32個)

選擇 RoIs和gt_bboxes的IoU小於等於0(或者0.1)的選擇一些(比如 128-32=96個)作爲負樣本

爲了便於訓練,對選擇出的128個RoIs,還對他們的gt_roi_loc 進行標準化處理(減去均值除以標準差)

對於分類問題,直接利用交叉熵損失. 而對於位置的迴歸損失,一樣採用Smooth_L1Loss, 只不過只對正樣本計算損失.而且是隻對正樣本中的這個類別4個參數計算損失。舉例來說:

一個RoI在經過FC 84後會輸出一個84維的loc 向量. 如果這個RoI是負樣本,則這84維向量不參與計算 L1_Loss

如果這個RoI是正樣本,屬於label K,那麼它的第 K×4, K×4+1 ,K×4+2, K×4+3 這4個數參與計算損失,其餘的不參與計算損失。

4.3 生成預測結果

測試的時候對所有的RoIs(大概300個左右) 計算概率,並利用位置參數調整預測候選框的位置。然後再用一遍極大值抑制(之前在RPN的ProposalCreator用過)。

注意:

在RPN的時候,已經對anchor做了一遍NMS,在RCNN測試的時候,還要再做一遍

在RPN的時候,已經對anchor的位置做了迴歸調整,在RCNN階段還要對RoI再做一遍

在RPN階段分類是二分類,而Fast RCNN階段是21分類

4.4 模型架構圖

最後整體的模型架構圖如下:

整體網絡結構

需要注意的是: 藍色箭頭的線代表着計算圖,梯度反向傳播會經過。而紅色部分的線不需要進行反向傳播(論文了中提到了ProposalCreator生成RoIs的過程也能進行反向傳播,但需要專門的算法)。

五、faster-RCNN裏面的幾個重要概念(四個損失三個creator)

5.1 四類損失

雖然原始論文中用的4-Step Alternating Training 即四步交替迭代訓練。然而現在github上開源的實現大多是採用近似聯合訓練(Approximate joint training),端到端,一步到位,速度更快。

在訓練Faster RCNN的時候有四個損失:

(1)RPN 分類損失:anchor是否爲前景(二分類)

(2)RPN位置迴歸損失:anchor位置微調

(3)RoI 分類損失:RoI所屬類別(21分類,多了一個類作爲背景)

(4)RoI位置迴歸損失:繼續對RoI位置微調

四個損失相加作爲最後的損失,反向傳播,更新參數。

5.2 三個creator

(1)AnchorTargetCreator : 負責在訓練RPN的時候,從上萬個anchor中選擇一些(比如256)進行訓練,以使得正負樣本比例大概是1:1. 同時給出訓練的位置參數目標。 即返回gt_rpn_loc和gt_rpn_label。

(2)ProposalTargetCreator: 負責在訓練RoIHead/Fast R-CNN的時候,從RoIs選擇一部分(比如128個)用以訓練。同時給定訓練目標, 返回(sample_RoI, gt_RoI_loc, gt_RoI_label)

(3)ProposalCreator: 在RPN中,從上萬個anchor中,選擇一定數目(2000或者300),調整大小和位置,生成RoIs,用以Fast R-CNN訓練或者測試。

其中AnchorTargetCreator和ProposalTargetCreator是爲了生成訓練的目標,只在訓練階段用到,ProposalCreator是RPN爲Fast R-CNN生成RoIs,在訓練和測試階段都會用到。三個共同點在於他們都不需要考慮反向傳播(因此不同框架間可以共享numpy實現)

 

其實還可以去看下後面的ROI pooling之類的東西。

更多參考:

https://www.jianshu.com/p/0c3e7dbd642a

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章