一、創新點和解決的問題
創新點
設計Region Proposal Networks【RPN】,利用CNN卷積操作后的特征圖生成region proposals,代替了Selective Search、EdgeBoxes等方法,速度上提升明顯;
訓練Region Proposal Networks與檢測網絡【Fast R-CNN】共享卷積層,大幅提高網絡的檢測速度。
解決的問題
繼Fast R-CNN后,在CPU上實現的區域建議算法Selective Search【2s/image】、EdgeBoxes【0.2s/image】等成了物體檢測速度提升上的最大瓶頸。
二、整體框架
我們先整體的介紹下上圖中各層主要的功能:
1)、Conv layers提取特征圖:
作為一種CNN網絡目標檢測方法,Faster RCNN首先使用一組基礎的conv+relu+pooling層提取input image的feature maps,該feature maps會用於后續的RPN層和全連接層
2)、RPN(Region Proposal Networks):
RPN網絡主要用於生成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回歸操作獲得物體的精確位置.
三、網絡結構
現在,通過上圖開始逐層分析
1)、Conv layers
Faster RCNN首先是支持輸入任意大小的圖片的,比如上圖中輸入的P*Q,進入網絡之前對圖片進行了規整化尺度的設定,如可設定圖像短邊不超過600,圖像長邊不超過1000,我們可以假定M*N=1000*600(如果圖片少於該尺寸,可以邊緣補0,即圖像會有黑色邊緣)
① 13個conv層:kernel_size=3,pad=1,stride=1;
卷積公式:
所以,conv層不會改變圖片大小(即:輸入的圖片大小=輸出的圖片大小)
② 13個relu層:激活函數,不改變圖片大小
③ 4個pooling層:kernel_size=2,stride=2;pooling層會讓輸出圖片是輸入圖片的1/2
經過Conv layers,圖片大小變成(M/16)*(N/16),即:60*40(1000/16≈60,600/16≈40);則,Feature Map就是60*40*512-d(注:VGG16是512-d,ZF是256-d),表示特征圖的大小為60*40,數量為512
2)、RPN(Region Proposal Networks):
為了進一步更清楚的看懂RPN的工作原理,將Caffe版本下的網絡圖貼出來,對照網絡圖進行講解會更清楚
(2.1) rpn_cls、 rpn_bbox
Feature Map進入RPN后,先經過一次3*3的卷積,同樣,特征圖大小依然是60*40,數量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.2)、Anchors的生成規則
前面提到經過Conv layers后,圖片大小變成了原來的1/16,令feat_stride=16,在生成Anchors時,我們先定義一個base_anchor,大小為16*16的box(因為特征圖(60*40)上的一個點,可以對應到原圖(1000*600)上一個16*16大小的區域),源碼中轉化為[0,0,15,15]的數組,參數ratios=[0.5, 1, 2]scales=[8, 16, 32]
先看[0,0,15,15],面積保持不變,長、寬比分別為[0.5, 1, 2]是產生的Anchors box
如果經過scales變化,即長、寬分別均為 (16*8=128)、(16*16=256)、(16*32=512),對應anchor box如圖
綜合以上兩種變換,最后生成9個Anchor box
特征圖大小為60*40,所以會一共生成60*40*9=21600個Anchor box
源碼中,通過width:(0~60)*16,height(0~40)*16建立shift偏移量數組,再和base_ancho基准坐標數組累加,得到特征圖上所有像素對應的Anchors的坐標值,是一個[216000,4]的數組
(2.3)rpn-data
這一層主要是為特征圖60*40上的每個像素生成9個Anchor box,並且對生成的Anchor box進行過濾和標記,參照源碼,過濾和標記規則如下:
① 去除掉超過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
除了對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網絡中的權重能夠學習到預測box的能力
(2.4)rpn_loss_cls、rpn_loss_bbox、rpn_cls_prob
‘rpn_loss_cls’、‘rpn_loss_bbox’是分別對應softmax,smooth L1計算損失函數,‘rpn_cls_prob’計算概率值(可用於下一層的nms非最大值抑制操作)
(2.5)proposal
源碼中,會重新生成60*40*9個anchor box,然后累加上訓練好的△x, △y, △w, △h,從而得到了相較於之前更加准確的預測框region proposal,進一步對預測框進行越界剔除和使用nms非最大值抑制,剔除掉重疊的框;比如,設定IoU為0.7的閾值,即僅保留覆蓋率不超過0.7的局部最大分數的box(粗篩)。最后留下大約2000個anchor,然后再取前N個box(比如300個);這樣,進入到下一層ROI Pooling時region proposal大約只有300個
(2.6)roi_data
為了避免定義上的誤解,我們將經過‘proposal’后的預測框稱為region proposal(其實,RPN層的任務其實已經完成,roi_data屬於為下一層准備數據)
主要作用:
① RPN層只是來確定region proposal是否是物體(是/否),這里根據region proposal和ground truth box的最大重疊指定具體的標簽(就不再是二分類問題了,參數中指定的是81類)
② 計算region proposal與ground truth boxes的偏移量,計算方法和之前的偏移量計算公式相同
經過這一步后的數據輸入到ROI Pooling層進行進一步的分類和定位.
剩下的就是Fast R-CNN了。
參考:
https://www.cnblogs.com/wangyong/p/8513563.html
https://blog.csdn.net/WoPawn/article/details/52223282