作者: 我是小將
編輯:黃俊嘉
圖像分割是計算機視覺中除了分類和檢測外的另一項基本任務,它意味著要將圖片根據內容分割成不同的塊。相比圖像分類和檢測,分割是一項更精細的工作,因為需要對每個像素點分類,如下圖的街景分割,由於對每個像素點都分類,物體的輪廓是精準勾勒的,而不是像檢測那樣給出邊界框。圖像分割可以分為兩類:語義分割(Semantic Segmentation)和實例分割(Instance Segmentation),其區別如圖2所示。可以看到語義分割只是簡單地對圖像中各個像素點分類,但是實例分割更進一步,需要區分開不同物體,這更加困難,從一定意義上來說,實例分割更像是語義分割加檢測。這裡我們主要關注語義分割。
與檢測模型類似,語義分割模型也是建立是分類模型基礎上的,即利用CNN網絡來提取特徵進行分類。對於CNN分類模型,一般情況下會存在stride>1的卷積層和池化層來降採樣,此時特徵圖維度降低,但是特徵更高級,語義更豐富。這對於簡單的分類沒有問題,因為最終只預測一個全局概率,對於分割模型就無法接受,因為我們需要給出圖像不同位置的分類概率,特徵圖過小時會損失很多信息。其實對於檢測模型同樣存在這個問題,但是由於檢測比分割更粗糙,所以分割對於這個問題更嚴重。但是下採樣層又是不可缺少的,首先stride>1的下採樣層對於提升感受野非常重要,這樣高層特徵語義更豐富,而且對於分割來說較大的感受野也至關重要;另外的一個現實問題,沒有下採樣層,特徵圖一直保持原始大小,計算量是非常大的。相比之下,對於前面的特徵圖,其保持了較多的空間位置信息,但是語義會差一些,但是這些空間信息對於精確分割也是至關重要的。這是語義分割所面臨的一個困境或者矛盾,也是大部分研究要一直解決的。
對於這個問題,主要存在兩種不同的解決方案,如圖3所示。其中a是原始的FCN([Fully Convolutional Networks for Semantic Segmentation](https://arxiv.org/abs/1411.4038)),圖片送進網絡後會得到小32x的特徵圖,雖然語義豐富但是空間信息損失嚴重導致分割不準確,這稱為FCN-32s,另外paper還設計了FCN-8s,大致是結合不同level的特徵逐步得到相對精細的特徵,效果會好很多。為了得到高解析度的特徵,一種更直觀的解決方案是b中的EncoderDecoder結構,其中Encoder就是下採樣模塊,負責特徵提取,而Decoder是上採樣模塊(通過插值,轉置卷積等方式),負責恢復特徵圖大小,一般兩個模塊是對稱的,經典的網絡如U-Net([U-Net: Convolutional Networks for Biomedical Image Segmentation]
(https://arxiv.org/abs/1505.04597))。而要直接將高層特徵圖恢復到原始大小是相對困難的,所以Decoder是一個漸進的過程,而且要引入橫向連接(lateral connection),即引入低級特徵增加空間信息特徵分割準確度,橫向連接可以通過concat或者sum操作來實現。另外一種結構是c中的DilatedFCN,主要是通過空洞卷積(Atrous Convolution)來減少下採樣率但是又可以保證感受野,如圖中的下採樣率只有8x,那麼最終的特徵圖語義不僅語義豐富而且相對精細,可以直接通過插值恢復原始解析度。天下沒有免費的午餐,保持解析度意味著較大的運算量,這是該架構的弊端。這裡介紹的DeepLabv3+就是屬於典型的DilatedFCN,它是Google提出的DeepLab系列的第4彈。
圖3 語義分割不同架構(來源:https://arxiv.org/abs/1903.11816)整體架構DeepLabv3+模型的整體架構如圖4所示,它的Decoder的主體是帶有空洞卷積的DCNN,可以採用常用的分類網絡如ResNet,然後是帶有空洞卷積的空間金字塔池化模塊(Atrous Spatial Pyramid Pooling, ASPP)),主要是為了引入多尺度信息;相比DeepLabv3,v3+引入了Decoder模塊,其將底層特徵與高層特徵進一步融合,提升分割邊界準確度。從某種意義上看,DeepLabv3+在DilatedFCN基礎上引入了EcoderDecoder的思路。
圖4 DeepLabv3+模型的整體架構
對於DilatedFCN,主要是修改分類網絡的後面block,用空洞卷積來替換stride=2的下採樣層,如下圖所示:其中a是原始FCN,由於下採樣的存在,特徵圖不斷降低;而b為DilatedFCN,在第block3後引入空洞卷積,在維持特徵圖大小的同時保證了感受野和原始網絡一致。
圖5 DilatedFCN與傳統FCN對比
在DeepLab中,將輸入圖片與輸出特徵圖的尺度之比記為output_stride,如上圖的output_stride為16,如果加上ASPP結構,就變成如下圖6所示。其實這就是DeepLabv3結構,v3+只不過是增加了Decoder模塊。這裡的DCNN可以是任意的分類網絡,一般又稱為backbone,如採用ResNet網絡。
圖6 output_stride=16的DeepLabv3結構
空洞卷積空洞卷積(Atrous Convolution)是DeepLab模型的關鍵之一,它可以在不改變特徵圖大小的同時控制感受野,這有利於提取多尺度信息。空洞卷積如下圖所示,其中rate(r)控制著感受野的大小,r越大感受野越大。通常的CNN分類網絡的output_stride=32,若希望DilatedFCN的output_stride=16,只需要將最後一個下採樣層的stride設置為1,並且後面所有卷積層的r設置為2,這樣保證感受野沒有發生變化。對於output_stride=8,需要將最後的兩個下採樣層的stride改為1,並且後面對應的卷積層的rate分別設為2和4。另外一點,DeepLabv3中提到了採用multi-grid方法,針對ResNet網絡,最後的3個級聯block採用不同rate,若output_stride=16且multi_grid = (1, 2, 4), 那麼最後的3個block的rate= 2 · (1, 2, 4) = (2, 4, 8)。這比直接採用(1, 1, 1)要更有效一些,不過結果相差不是太大。圖7 不同rate的空洞卷積
在DeepLab中,採用空間金字塔池化模塊來進一步提取多尺度信息,這裡是採用不同rate的空洞卷積來實現這一點。ASPP模塊主要包含以下幾個部分:
(1) 一個1×1卷積層,以及三個3x3的空洞卷積,對於output_stride=16,其rate為(6, 12, 18) ,若output_stride=8,rate加倍(這些卷積層的輸出channel數均為256,並且含有BN層);
(2)一個全局平均池化層得到image-level特徵,然後送入1x1卷積層(輸出256個channel),並雙線性插值到原始大小;
(3)將(1)和(2)得到的4個不同尺度的特徵在channel維度concat在一起,然後送入1x1的卷積進行融合併得到256-channel的新特徵。
圖8 DeepLab中的ASPP
ASPP主要是為了抓取多尺度信息,這對於分割準確度至關重要,一個與ASPP結構比較像的是[PSPNet](https://arxiv.org/abs/1612.01105)中的金字塔池化模塊,如下圖所示,主要區別在於這裡採用池化層來獲取多尺度特徵。
圖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得到的最優DPC,這是人工所難以設計的。
圖10 最優DPC
Decoder
對於DeepLabv3,經過ASPP模塊得到的特徵圖的output_stride為8或者16,其經過1x1的分類層後直接雙線性插值到原始圖片大小,這是一種非常暴力的decoder方法,特別是output_stride=16。然而這並不利於得到較精細的分割結果,故v3+模型中借鑑了EncoderDecoder結構,引入了新的Decoder模塊,如下圖所示。首先將encoder得到的特徵雙線性插值得到4x的特徵,然後與encoder中對應大小的低級特徵concat,如ResNet中的Conv2層,由於encoder得到的特徵數只有256,而低級特徵維度可能會很高,為了防止encoder得到的高級特徵被弱化,先採用1x1卷積對低級特徵進行降維(paper中輸出維度為48)。兩個特徵concat後,再採用3x3卷積進一步融合特徵,最後再雙線性插值得到與原始圖片相同大小的分割預測。
圖11 DeepLab中的Decoder
改進的Xception模型
DeepLabv3所採用的backbone是ResNet網絡,在v3+模型作者嘗試了改進的Xception,Xception網絡主要採用depthwise separable convolution,這使得Xception計算量更小。改進的Xception主要體現在以下幾點:
參考MSRA的修改([Deformable Convolutional Networks](https://arxiv.org/abs/1703.06211)),增加了更多的層;
所有的最大池化層使用stride=2的depthwise separable convolutions替換,這樣可以改成空洞卷積 ;
與MobileNet類似,在3x3 depthwise convolution後增加BN和ReLU。
採用改進的Xception網絡作為backbone,DeepLab網絡分割效果上有一定的提升。作者還嘗試了在ASPP中加入depthwise separable convolution,發現在基本不影響模型效果的前提下減少計算量。
圖12 修改的Xception網絡
結合上面的點,DeepLabv3+在VOC數據集上的取得很好的分割效果:
關於DeepLab模型的實現,Google已經開源在[tensorflow/models](https://github.com/tensorflow/models/tree/master/research/deeplab),採用Google自家的slim來實現的。一點題外話是,作者最近有研究了NAS在分割網絡的探索,叫做Auto-DeepLab([Auto-DeepLab:Hierarchical Neural Architecture Search for Semantic Image Segmentation](https://arxiv.org/pdf/1901.02985v1.pdf)),不同於前面的工作,這個真正是網絡級別的NAS,其搜索空間更大。
小結
DeepLab作為DilatedFCN的典範還是值得學習的,其分割效果也是極其好的。但是由於存在空洞卷積,DeepLab的計算複雜度要高一些,特別是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
機器學習算法工程師
一個用心的公眾號
長按,識別,加關注進群,學習,得幫助
你的關注,我們的熱度,
我們一定給你學習最大的幫助