1. 程式人生 > 實用技巧 >Mask R-CNN綜述

Mask R-CNN綜述

本專欄將從論文的角度解讀一下CV方向的一些經典神經網路模型及其貢獻與意義,以期加深自己的印象,後續可以隨時翻看並且學習其中好的tricks。這一期介紹基於 Faster R-CNN 的 Mask R-CNN ,看看其如何改進使得模型出色地完成了例項分割任務。

論文相關資訊

在這裡插入圖片描述
論文(連結)使用的資料集是MS COCO資料集,並且力壓前幾屆的冠軍模型們,比如FCIS,在COCO系列挑戰賽的例項分割、邊框目標檢測以及人體關鍵點檢測三個賽道中都取得了最佳成績。

網路架構

論文中的架構圖:

在這裡插入圖片描述
更為清晰的圖,轉自這裡
在這裡插入圖片描述
從上圖與 Faster R-CNN 的架構對比可以看出,首先是在用於提取特徵的 backbone 部分,利用了 FPN

(Feature Pyramid Network,特徵金字塔網路,為了解決多尺度檢測的問題而引入,具體可以看這篇部落格)來代替 CNN ,然後利用RoI Align()代替了 RoI Pooling,並且多了一個基於FCN(Fully Convolutional Network,全卷積網路,用於語義分割,具體可以看這篇部落格)的用於逐畫素例項分割的 Mask Prediction Branch,變成了一個三分支的多工模型。

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,取得了不錯的效果。