Mask R-CNN

Mask R-CNN 為 Faster R-CNN 的延伸應用, 主要作為 實例分割 (instance segmentation) 的方法, 實例分割的目的是要將每個物件標上 label 並且切割出每個標記 label 物件的輪廓。除了可以作為實例分割, Mask R-CNN 也保有原本 Faster R-CNN 在 object detection 上的功能, 並且也可以用來作為 person keypoint detection 用來偵測人體各軀幹的位置。實例分割可以參考來自 cs231n handouts 的截圖,

Mask R-CNN 利用了 single-model 在 COCO 的 3 種競賽 Keypoint detection, instance segmentation, bounding-box object detection 贏過了 COCO 2016 的冠軍。 讀者可以參考下圖 COCO 2016 segmentation 的冠軍 FCIS 與 Mask R-CNN 在 instance segmentation 上的差異, 可以發現只要 object 有重疊的現象 FCIS 都無法處理得很好, 但 Mask R-CNN 卻可以很明確地切割出重疊的 object

Mask R-CNN 利用了相當簡潔與彈性的方法進行實例分割, 主要跟 Faster R-CNN 不同的地方在於原架構有 2 個分支 1. Classification branch 與 2. Bounding box branch , 而 Mask R-CNN 的方法則是多加了另一個分支 3. Mask branch。

Mask branch 由 FCN (Fully Convolutional Network) 的概念所構成, Mask branch 會在每個 RoI (Region of Interest) 上以 pixel-to-pixel 的方式預測出 segmentation mask。但原來 Faster R-CNN 的設計無法在 inputs 與 outputs 間做 pixel-to-pixel 的對齊 (pixel-to-pixel alignment)。為了要解決對齊的問題, Mask R-CNN 多設計了 RoIAlign 用來保存原本的空間位置。FCN 的架構可以參考 Fully Convolutional Networks for Semantic Segmentation 提出的示意圖,

Faster R-CNN 簡短回顧:

Faster R-CNN 在訓練時由兩個階段所組成。第一階段, 以 RPN (Region Proposal Network) 產生候選外框 (bounding box)。
第二階段, 用原有的 Fast R-CNN 利用 RoI pooling 從候選外框擷取出特徵並進行分類與 bounding box regression。

Mask R-CNN:

Mask R-CNN 繼承原來 Fast R-CNN 的架構, 在第二階段時會對每一個 RoI 預測出類別與 box offset, 之後產出 binary mask。 Mask R-CNN 定義的 loss function: L = L_{cls} + L_{box}  + L_{mask} , 將 3 種 Loss 結合, L_{cls}L_{box} 定義可以參考 Faster R-CNN 原文, 與新加入的 L_{mask} 。在 Mask branch 時預測出 K m \times m 的 mask, 也就是對 K 種分類, 每種分類皆會會預測一種 mask。

在預測 binary mask 時, 會以 per-pixel sigmoid 對每個 pixel 預測, 而 L_{mask} 是對所有 binary cross-entropy loss 取平均。每個 RoI 都會有其對應的 ground-truth class k , 而只有第 k 個 mask 會貢獻於 L_{mask} 。 在 Fast R-CNN 的 Classification branch 對 RoI 進行預測類別, 並利用這個預測出的類別產出該類別的 mask, 這也是為什麼 L_{mask} 的定義能讓 network 對每個類別產出 mask 但又不會與其他類別的 mask 競爭。

RoIAlign

ROIPool 是用來提取 feature maps 的方法。 在 Fast RCNN, 會對每一個 RoI 進行 RoI pooling, 得到固定大小 (e.g., 7 x 7 ) 的 feature map。關於 RoI pooling layer 的詳細介紹可以參考連結 (Link) 或下圖。

source

在進行 RoI pooling 時會進行量化, 但在量化的過程中會造成 RoI 與擷取特徵 (extracted feature) 間產生 misalignment。為了解決這個問題, 本文提出了新的 RoIAlign Layer, 用來對 input 與擷取特徵做對齊。

source

如上圖, 假設一張 128x128 原圖與 25x25 的 feature map, 如果 RoI 是位於原圖左上角 15x15, 而要從 25x25 的 feature map 擷取此 RoI 特徵, 我們應該要擷取的 pixels 範圍大約為 2.93 x 2.93 pixels (15 \times \frac{25}{128} = 2.93 )。在原來的 RoI pooling 會捨去小數點擷取出 2 x 2 pixels, 也因為捨去所以會造成細微的 misalignment。不同的地方在於,
RoIAlign 利用雙線性內差 (Bilinear interpolation) 來得到位於 2.93 上大致的 pixel 數值。

Implementation Details

Training:

在訓練 Fast R-CNN 時, 每個 RoI 皆會被賦予標記, 如果 RoI 與 ground-truth box 的 IoU 大於 0.5, 就會賦予 positive 的標記, 反之如果小於 0.5 就會賦予 negative。 Mask loss (L_{mask}) 只會針對 positive 的 RoI 做計算, 預測的目標是希望 RoI 與對應的 ground-truth mask 交集能夠越多越好。

Inference:

再進行推論測試時, 會產出多個 proposal 並對每個 proposal 預測出 score 與 bounding box region, 再利用 NMS 以 score 與 bounding box region 作為依據, 將重疊的 proposal 結合。 Mask branch 會對分數前 100 高的 proposal 預測出該 proposal 該類別的 mask (所屬類別已經在 classification branch 時得到)。最後會將 m \times m 的 mask, resize 到原有 RoI 的大小, resize 後的 mask > 0.5 的數值做 threshold 就可以得到預測的 binary mask。 讀者可以參考 Mask R-CNN 在 COCO datasets 下的預測結果,

Conclusion:

Mask R-CNN 延伸了 Faster R-CNN 的架構, 在原有架構新加了 Mask branch 用來預測物件的 mask。Mask R-CNN 在 training 的時候可以以 end-to-end 的方式訓練出 object detector 與 mask detector。在本文中 Mask R-CNN 結合了 Feature Pyramid Network 擷取各個 layer 的 RoI 特徵, 讀者可以參考下圖與 FPN 的詳細作法,

跟 Faster R-CNN 不同的是原來 Faster R-CNN 會將原圖 resize 到短邊 600, Mask R-CNN 則是 resize 到 800, anchor boxes 的 scale 與 ratio 組合也由 12 種提升到 15 種, 讀者有興趣可以參考本文詳細的實驗結果與應用於人體姿態的估計。 目前 Mask R-CNN 的 code 還沒有正式 release, 但有其他開發者已經在不同 DL library 上實作但目前皆未完整實作出所有細節, 有興趣的讀者可以參考以下連結。

原文
Implementation in Pytorch
Implementation in Tensorflow
Implementation in Caffe
Reference 1
Reference 2

Share the joy
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

近期文章

近期迴響

彙整

分類

其它

Eugene Liu Written by:

Be First to Comment

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *