人人必須要知道的語義分割模型:DeepLabv3+

???作者:?我是小將
編輯:黃俊嘉


可以看到語義分割只是簡單地對圖像中各個像素點分類,但是實例分割更進一步,需要區(qū)分開不同物體,這更加困難,從一定意義上來說,實例分割更像是語義分割加檢測。這里我們主要關(guān)注語義分割。
與檢測模型類似,語義分割模型也是建立是分類模型基礎(chǔ)上的,即利用CNN網(wǎng)絡(luò)來提取特征進行分類。對于CNN分類模型,一般情況下會存在stride>1的卷積層和池化層來降采樣,此時特征圖維度降低,但是特征更高級,語義更豐富。這對于簡單的分類沒有問題,因為最終只預(yù)測一個全局概率,對于分割模型就無法接受,因為我們需要給出圖像不同位置的分類概率,特征圖過小時會損失很多信息。其實對于檢測模型同樣存在這個問題,但是由于檢測比分割更粗糙,所以分割對于這個問題更嚴重。但是下采樣層又是不可缺少的,首先stride>1的下采樣層對于提升感受野非常重要,這樣高層特征語義更豐富,而且對于分割來說較大的感受野也至關(guān)重要;另外的一個現(xiàn)實問題,沒有下采樣層,特征圖一直保持原始大小,計算量是非常大的。相比之下,對于前面的特征圖,其保持了較多的空間位置信息,但是語義會差一些,但是這些空間信息對于精確分割也是至關(guān)重要的。這是語義分割所面臨的一個困境或者矛盾,也是大部分研究要一直解決的。
對于這個問題,主要存在兩種不同的解決方案,如圖3所示。其中a是原始的FCN([Fully Convolutional Networks for Semantic Segmentation](https://arxiv.org/abs/1411.4038)),圖片送進網(wǎng)絡(luò)后會得到小32x的特征圖,雖然語義豐富但是空間信息損失嚴重導(dǎo)致分割不準確,這稱為FCN-32s,另外paper還設(shè)計了FCN-8s,大致是結(jié)合不同level的特征逐步得到相對精細的特征,效果會好很多。為了得到高分辨率的特征,一種更直觀的解決方案是b中的EncoderDecoder結(jié)構(gòu),其中Encoder就是下采樣模塊,負責(zé)特征提取,而Decoder是上采樣模塊(通過插值,轉(zhuǎn)置卷積等方式),負責(zé)恢復(fù)特征圖大小,一般兩個模塊是對稱的,經(jīng)典的網(wǎng)絡(luò)如U-Net([U-Net: Convolutional Networks for Biomedical Image Segmentation]
(https://arxiv.org/abs/1505.04597))。而要直接將高層特征圖恢復(fù)到原始大小是相對困難的,所以Decoder是一個漸進的過程,而且要引入橫向連接(lateral connection),即引入低級特征增加空間信息特征分割準確度,橫向連接可以通過concat或者sum操作來實現(xiàn)。另外一種結(jié)構(gòu)是c中的DilatedFCN,主要是通過空洞卷積(Atrous Convolution)來減少下采樣率但是又可以保證感受野,如圖中的下采樣率只有8x,那么最終的特征圖語義不僅語義豐富而且相對精細,可以直接通過插值恢復(fù)原始分辨率。天下沒有免費的午餐,保持分辨率意味著較大的運算量,這是該架構(gòu)的弊端。這里介紹的DeepLabv3+就是屬于典型的DilatedFCN,它是Google提出的DeepLab系列的第4彈。

01
整體架構(gòu)
DeepLabv3+模型的整體架構(gòu)如圖4所示,它的Decoder的主體是帶有空洞卷積的DCNN,可以采用常用的分類網(wǎng)絡(luò)如ResNet,然后是帶有空洞卷積的空間金字塔池化模塊(Atrous Spatial Pyramid Pooling, ASPP)),主要是為了引入多尺度信息;相比DeepLabv3,v3+引入了Decoder模塊,其將底層特征與高層特征進一步融合,提升分割邊界準確度。從某種意義上看,DeepLabv3+在DilatedFCN基礎(chǔ)上引入了EcoderDecoder的思路。

圖4 DeepLabv3+模型的整體架構(gòu)
對于DilatedFCN,主要是修改分類網(wǎng)絡(luò)的后面block,用空洞卷積來替換stride=2的下采樣層,如下圖所示:其中a是原始FCN,由于下采樣的存在,特征圖不斷降低;而b為DilatedFCN,在第block3后引入空洞卷積,在維持特征圖大小的同時保證了感受野和原始網(wǎng)絡(luò)一致。

圖5 DilatedFCN與傳統(tǒng)FCN對比
在DeepLab中,將輸入圖片與輸出特征圖的尺度之比記為output_stride,如上圖的output_stride為16,如果加上ASPP結(jié)構(gòu),就變成如下圖6所示。其實這就是DeepLabv3結(jié)構(gòu),v3+只不過是增加了Decoder模塊。這里的DCNN可以是任意的分類網(wǎng)絡(luò),一般又稱為backbone,如采用ResNet網(wǎng)絡(luò)。

圖6 output_stride=16的DeepLabv3結(jié)構(gòu)
02
空洞卷積
空洞卷積(Atrous Convolution)是DeepLab模型的關(guān)鍵之一,它可以在不改變特征圖大小的同時控制感受野,這有利于提取多尺度信息。空洞卷積如下圖所示,其中rate(r)控制著感受野的大小,r越大感受野越大。通常的CNN分類網(wǎng)絡(luò)的output_stride=32,若希望DilatedFCN的output_stride=16,只需要將最后一個下采樣層的stride設(shè)置為1,并且后面所有卷積層的r設(shè)置為2,這樣保證感受野沒有發(fā)生變化。對于output_stride=8,需要將最后的兩個下采樣層的stride改為1,并且后面對應(yīng)的卷積層的rate分別設(shè)為2和4。另外一點,DeepLabv3中提到了采用multi-grid方法,針對ResNet網(wǎng)絡(luò),最后的3個級聯(lián)block采用不同rate,若output_stride=16且multi_grid =?(1, 2, 4), 那么最后的3個block的rate= 2 ·?(1, 2, 4)?=?(2, 4, 8)。這比直接采用(1, 1, 1)要更有效一些,不過結(jié)果相差不是太大。

圖7 不同rate的空洞卷積
03
空間金字塔池化(ASPP)
在DeepLab中,采用空間金字塔池化模塊來進一步提取多尺度信息,這里是采用不同rate的空洞卷積來實現(xiàn)這一點。ASPP模塊主要包含以下幾個部分:
(1)?一個1×1卷積層,以及三個3x3的空洞卷積,對于output_stride=16,其rate為(6, 12, 18)?,若output_stride=8,rate加倍(這些卷積層的輸出channel數(shù)均為256,并且含有BN層);
(2)一個全局平均池化層得到image-level特征,然后送入1x1卷積層(輸出256個channel),并雙線性插值到原始大?。?/span>
(3)將(1)和(2)得到的4個不同尺度的特征在channel維度concat在一起,然后送入1x1的卷積進行融合并得到256-channel的新特征。

圖8 DeepLab中的ASPP
ASPP主要是為了抓取多尺度信息,這對于分割準確度至關(guān)重要,一個與ASPP結(jié)構(gòu)比較像的是[PSPNet](https://arxiv.org/abs/1612.01105)中的金字塔池化模塊,如下圖所示,主要區(qū)別在于這里采用池化層來獲取多尺度特征。

圖9 PSPNet中的金字塔池化層
此外作者在近期的文章([Searching?for?Efficient?Multi-Scale?Architectures?for?Dense?Image?Prediction](https://arxiv.org/pdf/1809.04184.pdf))還嘗試了采用NAS來搜索比ASPP更有效的模塊,文中稱為DPC(Dense Prediction Cell),其搜索空間包括了1x1卷積,不同rate的3x3空洞卷積,以及不同size的平均池化層,下圖是NAS得到的最優(yōu)DPC,這是人工所難以設(shè)計的。

圖10 最優(yōu)DPC
04
Decoder
對于DeepLabv3,經(jīng)過ASPP模塊得到的特征圖的output_stride為8或者16,其經(jīng)過1x1的分類層后直接雙線性插值到原始圖片大小,這是一種非常暴力的decoder方法,特別是output_stride=16。然而這并不利于得到較精細的分割結(jié)果,故v3+模型中借鑒了EncoderDecoder結(jié)構(gòu),引入了新的Decoder模塊,如下圖所示。首先將encoder得到的特征雙線性插值得到4x的特征,然后與encoder中對應(yīng)大小的低級特征concat,如ResNet中的Conv2層,由于encoder得到的特征數(shù)只有256,而低級特征維度可能會很高,為了防止encoder得到的高級特征被弱化,先采用1x1卷積對低級特征進行降維(paper中輸出維度為48)。兩個特征concat后,再采用3x3卷積進一步融合特征,最后再雙線性插值得到與原始圖片相同大小的分割預(yù)測。

圖11 DeepLab中的Decoder
05
改進的Xception模型
DeepLabv3所采用的backbone是ResNet網(wǎng)絡(luò),在v3+模型作者嘗試了改進的Xception,Xception網(wǎng)絡(luò)主要采用depthwise separable convolution,這使得Xception計算量更小。改進的Xception主要體現(xiàn)在以下幾點:
參考MSRA的修改([Deformable?Convolutional?Networks](https://arxiv.org/abs/1703.06211)),增加了更多的層;
所有的最大池化層使用stride=2的depthwise separable convolutions替換,這樣可以改成空洞卷積?;
與MobileNet類似,在3x3 depthwise convolution后增加BN和ReLU。
采用改進的Xception網(wǎng)絡(luò)作為backbone,DeepLab網(wǎng)絡(luò)分割效果上有一定的提升。作者還嘗試了在ASPP中加入depthwise separable convolution,發(fā)現(xiàn)在基本不影響模型效果的前提下減少計算量。

圖12 修改的Xception網(wǎng)絡(luò)
結(jié)合上面的點,DeepLabv3+在VOC數(shù)據(jù)集上的取得很好的分割效果:

關(guān)于DeepLab模型的實現(xiàn),Google已經(jīng)開源在[tensorflow/models](https://github.com/tensorflow/models/tree/master/research/deeplab),采用Google自家的slim來實現(xiàn)的。一點題外話是,作者最近有研究了NAS在分割網(wǎng)絡(luò)的探索,叫做Auto-DeepLab([Auto-DeepLab:Hierarchical Neural Architecture Search for Semantic Image Segmentation](https://arxiv.org/pdf/1901.02985v1.pdf)),不同于前面的工作,這個真正是網(wǎng)絡(luò)級別的NAS,其搜索空間更大。
06
小結(jié)
DeepLab作為DilatedFCN的典范還是值得學(xué)習(xí)的,其分割效果也是極其好的。但是由于存在空洞卷積,DeepLab的計算復(fù)雜度要高一些,特別是output_stride=8,對于一些要求低延遲的場景如無人車,還是需要更加輕量級的分割模型,這也是近來的研究熱點。
參考文獻
[Rethinking?Atrous?Convolution?for?Semantic?Image?Segmentation]
(https://arxiv.org/abs/1706.05587)
[Encoder?Decoder?with?Atrous?Separable?Convolution?for?Semantic?Image?Segmentation](https://arxiv.org/abs/1802.02611v1)
?
END
往期回顧之作者葉虎
【4】輕量級CNN網(wǎng)絡(luò)之MobileNetv2
【5】ShuffleNetV2:輕量級CNN網(wǎng)絡(luò)中的桂冠
機器學(xué)習(xí)算法工程師
? ? ? ? ? ? ? ? ? ? ? ? ? ? 一個用心的公眾號
進群,學(xué)習(xí),得幫助
你的關(guān)注,我們的熱度,
我們一定給你學(xué)習(xí)最大的幫助
