Mask R-CNN綜述
本專欄將從論文的角度解讀一下CV方向的一些經典神經網路模型及其貢獻與意義,以期加深自己的印象,後續可以隨時翻看並且學習其中好的tricks。這一期介紹基於 Faster R-CNN 的 Mask R-CNN ,看看其如何改進使得模型出色地完成了例項分割任務。
論文相關資訊
論文(連結)使用的資料集是MS COCO資料集,並且力壓前幾屆的冠軍模型們,比如FCIS,在COCO系列挑戰賽的例項分割、邊框目標檢測以及人體關鍵點檢測三個賽道中都取得了最佳成績。
網路架構
論文中的架構圖:
更為清晰的圖,轉自這裡:
從上圖與 Faster R-CNN 的架構對比可以看出,首先是在用於提取特徵的 backbone 部分,利用了 FPN
tricks
1、backbone部分:FPN or CNN
首先必須先理解一下 Faster R-CNN 的架構和 FPN架構,圖轉自這裡:
和
論文中的實驗,其中C4代表的就是原始的利用Conv4的特徵圖:
結果應該是比較顯然的,畢竟在目標檢測中對於小物體,傳統的CNN經過卷積池化之後可能在特徵圖上都沒有小物體的特徵了,所以能夠融合低層和高層特徵語義資訊然後綜合進行預測的FPN做的會更好,而且幾乎沒有消耗額外的資源,這才是FPN最厲害的地方。
2、RoI Pooling or RoI Align
這裡直接轉一下這篇部落格裡的原話:
論文中的實驗:
d組相比於c組的stride 16使用了更大的stride 32,更小的特徵圖會放大沒有對準的缺點,所以RoI Align是一個比較有效的改進。
3、Mask 分支
這也是最為關鍵也是比較難理解的一個部分,因為這個分支直接關係到分割的效果。
首先是一個 Head 模組,由於前面進行了多次卷積和池化,減小了對應的解析度,Mask 分支先利用反捲積進行解析度的提升,同時減少通道的個數,將RoI尺寸變成14x14x256。
最後經由FCN輸出了28x28x80的 mask ,這裡的80是類別數,28為特徵圖大小,指用28×28個畫素點來描述80個分類的分割外形。這一分支的損失函式 Lmask 使用的是二值交叉熵損失函式,即用於二分類的交叉熵損失函式,對於 28×28 中的每個點,都會輸出80個二值 mask(每個類別使用sigmoid輸出)。
需要注意的是,計算loss的時候,並不是每個類別的sigmoid輸出都計算二值交叉熵損失,而是該畫素屬於哪個類,哪個類的sigmoid輸出才要計算損失,並且在測試的時候,先通過分類分支預測的類別再來選擇相應的類別做 mask 預測。這與FCN原文中所用的方法不同,FCN是對每個畫素進行多類別softmax分類,然後計算交叉熵損失,相當於同時進行分類和逐畫素預測,很明顯,這種做法是會造成類間競爭的,而每個類別使用sigmoid輸出並計算二值損失,可以避免類間競爭,論文中的實驗也表明,通過這種方法,可以較好地提升效能:
而且FCN也是有效的:
總結
Mask R-CNN是集成了很多工作綜合而成的多工模型,比如用FPN來代替Faster R-CNN中傳統的CNN、利用FCN進行分割任務且將FCN中的分類和分割解耦成兩個分支;主要貢獻有兩點:第一是在Faster R-CNN上面加了一個 Mask 預測分支,較好地完成了例項分割任務;第二則是由於需要畫素級的精確定位,提出了RoI Align改良RoI Pooling,取得了不錯的效果。