最詳細的Mask R-CNN論文筆記

個人博客:http://www.chenjianqu.com/

原文鏈接:http://www.chenjianqu.com/show-111.html

論文:Kaiming He Georgia Gkioxari Piotr Dollar Ross Girshick.Facebook AI Research (FAIR).Mask R-CNN.20 Mar 2017

素質三連

1.論文貢獻

在Faster R-CNN的基礎上提出Mask R-CNN實例分割模型。

提出了RoIAlign解決RoIPool中的misalign問題

增加一個全卷積網絡分枝用於預測mask

將class預測和mask預測解耦

2.實驗結果   

在COCO數據集獲得實例分割和目標檢測的SOTA,可以以5fps運行。

3.存在的問題

速度太慢,無法實時分割

摘要

    本文提出了一種計算簡單、靈活的目標實例分割的通用框架。可以高效的檢測圖像中的目標,同時對每個實例生成高質量的分割掩碼(segmentation mask)。這個方法稱之爲Mask R-CNN,它基於Faster R-CNN進行拓展,增加了與bounding box識別分枝並行的一個分枝,用於預測目標的掩碼。Mask R-CNN訓練簡單,它在Faster R-CNN上一小部分網絡得來的,可以以5fps運行。此外,Mask R-CNN很容易泛化到其它任務,比如進行人體姿態估計。Mask R-CNN在COCO系列挑戰賽上三個比賽:實例分割,目標檢測,人體關鍵點檢測上取得了最頂級的成績。Mask R-CNN在每項任務上默默的勝過所有的單模型,包括COCO 2016挑戰賽的冠軍。希望這個簡單高效的方法可以作爲一個堅實的baseline,有助於未來在實例級(instance-level)識別的研究。代碼開源:https://github.com/facebookresearch/Detectron  。

 

模型提出

    本文的目標是要讓Mask R-CNN在實例分割的地位,相當於Faster R-CNN之於目標檢測、FCN之於語義分割。實例分割需要正確檢測出圖片中所有的目標,同時精確的分割每個實體,這意味着需要聯合目標檢測和語義分割來實現。作者提出的Mask R-CNN框架如下:

1.jpg

    如圖所示,Mask R-CNN在Faster R-CNN的最後bounding box預測和分類的部分,增加了一個並行分枝用於預測每個RoI(Region of Interest)的分割掩碼。這個掩碼分枝(mask branch)相當於應用在每個RoI上的FCN,以逐像素分類的方式預測分割掩碼。

    與原始的Faster R-CNN相比,Mask R-CNN僅在最後增加了一個分枝,因此額外增加的計算量很小。但並不是直接放上去就可以了,需要引入一些其它設計。

    首先,Faster R-CNN沒有設計網絡輸入到輸出的像素到像素(pixel-to-pixel)對齊,它使用RoIPool用於每個候選框提取特徵,但是RoIPool的量化非常粗糙。爲了糾正這個問題,作者提出了無量化的RoIAlign層。RoIAlign的加入使得mask精度提高了10%到50%。

    其次,作者發現掩碼預測和分類預測的解耦非常重要,獨立的爲每個類預測一個二值掩碼,這樣不存在類別之間的競爭,並使用RoI分類分枝來預測類別。而FCN將每個像素進行分類,這樣分割和分類是耦合的。根據實驗這樣做不利於實例分割。

    Mask R-CNN在COCO實例分割任務上默默的超越了之前的單模型SOTA,順便在COCO目標檢測任務中勝出。Mask R-CNN可以在單個GPU上以200ms每幀的速度運行,在一個8-GPU機器上訓練兩天COCO任務。作者還通過在COCO關鍵點數據集上評估人體姿態估計任務展示了Mask R-CNN的通用性。

 

相關工作

    R-CNNFast R-CNNFaster R-CNN,DeepMask,FCIS,FCN

 

Mask R-CNN設計

    Faster R-CNN有兩個輸出分枝,對每個候選框預測其類別和包圍框的偏置。Mask R-CNN的設想很簡單,就是在Faster R-CNN的基礎上添加第三個分枝輸出目標的掩碼。但是mask預測不同於分類和包圍框迴歸,它需要對目標提取更加精細的空間特徵。

Faster R-CNN

    Faster R-CNN是是一個兩階段的目標檢測模型。第一個階段是RPN網絡,用於生成候選包圍框。第二個階段是Fast R-CNN,使用RoIPool抽取每個候選框的特徵,並對特徵進行邊框迴歸和分類。

Mask R-CNN

    Mask R-CNN也採用兩階段處理。第一階段也是使用RPN。第二個階段除了並行執行邊框迴歸和分類之外,還對每個RoI預測一個二值掩碼(binary mask)。Mask R-CNN不像其它實例分割模型那樣在mask的基礎上分類,而是採取並行預測的方法,簡化了pipeline。

    在訓練時,對每個RoI定義多任務損失(multi-task loss):L=Lcls + Lbox + Lmask,其中分類損失Lcls和邊框損失Lbox與Fast R-CNN一致。每個RoI的Mask分枝輸出維度爲Km^2,mxm是預測的mask的分辨率,K是類別數。最後逐像素應用sigmoid激活函數,定義Lmask爲平均二值交叉熵損失。設該RoI的ground-truth類別是k,則Lmask只定義在第k個mask,其它的mask不定義損失。

    Lmask的定義使得網絡對每個類別都產生非競爭的mask,然後根據分類分枝設置mask的標籤。這樣就將mask預測和class預測解耦了。對於實例分割來說,這種解耦很重要。反之,使用FCN那種耦合預測則不利於實例分割。

Mask表示

    Mask分枝使用FCN對每個RoI預測mxm的mask。之前很多工作都採用fc層預測mask,而這裏使用全卷積層,需要的參數更少而且精度更高。

    而這樣pixel-to-pixel的方法需要準確的RoI特徵能被對齊(RoI都是很小的特徵圖),以忠實的保持每個像素顯式的空間對應。這裏提出RoIAlign算法解決這個問題。

RoIAlign

    Fast R-CNN提出的RoIPool是從每個RoI抽取特徵的方法。RoIPool使用最大池化將RoI特徵圖(hxw)轉換爲預定義分辨率(HxW)特徵圖。每個ROI被定義爲四元組(r,c,h,w),其中(r,c)是候選框左上角的位置,(h,w)是候選框的高和寬。ROIPool是SPP的特例,是單級SPP。RoIPool首先確定池化的粒度,stride=(h/H,w/W),然後對stride進行量化,最後執行最大池化即可。下面舉個例子展示RoIPool的過程(參考https://zhuanlan.zhihu.com/p/37998710  )。

 已知當前特徵圖大小爲8x8,RoI爲(0,3,5,7),則RoI區域如下:

2.jpg

    設置池化後的大小爲HxW=(2,2),則stride=(5/2,7/2)=(2.5,3.5)。然後對stride進行整數量化,得stride=(2,3)。則得劃分後的RoI爲:

3.jpg

    然後進行最大池化,得抽取的特徵:

4.jpg

    上面這個過程有兩次整數量化。第一次,候選區域的(x,y,w,h)通常是小數,爲了方便操作會把它整數化。第二次,將整數化後的邊界區域平均分割成 k x k 個單元,對每一個單元的邊界進行整數化。如下:

5.jpg

    經過上述兩次整數化,此時的候選框已經和最開始迴歸出來的位置有一定的偏差,這個偏差會影響檢測或者分割的準確度。作者稱之爲misalignment

    爲了解決這個問題,ROIAlign方法取消整數化操作,保留了小數,使用雙線性插值的方法獲得座標爲浮點數的像素點上的圖像數值。

    如下圖所示,虛線部分表示特徵圖,實線表示ROI,這裏將ROI切分成2x2的單元格。如果採樣點數是4,那我們首先將每個單元格子均分成四個小方格(如紅色線所示),每個小方格中心就是採樣點。這些採樣點的座標通常是浮點數,所以需要對採樣點像素進行雙線性插值(如四個箭頭所示),就可以得到該像素點的值了。然後對每個單元格內的四個採樣點進行maxpooling,就可以得到最終的ROIAlign的結果。

6.jpg

網絡架構

    本文會使用不同的backbone,將這些它們命名爲network-depth-features。比如Faster R-CNN使用ResNet50作爲Backbone,而且它RoIPool所在的層是第四個階段,因此稱該backbone爲ResNet-50-C4。此外,本文還使用FPN作爲Backbone。FPN+Faster R-CNN,除了從特徵金字塔的不同層級抽取RoI特徵,其它方面都跟原始的Faster R-CNN一致。在網絡頭部,增加一個全卷積的mask預測分枝。兩種backbone下網絡頭部的架構如下:

7.jpg

 

實現細節

    超參數設置跟原始的Fast R-CNN/Faster R-CNN差不多。

訓練

    RPN生成的候選框中,只有與真實框的IOU大於0.5時,纔會被設置爲positive框。而Lmask僅僅定義在Positive框上。

    採用image-centric訓練方法,將原始圖片的短邊縮放置800pix。每個Mini-batch由兩張圖片,每張圖片採樣N個RoI,正負樣本數爲1:3。C4 backbone設置N=64,FPN設置N=512。在8個GPU上訓練,迭代160k次,初始學習率爲0.02,120k次訓練後除以10。權重衰減係數爲0.0001,動量係數爲0.9。

    對於RPN,設置5個尺度,3中長寬比。

推斷

    測試時,設置C4 backbone的候選框數爲300,FPN backbone爲1000。最後執行NMS。Mask分枝應用到最置信度的100個候選框,這可以加速推斷時間和提高精度。每個RoI預測出K個mask,但是這裏僅使用第k個mask,k是分類分枝的預測結果。Mask的分辨率爲mxm,最後將其resize爲RoI的大小,其二值化的閾值爲0.5。由於僅預測前100個RoI的mask,mask增加的計算量很小。

 

實例分割實驗

    在COCO數據集上進行實驗。COCO的標準評價指標包括:AP(平均IOU閾值),AP50,AP75,APS,APM,APL(不同尺度的AP)。這裏使用AP作爲mask IoU的評價指標。

實驗結果

    Mask R-CNN與其它SOTA方法的比較:

8.jpg

 Mask R-CNN的輸出可視化:

9.jpg

10.jpg

    下圖比較了FCIS++和Mask R-CNN的輸出結果:

11.jpg

    可以看到FCIS++對重疊目標的分割存在系統性的artifacts。

消融實驗

架構

    下表顯示Mask R-CNN使用backbone的結果。

12.jpg

是否將class預測和mask預測解耦

13.jpg

    可以看到解耦的網絡比耦合的網絡的AP提高了5.5,這表明一旦實例作爲一個整體被分類,就可以單獨預測一個mask,這樣更容易訓練。

RoI對齊

    可以看到RoI對齊的引入對精度的提升也很大。

14.jpg

    作者還使用ResNet-50-C5作爲backbone評估了RoIAlign的性能,該backbone有更大的stride=32,可以看到性能精度提升的幅度更大。而且發現該backbone優於ResNet-50-C4。

15.jpg

Mask分枝

    Mask分枝可以使用fc層,也可以使用fcn,下面的結果表明使用fcn的實例分割的精度要更高。

16.jpg

 

目標檢測實驗

    Mask R-NN與其它SOTA目標檢測模型的比較:

18.jpg

    上表中的Mask R-CNN推斷時僅僅輸出類別和標籤,Faster R-CNN,RoIAlign去掉Mask分枝訓練的。結果表明Mask R-CNN同樣可以用作目標檢測。

 

時間花費

推斷時間

    使用ResNet-101-FPN作爲backbone,Mask R-CNN在Nvidia Tesla M40 GPU上的運行時間爲195ms(CPU resize該圖片需要15ms)。而使用ResNet-101-C4,則需要花費~400ms。

訓練時間

    使用ResNet-50-FPN作爲backbone,使用COC trainval135k作爲數據集,在一個8-GPU上訓練需要花費32小時。若使用ResNet-101-FPN則需要花費44小時。

 

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