Mask RCNN
一、核心要點
(1)RoIAlign
mask rcnn的關鍵 一是RoIAlign,是將RoIPooling的插值方式,從最近鄰插值(INTER_NEAREST)方式變為雙線性插值。
這里復習一下關於RoI,RoIPooling的知識
RoI是Region of Interests 特征圖上感興趣的區域(“框”)
RoIPooling的過程是將一個個大小不同的box框,都映射成固定大小(w*h)的矩形框
具體操作是:先把RoI中的坐標映射到feature map上,得到feature map上的坐標后,使用Pooling得到輸出,在Pooling過程中需要計算Pooling后的結果對應到feature map上所占的范圍,然后在那個范圍中進行取max或average操作。使用RoIPooling會在RoI和extracted features之間對應位置產生偏移(introduce misalignments)。
所以使用RoIAlign 來解決這個問題。
論文中還和RoIWarp(J. Dai, K. He, and J. Sun. Instance-aware semantic segmentation via multi-task network cascades. In CVPR, 2016. 2, 3,4, 5, 6 )進行了比較,實驗結果表明RoIAlign的效果要好於 RoIWarp。
(2)實例分割同檢測並行進行
嘗試了兩種不同的faster rcnn的結構,ResNet C4和FPN結構。
從圖中可以看到,ResNet C4共享RoI層,而FPN是兩個任務分開做RoI。
mask Loss 只定義在了正例的RoIs上。
在該文章中RPN和 mask分支,訓練時,不共享特征;對於前邊的特征提取,RPN和mask共享基礎網絡結構。
(3)使用FCN對RoI進行實例分割
使用FCN對RoI生成的每一個mask進行pixel2pixel的預測。mask編碼了輸入目標的空間分布。
(4)類間無競爭的Lmask
對於每個RoI,其loss定義為L=Lcls +Lbox + Lmask
Lcls為分類損失,Lbox為bounding box回歸,Lmask為實例分割損失
生成k個m*m的mask,Lmask只定義在 k-th mask上對於一個具體為k類的gt,其他mask對loss沒有貢獻,這樣類間就沒有競爭。
對每一個像素使用sigmod,然后取RoI上所有像素的交叉熵的平均值,作為Lmask,
反向傳播的時候,Loss只對gt那一類進行計算和反向傳播,有效的避免了類別競爭,也使得分割和分類解耦(之前的FCN,是針對每一個像素進行softmax輸出,然后計算交叉熵)
實驗
實驗一
Instance Segmentation
- 說明 Mask RCNN效果好, ResNeXt-FPN網絡的表達能力最好
實驗二 剝離實驗分析
表二(a) Backbone Architecture實驗說明,ResNeXt-101-FPN的效果要最好
表二(b)說明計算loss時,使用sigmod要好於FCN的softmax
表二(c、d)說明RoIAlign的效果要好於RoIPool和RoIWarp
表二(e)說用使用FCN進行分割的效果要好於MLP(多層感知機)
實驗三 目標檢測
實驗四 關鍵點檢測
實驗五 cityscapes 上的效果