天天看點

語義分割和執行個體分割_語義分割模型之DeepLabv3+

語義分割和執行個體分割_語義分割模型之DeepLabv3+
碼字不易,歡迎給個贊! 歡迎交流與轉載,文章會同步釋出在公衆号:機器學習算法全棧工程師(Jeemy110)

圖像分割是計算機視覺中除了分類和檢測外的另一項基本任務,它意味着要将圖檔根據内容分割成不同的塊。相比圖像分類和檢測,分割是一項更精細的工作,因為需要對每個像素點分類,如下圖的街景分割,由于對每個像素點都分類,物體的輪廓是精準勾勒的,而不是像檢測那樣給出邊界框。

語義分割和執行個體分割_語義分割模型之DeepLabv3+

圖1 街景分割

圖像分割可以分為兩類:語義分割(Semantic Segmentation)和執行個體分割(Instance Segmentation),其差別如圖2所示。

語義分割和執行個體分割_語義分割模型之DeepLabv3+

圖2 圖像分割中的語義分割和執行個體分割

可以看到語義分割隻是簡單地對圖像中各個像素點分類,但是執行個體分割更進一步,需要區分開不同物體,這更加困難,從一定意義上來說,執行個體分割更像是語義分割加檢測。這裡我們主要關注語義分割。

與檢測模型類似,語義分割模型也是建立是分類模型基礎上的,即利用CNN網絡來提取特征進行分類。對于CNN分類模型,一般情況下會存在stride>1的卷積層和池化層來降采樣,此時特征圖次元降低,但是特征更進階,語義更豐富。這對于簡單的分類沒有問題,因為最終隻預測一個全局機率,對于分割模型就無法接受,因為我們需要給出圖像不同位置的分類機率,特征圖過小時會損失很多資訊。其實對于檢測模型同樣存在這個問題,但是由于檢測比分割更粗糙,是以分割對于這個問題更嚴重。但是下采樣層又是不可缺少的,首先stride>1的下采樣層對于提升感受野非常重要,這樣高層特征語義更豐富,而且對于分割來說較大的感受野也至關重要;另外的一個現實問題,沒有下采樣層,特征圖一直保持原始大小,計算量是非常大的。相比之下,對于前面的特征圖,其保持了較多的空間位置資訊,但是語義會差一些,但是這些空間資訊對于精确分割也是至關重要的。這是語義分割所面臨的一個困境或者沖突,也是大部分研究要一直解決的。

對于這個問題,主要存在兩種不同的解決方案,如圖3所示。其中a是原始的FCN(Fully Convolutional Networks for Semantic Segmentation),圖檔送進網絡後會得到大小降為32x的特征圖,雖然語義豐富但是空間資訊損失嚴重導緻分割不準确,這稱為FCN-32s,另外paper還設計了FCN-8s,大緻是結合不同level的特征逐漸得到相對精細的特征,效果會好很多。為了得到高分辨率的特征,一種更直覺的解決方案是b中的EncoderDecoder結構,其中Encoder就是下采樣子產品,負責特征提取,而Decoder是上采樣子產品(通過插值,轉置卷積等方式),負責恢複特征圖大小,一般兩個子產品是對稱的,經典的網絡如U-Net(U-Net: Convolutional Networks for Biomedical Image Segmentation。而要直接将高層特征圖恢複到原始大小是相對困難的,是以Decoder是一個漸進的過程,而且要引入橫向連接配接(lateral connection),即引入低級特征增加空間資訊特征分割準确度,橫向連接配接可以通過concat或者sum操作來實作。另外一種結構是c中的DilatedFCN,主要是通過空洞卷積(Atrous Convolution)來減少下采樣率但是又可以保證感受野,如圖中的下采樣率隻有8x,那麼最終的特征圖語義不僅語義豐富而且相對精細,可以直接通過插值恢複原始分辨率。天下沒有免費的午餐,保持分辨率意味着較大的運算量,這是該架構的弊端。這裡介紹的DeepLabv3+就是屬于典型的DilatedFCN,它是Google提出的DeepLab系列的第4彈。

語義分割和執行個體分割_語義分割模型之DeepLabv3+

圖3 語義分割不同架構(來源:https://arxiv.org/abs/1903.11816)

整體架構

DeepLabv3+模型的整體架構如圖4所示,它的Encoder的主體是帶有空洞卷積的DCNN,可以采用常用的分類網絡如ResNet,然後是帶有空洞卷積的空間金字塔池化子產品(Atrous Spatial Pyramid Pooling, ASPP)),主要是為了引入多尺度資訊;相比DeepLabv3,v3+引入了Decoder子產品,其将底層特征與高層特征進一步融合,提升分割邊界準确度。從某種意義上看,DeepLabv3+在DilatedFCN基礎上引入了EcoderDecoder的思路。

語義分割和執行個體分割_語義分割模型之DeepLabv3+

圖4 DeepLabv3+模型的整體架構

對于DilatedFCN,主要是修改分類網絡的後面block,用空洞卷積來替換stride=2的下采樣層,如下圖所示:其中a是原始FCN,由于下采樣的存在,特征圖不斷降低;而b為DilatedFCN,在第block3後引入空洞卷積,在維持特征圖大小的同時保證了感受野和原始網絡一緻。

語義分割和執行個體分割_語義分割模型之DeepLabv3+

圖5 DilatedFCN與傳統FCN對比

在DeepLab中,将輸入圖檔與輸出特征圖的尺度之比記為

output_stride

,如上圖的

output_stride

為16,如果加上ASPP結構,就變成如下圖6所示。其實這就是DeepLabv3結構,v3+隻不過是增加了Decoder子產品。這裡的DCNN可以是任意的分類網絡,一般又稱為backbone,如采用ResNet網絡。

語義分割和執行個體分割_語義分割模型之DeepLabv3+

圖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)要更有效一些,不過結果相差不是太大。

語義分割和執行個體分割_語義分割模型之DeepLabv3+

圖7 不同rate的空洞卷積

空間金字塔池化(ASPP)

在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的新特征。

語義分割和執行個體分割_語義分割模型之DeepLabv3+

圖8 DeepLab中的ASPP

ASPP主要是為了抓取多尺度資訊,這對于分割準确度至關重要,一個與ASPP結構比較像的是[PSPNet](Pyramid Scene Parsing Network)中的金字塔池化子產品,如下圖所示,主要差別在于這裡采用池化層來擷取多尺度特征。

語義分割和執行個體分割_語義分割模型之DeepLabv3+

圖9 PSPNet中的金字塔池化層

此外作者在近期的文章(Searching for Efficient Multi-Scale Architectures for Dense Image Prediction)還嘗試了采用NAS來搜尋比ASPP更有效的子產品,文中稱為DPC(Dense Prediction Cell),其搜尋空間包括了1x1卷積,不同rate的3x3空洞卷積,以及不同size的平均池化層,下圖是NAS得到的最優DPC,這是人工所難以設計的。

語義分割和執行個體分割_語義分割模型之DeepLabv3+

圖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卷積進一步融合特征,最後再雙線性插值得到與原始圖檔相同大小的分割預測。

語義分割和執行個體分割_語義分割模型之DeepLabv3+

圖11 DeepLab中的Decoder

改進的Xception模型

DeepLabv3所采用的backbone是ResNet網絡,在v3+模型作者嘗試了改進的Xception,Xception網絡主要采用depthwise separable convolution,這使得Xception計算量更小。改進的Xception主要展現在以下幾點: (1)參考MSRA的修改(Deformable Convolutional Networks),增加了更多的層; (2)所有的最大池化層使用stride=2的depthwise separable convolutions替換,這樣可以改成空洞卷積 ; (3)與MobileNet類似,在3x3 depthwise convolution後增加BN和ReLU。

采用改進的Xception網絡作為backbone,DeepLab網絡分割效果上有一定的提升。作者還嘗試了在ASPP中加入depthwise separable convolution,發現在基本不影響模型效果的前提下減少計算量。

語義分割和執行個體分割_語義分割模型之DeepLabv3+

圖12 修改的Xception網絡

結合上面的點,DeepLabv3+在VOC資料集上的取得很好的分割效果:

語義分割和執行個體分割_語義分割模型之DeepLabv3+

關于DeepLab模型的實作,Google已經開源在tensorflow/models,采用Google自家的slim來實作的。一點題外話是,作者最近有研究了NAS在分割網絡的探索,叫做Auto-DeepLab(Auto-DeepLab:Hierarchical Neural Architecture Search for Semantic Image Segmentation),不同于前面的工作,這個真正是網絡級别的NAS,其搜尋空間更大。

小結

DeepLab作為DilatedFCN的典範還是值得學習的,其分割效果也是極其好的。但是由于存在空洞卷積,DeepLab的計算複雜度要高一些,特别是output_stride=8,對于一些要求低延遲的場景如無人車,還是需要更加輕量級的分割模型,這也是近來的研究熱點。

參考文獻

  1. Rethinking Atrous Convolution for Semantic Image Segmentation
  2. Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation
碼字不易,歡迎給個贊! 歡迎交流與轉載,文章會同步釋出在公衆号:機器學習算法全棧工程師(Jeemy110)