Faster RCNN中RPN理解(需要訓練得到粗略proposals的)

fast+fpn=faster rcnn

之前已經用過RPN,因爲重心一直在修改我自己的網絡結構上,這次重新涉及到此部分的優化(Guided Anchoring: 物體檢測器也能自己學 Anchor),重新審視了一下RPN,記錄一下。

如果把RPN看作一個黑盒子的話,最關心的問題是,輸入和輸出。RPN輸入的是一張圖片,輸出輸出一系列的矩形object proposals。RPN其實就像個“內嵌的”的網絡似的,這也正是“兩階段物體檢測”的體現之處,進行了初步、首階段的學習。

RPN相當於是一個小的、粗糙的目標檢測cnn模型,只不過它不具體識別/分類,它的識別/分類是:是前景還是背景;定位是:根據anchor使得檢測的框靠近gt_box(迴歸:做怎樣的逼近才能使得anchor逼近gt-boxes)。這時候結果不是很準確,只能大致確定框的位置,後面fast rcnn會進一步精確。這個RPN實際上就是一個attention機制,這也是兩階段法比一階段法(YOLO等)準確的原因)

訓練步驟:

1.將圖片輸入到VGG或resnet等的可共享的卷積層中,得到最後可共享的卷積層特徵圖FM(feature map)。

2.將FM送入RPN。(先3*3filter滑窗生成新的FM(intermediate layer),再送入兩個1*1conv

    2.1在滑動窗口的每個像素點根據感受野都對應的原圖上的一片區域,這片區域對目標的覆蓋力、形狀多樣性可能沒有那麼好,故根據此區域的中心點(錨點)在原圖設置9/15個矩形窗口(eg:3種長寬比*3種尺度),即錨框、anchor。至於這裏爲什麼要在原圖上,是因爲最後求出來的錨框要跟原圖的標定框最小梯度下降。

   2.2將卷積的結果和錨點分別輸入到兩個小的1*1的網絡中reg(迴歸,求目標框的位置)和cls(分類,確定該框中是不是目標)

3.訓練集標記好了每個框的位置,和reg輸出的框的位置比較,用梯度下降來訓練網絡。

注意:anchors是在原圖上的。在FM上對點做信息抽取時候,相當於抽取該點在原圖上對應的一堆anchors的信息(分類和迴歸信息)。

圖片節選自https://www.bilibili.com/video/av21846607/?p=6(視頻不建議看,建議看這個系列:https://www.bilibili.com/video/av29987414

ROI Pooling : anchor 到FM上的ROI進行pooling

Region Proposal Networks(RPN)

(RPN是faster-Rcnn的一部分,faster-Rcnn論文原文請點擊)

RPN網絡把一個任意尺度的圖片作爲輸入,輸出一系列的矩形object proposals,每個object proposals都帶一個objectness score。我們用一個全卷積網絡來模擬這個過程,這一小節描述它。因爲我們的最終目標是與Fast R-CNN目標檢測網絡來共享計算,所以我們假設兩個網有一系列相同的卷積層。我們研究了the Zeiler and Fergus model(ZF,它有5個可共享的卷積層,以及the Simonyan and Zisserman model(VGG-16,它有13個可共享的卷積層。

爲了生成region proposals,我們在卷積的feature map上滑動一個小的網絡,這個feature map 是最後一個共享卷積層的輸出。這個小網絡需要輸入卷積feature map的一個n*n窗口。每個滑動窗口都映射到一個低維特徵(resnet+fpn中是256維,VGG是512維,後面跟一個ReLU激活函數)。這個特徵被輸入到兩個兄弟全連接層中(一個box-regression層(reg),一個box-classification層(cls))。在這篇論文中使用了n=3,使輸入圖像上有效的接受域很大(ZF 171個像素,VGG 228個像素)。這個迷你網絡在圖3(左)的位置上進行了說明。注意,由於迷你網絡以滑動窗口的方式運行,所以全連接層在所有空間位置共享。這個體系結構是用一個n*n的卷積層來實現的,後面是兩個1*1的兄弟卷積層(分別是reg和cls)。

要保證下面三個layer的尺寸一致性(空間位置一直,有助於後面直接找到anchor),也就是:

假設:FM尺寸W,H,C,則intermediate layer:經過3*3*C→W,H,1,然後cls layer經過1*1*2k→W,H,2k;reg layer經過1*1*4k→W,H,4K。如圖:

 https://images2018.cnblogs.com/blog/990792/201808/990792-20180806220619966-1988745146.png

1.1Anchors(錨點)

在每個滑動窗口位置,我們同時預測多個region proposals,其中每個位置的最大可能建議的數量表示爲k。所以reg層有4 k輸出來編碼k個box的座標(可能是一個角的座標(x,y)+width+height),cls層輸出2 k的分數來估計每個proposal是object的概率或者不是的概率。這k個proposals是k個參考框的參數化,我們把這些proposals叫做Anchors(錨點)。錨點位於問題的滑動窗口中,並與比例和縱橫比相關聯。默認情況下,我們使用3個尺度和3個縱橫比,在每個滑動位置上產生k=9個錨點。對於W *H大小的卷積特性圖(通常爲2,400),總共有W*H*k個錨點。

平移不變性的錨點

我們的方法的一個重要特性是是平移不變性,錨點本身和計算錨點的函數都是平移不變的。如果在圖像中平移一個目標,那麼proposal也會跟着平移,這時,同一個函數需要能夠在任何位置都預測到這個proposal。我們的方法可以保證這種平移不變性。作爲比較,the MultiBox method使用k聚類方法生成800個錨點,這不是平移不變的。因此,MultiBox並不保證當一個對象被平移式,會生成相同的proposal。

平移不變性也減少了模型的尺寸,當錨點數k=9時,因爲MultiBox錨點不具有平移不變性,所有它要求一個(4+1)×800維的全連接輸出層,而這篇論文的方法有一個(4+2)*9維的卷積輸出層。因此,我們輸出層的參數比MultiBox少兩個數量級(原文有具體的數,感覺用處不大,沒有具體翻譯)。如果考慮到feature projection層,我們的建議層仍然比MultiBox的參數少了一個數量級。這裏的建議層有一個數量級的參數減少(使用GoogLeNet 的MultiBox有27百萬,而使用VGG-16的RPN有2.4百萬),因此在想PASCAL VOC這樣的小數據集上有更少過擬合的風險。

多尺度錨點作爲迴歸參考

我們的錨點設計提出了一種解決多個尺度(和縱橫比)的新方案。如圖所示,有兩種流行的多尺度預測方法

 https://images2018.cnblogs.com/blog/990792/201808/990792-20180806220711044-2032233715.png

(a.建立了圖像和特徵圖的金字塔,分類器在所有的尺度上運行。b. 具有多個尺寸/大小的過濾器金字塔在feature map上運行。c. 我們在迴歸函數中使用了參考框的金字塔。)

第一種方法是基於圖像/特徵金字塔,例如,在DPM和基於cnn方法的方法。這些圖像在多個尺度上進行了調整,並且爲每個尺度計算特徵圖(佔用或深度卷積特性)(圖1(a))。這種方法通常很有用,但很耗費時間。第二種方法是在feature map上使用多個尺度(和/或方面比率)的滑動窗口。例如,在DPM中,不同方面比率的模型分別使用不同的過濾大小(如5 7和7 5)進行單獨訓練。如果這種方法用於處理多個尺度,它可以被認爲是一個過濾器金字塔(圖1(b))。第二種方法通常是與第一種方法共同使用的

相比而言,我們基於錨點的方法建立在錨點金字塔上,這更節省成本。我們的方法對多個尺度和縱橫比的錨點框進行了分類和迴歸。它只依賴於單一尺度的圖像和feature map,並使用單一大小的過濾器(feature map上的滑動窗口)。我們通過實驗展示了這個方案對處理多個尺度和大小的影響(表8)。

 

https://images2018.cnblogs.com/blog/990792/201808/990792-20180806220739546-1677814247.png

由於這種多尺度設計是基於錨點的,我們可以簡單地使用在單尺度圖像上計算的卷積特性,也可以使用Fast R-CNN檢測器。多尺度錨點的設計是共享特性的關鍵組成,使處理尺度時不需要額外的成本。

1.2損失函數

爲了訓練RPNs,(既然訓練就要樣本,小網絡已經有了,那麼接下來)

(1)樣本製作:

將一個二進制類標籤(是否是object)分配給每個錨點。會給這兩種錨點設置成正標籤:1)跟真值框的交併比最高的。2)跟真值框的交併比大於0.7的。因此,一個真值框可以對應多個正標籤的錨點。通常第二個條件足以確定正樣本,我們還用第一種情況的原因是,有的時候第二種情況找不到正樣本。如果一個錨點跟所有真值框的交併比小於0.3,那馬我們就把它設爲負樣本。正負樣本之間的這些樣本對訓練沒有貢獻。

(2)損失函數:

在fast R-CNN的多任務損失之後最小化一個目標函數,一張圖片的損失函數定義爲:

https://images2018.cnblogs.com/blog/990792/201808/990792-20180806220807730-63228355.png

i 是每個小批量中錨點的序號,p是錨點i是目標的概率,p*是標籤(只能是0或1),t是預測框的4個參數,t*是標定框的參數;L_{cls}是分類損失函數,L_{reg}是迴歸損失函數;p_{i}^{*}L_{reg}表示迴歸只對正樣本進行(負樣本p_{i}^{*}=0)。cls和reg分別輸出p^{_{i}}t^{_{i}}

這兩部分由N^{_{cls}}(小批量的大小決定,這裏是~2000個proposals,只選256個進行訓練)和Nreg(錨點位置數量決定,這裏是2400)進行規範化,並通過一個平衡參數λ進行加權。默認情況下,我們設置λ=10,因此cls和reg部分的權重大致相同。我們通過實驗證明,結果對在大範圍內λ的值不敏感。我們還注意到,上面的標準化是不需要的,可以被簡化。λ=9.375完全相同。

對於邊界框迴歸,我們採用了以下4個座標的參數化:

 x,y,w,和h表示框的中心座標以及它的寬度和高度。變量x、x{_{a}}和x*分別代表預測的框、錨點框和真值框(y、w、h類似)。這可以認爲是錨點框向附近真值框迴歸。是一種微調的感覺

用與以前基於ROI(感興趣的區域)方法不同的方法實現了有界的迴歸。原來的方法在從任意大小的RoIs中集合的特性上執行有界的迴歸,並且所有區域大小都共享迴歸權重。在我們的公式中,用於迴歸的特性在feature maps上具有相同的空間大小(3*3)。爲了計算不同的尺寸,我們學習了一組k個有界的迴歸每一個迴歸器負責一個尺度和一個縱橫比,而k個迴歸器不共享權重。因此,由於錨點的設計,仍然可以預測各種大小的框,即使這些特徵是固定的大小/比例。

1.3 訓練RPNs

RPN可以通過反向傳播和隨機梯度下降來端到端訓練。我們遵循以圖像爲中心的採樣策略,開始訓練這個網絡。每個小批次都來自同一張照片,照片包含許多正負錨點示例。對所有錨點的損失函數進行優化是可行的,但這將偏向於負樣本,因爲它們多。相反,我們在一個圖像中隨機抽取256個錨點來計算一個小批的損失函數,其中採樣的正和負錨點的比例是1:1。如果一個圖像中有少於128個正的樣本,我們用負樣本填充。

隨機地初始化所有的新層,方法是用標準偏差0.01的零均值高斯分佈來初始化權重。通常,所有其他層(共享卷積層)都是通過預先培訓練一個用於ImageNet分類的模型來初始化的。我們對ZF網絡的所有層進行調優,並對VGG網絡的conv3_1層進行調優,以節省內存。我們對60 k小批量的學習速率爲0.001,在PASCAL VOC數據集上的下一個20 k小批量的學習速率是0.0001。我們使用0.9的步長和0.0005的重量衰減。用Caffe實現的。

初步會根據概率篩選一部分,餘下得分高、高度重疊的proposals,再用nms進行循環抑制。

參考:

http://www.mamicode.com/info-detail-2243373.html

https://www.cnblogs.com/jiangnanyanyuchen/p/9433791.html

https://www.cnblogs.com/hellcat/p/9811301.html

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