1. 程式人生 > >Mask RCNN 學習筆記

Mask RCNN 學習筆記

目標 泛化 插值 留言 筆記 步長 roi 閱讀 開始

涉及到的知識點補充:

FasterRCNN:https://www.cnblogs.com/wangyong/p/8513563.html

RoIPooling、RoIAlign:https://www.cnblogs.com/wangyong/p/8523814.html

FPN:https://www.cnblogs.com/wangyong/p/8535044.html


首先,先看兩張圖(第一張圖來源於論文,第二張圖來源於網絡),如下:

技術分享圖片

(圖1)

技術分享圖片

(圖2)

圖1:可以看出MaskRCNN在有效檢測目標的同時輸出高質量的實例分割mask

圖2:可以看出MaskRCNN的網絡結構,作為FasterRCNN的擴展


1):用RolAlign代替了RoIPooling,RoIPooling使用取整量化,導致特征圖RoI映射回原圖RoI時空間不對齊明顯,造成誤差;RolAlign不使用取整量化而是采用雙線性插值,完成像素級的對齊;

2):FasterRcnn為每個候選對象ROI提供兩個輸出,一個類標簽,一個邊界框偏移量,為此,MaskRCNN並行添加了第三個分割mask的分支,mask分支是應用到每一個ROI上的一個小的FCN(Fully Convolutional Network),以pix2pix的方式預測分割mask。

MaskRCNN具有很好的泛化適應能力,可以和多種RCNN框架結合,比較常見的如:

1)FasterRCNN/ResNet;

2)FasterRCNN/FPN


技術分享圖片


在接下來的文章介紹中則主要結合FPN網絡記錄MaskRCNN的工作原理

如果要說清楚MaskRCNN的工作原理,先從數據標註開始,知道如何制作數據集,對理解網絡有幫助

一)、數據標註

利用labelImg和labelme的源碼,整合成一套新的標註工具,同時支持矩形和多邊形的繪制,界面如下圖(從上到下,從左到右依次是:菜單欄、工具箱、文件列表展示區、主圖繪制區、標簽展示區、狀態欄):

技術分享圖片

繪制完成,點擊保存後,會將圖中繪制的點坐標信息保存到JSON文件中,JSON文件的格式如下:


技術分享圖片

技術分享圖片

每一張圖片會產生一個與其同名的JSON文件,文件夾中的格式如下圖所示:

技術分享圖片

註:一張圖片只需對應一張JSON文件即可,而網絡在訓練的時候需要一個‘mask圖片’,這個會在代碼中利用JSON中坐標點臨時生成


二)、網絡原理

MaskRCNN作為FasterRCNN的擴展,產生RoI的RPN網絡和FasterRCNN網絡一樣,如想詳細了解這個過程,可以參看文章上述給出的FasterRCNN的博文,這裏不太敘述RPN網絡的原理,重點看下MaskRCNN其余部分的理解;

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

結構:ResNet101+FPN

代碼:TensorFlow+ Keras(Python)

代碼中將Resnet101網絡,分成5個stage,記為[C1,C2,C3,C4,C5];如果了解FPN網絡(也可以參看上面提供的FPN網絡博文鏈接),知道這裏的5個階段分別對應著5中不同尺度的feature map輸出,用來建立FPN網絡的特征金字塔(feature pyramid).

先通過兩張MaskRCNN整體網絡結構圖,再附帶一張繪制了stage1和stage2的層次結構圖(stage3到stage5的結構層次比較多,未繪制),來整體了解下MaskRCNN網絡。

MaskRCNN網絡結構泛化圖:

技術分享圖片

MaskRCNN網絡結構細化圖(可放大看):

技術分享圖片


stage1和stage2層次結構圖:

技術分享圖片

結合MaskRCNN網絡結構圖,註重點出以下幾點:

1) 雖然事先將ResNet網絡分為5個stage,但是,並沒有利用其中的Stage1即P1的特征,官方的說法是因為P1對應的feature map比較大計算耗時所以棄用;相反,在Stage5即P5的基礎上進行了下采樣得到P6,故,利用了[P2 P3 P4 P5 P6]五個不同尺度的特征圖輸入到RPN網絡,分別生成RoI.

2)[P2 P3 P4 P5 P6]五個不同尺度的特征圖由RPN網絡生成若幹個anchor box,經過NMS非最大值抑制操作後保留將近共2000個RoI(2000為可更改參數),由於步長stride的不同,分開分別對[P2 P3 P4 P5]四個不同尺度的feature map對應的stride進行RoIAlign操作,將經過此操作產生的RoI進行Concat連接,隨即網絡分為三部分:全連接預測類別class、全連接預測矩形框box、全卷積預測像素分割mask


3)損失函數:分類誤差+檢測誤差+分割誤差,即L=Lcls+Lbox+Lmask

Lcls、Lbox:利用全連接預測出每個RoI的所屬類別及其矩形框坐標值,可以參看FasterRCNN網絡中的介紹。

Lmask:

① mask分支采用FCN對每個RoI的分割輸出維數為K*m*m(其中:m表示RoI Align特征圖的大小),即K個類別的m*m的二值mask;保持m*m的空間布局,pixel-to-pixel操作需要保證RoI特征 映射到原圖的對齊性,這也是使用RoIAlign解決對齊問題原因,減少像素級別對齊的誤差。

K*m*m二值mask結構解釋:最終的FCN輸出一個K層的mask,每一層為一類,Log輸出,用0.5作為閾值進行二值化,產生背景和前景的分割Mask

這樣,Lmask 使得網絡能夠輸出每一類的 mask,且不會有不同類別 mask 間的競爭. 分類網絡分支預測 object 類別標簽,以選擇輸出 mask,對每一個ROI,如果檢測得到ROI屬於哪一個分 類,就只使用哪一個分支的相對熵誤差作為誤差值進行計算。(舉例說明:分類有3類(貓,狗,人),檢測得到當前ROI屬於“人”這一類,那麽所使用的Lmask為“人”這一分支的mask,即,每個class類別對應一個mask可以有效避免類間競爭(其他class不貢獻Loss)

② 對每一個像素應用sigmoid,然後取RoI上所有像素的交叉熵的平均值作為Lmask。

由於MaskRCNN網絡包含了很多之前介紹過的知識點,例如RPN,FPN,RoIPooling,RoIAlign,故這遍文章看上去顯得比較‘單薄’,如果想弄清楚MaskRCNN網絡,還是可以需要結合文章一開頭提到的幾遍博文一起閱讀…

文章開頭的時候,利用自己的標註工具,對細胞圖片進行標註,每個圖片產生一個JSON文件,通過訓練後,測試效果如下(標註的圖片不是很多,效果還行):

3)損失函數:分類誤差+檢測誤差+分割誤差,即L=Lcls+Lbox+Lmask

Lcls、Lbox:利用全連接預測出每個RoI的所屬類別及其矩形框坐標值,可以參看FasterRCNN網絡中的介紹。

Lmask:

① mask分支采用FCN對每個RoI的分割輸出維數為K*m*m(其中:m表示RoI Align特征圖的大小),即K個類別的m*m的二值mask;保持m*m的空間布局,pixel-to-pixel操作需要保證RoI特征 映射到原圖的對齊性,這也是使用RoIAlign解決對齊問題原因,減少像素級別對齊的誤差。

K*m*m二值mask結構解釋:最終的FCN輸出一個K層的mask,每一層為一類,Log輸出,用0.5作為閾值進行二值化,產生背景和前景的分割Mask

這樣,Lmask 使得網絡能夠輸出每一類的 mask,且不會有不同類別 mask 間的競爭. 分類網絡分支預測 object 類別標簽,以選擇輸出 mask,對每一個ROI,如果檢測得到ROI屬於哪一個分 類,就只使用哪一個分支的相對熵誤差作為誤差值進行計算。(舉例說明:分類有3類(貓,狗,人),檢測得到當前ROI屬於“人”這一類,那麽所使用的Lmask為“人”這一分支的mask,即,每個class類別對應一個mask可以有效避免類間競爭(其他class不貢獻Loss)

② 對每一個像素應用sigmoid,然後取RoI上所有像素的交叉熵的平均值作為Lmask。

由於MaskRCNN網絡包含了很多之前介紹過的知識點,例如RPN,FPN,RoIPooling,RoIAlign,故這遍文章看上去顯得比較‘單薄’,如果想弄清楚MaskRCNN網絡,還是可以需要結合文章一開頭提到的幾遍博文一起閱讀…

文章開頭的時候,利用自己的標註工具,對細胞圖片進行標註,每個圖片產生一個JSON文件,通過訓練後,測試效果如下(標註的圖片不是很多,效果還行):

技術分享圖片 技術分享圖片


作為一枚技術小白,寫這篇筆記的時候參考了很多博客論文,在這裏表示感謝,同時,轉載請註明出處......

如有疑問,歡迎留言...


Mask RCNN 學習筆記