1. 程式人生 > >MaskRCNN-ICCV2017 論文解讀

MaskRCNN-ICCV2017 論文解讀

文章: MaskRCNN
作者: Kaiming He, Georgia Gkioxari, Piotr Dollar, Ross Girshick
備註: FAIR, ICCV best paper

核心亮點

1) 提出了一個簡單,靈活,通用的例項分割模型框架
MaskRCNN 在 FasterRCNN 的基礎上進行改進, 在模型的head部分引入了一個新的mask預測分支, 在訓練階段, 該分支會與其他分支並行執行, 在測試階段, 雖然不是並行執行, 但是利用 NMS 減少了需要計算的候選框個數, 因此 MaskRCNN 模型整體增加的額外開銷較小.

2) 提出了RoI Align來解決 RoI 與 pooling後的特徵圖譜之間的不對齊問題


Fast/FasterRCNN 原始的 RoIPool 操作在進行池化時, 會進行兩次粗糙的量化操作, 這使得池化後的特徵圖譜與 RoI 中的資訊不能很好的對其, 對於畫素級任務例項分割來說, 這種非對齊會使得模型效能大大降低, 因此 MaskRCNN 提出用基於雙線性插值法的 RoI Align 代替 RoI Pool, 以此來解決非對齊問題.

論文細節

摘要

本文提出了一個簡單, 靈活, 通用的目標例項分割框架. 本文的方法可以有效的檢測圖片中的物體, 同時為每個例項生成一個高質量的掩膜, 我們將其稱為 Mask RCNN, 它是從 Faster RCNN擴充套件而來的, 添加了一個新的分支來並行預測物體掩膜. MaskRCNN可以輕易的進行訓練, 並且相對於FasterRCNN只增加了很少的開銷, 可以在5fps下執行. 不僅如此, MaskRCNN可以輕易的泛化到其他任務中, 如人體姿態識別. 本文的模型在COCO的三個系列任務都, 都取得了最好的效果.

背景介紹

本文意在提出一種通用的例項分割模型框架-MarkRCNN, 該模型擴充套件自FasterRCNN, 在FasterRCNN模型中的每一個RoI上, 新增一個與檢測分支平行執行的掩膜預測分支, 如圖1所示. 掩膜分支(mask branch) 是一個小型的FCN網路, 它應用在每一個RoI上, 以pixel-to-pixel的方式來預測一個分割掩膜. Mask RCNN易於實現, 且增加的額外開銷很小, 並且具有很大的靈活性, 是一個通用的例項分割模型框架. 在FasterRCNN中使用的RoI pooling是一種針對目標檢測任務的粗糙的pooling方法, 會造成一定程度上的不對齊結果, 為了克服這一點, 本文提出了RoIAlign, 用於保留準確的空間位置, RoIAlign可以將掩膜的精確度才提高10%~50%. 另外, 本文發現, 將二值掩膜預測和類別預測任務分開獨立進行是非常重要的一步, 因此, 我們為每一個類別都會單獨進行mask預測, 避免了不同類別之間的衝突. 這一點與FCN不同, FCN會對一個畫素點進行多類別的分類.
我們的模型在GPU上的執行速度大約為200ms/frame, 在8-GPU的單機上訓練時, 需要1到2天的時間.

Mask RCNN

Mask RCNN在概念上來說非常簡單: FasterRCNN對於每個候選框來說都有兩個輸出分支, 一個class label和一個bounding-box offset, 對此在MaskRCNN中我們添加了第三個分支用於輸出掩膜. 雖然這是一個看起來很自然的想法, 但是額外增加的掩膜分支和class, box分支並不相同, 它需要物體更加精確的空間位置. 因此, 我們還引入了一個在MaskRCNN中非常關鍵的元素:RoIAlign, 用於進行畫素對其. 來彌補FasterRCNN RoI pooling的粗糙對映造成的位置偏移問題.

Faster RCNN: 簡單回顧一下Faster RCNN, 它包含兩個階段, 第一個階段, 是RPN接面構, 用於生成候選框集合. 第二個階段, 本質上就是一個Fast RCNN, 利用RoI pooling從RoI中提出固定尺寸的特徵, 然後進行分類任務和邊框迴歸任務. 這兩個階段使用的特徵圖譜是共享的, 都來自backbone網路.

Mask RCNN: MaskRCNN使用了相同的two-stage結構, 第一階段使用了相同的RPN網路, 第二階段, 在執行class分類的box迴歸任務的 同時(並行), MaskRCNN會為每一個RoI生成一個二值掩膜. 這一點與許多現有系統不同, 它們都是在mask預測結果的基礎上進行分類任務的. 我們的靈感來自於Fast RCNN中class任務和box任務的並行執行.
Formally, 在訓練階段, 我們在每一個取樣的RoI上定義一個multi-task loss如: L = L c l s + L b o x + L m a s k L = L_{cls}+L_{box}+L_{mask} . 前兩個loss和Fast RCNN相同, 第三個分支對於每一個RoI的輸出維度為 K m 2 Km^2 , 代表這解析度 m × m m\times m 下的 K K 個二值掩膜, 每一個掩膜對應了一個類別(共 K K 個類別). 為此, 我們使用了 per-pixed sigmoid, 並且將 L m a s k L_{mask} 定義為平均二值交叉熵. 對於一個與真實類別 k k 相關聯的RoI, L m a s k L_mask 只在第 k k 個mask上有定義(其他mask不計入loss).
我們對 L m a s k L_{mask} 的定義使得網路模型可以為每個class生成mask, 避免了不同類別之間的競爭衝突. 並且利用分類分支的結果標籤來選擇對應的mask進行計算. 這樣做可以使得mask預測任務和class預測任務decouple.(與現有FCNs模型不同).

Mask Representation: 一個mask代表了一個物體的空間佈局. 因此, 和 class labels 或者 box offsets 不同(輸出維度較小), 提取mask的空間結構時可以通過畫素到畫素卷積的方式解決.
具體來說, 我們使用一個FCN從每個RoI中預測 m × m m\times m 的mask. 這使得mask分支中的每一層都維護著 m × m m\times m 的物體空間佈局矩陣, 而不用將其轉換成向量形式(缺少空間資訊). 和之前的工作(依賴於fc層預測mask)不同的是, 本文的全卷積表徵需要的引數更少, 同時通過實驗證明, 更加精確. 這種 pixel to pixel 的機制需要我們的RoI feature能夠精確與真實物體對齊, 保持其空間位置和結構資訊. 為此, 本文提出了RoIAlign來代替RoiPool.(這個替換很重要)

RoIAlign: RoIPool可以從每個RoI中提取到一個較小的固定的feature map(如, 7×7). RoIPool首先會將浮點型的feature map座標離散化成輸出size對應的整數, 然後根據每個bin內的畫素數值進行pooling操作. 但是這種pooling方式會引入RoI與提取後的feature map之間的misalignments, 這種misalignments對於分類任務來說或許影響不大, 但是對於predicting pixel-accurate mask任務來說就會造成很大的負面影響.
為了解決這個問題, 我們提出了RoIAlign層, 移除了RoIPool粗糙的量化計算, 將輸出的feature map與輸入的RoI對齊. RoIAlign的原理很簡單: 避免在RoI邊界或者bins上執行任何量化計算(即, 我們使用 x / 16 x/16 , 而不是 [ x / 16 ] [x/16] ). 我們利用雙線性插值法來計算每個位置上具體的畫素值, 並且對計算結果整合(max或者average). 具體計算細節如圖3所示. 我們注意到, 在不使用任何量化計算以後, 計算結果對於具體的取樣點和取樣數量的多少都不再那麼敏感了.

RoI Pooling存在兩次量化過程:

  • 將候選框邊界量化為整數座標值
  • 將量化後的邊界區域分割成 k × k k\times k 個bins, 並對每一個單元的邊界量化

可以看出, 上面的量化操作是一種很粗糙的Pooling方式, 由於feature map可以看做是對原圖特徵的高度概括資訊, 所以feature map上的細微差別映射回原圖時, 往往會導致產生很大的畫素位移差. 故此, 提出了RoI Align的解決思路: 取消量化操作, 使用雙線性內插的方法獲得座標為浮點數的畫素點上的影象數值, 從而將整個特徵聚集過程轉換為一個連續的操作. 其具體流程如下:

  • 遍歷每一個候選區域, 保持浮點數邊界不做量化
  • 將候選區域分割成 k × k k\times k 個bins, 每個bins的邊界也不做量化
  • 在每個bins中計算固定四個座標的位置, 使用雙線性插值的方法計算出這四個位置的值, 然後進行最大化操作.

Network Architecture: 為了說明本文方法的通用性, 我們利用多個模型結構初始化Mask RCNN. For clarity, we differentiate between: 1) 用於提取整個圖片特徵的backbone卷積結構, 2) 用於執行bounding-box recognition(cls,reg)任務和 mask prediction 任務的 network head.
我們將backbone architecture 命名為術語: network-depth-features. 我們測試了 50和101層的 ResNet, ResNeXt 網路. 原始的 FasterRCNN 在使用ReNets時, 利用的是第4段卷積塊的最後一層卷積層的輸出, 我們稱為 C4. 這個backbone, 即 ResNet-50-C4 是很多模型中的一個常用的選擇.
我們同時還使用了另一個更有效backbone—Feature Pyramid Network(FPN). FasterRCNN和FPN在提取RoI feature的level上有所區別, 但是其餘部分基本和ResNet相同. 使用 ResNet-FPN backbone 用於特徵提取可以獲得極大的效能提升(both acc and speed).
對於 network head, 我們根據之前的工作添加了一個全卷積的mask prediction 分支. Specifically, 我們將基於ResNet和FPN的 FasterRCNN 的 box heads進行擴充套件, 具體細節如圖4所示. ResNet-C4 的 head 包含 ResNet 的第5個卷積塊(即 9層的res5, 計算密集型). 對於FPN來說, 它的backbone就已經包含了res5, 因此可以具有效率更高的head(filers更少).
我們注意到本文的mask分支具有一個很簡單的結構. 其他更加複雜設計將會在以後的工作的進一步提高模型的效能.

Implementation Details

我們使用Faster RCNN原文提供的超引數.(無需調參也說明了MaskRCNN的魯棒性很高)

Training: 和FastRCNN一樣, 如果RoI與真實框的IOU大於0.5, 就會被認為是正樣本, 否則認為是負樣本(這裡與FasterRCNN不同). L m a s k L_{mask} 只會計算正樣本上的掩膜損失. mask target 是 RoI 和 真實mask之間的交集(注意不是直接根據真實mask計算損失). 我們使用 image-cengric (FastRCNN), 圖片會被resized成scale(shorter edge) 為800 畫素. minibatch為 2 img/GPU, 每個img含有N個sampled RoIs. 正負樣本比例為 1:3. 對於 C4 backbone來說, N為 64, 對於FPN來說, N為512.(因為FPN效率更高, 所以可以在一張圖片上計算更多的RoIs). 在8PGUs上訓練(即有效minibatch為16). lr為0.02, 每120k 迭代(iteration)會縮小10倍. weight decay為0.0001, momentum為0.9. 在使用ResNeXt時, one img/GPU, lr初始為0.02, 其他相同.
FPN的anchor具有 5 scales 和 3 aspect ratios. 為了方便進行消融實驗, RPN是被單獨訓練的, 並且沒有與Mask RCNN共享了卷積特徵(可共享, 只是為了方便沒有共享). 對於本文中的每一項, RPN和MaskRCNN都具有相同的backbones.

Inference: 在測試階段, proposal的數量為300 for C4 backbone, 1000 for FPN. 使用NMS選擇了最高score的100個boxes, 對其應用mask branch, 雖然這裡沒有采用訓練時的並行側率, 但是它可以加速預測速度, 同時能夠提高精度(因為只對更少的100個box使用了mask branch, 而訓練階段雖然是並行的, 但是進行mask branch的box更多一些). mask branch 可以對每個RoI預測出 K K 個maks, 但是我們只會使用第 k k 個mask來計算損失. 我們會將 m × m m\times m 的浮點型別的mask放縮到RoI的尺寸大小, 然後依據一個閾值(0.5)對mask的畫素值進行二值化操作. 由於我們只對100個top score box執行mask branch , 因此在模型預測時, MaskRCNN相比於FasterRCNN, 只增加了很小的開銷.

Experiments: Instance Segmentation

使用了 COCO 資料集, 採用 AP(averaged over IoU thresholds) 評價標準, AP 50 \text{AP}_{50} , AP 75 \text{AP}_{75} , AP S \text{AP}_{S} , AP M \text{AP}_{M} , AP L \text{AP}_{L} .

如表1所示, MarkRCNN 的效能超過 COCO2015 和 COCO2016的例項分割冠軍 MNC 和 FCIS.(並且 MaskRCNN 沒有使用 multi-scale train/test, horizontal flip test, OHEM 等 trick, 言外之意 MaskRCNN 的效能可以進一步利用這些 trick 提高)

Table2 顯示了對 MaskRCNN 的消融實驗分析結果.

Table3 顯示了 MaskRCNN 與當前的 state of art 的目標檢測方法在 COCO 資料集上的表現.

MaskRCNN for Human Pose Estimation:

Appendix A: Experiments on Cityscapes

Appendix B: Enhanced Results on COCO

下表顯示了 MarkRCNN 被各種 trick 增益後的效能表現