天天看點

Mask RCNN學習筆記

原文位址:Mask RCNN

源碼:matterport - github(基于Python 3、Keras和TensorFlow)

源碼解析:TensorFlow實戰:Chapter-8上(Mask R-CNN介紹與實作)

Mask RCNN論文簡介

Mask R-CNN是基于R-CNN系列、FPN、FCIS等工作之上的,Mask R-CNN的思路很簡潔:Faster R-CNN針對每個候選區域有兩個輸出:種類标簽和bbox的偏移量。那麼Mask R-CNN就在Faster R-CNN的基礎上通過增加一個分支進而再增加一個輸出,即物體掩膜。

模型對圖檔中的每個對象執行個體生成包圍框(bounding boxes)和分割掩(segmentation masks)。基于特征金字塔網絡(FPN)和ResNet101的主幹(backbone)。

mask-RCNN執行個體分割架構:

Mask RCNN學習筆記

與Faster RCNN等比較及改進

Mask RCNN學習筆記

其中 黑色部分為原來的 Faster-RCNN,紅色部分為在 Faster網絡上的修改:

1)将 Roi Pooling 層替換成了 RoiAlign;

2)添加并列的 FCN 層(mask 層);

   先來概述一下 Mask-RCNN 的幾個特點(來自于 Paper 的 Abstract):

1)在邊框識别的基礎上添加分支網絡,用于 語義Mask 識别;

2)訓練簡單,相對于 Faster 僅增加一個小的 Overhead,可以跑到 5FPS;

3)可以友善的擴充到其他任務,比如人的姿态估計 等;

4)不借助 Trick,在每個任務上,效果優于目前所有的 single-model entries;

     包括 COCO 2016 的Winners。
           

技術要點

● 技術要點1 - 強化的基礎網絡

通過 ResNeXt-101+FPN 用作特征提取網絡,達到 state-of-the-art 的效果。

● 技術要點2 - ROIAlign

采用 ROIAlign 替代 RoiPooling(改進池化操作)。引入了一個插值過程,先通過雙線性插值到14*14,再 pooling到7*7,很大程度上解決了僅通過 Pooling 直接采樣帶來的 Misalignment 對齊問題。

PS: 雖然 Misalignment 在分類問題上影響并不大,但在 Pixel 級别的 Mask 上會存在較大誤差。

後面我們把結果對比貼出來(Table2 c & d),能夠看到 ROIAlign 帶來較大的改進,可以看到,Stride 越大改進越明顯。

● 技術要點3 - Loss Function

每個 ROIAlign 對應 K * m^2 次元的輸出。K 對應類别個數,即輸出 K 個mask,m對應 池化分辨率(7*7)。Loss 函數定義:

Lmask(Cls_k) = Sigmoid (Cls_k), 平均二值交叉熵 (average binary cross-entropy)Loss,通過逐像素的 Sigmoid 計算得到。通過對每個 Class 對應一個 Mask 可以有效避免類間競争(其他 Class 不貢獻 Loss )。

實作細節

超參數的設定與現有的Fast/Faster R-CNN基本一緻。雖然這些設定是在原始論文中是用于目标檢測的,但是我們發現我們的目标分割系統也是可以用。

訓練:與Faster R-CNN中的設定一樣,如果RoI與真值框的IoU不小于0.5,則為正樣本,否則為負樣本。掩碼損失函數LmaskLmask僅在RoI的正樣本上定義。掩碼目标是RoI及其對應的真值框之間的交集的掩碼。

我們采用以圖像為中心的訓練1。圖像被縮放(較短邊)到800像素12。批量大小為每個GPU2個圖像,每個圖像具有N個RoI采樣,正負樣本比例為1:31。 C4下層網絡的N為64(如1 2),FPN為512(如12)。我們使用8個GPU訓練(如此有效的批量大小為16)160k次疊代,學習率為0.02,在120k次疊代時學習率除以10。我們使用0.0001的權重衰減和0.9的動量。

RPN錨點跨越5個尺度和3個縱橫比12。為友善消融,RPN分開訓練,不與Mask R-CNN共享特征。本文中的,RPN和Mask R-CNN具有相同的下層網絡,是以它們是可共享的。

測試:在測試時,C4下層網絡(如2)中的候選數量為300,FPN為1000(如12)。我們在這些候選上執行檢測框預測分支,然後執行非極大值抑制29。然後将掩碼分支應用于評分最高100個檢測框。盡管這與訓練中使用的并行計算不同,但它可以加速推理并提高精度(由于使用更少,更準确的RoI)。掩碼分支可以預測每個RoI的KK個掩碼,但是我們隻使用第kk個掩碼,其中kk是分類分支預測的類别。然後将m×mm×m浮點數掩碼輸出的大小調整為RoI大小,并使用門檻值0.5将其二值化。

請注意,由于我們僅在前100個檢測框中計算掩碼,Mask R-CNN将邊緣運作時間添加到其對應的Faster R-CNN版本(例如,相對約20%)。

實驗結果

Mask RCNN學習筆記
Mask RCNN學習筆記

消融實驗結果

Mask RCNN學習筆記

結構:表a顯示了具有各種使用不同下層網絡的Mask R-CNN。它受益于更深層次的網絡(50對比101)和進階設計,包括FPN和ResNeXt(我們使用64×4d64×4d的普通的ResNeXt)。我們注意到并不是所有的架構都會從更深層次的或進階的網絡中自動獲益。

獨立與非獨立掩碼: Mask R-CNN解耦了掩碼和類預測:由于現有的檢測框分支預測類标簽,是以我們為每個類生成一個掩碼,而不會在類之間産生競争(通過像素級Sigmoid和二值化損失)。在表b中,我們将其與使用像素級Softmax和非獨立損失的方法進行比較(常用于FCN3)。這些方法将掩碼和類預測的任務結合,導緻了掩碼AP(5.5個點)的嚴重損失。這表明,一旦目标被歸類(通過檢測框分支),就可以預測二值化掩碼而不用擔心類别,這樣可以使模型更容易訓練。

類相關與類無關掩碼:我們預設預測類相關的掩碼,即每類一個m×mm×m掩碼。有趣的是,這種方法與具有類别無關掩碼的Mask R-CNN(即,預測單個m×mm×m輸出而不論是那一類)幾乎同樣有效:對于ResNet-50-C4掩碼AP為29.7,而對于類相關的對應的模型AP為30.3 。這進一步突出了我們的方法中的改進:解耦了分類和分割。

RoIAlign:表c顯示了對我們提出的RoIAlign層的評估。對于這個實驗,我們使用的下層網絡為ResNet-50-C4,其步進為16。RoIAlign相對RoIPool将AP提高了約3個點,在高IoU(AP75AP75)結果中增益更多。 RoIAlign對最大/平均池化不敏感,我們在本文的其餘部分使用平均池化。

此外,我們與采用雙線性采樣的MNC 中提出的RoIWarp進行比較。如實驗:目标分割所述,RoIWarp仍然四舍五入了RoI,與輸入失去了對齊。從表c可以看出,RoIWarp與RoIPool效果差不多,比RoIAlign差得多。這突出表明正确的對齊是關鍵。

我們還使用ResNet-50-C5下層網絡評估了RoIAlign,其步進更大,達到了32像素。我們使用與相同的上層網絡,因為res5不适用。表d顯示,RoIAlign将掩碼AP提高了7.3個點,并将掩碼的AP75AP75 提高了10.5個點(相對改善了50%)。此外,我們注意到,與RoIAlign一樣,使用步幅為32的C5特征(30.9 AP)比使用步幅為16的C4特征更加精準。 RoIAlign在很大程度上解決了使用大步進特征進行檢測和分割的長期挑戰。

最後,當與FPN一起使用時,RoIAlign顯示出1.5個掩碼AP和0.5個檢測框AP的增益,FPN具有更精細的多級步長。對于需要更精細對準的關鍵點檢測,即使使用FPN,RoIAlign也顯示出很大的增益。

掩碼分支:分割是一個像素到像素的任務,我們使用FCN來利用掩碼的空間布局。在表e中,我們使用ResNet-50-FPN下層網絡來比較多層感覺機(MLP)和FCN。使用FCN可以提供超過MLP 2.1個點的AP增益。為了與與MLP進行公平的比較,FCN的上層網絡的卷積層沒有被預訓練。

繼續閱讀