1. 程式人生 > >Faster R-CNN 學習筆記

Faster R-CNN 學習筆記

Faster RCNN 學習
Faster R-CNN這篇論文著重解決了這個系統中的三個問題:
1. 如何設計區域生成網路;RPN
2. 如何訓練區域生成網路;
3. 如何讓區域生成網路和Fast RCNN網路共享特徵提取網路。

圖1:Faster RCNN 結構

Faster RCNN:
1. Faster RCNN 由兩部分組成:提取候選框和Fast R-CNN 檢測器
2. 提取候選框:卷積特徵提取 + RPN網路

RPN網路的訓練樣本是anchors
RPN網路輸出為Proposals
Fast RNN檢測器 的訓練樣本是Proposals

基於ZF網路的Faster RCNN (ZF + RPN + Faster R-CNN)
Layer1:conv_5 3*3 convilution


輸出特徵集 14 * 14 * 256

2)RPN

圖2: RPN網路結構簡化版

圖3:RPN網路流程圖

RPN 網路是替換Fast R-CNN 的 SS 部分,用來生成Region Proposal,對應到ZF最後一個卷積特徵層14 * 14的特徵集上每一個點產生9個anchors。

產生9個anchors過程主要有三步:
(1)首先採用固定大小,固定尺度比和固定橫縱比產生9個base_anchors(屬於預處理過程)。
(2)由ZF生成的特徵(14 * 14)先經過一個3 * 3 * 256 維(256個卷積核)的卷積操作,再經過兩個1 * 1(1 * 1 * 18 和 1 * 1 * 36)的卷積操作,一個輸出為18維(9個 anchors,每一個有兩個引數,共18維,18個輸出值),一個輸出36維(9個 anchors,每一個有四個引數,共36維,36個輸出值)
(3)根據上面兩個過程,將產生的9個anchors對映到原圖上,得到9個anchors在原圖上的位置。

Layer2:conv_rpn 3*3 convilution
Filter 3 * 3 * 256,輸出為256維,padding = 1 Stride = 1
輸出為 14 * 14 * 256

Layer3_1:conv_rpn_cls 1*1 convilution
RPN網路第1條線路:
Filter 為 1 * 1 * 18 padding = 0 Stride = 1
9個 anchors ,每一個有兩個引數,一個是前景概率,一個是後景概率
輸入14 * 14 * 256 輸出 14 * 14 * 18

Layer3_2:conv_rpn_res 1*1 convilution


RPN網路第2條線路:
Filter 為 1 * 1 * 36 padding = 0 Stride = 1
9個 anchors ,每一個有四個引數,座標(x,y) 寬高(w,h)
輸入14 * 14 * 256 輸出 14 * 14 * 36

由圖2可知,Layer3_1在進入到下一層時需要進行Reshape一下,{dim:0 dim:2 dim:-1 dim: 0}。Reshape表示一種操作。
我們輸入為{dim:1 dim:18 dim:14 dim:14} 經過Reshape 得到{dim:1 dim:2 dim:9 * 14 dim:14},即126 * 14 * 2(9是每一個特徵點anchors的個數,一共有14 * 14個特徵點,因此一共有14 * 14 個9,即14 * 14 * 9 = 1764 個anchors,2 表示每一個anchors是前景和不是前景的概率,利用softmax得到)。

為什麼要進行Reshape?:
其實只是為了便於softmax分類,feature maps每一個點都有9個anchors,同時每個anchors又有可能是foreground和background,所有這些資訊都儲存WxHx(9x2)大小的矩陣,後面接softmax分類獲得foreground anchors,也就相當於初步提取了檢測目標候選區域box(一般認為目標在foreground anchors中),開始的儲存形式為[1, 18, H, W]。而在softmax分類時需要進行fg/bg二分類,所以reshape layer會將其變為[1, 2, 9*H, W]大小,即單獨“騰空”出來一個維度以便softmax分類,之後再reshape回覆原狀。

Layer4:softmax 將18維的特徵集輸入,得到概率
輸入為Reshape 的結果即 126 * 14 * 2。進行完這一步還要Reshape回去變成{dim:1 dim:18 dim:14 dim:14} 即14 * 14 * 18

RPN網路第2條線路:Layer3_2 輸出相當於feature maps每個點都有9個anchors,每個anchors又都有4個用於迴歸的[dx(A),dy(A),dw(A),dh(A)]變換量。利用bounding box regression的計算公式即可從foreground anchors(RPN網路第1條線路cls)迴歸出proposals。

Layer4:proposals
輸入為Layer4 和 Layer3_2 和im_info,另外還有引數feat_stride=16,輸出為精準的proposal,然後送入後續的RoI Pooling Layer。

im_info:對於一副任意大小PxQ影象,傳入Faster R-CNN 前首先reshape到固定MxN,im_info=[M, N, scale_factor]則儲存了此次縮放的所有資訊,所有這些數值都是為了將proposal映射回原圖而設定的。例如經過4此池化,feature_stride=16則儲存了該資訊。*

具體實現步驟:
(1) 利用feat_stride和im_info將anchors映射回在原圖的位置即座標和引數。
(2) 將長寬低於閾值的除去(檢測不到小的物體)
(3) 按照score(前景分數值) 從高到底排序
(4) 選取前top_N(例如6000)的proposal留下來,其他刪除
(5) 對留下來的top_N的proposal進行NMS(非極大抑制)操作,操作閾值為0.7,剩下的就是我們想要的proposal(例如2000)
在訓練的時候有以下幾個原則
(a)對每一個標定的真值候選區域,與其重疊比例最大的anchor標記為前景樣本(label = 1)
(b)對於a)剩下的,如何與某一個標定的真值候選區域的重疊比例大於0.7,也標記為前景樣本,如果與任意一個標定的真值候選區域的重疊比例小於0.3則標定為背景樣本(label = 0)
(c) (a)和(b)剩下的棄之不用
(d) 跨越影象邊界的anchor棄之不用。
最終得到一定數量的proposals,例如當輸入為600 * 1000 可得到2000個proposals。
由於在第三步中將anchors映射回原圖判斷是否超出邊界,所以這裡輸出的proposal是對應MxN輸入影象尺度的。

RPN網路結構就介紹到這裡,總結起來就是:
生成anchors -> softmax分類器提取fg anchors -> bbox reg迴歸fg anchors -> Proposal Layer生成proposals

Layer5:ROI_pool_conv5
什麼是ROI呢?
ROI是Region of Interest的簡寫,指的是在“特徵圖上的框”;
1)在Fast RCNN中, RoI是指Selective Search完成後得到的“候選框”在特徵圖上的對映,如下圖所示;
2)在Faster RCNN中,候選框是經過RPN產生的,然後再把各個“候選框”對映到特徵圖上,得到RoIs。
先看一下Fast RCNN的結構:

圖4 Fast RCNN 的網路結構
ROIs Pooling顧名思義,是Pooling層的一種,而且是針對RoIs的Pooling,他的特點是輸入特徵圖尺寸不固定,但是輸出特徵圖尺寸固定;
Layer5的輸入為Layer4得到的ROI(例如Layer4輸出300個proposals{index,x,y,w,h})和ZF最後一層卷積特徵(Layer1:14 * 14 * 256),本層的池化引數為6 * 6 ,空間尺度為16分之一,意思是輸出的特徵集大小是6 * 6 維,因為Layer4得到的ROI尺寸是針對原圖的,所有此時要對映到特徵層上,ROI的座標引數要除以16(經過幾層池化計算得到),對每一個ROI都需要池化,最終得到300個ROI 。其具體步驟:
(1)將ROI的座標引數對映到特徵集上,設為H * W
(2) 要想得到6 * 6的特徵圖,採用特定的核進行最大池化,並用index表示輸出的值由特徵集中哪個位置的元素得到,對於每一個ROI可得到6 * 6 * 256 維的向量。
(3)共有300個ROI,因此,最終輸出為300 * 6 * 6 * 256

Layer6:FC6
輸入300 * 6 * 6 * 256 的特徵圖,輸出4096個神經元
Layer7:Droput
以一定概率丟掉一些引數
Layer8:FC7
輸出為4096個神經元。
Layer9:Droput
以一定概率丟掉一些引數
Layer10_1:cls_score
如果目標為10類(數字0到9)則輸出為10,引數個數4096 * 10
Layer10_2:FC6
我需要10個框,則輸出為40,引數個數4096 * 40
**Layer11 Softmax:cls_prob
cls_score 層概率值

參考文獻 :
基於ZF網路的Faster RCNN網路結構詳解(非常詳細版)

Faster RCNN原理分析(二):Region Proposal Networks詳解

ROI Pooling層解析

Faster R-CNN論文筆記——FR