在做工業缺陷檢測使用過基於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圖,通道數為分類數。
總的結構附上一個圖,這個朋友畫的很詳細: