原文: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)載....