Mask RCNN 學習筆記

    下面會介紹基於ResNet50的Mask RCNN網絡,其中會涉及到RPN、FPN、ROIAlign以及分類、迴歸使用的損失函數等python

    介紹時所採用的MaskRCNN源碼(python版本)來源於GitHub:https://github.com/matterport/Mask_RCNNgit

   下面的介紹都是基於這部分源碼進行的(少數地方會和原始論文中有差異,不過不影響整個網絡的理解)github

 

一) 、總體框架結構算法

經過對代碼的理解,從新繪製出一張MASKRCNN的總體架構圖數組

 

二) 、分解各個節點網絡

 

1) ResNet50網絡簡單介紹架構

ResNet50網絡主要用來提取圖片的特徵。框架

MASKRCNN網絡雖然對於輸入圖片的大小沒有要求,可是在代碼中存在IMAGE_MIN_DIMIMAGE_MAX_DIM兩個參數的定義,會將圖片統一成設定的大小。設定的規則這裏主要介紹兩種經常使用的方式:函數

①‘squre’:先將圖片較短邊按照IMAGE_MIN_DIM進行等比例縮放,再將圖片以零像素填充到IMAGE_MAX_DIM大小spa

 

②‘crop’:一樣,先將圖片較短邊按照IMAGE_MIN_DIM進行等比例縮放,再從圖片中隨機剪裁一個IMAGE_MIN_DIM大小的子圖片做爲輸入圖片

這裏,基於squre’這種方式介紹,即將參數IMAGE_MAX_DIM設定爲1024,所以,網絡的輸入圖片大小就是1024*1024

 

ResNet50網絡比較簡單,主要包括卷積、BNRELU三步提取特徵的操做,其中:

C1256*256*64表示特徵圖的大小爲256*256,特徵圖的個數是64

 

C2256*256*256表示特徵圖的大小爲256*256,共有256個特徵圖

 

C3128*128*512表示特徵圖的大小爲128*128,共有512個特徵圖

 

C464*64*1024表示特徵圖的大小爲64*64,共有1024個特徵圖

 

C532*32*2048表示特徵圖的大小爲32*32,共有2048個特徵圖

C1C2的特徵圖大小是同樣的,因此,FPN的創建也是基於從C2C5這四個特徵層上。

 

2) FPN網絡的創建

 

經過ResNet50網絡,獲得圖片不一樣階段的特徵圖,利用C2C3C4C5創建特徵圖金字塔結構

①將C5通過2561*1的卷積核操做獲得:32*32*256,記爲P5

 

②將P5進行步長爲2的上採樣獲得64*64*256,再與C4通過的2561*1卷積核操做獲得的結果相加,獲得64*64*256,記爲P4

 

P4進行步長爲2的上採樣獲得128*128*256,再與C3通過的2561*1卷積核操做獲得的結果相加,獲得128*128*256,記爲P3

 

P3進行步長爲2的上採樣獲得256*256*256,再與C2通過的2561*1卷積核操做獲得的結果相加,獲得256*256*256,記爲P2

 

⑤將P5進行步長爲2的最大池化操做獲得:16*16*256,記爲P6

結合從P2P6特徵圖的大小,若是原圖大小1024*1024,那各個特徵圖對應到原圖的步長依次爲[P2,P3,P4,P5,P6]=>[4,8,16,32,64]

 

3) Anchor錨框生成規則

 

基於上一步獲得的特徵圖[P2,P3,P4,P5,P6],介紹下MASKRCNN網絡中Anchor錨框的生成,根據源碼中介紹的規則,與以前的Faster-RCNN中的生成規則有一點差異。

①遍歷P2P6這五個特徵層,以每一個特徵圖上的每一個像素點都生成Anchor錨框

 

②以P2層爲例,P2層的特徵圖大小爲256*256,相對於原圖的步長爲4,這樣P2上的每一個像素點均可以生成一個基於座標數組[0,0,3,3]4*4面積爲16大小的Anchor錨框,固然,能夠設置一個比例SCALE,將這個基礎的錨框放大或者縮小,好比,這裏設置P2層對應的縮放比例爲16,那邊生成的錨框大小就是長和寬都擴大16倍,從4*4變成64*64,面積從16變成4096,固然在保證面積不變的前提下,長寬比能夠變換爲32*12864*64128*32,這樣以長、寬比率RATIO=[0.5,1,2]完成了三種變換,這樣一個像素點均可以生成3Anchor錨框。在Faster-RCNN中能夠將SCALE也能夠設置爲多個值,而在MASKRCNN中則是每一特徵層只對應着一個SCALE即對應着上述所設置的16

 

③以P2層每一個像素點位中心,對應到原圖上,則可生成256*256*3(長寬三種變換)=196608個錨框

 

④以P3層每一個像素點爲中心,對應到原圖上,則可生成128*128*3=49152個錨框

 

⑤以P4層每一個像素點爲中心,對到原圖上,則可生成64*64*3=12288錨框

 

⑥以P5層每一個像素點爲中心,對應到原圖上,則生成32*32*3=3072個錨框

 

⑦以P6層每一個像素點爲中心,對應到原圖上,則生成16*16*3=768個錨框

P2P6層一共能夠在原圖上生成261888Anchor錨框

 

4) 生成RPN網絡數據集

 

在上一步已經生成了26188Anchor錨框,須要藉助這些Anchors創建RPN網絡訓練時的正類和負類,

假設須要的正樣本與負樣本共計256Anchor,即RPN_TRAIN_ANCHORS_PER_IMAGE這個參數所指定。源碼中這步操做由如下幾方面構成:

①先找到全部真實框中那些同時框住了多個物體的框,並排除掉

 

②計算每一個Anchors與該圖片上標註的真實框ground truth之間的IOU

 若是anchor boxground truthIoU值最大,標記爲正樣本,label=1

 若是anchor boxground truthIoU>0.7,標記爲正樣本,label=1

若是anchor boxground truthIoU<0.3,標記爲負樣本,label=-1

剩下的既不是正樣本也不是負樣本,不用於最終訓練,label=0

同時,保證正樣本爲128個,負樣本爲128

除了對anchor box進行標記外,另外一件事情就是計算anchor boxground 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)

 什麼是IoU:

 

這樣,通過這一步,共找到128Anchor做爲正樣本和128Anchor做爲負樣本, 同時,保存了這256Anchor與真實框ground truth之間的偏移量

 

5) RPN網絡的分類與迴歸

①前向傳播計算分類得分(機率)和座標點偏移量

RPN網絡在分類和迴歸的時候,分別將每一層的每個Anchor分爲背景和前景兩類,以及迴歸四個位移量,好比P2層,特徵圖大小爲256*256,即像素點有256*256個,每一個像素點有三種長寬比例變換,一共有256*256*3Anchor,若是是分類則須要分別計算每一個Anchor爲前景的得分(機率)或爲背景的得分(機率),其數組可定義爲[256*256*3,2],相應的若是是偏移量的迴歸則數組對應着形式爲[256*256*3,4]

將從P2P6的全部層進行一樣的分類和迴歸操做,一共獲得[261888,2]的分類信息和[261888,4]的迴歸信息。

 

計算RPN網絡損失值反向傳播更新權重

生成RPN網絡數據集’這一步,在261888Anchors中得到了256個正負樣本且與真實框的偏移量。

分類:

從前向傳播計算獲得的全部Anchors得分數組中即上面所述的[261888,2]數組中找到這256個正樣本和負樣本所對應的得分,利用得分與正負樣本的標籤計算交叉熵損失值。

RPN分類使用的是基於Softmax函數的交叉熵損失函數,Softmax函數只要是將前向傳播計算的得分歸一化到0~1之間的機率值,同時,通過Softmax函數後,也能夠保證各個分類的機率不會出現負數

Softmax函數公式:

 

其中,表示類別j通過網絡前向傳播計算出來的得分,表示類別j通過Softmax函數後換算獲得的機率

基於Softmax的交叉熵公式:

 

其中,表示的是真實標籤,表示機率,下面用代替來表示機率,看下L的求導結果:

 

所以假設一個5分類任務,一張圖像通過Softmax層後獲得的機率向量p是[0.1,0.2,0.25,0.4,0.05],真實標籤y是[0,0,1,0,0],那麼損失回傳時該層獲得的梯度就是p-y=[0.1,0.2,-0.75,0.4,0.05]。這個梯度就指導網絡在下一次forward的時候更新該層的權重參數

 

迴歸:

從前向傳播計算獲得的全部Anchors偏移量數組中即上面所述的[261888,4]數組中找到這128個正樣本所在索引對應的偏移量,利用此前向傳播計算獲得的偏移量與正樣本與真實框之間計算的偏移量計算損失值,使用的是SmoothL1Loss

SmoothL1函數:

 

對應的損失函數:

其中,

分別表示由前向傳播計算的預測框的座標值,Anchor錨框對應的座標值,真實框對應的座標值

SmoothL1函數的求導:

 

將預測框與真實框偏移量之間的差值帶入上述公式後可獲得損失函數求導後的結果,用此更新權重實現反向傳播

 

6) 根據RPN調整生成ROI

這一部分對應着總網絡圖中的ProposalLayer,取出必定量的Anchors做爲ROI,這個量由源碼中參數POST_NMS_ROIS_TRAINING肯定,假設這個參數在訓練的時候設置爲2000,則咱們這裏須要從261888Anchors中取出2000個做爲ROI

首先,按照Anchors通過RPN網絡前向傳播計算得出的前景(或稱爲正樣本)的得分從高到低排序,取出前2000個得分最高的Anchors,相對應的將2000AnchorsRPN網絡前向傳播計算出的偏移量累加到Anchor box上獲得較爲準確的box座標。

其中,紅色的A框是生成的anchor box,而藍色的G’框就是通過RPN網絡訓練後獲得的較精確的預測框,綠色的Gground truth box

 

最後在返回前,對2000個框再進行一次非最大值抑制NMS操做

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

 

如上圖所示,一共有6個識別爲人的框,每個框有一個置信率。 
如今須要消除多餘的:

  • 按置信率排序: 0.95, 0.9, 0.9, 0.8, 0.7, 0.7
  • 取最大0.95的框爲一個物體框
  • 剩餘5個框中,去掉與0.95框重疊率IoU大於0.6(能夠另行設置),則保留0.9, 0.8, 0.7三個框
  • 重複上面的步驟,直到沒有框了,0.9爲一個框
  • 選出來的爲: 0.95, 0.9

進行非最大值抑制的目的主要是須要剔除掉重複的框,若是通過非最大值抑制操做後獲得的ROI沒有事先代碼中設定的2000個,則用0填充。

 

 

7) 生成RCNN網絡數據集

這一部分對應着總網絡圖中的DetectionTargetLayer

在通過ProposalLayer層以後獲得了2000個通過微調後的ROI,而在DetectionTargetLayer須要對2000ROI作如下幾步:

①首先剔除掉2000ROI中不符合條件的ROI,主要是在ProposalLayer層最後返回的時候若是不足2000個會用0填充湊足,將這些用0填充的所有排除掉,避免參與沒必要要的計算

 

②DetectionTargetLayer中會用到圖片中的真實框信息,因此,在使用以前一樣將全部真實框中那些同時框住了多個物體的框,並排除掉

 

③計算每一個ROI與真實框之間的IOU

若是ROIground truthIoU>0.5,標記爲正樣本

若是ROIground truthIoU<0.5,標記爲負樣本

 

假定正樣本個數只保留到100個,而負樣本通常保持是正樣本數的3倍,正負樣本總數則就能夠達到400個,這個400可有配置文件中TRAIN_ROIS_PER_IMAGE參數肯定

 

④對於每一個正樣本,進一步計算與其相交最大即最接近的真實框ground truth box,將這個真實框所對應的類別即class_id賦予這個正樣本,這樣RCNN網絡就能夠區分具體哪一個類別

 

⑤一樣,計算每一個正樣本ROI與最接近的真實框ground truth box之間的偏移量,這RPN中的計算公式同樣

 

RCNN網絡還須要保存與每一個正樣本ROI最接近的真實框ground truth boxmask掩碼信息,而且知道每一個mask大小爲參數MASK_SHAPE所指定,通常爲28*28,同時知道其所屬於的類別即class_id,進行保存

 

最後DetectionTargetLayer層返回400個正、負樣本,400個位移偏移量(其中300個由0填充),400個掩碼mask信息(其中300個由0填充)

 

8) ROI 對齊操做

經過DetectionTargetLayer層,在原圖上找到400ROI,由於這些ROI多是有各個特徵層產生的Anchor,因此,如今須要將這些ROI映射回特徵圖上

第一步,咱們須要知道每一個ROI如何和特徵層對應上,論文中提到的方法是利用下面的公式:

對於公式而言:w,h分別表示ROI寬度和高度;k是這個RoI應屬於的特徵層level;w,h=224,224時映射的level,通常取爲4,即對應着P4,至於爲何使用224,通常解釋爲是由於這是ImageNet的標準圖片大小,好比如今有一個ROI112*112,則利用公式能夠計算獲得k=3,即P3

第二步,開始討論對齊的方式

當完成每一個ROI能找到其對應的特徵層後,就一樣能夠算出其對應的步長,步長只要用於解釋ROI Align的原理,論文中提到的ROI Align,這個方法的思路:

①使用每一個ROI的長、寬除以步長,獲得ROI映射到特徵圖上的圖片大小,好比ROI113*113,對應P3層,步長爲8,則在特徵圖上的感興趣區域則爲14.13*14.13

②若是要將特徵圖上的感興趣區域對齊到7*7,則須要將14.13*14.13這個區域分紅49份,每一份的大小爲:2.02*2.02

③再將每一個2.02*2.02的小區域,平分四份,每一份取其中心點位置,而中心點位置的像素,採用雙線性插值法進行計算,這樣,就會獲得四個點的像素值取四個像素值中最大值做爲這個小區域(即:2.02*2.02大小的區域)的像素值,如此類推,一樣是49個小區域獲得49個像素值,組成7*7大小的feature map

以上介紹的是論文中的ROI Align方法,可是在這篇博文開頭提供的代碼連接中的源碼並非這樣處理的。對於ROI映射到特徵圖上的方法是同樣的,但當每一個ROI找到對應的特徵層厚,直接利用Crop and Resize操做,生成7*7大小的feature map

Mask掩碼分支則是對齊成14*14大小的feature map

 

9) RCNN網絡的類別分類、迴歸、mask掩碼分類

RCNN網絡的類別分類和迴歸與RPN網絡中的分類和迴歸是同樣的,損失函數也都是基於Softmax交叉熵和SmoothL1Loss,只是RPN網絡中只分前景(正類)、背景(負類),而RCNN網絡中的分類是要具體到某個類別(多類別分類)

 

mask掩碼分類

ROI 對齊操做中mask分支對齊成14*14大小的feature map,而且在‘生成RCNN網絡數據集’操做中知道每一個正樣本mask掩碼區域對應的class_id

i) 前向傳播:將14*14大小feature map經過反捲積變換爲[28*28*num_class],即每一個類別對應一個mask區域,稱之爲預測mask

 

ii) ‘生成RCNN網絡數據集’操做中的返回的mask也是28*28,而且知道每一個mask區域的真實類別class_id,稱之爲真實mask

 

iii) 經過當前獲得的真實mask中的類別class_id,遍歷全部的預測mask,找到class_id類別所對應的預測mask(前向傳播中介紹過每一個類別都有一個預測mask),比較真實mask與預測mask每一個像素點信息,用的是binary_cross_entropy二分類交叉熵損失函數

 

iv) binary_cross_entropy是二分類的交叉熵,實際是多分類softmax_cross_entropy的一種特殊狀況,當多分類中,類別只有兩類時,即0或者1,由於28*28大小的mask中只有01,便是像素和不是像素

這個是針對機率之間的損失函數,你會發現只有預測機率真實標籤)是相等時,loss才爲0,不然loss就是爲一個正數。並且,機率相差越大,loss就越大根據Loss值更改權重實現反向傳播

 

做爲一枚技術小白,寫這篇筆記的時候參考了不少博客論文,在這裏表示感謝,同時,未經贊成,請勿轉載....

相關文章
相關標籤/搜索