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 Align 的基本原理和實現細節。
- 強烈推薦看上面這篇文章,但我自己還是要稍微總結一下。
- RoIAlign要解決的問題(即RoI Pooling存在缺陷):
-
- 在計算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。