【轉(zhuǎn)載】Faster RCNN 學習筆記

原文:https://www.cnblogs.com/wangyong/p/8513563.html


下面的介紹都是基于VGG16?的Faster RCNN網(wǎng)絡(luò),各網(wǎng)絡(luò)的差異在于Conv layers層提取特征時有細微差異,至于后續(xù)的RPN層、Pooling層及全連接的分類和目標定位基本相同.


一)鹅士、整體框架

我們先整體的介紹下上圖中各層主要的功能

1)、Conv layers提取特征圖:

作為一種CNN網(wǎng)絡(luò)目標檢測方法,F(xiàn)aster RCNN首先使用一組基礎(chǔ)的conv+relu+pooling層提取input image的feature maps,該feature maps會用于后續(xù)的RPN層和全連接層

2)诵原、RPN(Region Proposal Networks):

??? RPN網(wǎng)絡(luò)主要用于生成region proposals,首先生成一堆Anchor box挽放,對其進行裁剪過濾后通過softmax判斷anchors屬于前景(foreground)或者后景(background)绍赛,即是物體or不是物體,所以這是一個二分類辑畦;同時吗蚌,另一分支bounding box regression修正anchor box,形成較精確的proposal(注:這里的較精確是相對于后面全連接層的再一次box regression而言)

3)纯出、Roi Pooling:

該層利用RPN生成的proposals和VGG16最后一層得到的feature map蚯妇,得到固定大小的proposal feature map,進入到后面可利用全連接操作來進行目標識別和定位

4)、Classifier:

?會將Roi Pooling層形成固定大小的feature map進行全連接操作暂筝,利用Softmax進行具體類別的分類箩言,同時,利用L1 Loss完成bounding box regression回歸操作獲得物體的精確位置.


)焕襟、網(wǎng)絡(luò)結(jié)構(gòu)

現(xiàn)在陨收,通過上圖開始逐層分析

1)Conv layers

Faster RCNN首先是支持輸入任意大小的圖片的鸵赖,比如上圖中輸入的P*Q务漩,進入網(wǎng)絡(luò)之前對圖片進行了規(guī)整化尺度的設(shè)定,如可設(shè)定圖像短邊不超過600它褪,圖像長邊不超過1000饵骨,我們可以假定M*N=1000*600(如果圖片少于該尺寸,可以邊緣補0茫打,即圖像會有黑色邊緣)

①?13個conv層:kernel_size=3,pad=1,stride=1;

卷積公式:

? ? ? ? ? ? ?所以垛贤,conv層不會改變圖片大小(即:輸入的圖片大小=輸出的圖片大惺蚰簟)

②?13個relu層:激活函數(shù),不改變圖片大小

③?4個pooling層:kernel_size=2,stride=2;pooling層會讓輸出圖片是輸入圖片的1/2

? ? ? ?經(jīng)過Conv layers源葫,圖片大小變成(M/16)*(N/16),即:60*40(1000/16≈60,600/16≈40)砖瞧;則息堂,F(xiàn)eature Map就是60*40*512-d(注:VGG16是512-d,ZF是256-d),表示特征圖的大小為60*40块促,數(shù)量為512


2)荣堰、RPN(Region Proposal Networks):

Feature Map進入RPN后,先經(jīng)過一次3*3的卷積竭翠,同樣振坚,特征圖大小依然是60*40,數(shù)量512,這樣做的目的應該是進一步集中特征信息斋扰,接著看到兩個全卷積,即kernel_size=1*1,p=0,stride=1;

如上圖中標識:

①?rpn_cls:60*40*512-d?⊕? 1*1*512*18 ==> 60*40*9*2?

? ? ? ? ?逐像素對其9個Anchor box進行二分類

②?rpn_bbox:60*40*512-d?⊕?1*1*512*36==>60*40*9*4

?逐像素得到其9個Anchor box四個坐標信息(其實是偏移量渡八,后面介紹)

? 如下圖所示:

(2.1)、Anchors的生成規(guī)則

? ? ??前面提到經(jīng)過Conv layers后传货,圖片大小變成了原來的1/16屎鳍,令feat_stride=16,在生成Anchors時问裕,我們先定義一個base_anchor逮壁,大小為16*16的box(因為特征圖(60*40)上的一個點,可以對應到原圖(1000*600)上一個16*16大小的區(qū)域)粮宛,源碼中轉(zhuǎn)化為[0,0,15,15]的數(shù)組窥淆,參數(shù)ratios=[0.5,?1,?2]scales=[8, 16, 32]

? ?先看[0,0,15,15],面積保持不變,長巍杈、寬比分別為[0.5,?1,?2]是產(chǎn)生的Anchors box

如果經(jīng)過scales變化忧饭,即長、寬分別均為?(16*8=128)秉氧、(16*16=256)、(16*32=512)蜒秤,對應anchor box如圖

綜合以上兩種變換汁咏,最后生成9個Anchor box

? ?所以,最終base_anchor=[0,0,15,15]生成的9個Anchor box坐標如下:

[[ -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.]]

特征圖大小為60*40作媚,所以會一共生成60*40*9=21600個Anchor box

? 源碼中攘滩,通過width:(0~60)*16,height(0~40)*16建立shift偏移量數(shù)組,再和base_ancho基準坐標數(shù)組累加纸泡,得到特征圖上所有像素對應的Anchors的坐標值漂问,是一個[216000,4]的數(shù)組


?(2.2)、RPN工作原理解析

為了進一步更清楚的看懂RPN的工作原理,將Caffe版本下的網(wǎng)絡(luò)圖貼出來蚤假,對照網(wǎng)絡(luò)圖進行講解會更清楚

主要看上圖中框住的‘RPN’部分的網(wǎng)絡(luò)圖栏饮,其中‘rpn_conv/3*3’是3*3的卷積,上面有提到過磷仰,接著是兩個1*1的全卷積袍嬉,分別是圖中的‘rpn_cls_score’和‘rpn_bbox_pred’,在上面同樣有提到過灶平。接下來伺通,分析網(wǎng)絡(luò)圖中其他各部分的含義

2.2.1)、rpn-data

1. layer {

2.? ? ? name: 'rpn-data'?

3.? ? ? type: 'Python'?

4.? ? ? bottom: 'rpn_cls_score'? #僅提供特征圖的height和width的參數(shù)大小

5.? ? ? bottom: 'gt_boxes'? ? ? ? #ground truth box

6.? ? ? bottom: 'im_info'? ? ? ? #包含圖片大小和縮放比例逢享,可供過濾anchor box

7.? ? ? bottom: 'data'?

8.? ? ? top: 'rpn_labels'?

9.? ? ? top: 'rpn_bbox_targets'?

10.? ? ? top: 'rpn_bbox_inside_weights'?

11.? ? ? top: 'rpn_bbox_outside_weights'?

12.? ? ? python_param {?

13.? ? ? ? module: 'rpn.anchor_target_layer'?

14.? ? ? ? layer: 'AnchorTargetLayer'?

15.? ? ? ? param_str: "'feat_stride': 16 \n'scales': !!python/tuple [8, 16, 32]"?

16.? ? ? }?

17.? ? }


這一層主要是為特征圖60*40上的每個像素生成9個Anchor box罐监,并且對生成的Anchor box進行過濾和標記,參照源碼瞒爬,過濾和標記規(guī)則如下:

①?去除掉超過1000*600這原圖的邊界的anchor box

②?如果anchor box與ground truth的IoU值最大弓柱,標記為正樣本,label=1

③?如果anchor box與ground truth的IoU>0.7疮鲫,標記為正樣本吆你,label=1

④?如果anchor box與ground truth的IoU<0.3,標記為負樣本俊犯,label=0

? ? ?剩下的既不是正樣本也不是負樣本妇多,不用于最終訓練,label=-1

? ? ?什么是IoU:


? ? ?除了對anchor box進行標記外燕侠,另一件事情就是計算anchor box與ground truth之間的偏移量

? ?令:ground truth:標定的框也對應一個中心點位置坐標x*,y*和寬高w*,h*

anchor box:?中心點位置坐標x_a,y_a和寬高w_a,h_a

?所以者祖,偏移量:

?△x=(x*-x_a)/w_a?△y=(y*-y_a)/h_a?

? ?△w=log(w*/w_a)?△h=log(h*/h_a)

? ??通過ground truth box與預測的anchor box之間的差異來進行學習,從而是RPN網(wǎng)絡(luò)中的權(quán)重能夠?qū)W習到預測box的能力


2.2.2)?绢彤、rpn_loss_cls七问、rpn_loss_bbox、rpn_cls_prob

下面集體看下這三個茫舶,其中‘rpn_loss_cls’械巡、‘rpn_loss_bbox’是分別對應softmax,smooth L1計算損失函數(shù)饶氏,‘rpn_cls_prob’計算概率值(可用于下一層的nms非最大值抑制操作)

補充:

①?Softmax公式讥耗,

計算各分類的概率值

? ? ? ② Softmax Loss公式,

RPN進行分類時疹启,即尋找最小Loss值

在’rpn-data’中已經(jīng)為預測框anchor box進行了標記古程,并且計算出與gt_boxes之間的偏移量,利用RPN網(wǎng)絡(luò)進行訓練。

RPN訓練設(shè)置:在訓練RPN時喊崖,一個Mini-batch是由一幅圖像中任意選取的256個proposal組成的挣磨,其中正負樣本的比例為1:1雇逞。如果正樣本不足128,則多用一些負樣本以滿足有256個Proposal可以用于訓練茁裙,反之亦然


2.2.3)塘砸、proposal

1. layer {

2.? ? ? name: 'proposal'?

3.? ? ? type: 'Python'?

4.? ? ? bottom: 'rpn_cls_prob_reshape' #[1,18,40,60]==> [batch_size, channel,height呜达,width]Caffe的數(shù)據(jù)格式谣蠢,anchor box分類的概率

5.? ? ? bottom: 'rpn_bbox_pred'? # 記錄訓練好的四個回歸值△x, △y, △w, △h

6.? ? ? bottom: 'im_info'?

7.? ? ? top: 'rpn_rois'?

8.? ? ? python_param {?

9.? ? ? ? module: 'rpn.proposal_layer'?

10.? ? ? ? layer: 'ProposalLayer'?

11.? ? ? ? param_str: "'feat_stride': 16 \n'scales': !!python/tuple [4, 8, 16, 32]"

12.? ? ? }?

13.? ? }


在輸入中我們看到’rpn_bbox_pred’,記錄著訓練好的四個回歸值△x,?△y,?△w,?△h查近。

源碼中眉踱,會重新生成60*40*9個anchor box,然后累加上訓練好的△x,?△y,?△w,?△h,從而得到了相較于之前更加準確的預測框region proposal霜威,進一步對預測框進行越界剔除和使用nms非最大值抑制谈喳,剔除掉重疊的框;比如戈泼,設(shè)定IoU為0.7的閾值婿禽,即僅保留覆蓋率不超過0.7的局部最大分數(shù)的box(粗篩)。最后留下大約2000個anchor大猛,然后再取前N個box(比如300個)扭倾;這樣,進入到下一層ROI Pooling時region proposal大約只有300個

用下圖一個案例來對NMS算法進行簡單介紹

如上圖所示挽绩,一共有6個識別為人的框膛壹,每一個框有一個置信率。現(xiàn)在需要消除多余的:

·?按置信率排序: 0.95, 0.9, 0.9, 0.8, 0.7, 0.7

·?取最大0.95的框為一個物體框

·?剩余5個框中唉堪,去掉與0.95框重疊率IoU大于0.6(可以另行設(shè)置)模聋,則保留0.9, 0.8, 0.7三個框

·?重復上面的步驟,直到?jīng)]有框了唠亚,0.9為一個框

·?選出來的為: 0.95, 0.9

所以链方,整個過程,可以用下圖形象的表示出來

其中灶搜,紅色的A框是生成的anchor box,而藍色的G’框就是經(jīng)過RPN網(wǎng)絡(luò)訓練后得到的較精確的預測框祟蚀,綠色的G是ground truth box


2.2.4)、roi_data

1. layer {

2.? ? ? name: 'roi-data'?

3.? ? ? type: 'Python'?

4.? ? ? bottom: 'rpn_rois'?

5.? ? ? bottom: 'gt_boxes'?

6.? ? ? top: 'rois'?

7.? ? ? top: 'labels'?

8.? ? ? top: 'bbox_targets'?

9.? ? ? top: 'bbox_inside_weights'?

10.? ? ? top: 'bbox_outside_weights'?

11.? ? ? python_param {?

12.? ? ? ? module: 'rpn.proposal_target_layer'?

13.? ? ? ? layer: 'ProposalTargetLayer'?

14.? ? ? ? param_str: "'num_classes': 81"?

15.? ? ? }?

16.? ? }

為了避免定義上的誤解割卖,我們將經(jīng)過‘proposal’后的預測框稱為region proposal(其實前酿,RPN層的任務其實已經(jīng)完成,roi_data屬于為下一層準備數(shù)據(jù))

主要作用:

①?RPN層只是來確定region proposal是否是物體(是/否),這里根據(jù)region proposal和ground truth box的最大重疊指定具體的標簽(就不再是二分類問題了究珊,參數(shù)中指定的是81類)

②?計算region proposal與ground truth boxes的偏移量薪者,計算方法和之前的偏移量計算公式相同

經(jīng)過這一步后的數(shù)據(jù)輸入到ROI Pooling層進行進一步的分類和定位.


3)纵苛、ROI Pooling:

1. layer {

2.? ? ? name: "roi_pool5"?

3.? ? ? type: "ROIPooling"?

4.? ? ? bottom: "conv5_3"? #輸入特征圖大小

5.? ? ? bottom: "rois"? ? ? #輸入region proposal

6.? ? ? top: "pool5"? ? #輸出固定大小的feature map

7.? ? ? roi_pooling_param {?

8.? ? ? ? pooled_w: 7?

9.? ? ? ? pooled_h: 7?

10.? ? ? ? spatial_scale: 0.0625 # 1/16?

11.? ? ? }?

12.? ? }

從上述的Caffe代碼中可以看到剿涮,輸入的是RPN層產(chǎn)生的region proposal(假定有300個region proposal box)和VGG16最后一層產(chǎn)生的特征圖(60*40 512-d)言津,遍歷每個region proposal,將其坐標值縮小16倍取试,這樣就可以將在原圖(1000*600)基礎(chǔ)上產(chǎn)生的region proposal映射到60*40的特征圖上悬槽,從而將在feature map上確定一個區(qū)域(定義為RB*)。

在feature map上確定的區(qū)域RB*瞬浓,根據(jù)參數(shù)pooled_w:7,pooled_h:7,將這個RB*區(qū)域劃分為7*7初婆,即49個相同大小的小區(qū)域,對于每個小區(qū)域猿棉,使用max pooling方式從中選取最大的像素點作為輸出磅叛,這樣,就形成了一個7*7的feature map

? ? ? ?細節(jié)可查看:https://www.cnblogs.com/wangyong/p/8523814.html

以此萨赁,參照上述方法弊琴,300個region proposal遍歷完后,會產(chǎn)生很多個7*7大小的feature map杖爽,故而輸出的數(shù)組是:[300,512,7,7],作為下一層的全連接的輸入


4)敲董、全連接層:

經(jīng)過roi pooling層之后,batch_size=300, proposal feature map的大小是7*7,512-d,對特征圖進行全連接慰安,參照下圖腋寨,最后同樣利用Softmax Loss和L1 Loss完成分類和定位


通過full connect層與softmax計算每個region proposal具體屬于哪個類別(如人,馬化焕,車等)萄窜,輸出cls_prob概率向量;同時再次利用bounding box regression獲得每個region proposal的位置偏移量bbox_pred锣杂,用于回歸獲得更加精確的目標檢測框

即從PoI Pooling獲取到7x7大小的proposal feature maps后脂倦,通過全連接主要做了:

4.1)通過全連接和softmax對region proposals進行具體類別的分類

4.2)再次對region proposals進行bounding box regression,獲取更高精度的rectangle box


作為一枚技術(shù)小白元莫,寫這篇筆記的時候參考了很多博客論文赖阻,在這里表示感謝,同時踱蠢,未經(jīng)同意火欧,請勿轉(zhuǎn)載....

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市茎截,隨后出現(xiàn)的幾起案子苇侵,更是在濱河造成了極大的恐慌,老刑警劉巖企锌,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榆浓,死亡現(xiàn)場離奇詭異,居然都是意外死亡撕攒,警方通過查閱死者的電腦和手機陡鹃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門烘浦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萍鲸,你說我怎么就攤上這事闷叉。” “怎么了脊阴?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵握侧,是天一觀的道長。 經(jīng)常有香客問我嘿期,道長品擎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任备徐,我火速辦了婚禮孽查,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坦喘。我一直安慰自己盲再,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布瓣铣。 她就那樣靜靜地躺著答朋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棠笑。 梳的紋絲不亂的頭發(fā)上梦碗,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音蓖救,去河邊找鬼洪规。 笑死,一個胖子當著我的面吹牛循捺,可吹牛的內(nèi)容都是我干的斩例。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼从橘,長吁一口氣:“原來是場噩夢啊……” “哼念赶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起恰力,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤叉谜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后踩萎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體停局,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了董栽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片履怯。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖裆泳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柠硕,我是刑警寧澤工禾,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站蝗柔,受9級特大地震影響闻葵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜癣丧,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一槽畔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胁编,春花似錦厢钧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至市框,卻和暖如春霞扬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枫振。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工喻圃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粪滤。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓斧拍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親杖小。 傳聞我的和親對象是個殘疾皇子饮焦,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容