Faster R-CNN算法
??Faster R-CNN算法是作者Ross Girshick對Fast R-CNN算法的一種改進。Fast R-CNN在速度和精度上都有了不錯的結果,但仍有一些不足之處。Faster R-CNN算法同樣使用VGG-16網絡結構,檢測速度在GPU上達到5fps(包括候選區域的生成),準確率也有進一步的提升。在ILSVRC和COCO 2015競賽中獲得多個項目的第一名。在Faster R-CNN中提出了區域生成網絡(Region Proposal Network,RPN),將候選區域的提取和Fast R-CNN中的目標檢測網絡融合到一起,這樣可以在同一個網絡中實現目標檢測。Faster R-CNN主要是解決Fast R-CNN存在的問題:
- 候選區域提取方法耗時較長;
- 沒有真正實現end-to-end訓練測試。
??Faster R-CNN算法步驟:
- 將圖像輸入網絡得到相應的特征圖;
- 使用RPN結構生成候選框,將RPN生成的候選框投影到特征圖上獲得相應的特征矩陣;
- 將每個特征矩陣通過ROl pooling層縮放到7x7大小的特征圖,接著將特征圖展平通過一系列全連接層得到預測結果。
??上圖中各層的主要功能:
-
1) conv layers提取特征圖:
? 作為一種CNN網絡目標檢測方法,Faster R-CNN首先使用一組基礎的conv+relu+pooling層提取input image的feature maps,該feature maps會用于后續的RPN層和全連接層。 -
2) RPN(Region Proposal Networks):
? RPN網絡主要用于生成region proposals,首先生成一堆Anchor box,對其進行裁剪過濾后通過softmax判斷anchors屬于前景(foreground)或者后景(background),即是物體或者不是物體,所以這是一個二分類;同時,另一分支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回歸操作獲得物體的精確位置。
??Faster R-CNN算法可以看作是由R-CNN和Fast R-CNN演化而來。
Faster R-CNN存在的問題:
Faster R-CNN算法詳解:
-
conv layers: 在input-data層時,作者把原圖都reshape成M×N大小的圖片,conv layers中包含了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 layers中的pooling層kernel_size=2,stride=2,這樣使得經過pooling層,M×N矩陣都會變為(M/2)×\times×(N/2)大小。綜上所述,在整個conv layers中,conv和relu層不改變輸入輸出的大小,只有pooling層使輸出長寬都變為輸入的1/2。那么,一個MxN大小的矩陣經過conv layers固定變為(M/16)×\times×(N/16),這樣conv layers生成的feature map中都可以和原圖對應起來,最后得到51 ×\times× 39 ×\times× 256。
-
Region Propocal Networks(RPN): 經典的檢測方法生成檢測框都非常耗時,如OpenCV adaboost使用滑動窗口+圖像金字塔生成檢測框,或者如R-CNN使用SS(Selective Search)方法生成檢測框。而Faster R-CNN則拋棄了傳統的滑動窗口和SS方法,直接使用RPN生成檢測框,這也是Faster R-CNN的巨大優勢,能極大提升檢測框的生成速度。
??????????????????下圖中展示了RPN網絡的具體結構,可以看到,feature map經過一個3×3卷積核卷積后分成了兩條線,上面一條通過softmax對anchors分類獲得foreground和background(檢測目標是foregrounnd),因為是2分類,所以它的維度是2k scores。下面那條線是用于計算anchors的bounding box regression的偏移量,以獲得精確的proposal。它的維度是4k coordinates。而最后的proposal層則負責綜合foreground anchors和bounding box regression偏移量獲取proposal,同時剔除太小和超出邊界的proposal,其實網絡到這個Proposal Layer這里,就完成了目標定位的功能。
?
?
??1x1卷積核和3x3卷積核: 如果卷積的輸出輸入都只是一個平面,那么1x1卷積核并沒有什么意義,它是完全不考慮像素與周邊其他像素關系。 但卷積的輸出輸入是長方體,所以1x1卷積實際上是對每個像素點,在不同的channels上進行線性組合(信息整合),且保留了圖片的原有平面結構,調控depth,從而完成升維或降維的功能。
??候選區域(anchor): 特征可以看做一個尺度51 ×\times× 39的256通道圖像,對于該圖像的每一個位置,考慮9個可能的候選窗口:三種面積{1282^{2}2,2562^{2}2,5122^{2}2}×××三種比例{1:1,1:2,2:1},這些候選窗口稱為anchors。anchor的本質是SPP(spatial pyramid pooling)思想的逆向,而SPP本身就是將不同尺寸的輸入resize成為相同尺寸的輸出。所以SPP的逆向就是,將相同尺寸的輸出,倒推得到不同尺寸的輸入。下圖示出51 ×\times× 39個anchor中心,以及9種anchor示例。
??softmax判定foreground與background: 一個MxN大小的矩陣送入Faster R-CNN網絡后,到RPN網絡時變為(M/16)x(N/16),不妨設W=M/16,H=N/16。在進入reshape與softmax之前,先做了1x1卷積,如下圖所示。經過卷積的輸出圖像的大小為W ××× H ××× 18,這剛好對應了feature maps每一個點都有9個anchors,同時每個anchors又可能是foreground和background,所以這些信息都保存在W ××× H ××× (9 ××× 2)大小的矩陣。至于在softmax前后都接一個reshape layer的原因,其實只是為了便于softmax分類。
?? bounding box regression原理: 下圖所示的綠色框為飛機的Ground Truth(GT),紅色為提取的foreground anchors,那么即便紅色的框被分類器識別為飛機,但是由于紅色的框定位不準,這張圖相當于沒有正確的檢測出飛機。所以我們希望采用一種方法對紅色的框進行微調,使得foreground anchors和GT更加接近。
????對于窗口一般使用四維向量(x, y, w, h)表示,分別表示窗口的中心點坐標和寬高。對于下圖,紅色的框A代表原始的Foreground Anchors,綠色的框G代表目標的GT,我們的目標是尋找一種關系,使得輸入原始的anchor A經過映射得到一個跟真實窗口G更接近的回歸窗口G’,即:給定A=(Ax_xx?, Ay_yy?, Aw_ww?, Ah_hh?),尋找一種映射f,使得f(Ax_xx?, Ay_yy?, Aw_ww?, Ah_hh?)=(G’x_xx?, G’y_yy?, G’w_ww?, G’h_hh?),其中(G’x_xx?, G’y_yy?, G’w_ww?, G’h_hh?)≈(Gx_xx?, Gy_yy?, Gw_ww?, Gh_hh?)。
????那么經過何種變換才能從上圖中的A變為G’呢? 比較簡單的思路就是:
??????1. 先做平移
??????2. 再做縮放
????觀察上面4個公式發現,需要學習的是dx_xx?(A),dy_yy?(A),dw_ww?(A),dh_hh?(A)這四個變換。當輸入的anchor與GT相差較小時,可以認為這種變換是一種線性變換, 那么就可以用線性回歸來建模對窗口進行微調(注意,只有當anchors和GT比較接近時,才能使用線性回歸模型,否則就是復雜的非線性問題了)。對應于Faster R-CNN原文,平移量(tx_xx?, ty_yy?)與尺度因子(tw_ww?, th_hh?)如下:
????接下來的問題就是如何通過線性回歸獲得dx_xx?(A),dy_yy?(A),dw_ww?(A),dh_hh?(A)了。線性回歸就是給定輸入的特征向量X,學習一組參數W,使得經過線性回歸后的值跟真實值Y(即GT)非常接近,即Y=WX。對于該問題,輸入X是一張經過num_output=1的1 ×\times× 1卷積獲得的feature map,定義為ΦΦΦ;同時還有訓練傳入A與GT之間的變換量,即(tx_xx?, ty_yy?, tw_ww?, th_hh?),輸出是dx_xx?(A),dy_yy?(A),dw_ww?(A),dh_hh?(A)四個變換。那么目標函數可以表示為:
????其中Φ(A)Φ(A)Φ(A)是對應anchor的feature map組成的特征向量,w是需要學習的參數,d(A)是得到的預測值(*表示 x, y, w, h,也就是每一個變換對應一個上述目標函數)。為了讓預測值d?_*??(A)與真實值t?_*??差距最小,得到損失函數:
????函數優化目標為:
??對proposals進行bounding box regressiond: 看了RPN網絡的第一條線路后,再來看第二條線路,如下圖所示。經過卷積輸出圖像為W ××× H ××× 36,這里相當于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有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:對于一幅任意大小的P ××× Q圖像,傳入Faster R-CNN前首先reshape到M ××× N大小,im_info=[M, N, scale_factor]則保存了此次縮放的所有信息。然后經過conv layers,經過4次pooling變為W ××× H=(M/16) ××× (N/16)大小,其中feature_stride=16則保存了該信息,用于計算anchor偏移量。
??RPN網絡結構總結: 生成anchors -> softmax分類器提取fg anchors -> bbox reg回歸fg anchors -> proposal layer生成proposals。 -
ROI Pooling: RoI Pooling層負責收集proposal,并計算出proposal feature maps,送入后續網絡。Rol pooling層有2個輸入:原始的featrue map和RPN輸出的proposal boxes(大小各不相同)。
???????對于傳統的CNN(如alexnxt,VGG),當網絡訓練好后輸入的圖像尺寸必須是固定的,同時網絡輸出也是固定大小的vector 或matrix。如果輸入的圖像大小不定,這個問題就變得比較麻煩了。有2種解決辦法:1. 從圖像中crop一部分傳到網絡;2. 將圖像warp成需要大小后傳入網絡。兩種辦法的示意圖如下圖所示,可以看到無論采取哪種辦法都不好,要么crop破壞了圖像的完整結構,要么warp破壞了圖像原始形狀信息。
???????而RPN網絡生成的proposals的方法:對foreground anchors進行bound box regression,那么這樣獲得的proposal也是大小形狀各不相同,即也存在上述問題。所以Faster R-CNN提出了ROI Pooling來解決這個問題。
???????ROI Pooling layerl forward過程:proposal=[x1,y1,x2,y2]是對應M ××× N尺度的,所以首先使用spatial_scale參數將其映射回(M/16) ××× (N/16)大小的feature map尺度,之后將每個proposal水平方向和豎直方向都分成7份,對每一份都進行max pooling處理,這樣處理后,即使大小不同的proposal,輸出的結果都是7 ××× 7大小的,實現了fixed-length output(固定長度輸出),如下圖所示。
-
Classification: classification部分利用已經獲得的proposal featuer map,通過full connect層與softmax計算每個proposal具體屬于哪個類別(如車,人等),輸出cls_prob概率向量;同時再次利用Bounding box regression獲得每個proposal的位置偏移量bbox_pred,用于回歸更加精確的目標檢測框。classification部分網絡結構如下:
???????從ROI Pooling獲取到7 ××× 7=49大小的proposal feature maps后,送入后續的網絡,可以看到做了如下2件事:
?????????1. 通過全連接層和softmax對proposal進行分類,這實際上已經是識別的范疇了;
?????????2. 再次對proposals進行bounding box regression,獲取更高精度的rect box。
???????接下來我們來看看全連接層,簡單的示意圖如下所示。
???????其計算公式如下:
???????其中W和bias B都是預先訓練好的,即大小是固定,當然輸入X和輸出Y也是固定大小。所以,這也就印證了之前RIO Pooling的必要性。
??參考文章:https://blog.csdn.net/Lin_xiaoyi/article/details/78214874。
總結
以上是生活随笔為你收集整理的Faster R-CNN算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 理解Android Binder机制原理
- 下一篇: boost::stable_vector