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

2021-02-21 機器學習算法工程師

   作者: 我是小將

編輯:黃俊嘉

圖像分割是計算機視覺中除了分類和檢測外的另一項基本任務,它意味著要將圖片根據內容分割成不同的塊。相比圖像分類和檢測,分割是一項更精細的工作,因為需要對每個像素點分類,如下圖的街景分割,由於對每個像素點都分類,物體的輪廓是精準勾勒的,而不是像檢測那樣給出邊界框。圖像分割可以分為兩類:語義分割(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的空洞卷積

空間金字塔池化(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的新特徵。

圖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

機器學習算法工程師

                            一個用心的公眾號

長按,識別,加關注

進群,學習,得幫助

你的關注,我們的熱度,

我們一定給你學習最大的幫助

相關焦點

  • DeepLabv3+:語義分割領域的新高峰
    前言臨近春節,Google 團隊也不休假,趁著中國人每年一度大遷徙,他們在 arXiv 放出了 DeepLabv3+,在語義分割領域取得新的 state-of-the-art 水平。本文將帶大家回顧 DeepLabv1-v4 系列的發展歷程,看看 Google 團隊這些年都在做什麼。
  • 在PyTorch中使用DeepLabv3進行語義分割的遷移學習
    當我在使用深度學習進行圖像語義分割並想使用PyTorch在DeepLabv3[1]上運行一些實驗時,我找不到任何在線教程。並且torchvision不僅沒有提供分割數據集,而且也沒有關於DeepLabv3類內部結構的詳細解釋。然而,我是通過自己的研究進行了現有模型的遷移學習,我想分享這個過程,這樣可能會對你們有幫助。
  • 使用PixelLib來實現圖像分割
    圖像分割的一些主要應用包括:語義分割:使用相同類別的對象使用相同的顏色映射進行分割。實例分割:它不同於語義分割,它會對同一對象的不同實例用不同的顏色映射來進行分割。PixelLib:是為了在現實生活中更容易實現圖像分割而構建的庫。PixelLib是一個靈活的庫,可以集成到需要應用圖像分割的軟體解決方案中。
  • CVPR 2018:新型語義分割模型:動態結構化語義傳播網絡DSSPN
    近日,來自 CMU、Petuum 等機構的研究者提出一種新型語義分割模型動態結構化語義傳播網絡 DSSPN,通過將語義概念層次明確地結合到網絡中來構建語義神經元圖。實驗證明 DSSPN 優於當前最優的分割模型。
  • CVPR 2018 | 新型語義分割模型:動態結構化語義傳播網絡DSSPN
    實驗證明 DSSPN 優於當前最優的分割模型。引言隨著卷積神經網絡的不斷進步,目標識別和分割作為計算機視覺的主要研究方向取得了巨大的成功。然而,目前使用更深、更寬網絡層的分割模型 [24,5,40,37,22] 在對分割注釋有限的大型概念詞彙的識別方面表現欠佳。原因在於它們忽略了所有概念的固有分類和語義層次。
  • 語義分割入門的總結
    目的:給定一張圖像,我們要對這張圖像上的每個pixel逐一進行分類,結果展示如下圖:上圖中的實例分割是語義分割的延伸,要區別出相同類別的不同個體。應用場景:無人駕駛、輔助醫療等。語義分割方法發展過程:1.灰度分割(Gray Level Segmentation)語義分割的最簡單形式是對一個區域設定必須滿足的硬編碼規則或屬性,進而指定特定類別標籤. 編碼規則可以根據像素的屬性來構建,如灰度級強度(gray level intensity).
  • 語義分割入門的一點總結
    上圖中的實例分割是語義分割的延伸,要區別出相同類別的不同個體。應用場景:無人駕駛、輔助醫療等。語義分割方法發展過程:1.灰度分割(Gray Level Segmentation)語義分割的最簡單形式是對一個區域設定必須滿足的硬編碼規則或屬性,進而指定特定類別標籤. 編碼規則可以根據像素的屬性來構建,如灰度級強度(gray level intensity).
  • 2019 語義分割指南
    語義分割是指將圖像中的每個像素歸於類標籤的過程,這些類標籤可以包括一個人、汽車、鮮花、一件家具等。我們可以將語義分割認為是像素級別的圖像分類。例如,在有許多汽車的圖像中,分割會將所有對象標記為汽車對象。然後,一個稱為實例分割的模型能夠標記一個出現在圖像中的物體的獨立實例。
  • 圖像語義分割
    圖像語義分割是計算機視覺中十分重要的領域。上圖為語義分割的一個實例,其目標是預測出圖像中每一個像素的類標籤。圖像語義分割是圖像處理和計算機視覺技術中關於圖像理解的重要的一環。語義分割對圖像中的每一個像素點進行分類,確定每個點的類別(如屬於背景、邊緣或身體等)需要和實例分割區分開來。語義分割沒有分離同一類的實例;它關心的只是每個像素的類別,如果輸入對象中有兩個相同類別的對象,則分割本身不會將它們區分為單獨的對象。
  • Deeplab語義分割的發展
    「經典圖像分割方法—基於深度學習的語義分割—Deeplab及其變形」在計算機視覺中,簡單的圖像分割是將數字圖像分為多個段(像素集)的過程。圖像分割是一個長期存在的計算機視覺問題。但是,語義分割是在像素級別「理解」圖像的圖像分割技術。換句話說,語義分割是將每個像素分析和分類為多個類別(標籤)。
  • 語義分割領域開山之作:Google提出用神經網絡搜索實現語義分割
    Google 在 Cloud AutoML 不斷發力,相比較而言之前的工作只是在圖像分類領域精耕細作,如今在圖像分割開疆擴土,在 arxiv 提交第一篇基於 NAS(Neural network architecture)的語義分割模型[1](DPC,dense prediction cell)已經被 NIPS2018 接收,並且在 Cityscapes,PASCAL-Person-Part
  • 一文總結圖像語義分割模型
    連結:https://zhuanlan.zhihu.com/p/133268053語義分割是圖像分割中的基本任務,是指對於圖像將每個像素都標註上對應的類別
  • 入門 | 一文了解什麼是語義分割及常用的語義分割方法有哪些
    我們已經開始發展自動駕駛汽車和智慧機器人,這些都需要深入理解周圍環境,因此精確分割實體變得越來越重要。什麼是語義分割?語義分割是計算機視覺中的基本任務,在語義分割中我們需要將視覺輸入分為不同的語義可解釋類別,「語義的可解釋性」即分類類別在真實世界中是有意義的。
  • 入門| 一文了解什麼是語義分割及常用的語義分割方法有哪些
    我們已經開始發展自動駕駛汽車和智慧機器人,這些都需要深入理解周圍環境,因此精確分割實體變得越來越重要。什麼是語義分割?語義分割是計算機視覺中的基本任務,在語義分割中我們需要將視覺輸入分為不同的語義可解釋類別,「語義的可解釋性」即分類類別在真實世界中是有意義的。
  • 10分鐘看懂全卷積神經網絡( FCN ):語義分割深度模型先驅
    語義分割簡單地說,分割就是摳圖。語義分割,就是按圖像中物體表達的含義進行摳圖。現在ps已經集成很多自動分割的功能,相比舊版本軟體,新軟體提高了美工人員的摳圖和美圖的效率。如果我們能在更複雜的環境下,完成自動分割圖像進行分析,這將降低多少人工?這類場景我們很熟悉,比如現在快速發展的自動駕駛。
  • 魚與熊掌可以兼得:何愷明等人一統語義分割與實例分割
    ,它結合語義和實例分割的優勢構建更強大的方案。但目前大多數頂尖方法都分別用兩個模型建模語義和實例分割兩種任務,並最後將預測結果組合在一起。這種方法並不能利用兩者間的交互信息提供更準確的預測,這樣也就沒什麼意義了。在何愷明等研究者的這篇論文中,他們結合 Mask R-CNN 與 FCN 構建出一種新型的全景分割模型,這個統一的模型在兩種任務間共享計算,並實現非常好的性能。
  • 實時語義分割算法大盤點
    兩路網絡的特徵並不相同,因此不能簡單地加權兩種特徵,要用一個獨特的特徵融合模塊以融合這些特徵。該方法有助於總結從不同接受區域收集到的語義特徵。合成的特徵再一次與輸入特徵融合到同一個非瓶頸層。在所提出的非瓶頸層中,多個跳轉連接到特徵融合塊,這有助於處理高梯度流,因為在反向傳播時,傳入的梯度分布在所有路徑中。我們知道解碼器做得更寬,運行時間會大幅提高。因此,定期減少特徵圖的數量是負擔不起的,也超出了模型的預算。
  • 語義分割概念及應用介紹
    比如自動駕駛汽車已經逐漸成為可能,但在整個深度學習過程,需要算法識別和學習作為原始數據提供的圖像,在這一過程中,應用到了語義分割技術。下面讓我們來看看語義分割的需求是如何演變的。早期,計算機視覺的初始應用需求只是識別基本元素,例如邊緣(線和曲線)或漸變。然而,僅僅通過全像素語義分割的創造來理解像素級的圖像,它將屬於同一目標的圖像部分聚集在一起,從而擴展了語義分割的應用場景。
  • 基於深度學習的語義分割綜述
    近年來,由於深度學習模型在視覺應用中的成功,已有大量的工作致力於利用深度學習模型開發圖像分割方法。本文全面回顧了撰寫本文時的文獻,涵蓋了語義和實例級分割的大量開創性工作,包括完全卷積像素標記網絡、編碼器-解碼器架構、多尺度和基於金字塔的方法、遞歸網絡,視覺attention模型,以及生成對抗模型。
  • 一文讀懂語義分割與實例分割
    ,提出語義分割的模型由編碼器Encoder和解碼器Decoder組合,取代了收縮通道和擴展通道的說法,被後來的研究人員所引用。DeepLab我們在上文中已經討論了FCN,U-Net和Segnet這些經典的語義分割網絡,接下來我們會討論代表著語義分割最前沿技術的Deeplab系列。Deeplab是由谷歌研究人員開發的,目前被廣泛應用的語義分割模型,它最重要的特性是以更低的計算成本獲得更好的輸出。