Mask RCNN 簡單使用


 涉及到的知識點補充:

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文件,通過訓練后,測試效果如下(標注的圖片不是很多,效果還行):

          

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

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


免責聲明!

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



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