faster-rcnn原理介紹

打波廣告勒,女朋友的淘寶店:https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.25911deb2q0w5S&ft=t&id=591621534947 歡迎大家進店收藏關注觀看哦,如需本文的資料及資源,也可以淘寶旺旺問我拿哦。

本博客大部分參考http://blog.csdn.net/zy1034092330/article/details/62044941,其中夾雜着自己看論文的理解

效果圖

這裏寫圖片描述

作者

提到目標檢測,就不得不RBG大神,該大神在讀博士的時候就因爲dpm獲得過pascal voc 的終身成就獎。博士後期間更是不斷髮力,RCNN和Fast-RCNN,Faster-Rcnn就是他的典型作品。

前言

講起faster-rcnn,就不得不講講r-cnn,和fast-rcnn的原理,不過這個今天不是我們講的內容,我們就稍微簡略的講一下,具體的去看他們的論文
r-vnn:鏈接: https://pan.baidu.com/s/1hsengAo 密碼: cdd8
fast-rcnn:鏈接: https://pan.baidu.com/s/1i4SFHfZ 密碼: 38am
faser-rcnn:鏈接: https://pan.baidu.com/s/1sl7aVeP 密碼: mapn

  • r-cnn
    1.region proposal(Selective Search方法,具體可以去看他的論文,主要講的就是生成2K個候選框,用顏色等特徵進行融合)
    2.feature extraction(Deep Net):用卷積神經網絡對每個region提取特徵(Alex-net)
    3.Classification(SVM):對proposal提取到的特徵進行分類,用的方法是SVM
    4.rect refine(regression):對propoposal進行修正。

  • fast-rcnn
    1.region proposal(SS)
    2.feature extraction(Deep net)
    3.classification(Deep net)
    4.refine(Deep net)

注意:Rcnn存在着重複計算的問題(proposal的region有幾千個,多數都是互相重疊,重疊部分會多次重複提取特徵,浪費時間),作者藉助SPP-net搞出了fast-rcnn,跟R-cnn最大區別就是fast-rcnn將proposal的region映射到CNN的最後一層feature map,這樣一張圖片只需要提取一次特徵。而且把分類也在卷積神經網絡一起解決了

faster-rcnn原理

論文的demo用了ZF和VGG16的網絡結構,本文默認用VGG16
它的結構圖:
這裏寫圖片描述
它的前13層是用了VGG提取特徵,主要算法實習是後面幾層
這裏寫圖片描述
這裏寫圖片描述

test 網絡
test網絡

算法步驟

  • 1.Conv layers.作爲一種cnn網絡目標檢測的方法,faster_rcnn首先使用一組基礎conv+relu+pooling層提取image的feture map。該feature map被共享用於後續的RPN層和全連接層。
  • 2.Region Proposal Networks.RPN層是faster-rcnn最大的亮點,RPN網絡用於生成region proposcals.該層通過softmax判斷anchors屬於foreground或者background,再利用box regression修正anchors獲得精確的propocals(anchors也是作者自己提出來的,後面我們會認真講)
  • 3.Roi Pooling.該層收集輸入的feature map 和 proposcal,綜合這些信息提取proposal feature map,送入後續的全連接層判定目標類別。
  • 4.Classification。利用proposal feature map計算proposcal類別,同時再次bounding box regression獲得檢驗框的最終精確地位置

詳解

1.Conv layer

在input-data層時,作者把原圖都reshape成M×N大小的圖片
conv layer中包含了conv relu pooling三種層,就VGG16而言,就有13個conv層,13個relu層,4個pooling層。在conv layer中:
1.所有的conv層都是kernel_size=3,pad=1
2.所有的pooling層都是kernel_size=2,stride=2
這裏寫圖片描述
Conv layer中的pooling層kernel_size=2,stride=2,這樣使得經過pooling層中M×N矩陣,都會變爲(M/2)*(N/2)大小。綜上所述,在整個Conv layers中,conv和relu層不改變輸入輸出大小,只有pooling層使輸出長寬都變爲輸入的1/2。
那麼,一個MxN大小的矩陣經過Conv layers固定變爲(M/16)x(N/16)!這樣Conv layers生成的featuure map中都可以和原圖對應起來。

2.Region Propocal Networks(RPN)

經典的檢測方法生成檢測框都非常耗時,如OpenCV adaboost使用滑動窗口+圖像金字塔生成檢測框;或如RCNN使用SS(Selective Search)方法生成檢測框。而Faster RCNN則拋棄了傳統的滑動窗口和SS方法,直接使用RPN生成檢測框,這也是Faster RCNN的巨大優勢,能極大提升檢測框的生成速度。
這裏寫圖片描述

上圖中展示了RPN網絡的具體結構,可以看到,feature map 經過一個3×3卷積核卷積後分成了兩條線,上面一條通過softmax對anchors分類獲得foreground和background(檢測目標是foregrounnd),因爲是2分類,所以它的維度是2k scores。下面那條線是用於計算anchors的bounding box regression的偏移量,以獲得精確的proposal。它的維度是4k coordinates。而最後的proposcal層則負責綜合foreground anchors和bounding box regression偏移量獲取proposal,同時剔除太小和超出邊界的propocals,其實網絡到這個Proposal Layer這裏,就完成了目標定位的功能

1x1卷積核,3x3卷積核

如果卷積的輸出輸入都只是一個平面,那麼1x1卷積核並沒有什麼意義,它是完全不考慮像素與周邊其他像素關係。 但卷積的輸出輸入是長方體,所以1x1卷積實際上是對每個像素點,在不同的channels上進行線性組合(信息整合),且保留了圖片的原有平面結構,調控depth,從而完成升維或降維的功能。
這裏寫圖片描述

  • 對於單通道圖像+單卷積核做卷積,前面我已經講過了。
  • 對於多通道圖像+多卷積核做卷積,計算方式如下:
    這裏寫圖片描述
    如圖,輸入圖像layer m-1有4個通道,同時有2個卷積核w1和w2。對於卷積核w1,先在輸入圖像4個通道分別作卷積,再將4個通道結果加起來得到w1的卷積輸出;卷積核w2類似。所以對於某個卷積層,無論輸入圖像有多少個通道,輸出圖像通道數總是等於卷積核數量!

對於多通道圖像做1×1卷積,其實就是將輸入的圖像的每個通道乘以卷積係數加在一起,即相當於把原圖像中本來各個獨立通道"聯通"在一起。

anchors

提到PRN網絡,就不能不說anchors。所謂的anchors,實際上就是一組由rpn/generate_anchors.py生成的矩形。直接運行作者demo中的generate_anchors.py可以得到以下輸出:

[[ -84. -40. 99. 55.]
[-176. -88. 191. 103.]
[-360. -184. 375. 199.]
[ -56. -56. 71. 71.]
[-120. -120. 135. 135.]
[-248. -248. 263. 263.]
[ -36. -80. 51. 95.]
[ -80. -168. 95. 183.]
[-168. -344. 183. 359.]]

其中每行的4個值(x1,y1,x2,y2)代表矩形左上角和右下角點的座標。9個矩形共有3種形狀,3 scale with box areas分別是{128128 256256 512*512}和 3 aspect ratios分別是近似{(1:1 1:2 2:1)},所以共9種矩形。實際上通過anchors就引入了檢測中常用的多尺度方法
這裏寫圖片描述

注:關於上面的anchors size,其實是根據檢測圖像設置的。在python demo中,會把任意大小的輸入圖像reshape成800x600(即圖2中的M=800,N=600)。再回頭來看anchors的大小,anchors中長寬1:2中最大爲352x704,長寬2:1中最大736x384,基本是cover了800x600的各個尺度和形狀

anchor的本質是什麼,本質是SPP(spatial pyramid pooling)思想的逆向。而SPP本身是做什麼的呢,就是將不同尺寸的輸入resize成爲相同尺寸的輸出。所以SPP的逆向就是,將相同尺寸的輸出,倒推得到不同尺寸的輸入

對於每個3×3的窗口,作者就以這個滑動窗口的中心點對應原始圖片的中心點。然後作者假定,這個3×3的窗口,是從原始圖片通過SPP池化得到,而這個池化的面積及比例,就是一個個anchors。換句話說,對於每個3x3窗口,作者假定它來自9種不同原始區域的池化,但是這些池化在原始圖片中的中心點,都完全一樣。這個中心點,就是剛剛提到的,3x3窗口中心點所對應的原始圖片中的中心點。如此一來,在每個窗口位置,我們都可以根據不同的長寬比例,不同的面積的anchors,逆向推導出它所對應的原始圖片的一個區域,這個區域的尺寸以及座標,都是已知。而這個區域,就是我們想要的proposal.接下來,每個proposal我們只輸出6個參數,每個proposal和ground truth進行比較得到的前景概率和背景概率(2個參數)對應圖片上的cls_score,由於每個proposal和groundtruth的位置及尺寸上的差異從proposal通過平移縮放得到ground truth需要的4個平移縮放參數(對應圖片上bbox_pred)
這裏寫圖片描述
這樣做獲得檢測框很不準確,不用擔心,後面還有2次bounding box regression可以修正檢測框位置。

補充一點,全部anchors拿去訓練太多了,訓練程序會在合適的anchors中隨機選取128個postive anchors+128個negative anchors進行訓練

softmax判定foreground與background

一副MxN大小的矩陣送入Faster RCNN網絡後,到RPN網絡變爲(M/16)x(N/16),不妨設W=M/16,H=N/16。在進入reshape與softmax之前,先做了1x1卷積
這裏寫圖片描述

該1x1卷積的caffe prototxt定義如下:

layer {  
  name: "rpn_cls_score"  
  type: "Convolution"  
  bottom: "rpn/output"  
  top: "rpn_cls_score"  
  convolution_param {  
    num_output: 18   # 2(bg/fg) * 9(anchors)  
    kernel_size: 1 pad: 0 stride: 1  
  }  
}  

可以看到num_output=18,也就是經過卷積的輸出的圖像爲W×H×18大小。這剛好對應了feature maps每一個點都有9個anchors,同時每個anchors又可能是foreground和background,所以這些信息都保存在W×Hx(9x2)大小的矩陣。爲啥要這樣做,因爲後面的softmax類獲得foreground anchors,也就是相當於初步提取了檢測目標候選區域box(一般認爲目標在foreground anchors中)

那麼爲何要在softmax前後都接一個reshape layer?其實只是爲了便於softmax分類,至於具體原因這就要從caffe的實現形式說起了。在caffe基本數據結構blob中以如下形式保存數據:

blob=[batch_size,channel,height,width]

對應至上面的保存bg/fg anchors的矩陣,其在caffe blob中的存儲形式爲[1, 29, H, W]。而在softmax分類時需要進行fg/bg二分類,所以reshape layer會將其變爲[1, 2, 9H, W]大小,即單獨“騰空”出來一個維度以便softmax分類,之後再reshape回覆原狀。貼一段caffe softmax_loss_layer.cpp的reshape函數的解釋,非常精闢:

"Number of labels must match number of predictions; "  
"e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), "  
"label count (number of labels) must be N*H*W, "  
"with integer values in {0, 1, ..., C-1}."; 

綜上所述,RPN網絡中利用anchors和softmax初步提取了foreground anchors作爲候選區域。

softmax判斷anchors是否屬於foreground或者background,這具體怎麼實現我後面講loss時會認真講

bounding box regression原理

介紹bounding box regression數學模型及原理。如圖所示綠色框爲飛機的Ground Truth(GT),紅色爲提取的foreground anchors,那麼即便紅色的框被分類器識別爲飛機,但是由於紅色的框定位不準,這張圖相當於沒有正確的檢測出飛機。所以我們希望採用一種方法對紅色的框進行微調,使得foreground anchors和GT更加接近。
這裏寫圖片描述

對於窗口我們一般用四維向量(x,y,w,h)表示,分別表示窗口的中心點座標和寬高,如下圖,紅色的框A代表原始的Foreground Anchors,綠色的框G代表目標的GT,我們的目標是尋找一種關係,使得輸入原始的anchor A經過映射得到一個跟真實窗口G更接近的迴歸窗口G’,即給定anchorA=(Ax,Ay,Aw,Ah),GT=[Gx,Gy,Gw,Gh],尋找一種變換F:使得F(Ax,Ay,Aw,Ah)=(G’x,G’y,G’w,G’h),其中(G’x,G’y,G’w,G’h)≈(Gx, Gy, Gw, Gh)。
這裏寫圖片描述

那麼經過何種變換F才能從圖10中的anchor A變爲G’呢? 比較簡單的思路就是:
1.先做平移
              G’x=Awdx(A)+Ax
              G’y=Ah
dy(A)+Ay
2.再做縮放 
              G’w=Awexp(dw(A))
              G’h=Ah
exp(dh(A))
觀察上面4個公式發現,需要學習的是dx(A),dy(A),dw(A),dh(A)這四個變換。當輸入的anchor A與GT相差較小時,可以認爲這種變換是一種線性變換, 那麼就可以用線性迴歸來建模對窗口進行微調(注意,只有當anchorsAGT比較接近時,才能使用線性迴歸模型,否則就是複雜的非線性問題了)。對應Faster Rcnn原文,平移量(tx,ty)與尺度因子(tw,th)如下:
這裏寫圖片描述
其中x, y, w, h 對應兩組框的中心點的座標和它的寬和高。變量x,這裏寫圖片描述這裏寫圖片描述分別對應predicted box , anchor box 和 ground-truth box的中心店橫座標(同理,y , w , h)我們可以這麼認爲bounding box regression就是把anchor box 擬合到ground-truth box。在我們的公式中,用於迴歸的特徵是相同空間大小的在feature maps。爲了解決不同尺寸,一部分k bounding-box-regressionors將被學習。每一個regressor對應一個大小和一個比例值,而且k regressors 不共享weights。因此,我們可以預測不同大小的框哪怕不同大小尺度的feature

注意,我們的bounding box regression是在features pooled from arbitrarily sized regio執行,而且我們的regression weigths在任意大小的region都是共享的
原文:Nevertheless, our method achieves bounding-box regression by a different manner from previous
feature-map-based methods [7, 5]. In [7, 5], bounding-box regression is performed on features
pooled from arbitrarily sized regions, and the regression weights are shared by all region sizes. In
our formulation, the features used for regression are of the same spatial size (n × n) on the feature
maps. To account for varying sizes, a set of k bounding-box regressors are learned. Each regressor
is responsible for one scale and one aspect ratio, and the k regressors do not share weights. As such,
it is still possible to predict boxes of various sizes even though the features are of a fixed size/scale.

接下來的問題就是如何通過線性迴歸獲得dx(A),dy(A),dw(A),dh(A)了。線性迴歸就是給定輸入的特徵向量X,學習一組參數W,使得經過線性迴歸後的值跟真實值Y非常接近,即Y=WX。對於該問題,輸入X就是一張圖片經過卷積獲得的feature map,定義爲,GTtx,ty,tw,thdx(A),dy(A),dw(A),dh(A)![](http://img.blog.csdn.net/20171013001736522?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTGluX3hpYW95aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast),同時還有訓練傳入的GT,即(tx,ty,tw,th)。輸出的是dx(A), dy(A), dw(A),dh(A)四個變換。那麼目標函數可以表示爲: ![這裏寫圖片描述](https://img-blog.csdn.net/20171013001736522?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTGluX3hpYW95aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 其中(A)是對應anchor的feature map組成的向量,w是需要學習的參數,d(A)是得到的預測值(*表示x,y,w,h,也就是每一個變換對應上述的一個目標函數)。爲了讓預測值(tx,ty,tw,th)與真實值差距最小,設計損失函數:
這裏寫圖片描述
函數的目標爲:(smooth L1 loss)
這裏寫圖片描述

對proposals進行bounding box regression

瞭解了bounding box regression後,再回過頭來看RPN網絡第二條線路,如圖
這裏寫圖片描述

先來看看上圖中1×1卷積的caffe prototxt定義:

layer {  
  name: "rpn_bbox_pred"  
  type: "Convolution"  
  bottom: "rpn/output"  
  top: "rpn_bbox_pred"  
  convolution_param {  
    num_output: 36   # 4 * 9(anchors)  
    kernel_size: 1 pad: 0 stride: 1  
  }  
} 

可以看到num_output=36,即經過卷積輸出圖像爲W×H×36,在caffe blob存儲爲[1,36,H,W],這裏相當於feature maps每個點都有9個anchors,每個anchors又有4個用於迴歸的[dx(A),dy(A),dw(A),dh(A)]變換量。

Proposal Layer

proposal layer負責綜合所有的[dx(A),dy(A),dw(A),dh(A)]變換量和foreground anchors,計算出精準的proposal,送入後續的Roi pooling layer.
我們先看看proposal layer的caffe prototxt定義

layer {  
  name: 'proposal'  
  type: 'Python'  
  bottom: 'rpn_cls_prob_reshape'  
  bottom: 'rpn_bbox_pred'  
  bottom: 'im_info'  
  top: 'rois'  
  python_param {  
    module: 'rpn.proposal_layer'  
    layer: 'ProposalLayer'  
    param_str: "'feat_stride': 16"  
  }  
}  

proposal layer有3個輸入:fg/bg anchors分類器結果rpn_prob_reshape,對應的bbox reg的[dx(A),dy(A),dw(A),dh(A)]變換量rpn_bbox_ped,以及im_info,另外還有參數feat_stride=16,這和上圖對應

首先解釋下im_info,對於一幅任意大小的PQ圖像,傳入Fsater Rcnn前首先reshape到MN大小,im_info=[M, N, scale_factor]則保存了此次縮放的所有信息。然後經過Conv Layers,經過4次pooling變爲WxH=(M/16)x(N/16)大小,其中feature_stride=16則保存了該信息,用於計算anchor偏移量。
這裏寫圖片描述
Proposal Layer forward(caffe layer的前傳函數)按照以下順序依次處理:

  • 生成anchors,利用[dx(A),dy(A),dw(A),dh(A)]對所有的anchors做bbox regression迴歸(這裏的anchors生成和訓練時完全一致)
  • 按照輸入的foreground softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)個anchors,即提取修正位置後的foreground anchors。
  • 利用im_info將fg anchors從MxN尺度映射回PxQ原圖,判斷fg anchors是否大範圍超過邊界,剔除嚴重超出邊界fg anchors。
  • 進行nms(nonmaximum suppression,非極大值抑制)(以後介紹NMS的原理)
  • 再次按照nms後的foreground softmax scores由大到小排序fg anchors,提取前post_nms_topN(e.g. 300)結果作爲proposal輸出。
    之後輸出proposal=[x1, y1, x2, y2],注意,由於在第三步中將anchors映射回原圖判斷是否超出邊界,所以這裏輸出的proposal是對應MxN輸入圖像尺度的,這點在後續網絡中有用。另外我認爲,嚴格意義上的檢測應該到此就結束了,後續部分應該屬於識別了

RPN網絡結構總結
生成anchors -> softmax分類器提取fg anchors -> bbox reg迴歸fg anchors -> Proposal Layer生成proposals

RoI pooling

RoI Pooling層則負責收集proposal,並計算出proposal feature maps,送入後續網絡。從圖2中可以看到Rol pooling層有2個輸入:

  • 原始的featrue map
  • RPN輸出的proposal boxes(大小各不相同)

爲何需要ROI Pooling

先來看一個問題:對於傳統的CNN(如alexnxt,VGG),當網絡訓練好後輸入的圖像尺寸必須是固定的,同時網絡輸出也是固定大小的ovctor 或matrix。如果輸入的圖像大小不定,這個問題就變得比較麻煩了。
有2種解決辦法:

  • 從圖像中crop一部分傳到網絡
  • 將圖像warp成需要大小後傳入網絡
    這裏寫圖片描述
    兩種辦法的示意圖如圖,可以看到無論採取那種辦法都不好,要麼crop後破壞了圖像的完整結構,要麼warp破壞了圖像原始形狀信息。
    回憶下RPN網絡生成的proposals的方法:對foreground anchors進行bound box regression,那麼這樣獲得的proposal也是大小形狀各不相同,即也存在上述問題。所以Faster RCNN提出了RIO Pooling解決這個問題(RIO Pooing確實是從SPP發展而來的,SPP我們以後再講)

RIO Pooing原理

分析之前我們先來看RIO Pooling layer的caffe prototxt的定義

layer {  
  name: "roi_pool5"  
  type: "ROIPooling"  
  bottom: "conv5_3"  
  bottom: "rois"  
  top: "pool5"  
  roi_pooling_param {  
    pooled_w: 7  
    pooled_h: 7  
    spatial_scale: 0.0625 # 1/16  
  }  
}  

其中有新的參數pooled_w=poold_h=7,另一個倉庫spatial_scale=1/16
RIO Pooling layerl forward過程:在這之前有明確提到:proposal=[x1,y1,x2,y2]是對應MN尺度的,所以首先使用spatial_scale參數將其映射回(M/16)x(N/16)大小的feature map尺度;之後將每個proposal水平方向和豎直方向都分成7份,對每一份都進行max pooling處理,這樣處理後,即使大小不同的proposal,輸出的結果都是77大小的,實現了fixed-length output(固定長度輸出)。
這裏寫圖片描述

Classification

classification部分利用已經獲得的proposal featuer map,通過full connect層與softmax計算每個proposal具體屬於哪個類別(如車,人等),輸出cls_prob概率向量;同時再次利用Bounding box regression獲得每個proposal的位置偏移量bbox_pred,用於迴歸更加精確的目標檢測框。classification部分網絡結構如下:
這裏寫圖片描述
從RIO Pooling獲取到7*7=49大小的proposal feature maps後,送入後續的網絡,可以看到做了如下2件事:
1:通過全連接層和softmax對proposal進行分類,這實際上已經是識別的範疇了
2:再次對proposals進行bounding box regression,獲取更高精度的rect box
這裏我們來看看全連接層InnerProduct layers,簡單的示意圖如下
這裏寫圖片描述
其計算公式如下
這裏寫圖片描述
其中W和bias B都是預先訓練好的,即使大小是固定,當然輸入X和輸出Y也就是固定大小。所以,這也就印證了之前RIO Pooling的必要性。

Faster RCNN訓練

fastrcnn 訓練方式有三種:

  • 使用交替優化算法訓練
  • 近似聯合訓練
  • 聯合訓練

交替優化訓練

faster rcnn的訓練,其實是在已經訓練好的model(如VGG_CNN_M,_1024,VGG,ZF)的基礎上繼續訓練,實際中訓練的過程分爲6個步驟:

  1. 在預訓練的model上,訓練RPN網絡
  2. 利用訓練好的RPN
  3. 第一次訓練Fast-RCNN網絡
  4. 第二次訓練RPN網絡
  5. 再次利用步驟4訓練好的RPN網絡蒐集proposals
  6. 第二次訓練Fast-RCNN網絡

可以看到訓練過程類似於一種“迭代”的過程,不過只循環了2次。至於只循環了2次的原因是應爲作者提到:“A similar alternating training can be run for more iterations, but we have observed negligible improvements”,即循環更多次沒有提升了。

近似聯合訓練

直接一下子訓練完成

訓練RPN網絡

在該步驟中首先讀取預訓練model,開始進行迭代訓練
這裏寫圖片描述
與檢測網絡類似,依然使用conv layers提取feature map.整個網絡使用的loss如下
這裏寫圖片描述

上述公式中,i表示anchors index,pi表示foreground softmax predict概率,這裏寫圖片描述代表對應的GT predict概率(即當第i個anchors與GT間IoU>0.7,認爲該anchor是foreground,這裏寫圖片描述=1,反之IOU<0.3時,認爲該anchors是background,這裏寫圖片描述=0;至於那些0.3小於IOU<0.7的anchors則不參與訓練,一般一張圖片取256個anchors,一般bg和fg=1;1);t代表predict bounding box,這裏寫圖片描述代表對應的foreground anchors對應的GT box。可以看到,整個LOSS分爲2個部分:
1.cls loss,即rpn_cls_loss層計算的softmax loss,用於分類的anchors爲fg與bg的網絡訓練
2.reg loss,即rpn_loss_bbox層計算的soomth L1 loss,用於bounding box regression網絡訓練注意在該loss中乘了pi*,相當於只關心foreground anchors的迴歸(其實在迴歸中也完全沒必要去關心background)。

由於在實際過程中,Ncls和Nreg差距過大,用參數λ平衡二者(如Ncls=256,Nreg=2400時設置λ=10),使總的網絡Loss計算過程中能夠均勻考慮兩種Loss。這裏比較重要是Lreg使用的soomth L1 loss,計算公式如下:
這裏寫圖片描述

  1. 在RPN訓練階段,rpn-data(python AnchorTargetLayer)層會按照和test階段Proposal層完全一樣的方式生成Anchors用於訓練
  2. 對與rpn_loss_cls,輸入的rpn_cls_score_reshape和rpn_labels分別對應p與p*,Ncls參數隱含在p與p*的caffe blob的大小中

這樣,公式與代碼就完全對應了。特別需要注意的是,在訓練和檢測階段生成和存儲anchors的順序完全一樣,這樣訓練結果才能被用於檢測!

通過訓練好的RPN網絡收集proposals

進在該步驟中,利用之前的RPN網絡,獲取proposal rois,同時獲取foreground softmax probability,如圖18,然後將獲取的信息保存在python pickle文件中。該網絡本質上和檢測中的RPN網絡一樣,沒有什麼區別。

訓練Faster RCNN網絡

讀取之前保存的pickle文件,獲取proposals與foreground probability。從data層輸入網絡。然後:

  1. 將提取的proposals作爲rois傳入網絡,如圖籃框
  2. 將foreground probability作爲bbox_inside_weights傳入網絡,如圖19綠框
  3. 通過caffe blob大小對比,計算出bbox_outside_weights(即λ),如圖19綠框
    這樣就可以訓練最後的識別softmax與最終的bounding regression了,如圖19。

這裏寫圖片描述

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