1. 程式人生 > >Faster-RCNN論文詳解

Faster-RCNN論文詳解

Faster-RCNN

 

提出了Region Proposal Network(RPN)一個全連線的卷積層可以同時預測目標邊界和目標分數(物體)

把RPN和Fast-RCNN合併為一個網路通過共享他們的卷積特徵——使用帶有"attention"機制的神經網路

聯合網路unified networks

 


1、introduction

Region porposal mathod:

Selective Search:基於人工特徵的貪婪進行超級畫素合併

EdgeBoxes在速度和質量方面都權衡得很好

 

上面的方法都是在CPU計算的,當重新實現為GPU計算的時候,就忽略了下游的檢測網路,錯失共享計算的機會

 

改進:使用了深度卷積網路來計算proposals——基本零花費

——即使用convolutional feature maps來計算proposals

 

RPN可以有效預測大範圍的尺度和長寬比

——不同於影象金字塔和影象特徵金字塔(過濾器),使用的是( We use pyramids of reference boxes in the regression functions)

——pyramid of regression reference,避免了列舉(enumerate)所有尺度和長寬比的影象和過濾器

 

訓練:在region proposal task 和object detection 之間交替fine-tune——共享卷積特徵

 

 

2 相關工作

別人的工作:

OverFeat方法:一個全連線網路用來預測盒子box的座標(只針對一個物體),之後全連線層被換成卷積層用來檢測多個類別的物體。

MultiBox方法:從一個網路(最後一層同時可以預測box)產生proposal

但是,MultiBox的方法沒有共享在proposal和detection network 之間的features。

DeepMask method:用於學習segmentation proposals

 

 

 

3 Faster RCNN

整體架構:

 

 

由兩部分組成:

1> deep convolutional network:產生region————————RPN候選區域提取模組,是全卷積神經網路

2> fast RCNN detector:使用proposed regions————————fast RCNN檢測模組,基於RPN提取的proposal檢測並識別proposal中的目標

 

3.1 Region proposal networks(介紹它的設計和屬性)

RPN:輸入一張任意尺度的圖片,輸出一系列矩形proposals(with objectness score)

 

RPN的具體流程:

在convolutional feature map上slide a small network,這個small network選擇feature map上的nxn的空間視窗作為輸入(全連線) ,每個視窗對映到(map)一個低維(256d)的feature。之後feed給兩個姐妹全連線層(reg 和 cls)

 

論文中,作者使用n=3,實際上有效的感受野很大(171或228畫素)

 

部落格: RPN的具體流程如下:使用一個小網路在最後卷積得到的特徵圖上進行滑動掃描,這個滑動網路每次與特徵圖上n*n(論文中n=3)的視窗全連線(影象的有效感受野很大,ZF是171畫素,VGG是228畫素),然後對映到一個低維向量(256d for ZF / 512d for VGG),最後將這個低維向量送入到兩個全連線層,即bbox迴歸層(reg)和box分類層(cls)。sliding window的處理方式保證reg-layer和cls-layer關聯了conv5-3的全部特徵空間。

 

 

3.1.1 anchors

 

每個位置最大有k個可能的proposal,reg層有4k個輸出(位置),cls層有2k輸出(是目標的概率或者不是目標的概率)。即k個anchors,與尺度和長寬比有關。

 

anchor:

位於滑動視窗的中心,與尺度和長寬比有關,預設:3個scales和3個aspect ratios,每個sliding position 產生了k=9個anchors

 

三種尺度(面積){128*128,256*256,512*512},三種比例{1:1,1:2,2:1}所以每一個位置有3*3=9個anchor

 

 

 

對於一個WxH大小的feature map,共有WHk個anchors

 

translation-invariant anchors

論文的方法一個重要的特徵就是擁有translation-invariant(旋轉不變性)

旋轉不變性—— both in terms of the anchors and the functions that compute proposals relative to the anchors.

即:如果一張圖片中的一個目標發生了旋轉,proposal也會發生旋轉,同樣的function也能預測 出proposal

使用我們的方法這是能夠得到保證的

 

旋轉不變性減少了model size,k=9時,只有(4+2)x9的卷積輸出層

 

Multi-Scale anchors as regression references

傳統有兩種方法:

1> 基於影象/特徵金字塔(pyramid of anchors)——影象被resized成多個尺度,每個尺度計算出feature maps——有用但是耗時(對影象或者feature map層進行尺度/寬高的取樣)

2> 在feature map上使用多尺度的滑動視窗——使用不同的過濾器大小單獨訓練不同的aspect ratio模型,可以理解為一個過濾金字塔pyramid of filters(對濾波器進行尺度/寬高的取樣)

 

faster RCNN的解決方法:(multi-scale anchors)通過卷積核中心(用來生成推薦視窗的anchor)進行尺度、寬高的取樣,使用3種尺度和3種比例來產生9種anchor(more cost-efficient),只依賴於一個尺度的影象和feature map

 

 

3.1.2 損失函式loss function

訓練RPN,我們需要給每個anchor貼上二分類標籤——目標和非目標(positive label 和)

positive label定義:(兩種情況之一即可)

(i) the anchor/anchors with the highest Intersection-over Union(IoU) overlap with a ground-truth box,or

(ii) an anchor that has an IoU overlap higher than 0.7 with any ground-truth box.

注意,一個GT包圍盒可以對應多個anchor,這樣一個GT包圍盒就可以有多個正標籤

採用第二個規則基本上可以找到足夠的正樣本,但是對於一些極端情況,所有的anchor對應的anchor box與ground truth的IOU小於0.7,就可以不存在正樣本,所以需要採取第一種規則。

 

negative label定義:

與所有的GT包圍盒的IOU都小於0.3的anchor

既不是正標籤又不是負標籤的不參與訓練

 

損失函式為:

i是mini-batch中anchor的索引

pi是anchor i 成為一個目標的預測概率

The ground-truth label p∗i is 1 if the anchor is positive, and is 0 if the anchor is negative

ti是預測的bounding box 的四個位置引數向量

t*i是正標籤的ground-truth box

 

Lcls是兩個類別的分類損失函式——log函式

Lreg是fast-RCNN裡定義的smooth函式

pi*表明只有在正樣本的情況下才會啟用,負樣本pi*=0不啟用

 

兩部分通過Ncls 和Nreg歸一化,通過 λ控制權重來平衡

Ncls=256——mini-batch size

Nreg~2400——number ofanchor locations

為了cls和reg項大體上權重相等,我們令 λ=10

 

bounding box regression位置迴歸:

 

x是預測盒子即proposal(通過RPN網路預測出的proposal),

xa是anchor box(40*60*9個),

x*是ground-truth box

可以理解為從anchor box到nearby ground-truth box的bounding-box regression

 

 

 

3.1.3訓練RPN

後饋傳播(BP,back-propagation)+隨機梯度下降法(SGD,stochastic gradient descent)

依照fast RCNN中的“image-centric”取樣策略訓練這個網路

取樣:在一張圖片中隨機選擇256個anchors去計算損失函式(正負樣本1:1)(若沒有128個正樣本,用負樣本代替)

初始化:新增的2層引數用均值為0,標準差為0.01的高斯分佈來進行初始化,其餘層(都是共享的卷積層,與VGG共有的層)引數用ImageNet分類預測訓練模型初始化。

 

引數化設定:

60k mini-batches使用0.001學習率

next 20k mini-batches on the PASCAL VOCdataset使用0.0001學習率

設定動量momentum=0.9,權重衰減weighted decay=0.0005

 

3.2 sharing features for RPN and Fast RCNN

faster RCNN由兩大模組組成——RPN候選框模組,fast RCNN檢測模組

上面是如何為生成區域建議框訓練網路,而沒有考慮基於區域的目標檢測CNN如何利用這些建議框。對於檢測網路,我們採用fast RCNN,下面描述演算法——如何學習一個統一的網路(由RPN和Fast RCNN共享卷積層組成)/學習由RPN和Fast-RCNN之間共享的卷積層。

 

RPN和Fast RCNN都是獨立訓練的,要用不同的方式修改他們的卷積層,因此需要一種允許兩個網路間共享卷積層的技術,而非分別學習

兩個網路。注意到這不是僅僅定義一個包含RPN和Fast RCNN的單獨網路,然後用反向傳播優化它那麼簡單,原因是Fast RCNN訓練依賴於固定的目標建議框,而且並不清楚當同時改變建議機制時,學習Fast RCNN會不會收斂。

 

 

論文中討論了三種方法來訓練有共享特徵的網路:

第一種,作者用的方法:

RPN和FAST RCNN公用了13個VGG的卷積層,孤立的進行訓練是一個不明智的選擇,作者採用交替訓練Alternating training方法 (RPN提取得到proposals,再使用Fast RCNN實現最終目標的檢測和識別)

1> 首先依上述訓練RPN,該網路用ImageNet預訓練的模型初始化,並端到端微調用於區域建議任務。

2> 我們利用第一步的RPN生成的建議框,由Fast RCNN訓練一個獨立的檢測網路,這個檢測網路同樣是ImageNet預訓練的模型初始化的,這時候兩個網路還沒有共享卷積層

3> 我們用檢測網路(detector network)初始化RPN訓練,但我們固定共享的卷積層,並且只微調RPN獨有的層,現在兩個網路共享卷積層了。

4> 保持共享的卷積層固定,微調Fast RCNN的fc層,這樣兩個網路共享相同的卷積層,構成一個統一的網路。

 

 

 

3.3 implementation details實現細節 / 核心思想

https://github.com/rbgirshick/py-faster-rcnn/blob/master/models/pascal_voc/VGG16/faster_rcnn_end2end/train.prototxt

可以看出VGG16用於特徵提取的部分是13個卷積層(conv1_1---->conv5_3),不包括pool5以及其後的網路層次結構

 

因為我們的最終目標是和Fast RCNN目標檢測網路共享計算,所以假設這兩個網路共享一系列卷積層,在論文的實驗中,ZF有5個共享的卷積層,VGG有13個共享的卷積層。

 

具體流程:前面有解釋

部落格:(重述)

使用一個小網路在最後卷積得到的特徵圖上進行滑動掃描,這個滑動網路每次與特徵圖上n*n(論文中n=3)的視窗全連線(影象的有效感受野很大,ZF是171畫素,VGG是228畫素),然後對映到一個低維向量(256d for ZF / 512d for VGG),最後將這個低維向量送入到兩個全連線層,即bbox迴歸層(reg)和box分類層(cls)。sliding window的處理方式保證reg-layer和cls-layer關聯了conv5-3的全部特徵空間。

3*3卷積核的中心點對應原圖(re-scale為600*1000)上的位置(點),將該點作為anchor的中心點,在原圖中框出多尺度、多種長寬比的anchors。所以,anchor不在conv特徵圖上,而在原圖上,對於一個大小為H*W的特徵層,它上面的每一個畫素點對應9個anchor,這裡有一個重要的引數feat_stride=16,它表示特徵層上移動一個點,對應原圖移動16個畫素點。把這9個anchor的座標進行平移操作,獲得在原圖上的座標。之後根據ground truth label和這些anchor之間的關係生成RPN_labels(根據overlap計算)。生成的RPN_labels中,positive的位置被設定為1,negative的位置被設定為0,其他的位置被設定為-1。

 

faster RCNN卷積流程圖:

 

conv5得到的是40*60大小的特徵圖,對應論文中的2400。anchor的個數為40*60*9~2k個