Mask RCNN 簡單使用

 涉及到的知識點補充:html

FasterRCNN:http://www.javashuo.com/article/p-vesnskjk-ch.htmlgit

 

RoIPooling、RoIAlign:http://www.javashuo.com/article/p-xslffnvr-cu.htmlgithub

 

FPN:http://www.javashuo.com/article/p-ocgsnlhz-bk.html網絡

 

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

                                               (圖1)ide

 

  

 

                                               (圖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文件,經過訓練後,測試效果以下(標註的圖片不是不少,效果還行):

          

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

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

相關文章
相關標籤/搜索