Mask R-CNN 算法淺談


在做工業缺陷檢測使用過基於MRCNN的算法效果還不錯,這里就講講源碼的算法思路

論文鏈接:https://arxiv.org/abs/1703.06870

源碼鏈接:https://github.com/matterport/Mask_RCNN

如果沒接觸過RCNN系列的算法本人建議時間有限的話就看看Faster R-CNN就可以了,老的算法沒必要細品了。

 

進入正文

 

總體架構

Mask-RCNN 大體框架還是 Faster-RCNN 的框架,可以說在基礎特征網絡之后又加入了全連接的分割子網,由原來的兩個任務(分類+回歸)變為了三個任務(分類+回歸+分割)。Mask R-CNN 是一個兩階段的框架,第一個階段掃描圖像並生成提議即RPN部分(proposals,即有可能包含一個目標的區域),第二階段分類提議並生成邊界框和掩碼即MRCNN部分。

 

 

總體流程如下

下圖是模型每個模塊的關系:

 

下圖是源碼的每一個模塊這個看了源碼可以看下:

 

1)輸入圖像;

 以三通道圖為例,下圖是Resnet101的backbone,基本模塊是殘差模塊,加入了一些跳級層和主干路的層想加

(這里相加前提是feature map通道數和尺寸相同然后逐像素相加,和darknet的跳級層add相加不太一樣)

2)將整張圖片輸入CNN(Resnet101),FPN特征金字塔提取出C1-C5。

將C5進行1*1的卷積減少通道數至256生成P5, P5進行3*3卷積生成同通道數P5,

P5上采樣*2 + C4進行1*1卷積減少通道數至256生成P4,P4進行3*3卷積生成同通道數P4,

P4上采樣*2 + C3進行1*1卷積減少通道數至256生成P3,P3進行3*3卷積生成同通道數P3,

P3上采樣*2 + C2進行1*1卷積減少通道數至256生成P2,P2進行3*3卷積生成同通道數P2,

P5還要進行一次最大池化尺寸/2生成P6(僅rpn使用);

【p2,p3,p4,p5,p6】-> RPN      【p2,p3,p4,p5】-> MRCNN

 

3)生成anchors:RPN共有5個特征尺度,anchors的基礎大小也是基於這5個特征尺度,

越小的特征尺度對應着越大的anchors,反之亦然。基於這五個尺度的圖片,每個尺度的特征圖中每個像素點生成三個anchors,比例分別是【0.5,1,2】。組后將五個尺度的anchors

疊加成為RPN所使用的anchors,注意:生成的anchors坐標是歸一化坐標;

 

4)用RPN生成預選框(proposals):同anchors的生成也是在五個特征尺度上進行,每個特

征圖經過RPN網絡生成兩個結果一個是rpn_class_logits(每個anchors對應的BG/FG類別logits

注:給損失函數用的)---softmax--->  rpn_class_prob(每個anchors的類別置信度), 另一個結

果是rpn_bbox(每個anchors的偏移量[dy, dx, log(dh), log(dw)] ),得到每個尺度的類別和偏移

后將五個尺度疊加合成RPN網絡輸出的類別和偏移;

接下來判定需要生成的預選框,將RPN網絡生成的偏移量更新給anchors,並生成經過細化/nms(非極大抑制)后的歸一化預選框,為之后的訓練(2000個)/預測(1000個)使用;

 

5)【訓練】接下來訓練和預測會有一些不同這里分開來,先說訓練。訓練會對生成的預選框進行處理,將實際打標的bbox和預選框做IOU計算,IOU大於0.5的記為正樣本,IOU小於0.5的記為負樣本,負樣本最終隨機選取兩倍於正樣本數的bbox,然后將正樣本和負樣本疊加,若疊加后的樣本不足100,則不足的地方填充0,這樣便生成了訓練專用的預選框;

 

6)【訓練】特征金字塔RoiAlign:把預選框映射到FPN對應的feature map[p2,p3,p4,p5]上。

這里需要使用一個映射公式來求預選框究竟對應了哪個尺度的feature map,公式如下:

k0 + log2(sqrt(w*h) / 224)

W/H為預選框對應原圖尺寸的寬高;

這里k0取4,表示若預選框的面積為224個像素則此預選框映射到P4的feature map;

224和K0這個數值是可以改動的,具體數據取決於數據集中實例的大小,本公式的意思就是面積224的實例占多數並將其映射到p4,這樣小於224的實例可以映射到p3p2,大於224的實例可以映射到p5(我們要將大的實例映射到小的feature map如p5,將小的實例映射到大的feature map如p2)

得到了映射的feature map后使用RoiAlign將對應的feature map區域摳出來resize到7*7,100個rois生成了;

 

7)【訓練】將rois帶入MRCNN網絡,網絡有兩個,第一個是全連接網絡生成兩個結果一個是類別回歸mrcnn_class_logits(每個rois對應的多分類類別logits,注:給損失函數用)---softmax---> mrcnn_class_prob(每個rois的類別置信度),第二個結果是坐標回歸mrcnn_bbox(每個rois的偏移量[dy, dx, log(dh), log(dw)]);第二個是全卷積語義分割網絡生成一個結果mrcnn_mask,大小為28*28的mask圖,通道數為分類數。至此開始進行loss函數的計算,訓練就此開始迭代;

 

以上是訓練部分的基本結構,預測部分結構如下:

8)  【預測】上接第四步,將預測要使用的1000個預選框進行RoiAlign生成1000個rois,帶入MRCNN全連接網絡中的類別,位置回歸,生成mrcnn_class_prob和mrcnn_bbox(偏移量);

9)  【預測】將mrcnn層預測的偏移量更新至1000個預選框得到1000個bbox標准化坐標

根據預測的圖片中存在的實例類別逐類NMS處理,高於置信度閾值並且非背景類的roi的n個數據保留,然后將處理過的bbox填0至100,得到了預測boxes;

10)【預測】將得到的100個預測boxes帶入MRCNN 全卷積語義分割網絡生成mrcnn_mask大小為28*28的mask圖,通道數為分類數。

總的結構附上一個圖,這個朋友畫的很詳細:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM