MASK R-CNN

https://github.com/facebookresearch/Detectron.

1. 素質四連

  • 要解決什麼問題?
    • 之前的研究使得物體檢測、圖像分割任務的性能有了很大的提高,但對物體分割任務(instance segmentation)沒有很大提升。
    • 建立一套基於物體分隔的模型架構。
  • 用了什麼方法解決?
    • 在Faster R-CNN添加了預測mask的部分(與預測bbox的類別信息與位置信息平行)。
  • 效果如何?
    • 沒有進行大規模優化,就在COCO數據集的三項任務——物體分割、物體檢測、人體關鍵點檢測 中超過其他所有模型。
    • 使用RoI Align解決 mis-alignment 的問題,提高模型精度(特別是對於小物體)。
  • 還存在什麼問題?
    • Faster R-CNN系模型的主要問題在於測試速度慢,達不到實時要求。
    • PS:爲了訓練COCO,論文中用8GP訓練了2天,對我這種就1塊GPU的人來說……

 

2. 網絡結構

2.1. 綜述

  • 大部分結構與Faster R-CNN相同。
  • 不同之處:
    • 使用RoIAlign替代RoIPool。
    • 添加預測mask的分支(與預測bbox平行)。

2.2. 論文配圖如下

  • 流程介紹:
    • 原始圖片(圖中最左邊的圖片)通過基礎網絡(圖中忽略)提取特徵。
    • RPN(圖中忽略)以基礎網絡特徵圖爲輸入,獲取一系列RoI(圖中 RoIAlign 層中的多個矩形框),即候選區域。
    • RoIAlign(圖中RoIAlign) 以基礎網絡特徵圖爲輸入,結合RPN層獲取的RoI,爲每個RoI獲取固定尺寸的特徵圖(圖中左邊數第一個conv層)。
    • 以RoIAlign層輸出的固定尺寸特徵圖爲輸入,預測圖像的bbox,包括位置信息與分類信息。(即圖中獲取 class box的結果)。
    • 以RoIAlign層輸出的固定尺寸特徵圖爲輸入,預測圖像的mask。(即圖中兩個conv以及最終結果)。

2.3. 模型分層

  • 基礎網絡,論文中使用了以下兩中基礎網絡:
    • Faster R-CNN原文中使用的ResNet。
    • 另一篇論文中提到的 ResNet-EPN。
  • Head Architecture:
    • 以基礎網絡輸出作爲輸入,預測bbox、instance segmentation信息。
    • 與Faster R-CNN不同之處(論文配圖如下)
      • 灰色背景部分是原先的結構,其他部分是Mask R-CNN的添加部分。

 

3. 重點

3.1. Mask

  • Mask的設計:
    • 對每個RoI分別預測其mask。
    • 解耦(decouple)mask和分類信息,換句話說,就是每一類物體分別預測mask。
    • 從模型角度,每個RoI的的mask預測結果尺寸爲[m, m, k],其中m爲mask的長寬,k爲分類數量。
    • 在實際運行時,根據RoI的分類信息,來選擇對應通道的mask。
  • 如何計算mask?
    • 輸入:RoIAlign輸出的固定尺寸特徵圖。
    • 輸出:shape爲[m, m, k]的mask。
    • 方法:論文中說,利用FCN論文(圖像分割算法)中的方法計算,本質就是利用轉置卷積操作。
    • 其他方法:參考資料TensorFlow Object Detection API 中的 box_predictor.py,_predict_masks函數使用了bilinear resize和convolution來替代轉置卷積。

3.2. RoIAlign

    • 在計算RoI Pooling時,會進行兩次量化(在這裏指的就是去掉小數部分,只保留整數):
      • 獲取每個RoI在基礎網絡特徵圖中對應的區域時,會對對應區域的特徵圖邊界進行量化。
      • 在將RoI對應的特徵圖轉化爲固定尺寸的特徵圖時,也會進行量化。
    • 問題描述:在進行量化時,特徵圖對應的原始數據會有減少,影響模型整體精度。
  • 解決方案:保留所有特徵圖所在浮點數位置座標,使用雙線性插值獲取特徵圖上所有點的取值。
  • 論文配圖如下:
    • 圖中黑色點就是當前特徵圖中各點位置(位置座標不一定是整數)。
    • 圖中虛線相交點位置就是原始特徵圖中各點的實際位置(位置座標都是整數)。
    • 以左上角黑點爲例,雙線性插值通過與四個當前黑點最近的實際特徵點(位置座標都是整數),來計算當前特徵點(位置座標不一定是整數)取值。

3.3. 訓練細節

  • 損失函數:
    • 分爲三部分:分類損失(與Faster R-CNN相同),位置損失(與Faster R-CNN相同),mask損失(本論文特有)。
    • Mask 損失:
      • mask的結果是K*m*m維向量,其中K爲類別數量,m*m是mask的最終輸出長寬。
      • 計算每個像素的sigmoid結果,最終Mask 損失就是二維交叉熵損失的平均值(average binary cross-entropy loss)。
  • 每個GPU同時訓練兩張圖片(作者用了8GPU,所以batch size是16),輸入圖片尺寸爲800*800。
  • 訓練時,每張圖片的RoI數量爲64/512(根據基礎網絡不同而改變);測試時每張圖片RoI數量爲300/1000。
  • 正反例比例爲1:3。
  • anchors使用 5 scales 和 3 aspect ratios。
  • weight decay爲0.0001。
  • 學習率:0.02,到120k iteration後爲除以10。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章