1. 程式人生 > >Mask-RCNN論文解讀

Mask-RCNN論文解讀

   作者:夏    敏           

編輯:祝鑫泉           


Mask R-CNN介紹


Mask R-CNN是基於Faster R-CNN的基於上演進改良而來,FasterR-CNN並不是為了輸入輸出之間進行畫素對齊的目標而設計的,為了彌補這個不足,我們提出了一個簡潔非量化的層,名叫RoIAlign,RoIAlign可以保留大致的空間位置,除了這個改進之外,RoIAlign還有一個重大的影響:那就是它能夠相對提高10%到50%的掩碼精確度(Mask Accuracy),這種改進可以在更嚴格的定位度量指標下得到更好的度量結果。第二,我們發現分割掩碼和類別預測很重要:為此,我們為每個類別分別預測了一個二元掩碼。基於以上的改進,我們最後的模型Mask R-CNN的表現超過了之前所有COCO例項分割任務的單個模型,本模型可以在GPU的框架上以200ms的速度執行,在COCO的8-GPU機器上訓練需要1到2天的時間。

MaskR-CNN擁有簡潔明瞭的思想:對於FasterR-CNN來說,對於每個目標物件,它有兩個輸出,一個是類標籤(classlabel),一個是邊界框的抵消值(bounding-box offset),在此基礎上,Mask R-CNN方法增加了第三個分支的輸出:目標掩碼。目標掩碼與已有的class和box輸出的不同在於它需要對目標的空間佈局有一個更精細的提取。接下來,我們詳細介紹Mask R-CNN的主要元素,包括Fast/Faster R-CNN缺失的畫素對齊(pixel-topixel alignment)。

1

Mask R-CNN的工作原理

Mask R-CNN 使用了與Faster R-CNN相通的兩階段流程,第一階段叫做RPN(Region Proposal Network),此步驟提出了候選物件邊界框。第二階段本質上就是FastR-CNN,它使用來自候選框架中的RoIPool來提取特徵並進行分類和邊界框迴歸,但Mask R-CNN更進一步的是為每個RoI生成了一個二元掩碼,我們推薦讀者進一步閱讀Huang(2016)等人發表的“Speed/accuracy trade-offs for modern convolutional object detectors”論文詳細對比Faster R-CNN和其他框架的不同。

掩碼將一個物件的空間佈局進行了編碼,與類標籤或框架不同的是,Mast R-CNN可以通過卷積的畫素對齊來使用掩碼提取空間結構。

ROIAlign:ROIPool是從每個ROI中提取特徵圖(例如7*7)的標準操作。

網路架構(Network Architecture):為了證明Mast R-CNN的普遍性,我們將Mask R-CNN的多個構架例項化,為了區分不同的架構,文中展示了卷積的主幹架構(backbone architecture),該架構用於提取整張圖片的特徵;頭架構(headarchitecture),用於邊框識別(分類和迴歸)以及每個RoI的掩碼預測。

在Faster R-CNN網路上的修改,具體包括:

(1)將ROI Pooling層替換成了ROIAlign;

(2)添加了並列的FCN層(Mask層)。

2

技術要點

一、增強了基礎網路

將ResNeXt-101+FPN用作特徵提取網路,達到State-of-the-art的效果。

二、加入了ROIAlign層

ROIPool是一種針對每一個ROI的提取一個小尺度特徵圖(E.g. 7x7)的標準操作,它用以解決將不同尺度的ROI提取成相同尺度的特徵大小的問題。ROIPool首先將浮點數值的ROI量化成離散顆粒的特徵圖,然後將量化的ROI分成幾個空間的小塊(Spatial Bins),最後對每個小塊進行Max Pooling操作生成最後的結果。

通過計算[x/16]在連續座標x上進行量化,其中16是特徵圖的步長,[ . ]表示四捨五入。這些量化引入了ROI與提取到的特徵的不對準問題。由於分類問題對平移問題比較魯棒,所以影響比較小。但是這在預測畫素級精度的掩模時會產生一個非常的大的負面影響。

由此,作者提出ROIAlign層來解決這個問題,並且將提取到的特徵與輸入對齊。方法很簡單,避免對ROI的邊界或者塊(Bins)做任何量化,例如直接使用x/16代替[x/16]。作者使用雙線性插值(Bilinear Interpolation)在每個ROI塊中4個取樣位置上計算輸入特徵的精確值,並將結果聚合(使用Max或者Average)。

用例子具體分析一下上述區域不匹配問題。如圖所示,這是一個Faster-RCNN檢測框架。輸入一張800*800的圖片,圖片上有一個665*665的包圍框(框著一隻狗)。圖片經過主幹網路提取特徵後,特徵圖縮放步長(stride)為32。因此,影象和包圍框的邊長都是輸入時的1/32。800正好可以被32整除變為25。但665除以32以後得到20.78,帶有小數,於是ROI Pooling直接將它量化成20。接下來需要把框內的特徵池化7*7的大小,因此將上述包圍框平均分割成7*7個矩形區域。顯然,每個矩形區域的邊長為2.86,又含有小數。於是ROI Pooling再次把它量化到2。經過這兩次量化,候選區域已經出現了較明顯的偏差(如圖中綠色部分所示)。更重要的是,該層特徵圖上0.1個畫素的偏差,縮放到原圖就是3.2個畫素。那麼0.8的偏差,在原圖上就是接近30個畫素點的差別,影響還是很大的。

640?wx_fmt=jpeg

具體方法要點:

  • 遍歷每一個候選區域,保持浮點數邊界不做量化。

  • 將候選區域分割成k x k個單元,每個單元的邊界也不做量化。

  • 在每個單元中計算固定四個座標位置,用雙線性內插的方法計算出這四個位置的值,然後進行最大池化操作。

三、改進了分割Loss

由原來的基於單畫素Softmax的多項式交叉熵變為了基於單畫素Sigmod二值交叉熵。該框架對每個類別獨立地預測一個二值掩模,沒有引入類間競爭,每個二值掩模的類別依靠網路ROI分類分支給出的分類預測結果。這與FCNs不同,FCNs是對每個畫素進行多類別分類,它同時進行分類和分割,基於實驗結果表明這樣對於物件例項分割會得到一個較差的效能。

下面介紹一下更多的細節,在訓練階段,作者對於每個取樣的ROI定義一個多工損失函式$L=L_{cls}+L_{box}+L_{mask}$,前兩項不過多介紹。掩模分支對於每個ROI會有一個$Km^2$維度的輸出,它編碼了$K$個解析度為$m\times m$的二值掩模,分別對應著$K$個類別。因此作者利用了A Per-pixel
Sigmoid,並且定義為平均二值交叉熵損失(The Average Binary Cross-entropy Loss)。對於一個屬於第$K$個類別的ROI,僅僅考慮第$K$個Mask(其他的掩模輸入不會貢獻到損失函式中)。這樣的定義會允許對每個類別都會生成掩模,並且不會存在類間競爭。

四、掩模表示

一個掩模編碼了一個輸入物件的空間佈局。作者使用了一個FCN來對每個ROI預測一個的掩模,這保留了空間結構資訊。

end

機器學習演算法全棧工程師

                            一個用心的公眾號

640?wx_fmt=jpeg長按,識別,加關注

進群,學習,得幫助

你的關注,我們的熱度,

我們一定給你學習最大的幫助