Mask R-CNN

1 概述

Mask R-CNN是ICCV 2017的best paper,彰顯了機(jī)器學(xué)習(xí)計(jì)算機(jī)視覺(jué)領(lǐng)域在2017年的最新成果。在機(jī)器學(xué)習(xí)2017年的最新發(fā)展中,單任務(wù)的網(wǎng)絡(luò)結(jié)構(gòu)已經(jīng)逐漸不再引人矚目,取而代之的是集成,復(fù)雜,一石多鳥(niǎo)的多任務(wù)網(wǎng)絡(luò)模型。Mask R-CNN就是典型的代表。在實(shí)例分割Mask R-CNN框架中,其主要特點(diǎn)是:

  • 實(shí)例分割不僅要正確的找到圖像中的objects,還要對(duì)其精確的分割。所以Instance Segmentation可以看做object dection和semantic segmentation的結(jié)合。
  • 對(duì)于Faster RCNN的每個(gè)Proposal Box都要使用FCN進(jìn)行語(yǔ)義分割,分割任務(wù)與定位、分類任務(wù)是同時(shí)進(jìn)行的。
  • 引入了RoI Align代替Faster RCNN中的RoI Pooling。因?yàn)镽oI Pooling并不是按照像素一一對(duì)齊的(pixel-to-pixel alignment),也許這對(duì)bbox的影響不是很大,但對(duì)于mask的精度卻有很大影響。使用RoI Align后mask的精度從10%顯著提高到50%
  • 引入語(yǔ)義分割分支,實(shí)現(xiàn)了mask和class預(yù)測(cè)的關(guān)系的解耦,mask分支只做語(yǔ)義分割,類型預(yù)測(cè)的任務(wù)交給另一個(gè)分支。

2 問(wèn)題引入

  • 問(wèn)題1:從輸入圖上的RoI到特征圖上的RoI feature,RoI Pooling是直接通過(guò)四舍五入取整得到的結(jié)果。這樣會(huì)帶來(lái)什么壞處呢?就是RoI Pooling過(guò)后的得到的輸出可能和原圖像上的RoI對(duì)不上,如下圖所示,右圖中藍(lán)色部分表示包含了轎車主體的的信息的方格,RoI Pooling Layer的四舍五入取整操作導(dǎo)致其進(jìn)行了偏移。


  • 問(wèn)題2:再將每個(gè)RoI對(duì)應(yīng)的特征轉(zhuǎn)化為固定大小的維度時(shí),又采用了取整操作。在這里舉例講解一下RoI Pooling的操作



    這種取整操作(在Mask R-CNN中被稱為quantization)對(duì)RoI分類影響不大,可是對(duì)逐像素的預(yù)測(cè)目標(biāo)是有害的,因?yàn)閷?duì)每個(gè)RoI取得的特征并沒(méi)有與RoI對(duì)齊。因此,Mask R-CNN對(duì)RoI Pooling做了改進(jìn)并提出了RoI Align。

3. 框架解析

3.1 實(shí)例分割 vs 語(yǔ)義分割


觀察圖中的c和d圖,c圖是對(duì)a圖進(jìn)行語(yǔ)義分割的結(jié)果,d圖是對(duì)a圖進(jìn)行實(shí)例分割的結(jié)果。兩者最大的區(qū)別就是圖中的"cube對(duì)象",在語(yǔ)義分割中給了它們相同的顏色,而在實(shí)例分割中卻給了不同的顏色。即實(shí)例分割需要在語(yǔ)義分割的基礎(chǔ)上對(duì)同類物體進(jìn)行更精細(xì)的分割

3.2 算法框架

3.2.1 Mask R-CNN算法步驟

  1. 輸入一幅你想處理的圖片,然后進(jìn)行對(duì)應(yīng)的預(yù)處理操作,或者預(yù)處理后的圖片;
  2. 將其輸入到一個(gè)預(yù)訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)中(ResNeXt等)獲得對(duì)應(yīng)的feature map;
  3. 對(duì)這個(gè)feature map中的每一點(diǎn)設(shè)定預(yù)定個(gè)的ROI,從而獲得多個(gè)候選ROI;
  4. 將這些候選的ROI送入RPN網(wǎng)絡(luò)進(jìn)行二值分類(前景或背景)和BB回歸,過(guò)濾掉一部分候選的ROI;
  5. 對(duì)這些剩下的ROI進(jìn)行ROIAlign操作(即先將原圖和feature map的pixel對(duì)應(yīng)起來(lái),然后將feature map和固定的feature對(duì)應(yīng)起來(lái));
  6. 對(duì)這些ROI進(jìn)行分類(N類別分類)、BB回歸和MASK生成(在每一個(gè)ROI里面進(jìn)行FCN操作)

其中:

  • 在Mask R-CNN中的RoI Align之后有一個(gè)"head"部分,主要作用是將RoI Align的輸出維度擴(kuò)大,這樣在預(yù)測(cè)Mask時(shí)會(huì)更加精確。


  • 在Mask Branch的訓(xùn)練環(huán)節(jié),作者沒(méi)有采用FCN式的SoftmaxLoss,反而是輸出了K個(gè)Mask預(yù)測(cè)圖(為每一個(gè)類都輸出一張),并采用average binary cross-entropy loss訓(xùn)練,當(dāng)然在訓(xùn)練Mask branch的時(shí)候,輸出的K個(gè)特征圖中,也只是對(duì)應(yīng)ground truth類別的那一個(gè)特征圖對(duì)Mask loss有貢獻(xiàn)。

3.2.2 架構(gòu)分解

我將Mask R-CNN分解為如下的3個(gè)模塊,F(xiàn)aster-rcnn、ROIAlign和FCN。

  • ROI Pooling


    如圖所示,為了得到固定大?。?X7)的feature map,我們需要做兩次量化操作:1)圖像坐標(biāo) — feature map坐標(biāo),2)feature map坐標(biāo) — ROI feature坐標(biāo)。我們來(lái)說(shuō)一下具體的細(xì)節(jié),如圖我們輸入的是一張800x800的圖像,在圖像中有兩個(gè)目標(biāo)(貓和狗),狗的BB大小為665x665,經(jīng)過(guò)VGG16網(wǎng)絡(luò)后,我們可以獲得對(duì)應(yīng)的feature map,如果我們對(duì)卷積層進(jìn)行Padding操作,我們的圖片經(jīng)過(guò)卷積層后保持原來(lái)的大小,但是由于池化層的存在,我們最終獲得feature map 會(huì)比原圖縮小一定的比例,這和Pooling層的個(gè)數(shù)和大小有關(guān)。在該VGG16中,我們使用了5個(gè)池化操作,每個(gè)池化操作都是2Pooling,因此我們最終獲得feature map的大小為800/32 x 800/32 = 25x25(是整數(shù)),但是將狗的BB對(duì)應(yīng)到feature map上面,我們得到的結(jié)果是665/32 x 665/32 = 20.78 x 20.78,結(jié)果是浮點(diǎn)數(shù),含有小數(shù),但是我們的像素值可沒(méi)有小數(shù),那么作者就對(duì)其進(jìn)行了量化操作(即取整操作),即其結(jié)果變?yōu)?0 x 20,在這里引入了第一次的量化誤差;然而我們的feature map中有不同大小的ROI,但是我們后面的網(wǎng)絡(luò)卻要求我們有固定的輸入,因此,我們需要將不同大小的ROI轉(zhuǎn)化為固定的ROI feature,在這里使用的是7x7的ROI feature,那么我們需要將20 x 20的ROI映射成7 x 7的ROI feature,其結(jié)果是 20 /7 x 20/7 = 2.86 x 2.86,同樣是浮點(diǎn)數(shù),含有小數(shù)點(diǎn),我們采取同樣的操作對(duì)其進(jìn)行取整吧,在這里引入了第二次量化誤差。其實(shí),這里引入的誤差會(huì)導(dǎo)致圖像中的像素和特征中的像素的偏差,即將feature空間的ROI對(duì)應(yīng)到原圖上面會(huì)出現(xiàn)很大的偏差。原因如下:比如用我們第二次引入的誤差來(lái)分析,本來(lái)是2,86,我們將其量化為2,這期間引入了0.86的誤差,看起來(lái)是一個(gè)很小的誤差呀,但是你要記得這是在feature空間,我們的feature空間和圖像空間是有比例關(guān)系的,在這里是1:32,那么對(duì)應(yīng)到原圖上面的差距就是0.86 x 32 = 27.52。這個(gè)差距不小吧,這還是僅僅考慮了第二次的量化誤差。這會(huì)大大影響整個(gè)檢測(cè)算法的性能,因此是一個(gè)嚴(yán)重的問(wèn)題。

  • ROI Align


    如圖所示,為了得到為了得到固定大?。?X7)的feature map,ROIAlign技術(shù)并沒(méi)有使用量化操作,即我們不想引入量化誤差,比如665 / 32 = 20.78,我們就用20.78,不用什么20來(lái)替代它,比如20.78 / 7 = 2.97,我們就用2.97,而不用2來(lái)代替它。這就是ROIAlign的初衷。那么我們?nèi)绾翁幚磉@些浮點(diǎn)數(shù)呢?
    我們的解決思路是使用“雙線性插值”算法。雙線性插值是一種比較好的圖像縮放算法,它充分的利用了原圖中虛擬點(diǎn)(比如20.56這個(gè)浮點(diǎn)數(shù),像素位置都是整數(shù)值,沒(méi)有浮點(diǎn)值)四周的四個(gè)真實(shí)存在的像素值來(lái)共同決定目標(biāo)圖中的一個(gè)像素值,即可以將20.56這個(gè)虛擬的位置點(diǎn)對(duì)應(yīng)的像素值估計(jì)出來(lái)。如下圖所示,藍(lán)色的虛線框表示卷積后獲得的feature map,黑色實(shí)線框表示ROI feature,最后需要輸出的大小是2x2,那么我們就利用雙線性插值來(lái)估計(jì)這些藍(lán)點(diǎn)(虛擬坐標(biāo)點(diǎn),又稱雙線性插值的網(wǎng)格點(diǎn))處所對(duì)應(yīng)的像素值,最后得到相應(yīng)的輸出。這些藍(lán)點(diǎn)是2x2Cell中的隨機(jī)采樣的普通點(diǎn),作者指出,這些采樣點(diǎn)的個(gè)數(shù)和位置不會(huì)對(duì)性能產(chǎn)生很大的影響,你也可以用其它的方法獲得。然后在每一個(gè)橘紅色的區(qū)域里面進(jìn)行max pooling或者average pooling操作,獲得最終2x2的輸出結(jié)果。我們的整個(gè)過(guò)程中沒(méi)有用到量化操作,沒(méi)有引入誤差,即原圖中的像素和feature map中的像素是完全對(duì)齊的,沒(méi)有偏差,這不僅會(huì)提高檢測(cè)的精度,同時(shí)也會(huì)有利于實(shí)例分割。

  • FCN
    FCN算法是一個(gè)經(jīng)典的語(yǔ)義分割算法,可以對(duì)圖片中的目標(biāo)進(jìn)行準(zhǔn)確的分割。其總體架構(gòu)如下圖所示,它是一個(gè)端到端的網(wǎng)絡(luò),主要的??彀ň矸e和去卷積,即先對(duì)圖像進(jìn)行卷積和池化,使其feature map的大小不斷減??;然后進(jìn)行反卷積操作,即進(jìn)行插值操作,不斷的增大其feature map,最后對(duì)每一個(gè)像素值進(jìn)行分類。從而實(shí)現(xiàn)對(duì)輸入圖像的準(zhǔn)確分割。

  • LOSS計(jì)算與分析


    在上式中,Lbox和Lmask都是對(duì)positive RoI才會(huì)起作用的。
    在Mask R-CNN中,相較于Faster R-CNN還有些略微的調(diào)整,比如positive RoI被定義成了與Ground truth的IoU大于0.5的(Faster R-CNN中是0.7)。

3. 性能比較

3.1 整體

3.2 細(xì)化


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容