實例分割演算法之Mask R-CNN論文解讀
- 2020 年 2 月 12 日
- 筆記
前言
Anchor-Based的目標檢測演算法我們已經講了比較多了,另外Anchor-Free的目標檢測我們也已經簡單解讀了一下DenseBox開了個頭,而今天我們要來說說另外一個方向即實例分割。而實例分割首當其衝需要介紹的就是2017年He Kaiming大神的力作Mask-RCNN,其在進行目標檢測的同時進行實例分割,取得了出色的效果,並獲得了2016年COCO實例分割比賽的冠軍。
總覽
Mask-RCNN是一個實例分割(Instance segmentation)框架,通過增加不同的分支可以完成目標分類,目標檢測,語義分割,實例分割,人體姿態估計等多種任務。對於實例分割來講,就是在Faster-RCNN的基礎上(分類+回歸分支)增加了一個分支用於語義分割,其抽象結構如Figure1所示:

稍微描述一下這個結構:
- 輸入預處理後的原始圖片。
- 將輸入圖片送入到特徵提取網路得到特徵圖。
- 然後對特徵圖的每一個像素位置設定固定個數的ROI(也可以叫Anchor),然後將ROI區域送入RPN網路進行二分類(前景和背景)以及坐標回歸,以獲得精鍊後的ROI區域。
- 對上個步驟中獲得的ROI區域執行論文提出的ROIAlign操作,即先將原圖和feature map的pixel對應起來,然後將feature map和固定的feature對應起來。
- 最後對這些ROI區域進行多類別分類,候選框回歸和引入FCN生成Mask,完成分割任務。
下圖更清晰的展示了Mask-RCNN的整體框架,來自知乎用戶vision
:

在這裡插入圖片描述
方法
原始ROI Pooling的問題
在Faster-RCNN中ROIPooling的過程如下圖所示:

輸入圖片的大小為,其中狗這個目標框的大小為,經過VGG16網路之後獲得的特徵圖尺寸為,其中代表VGG16中的次下取樣(步長為2)操作。同樣,對於狗這個目標,我們將其對應到特徵圖上得到的結果是,因為坐標要保留整數所以這裡引入了第一個量化誤差即捨棄了目標框在特徵圖上對應長寬的浮點數部分。
然後我們需要將這個的ROI區域映射為的ROI特徵圖,根據ROI Pooling的計算方式,其結果就是,同樣執行取整操作操作後ROI特徵區域的尺寸為,這裡引入了第二次量化誤差。
從上面的分析可以看出,這兩次量化誤差會導致原始影像中的像素和特徵圖中的像素進行對應時出現偏差,例如上面將量化為的時候就引入了的偏差,這個偏差映射回原圖就是,可以看到這個像素偏差是很大的。
ROIAlign
為了緩解ROI Pooling量化誤差過大的缺點,本論文提出了ROIAlign,ROIAligin沒有使用量化操作,而是使用了雙線性插值。它充分的利用原圖中的虛擬像素值如四周的四個真實存在的像素值來共同決定目標圖中的一個像素值,即可以將和類似的非整數坐標值像素對應的輸出像素值估計出來。這一過程如下圖所示:

其中feat. map就是VGG16或者其他Backbone網路獲得的特徵圖,黑色實線表示的是ROI劃分方式,最後輸出的特徵圖大小為,然後就使用雙線性插值的方式來估計這些藍色點的像素值,最後得到輸出,然後再在橘紅色的區域中執行Pooling操作最後得到的輸出特徵圖。可以看到,這個過程相比於ROI Pooling沒有引入任何量化操作,即原圖中的像素和特徵圖中的像素是完全對齊的,沒有偏差,這不僅會提高檢測的精度,同時也會有利於實例分割。
網路結構
為了證明次網路的通用性,論文構造了多種不同結構的Mask R-CNN,具體為使用Backbone網路以及是否將用於邊框識別和Mask預測的上層網路分別應用於每個ROI。對於Backbone網路,Mask R-CNN基本使用了之前提出的架構,同時添加了一個全卷積的Mask(掩膜)預測分支。Figure3展示了兩種典型的Mask R-CNN網路結構,左邊的是採用或者做網路的backbone提取特徵,右邊的網路採用FPN網路做Backbone提取特徵,這兩個網路的介紹均在公眾號的往期文章中可以找到,最終作者發現使用ResNet-FPN作為特徵提取的backbone具有更高的精度和更快的運行速度,所以實際工作時大多採用右圖的完全並行的mask/分類回歸。

在這裡插入圖片描述
損失函數
Mask分支針對每個ROI區域產生一個的輸出特徵圖,即個的二值掩膜影像,其中代表目標種類數。Mask-RCNN在Faster-RCNN的基礎上多了一個ROIAligin和Mask預測分支,因此Mask R-CNN的損失也是多任務損失,可以表示為如下公式: 其中表示預測框的分類損失,表示預測框的回歸損失,表示Mask部分的損失。對於預測的二值掩膜輸出,論文對每一個像素點應用sigmoid
函數,整體損失定義為平均二值交叉損失熵。引入預測K個輸出的機制,允許每個類都生成獨立的掩膜,避免類間競爭。這樣做解耦了掩膜和種類預測。不像FCN的做法,在每個像素點上應用softmax
函數,整體採用的多任務交叉熵,這樣會導致類間競爭,最終導致分割效果差。
下圖更清晰的展示了Mask-RCNN的Mask預測部分的損失計算,來自知乎用戶vision
:

在這裡插入圖片描述
訓練
在Faster-RCNN中,如果ROI區域和GT框的IOU>0.5
,則ROI是正樣本,否則為負樣本。只在正樣本上定義,而Mask的標籤是ROI和它對應的Ground Truth Mask的交集。其他的一些訓練細節如下:
- 採用image-centric方式訓練,將圖片的長寬較小的一邊縮放到800像素。
- 每個GPU的
mini-batch=2
,每張圖片有個取樣ROIs,其中正負樣本比例為1:3
。 - 在8個gpu上進行訓練,
batch_size=2
,迭代160k
次,初始學習率0.02
,在第120k
次迭代時衰減10倍,weight_decay=0.0001
,momentum=0.9
。
測試
測試階段,採用的proposals
的數量分別為(Faster-RCNN)和1000(FPN)。在這些proposals
上,使用bbox
預測分支配合後處理nms
來預測box
。然後使用Mask預測分支對最高score
的100個檢測框進行處理。可以看到這裡和訓練時Mask預測並行處理的方式不同,這裡主要是為了加速推斷效率。然後,Mask網路分支對每個ROI預測個掩膜影像,但這裡只需要使用其中類別概率最大的那個掩膜影像就可以了,並將這個掩膜影像resize
回ROI大小,並以0.5
的閾值進行二值化。
實驗
總覽
非常的SOTA,Mask R-CNN打敗了上界冠軍FCIS(其使用了multi-scale訓練,水平翻轉測試,OHEM等),具體結果如Table1所示:

再來一些可視化結果看看,如Figure5所示。

在這裡插入圖片描述
消融實驗
Table2展示了Mask-RCNN的消融實驗,(a)
顯示網路越深,效果越好。並且FPN效果要好一些。而(b
)顯示sigmoid
要比softmax
效果好一些。(c)
和(d)
顯示ROIAligin效果有提升,特別是AP75提升最明顯,說明對精度提升很有用。(e)
顯示mask banch採用FCN效果較好(因為FCN沒有破壞空間關係)。

在這裡插入圖片描述
目標檢測結果對比
從Table3可以看出,在預測的時候即使不使用Mask分支,結果精度也是很高的。可以看到ROIAligin直接使用到Faster-RCNN上相對於ROI Pooling提高了0.9個點,但比Mask-RCNN低0.9個點。作者將其歸結為多任務訓練的提升,由於加入了mask分支,帶來的loss改變,間接影響了主幹網路的效果。

在這裡插入圖片描述
關鍵點檢測
和Mask-RCNN相比,關鍵點檢測就是將Mask分支變成heatmap
回歸分支,需要注意的是最後的輸出是形式的softmax
, 不再是sigmoid
,論文提到這有利於單獨一個點的檢測,並且最後的Mask解析度是,不再是。

在這裡插入圖片描述
後記
後面我會更新Mask R-CNN的程式碼詳細解析,從程式碼角度詳細分析Mask R-CNN的細節,論文解析暫時就講到這裡了。
附錄
- 論文原文:https://arxiv.org/pdf/1703.06870.pdf
- 參考資料:https://blog.csdn.net/chunfengyanyulove/article/details/83545784
歡迎關注GiantPandaCV, 在這裡你將看到獨家的深度學習分享,堅持原創,每天分享我們學習到的新鮮知識。( • ̀ω•́ )✧