人人必須要知道的語義分割模型:DeepLabv3+
點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)


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

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

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

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

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

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

圖8 DeepLab中的ASPP
ASPP主要是為了抓取多尺度信息,這對(duì)于分割準(zhǔn)確度至關(guān)重要,一個(gè)與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è)計(jì)的。

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

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

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

關(guān)于DeepLab模型的實(shí)現(xiàn),Google已經(jīng)開源在[tensorflow/models](https://github.com/tensorflow/models/tree/master/research/deeplab),采用Google自家的slim來實(shí)現(xiàn)的。一點(diǎn)題外話是,作者最近有研究了NAS在分割網(wǎng)絡(luò)的探索,叫做Auto-DeepLab([Auto-DeepLab:Hierarchical Neural Architecture Search for Semantic Image Segmentation](https://arxiv.org/pdf/1901.02985v1.pdf)),不同于前面的工作,這個(gè)真正是網(wǎng)絡(luò)級(jí)別的NAS,其搜索空間更大。
DeepLab作為DilatedFCN的典范還是值得學(xué)習(xí)的,其分割效果也是極其好的。但是由于存在空洞卷積,DeepLab的計(jì)算復(fù)雜度要高一些,特別是output_stride=8,對(duì)于一些要求低延遲的場(chǎng)景如無人車,還是需要更加輕量級(jí)的分割模型,這也是近來的研究熱點(diǎn)。
參考文獻(xiàn)
[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)
交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請(qǐng)按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~
