這就是神經網絡 12:深度學習-語義分割-DeepLabV1、V2、V3和V3+

概述

說到語義分割,谷歌的DeepLab系列都是一個無法繞過的話題。目前這個系列共出了4個版本:V1、V2、V3和V3+。

本文主要關注DeepLabV3+和DeepLabV3。V1、V2作爲前作,有一定的參考價值,但是我精力有限,這兩篇主要從其它總結材料裏學習而不是原論文,V3和V3+纔是我的重點。

一個系列看下來,感覺好漫長,半輩子都快過去了,雖然實際時間不到兩週。

DeepLabV1、V2的回顧

語義分割是一種對每個像素進行分類的密集預測,而普通的分類神經網絡具有平移不變性,對位置不敏感,而且降採樣過程會損失空間信息,不利於分割結果輸出。分類網絡不停的降採樣,也是爲了增加感知野,提取更高層的語義。那麼有沒有辦法保存特徵圖的分辨率同時增加感知野呢?辦法是有的,就是DeepLab採用的帶孔卷積(Atrous convolution)。

帶孔卷積和普通卷積核的區別示意:

在這裏插入圖片描述

使用帶孔卷積的時候,可以服用之前預訓練的分類網絡,把後面幾層的下采樣去掉,複用後面幾層的卷積參數,卷積方法改爲空洞卷積。這樣網絡最後輸出的特徵圖分辨率提高了,感知野也保住了(計算量相對大一些)。最後進行上採樣輸出原圖大小的score map即可。

下圖由左邊到右邊,主要是在DCNN中應用了空洞卷積密集的提取特徵,左邊的輸出步幅是16,需要上採樣16倍得到預測結果,可以看到結果是比較模糊的;而右邊是在DCNN中使用空洞卷積,保持步幅爲8,只需要上採樣8倍,結果清晰了很多。

在這裏插入圖片描述

DeepLabV1

DeepLabv1是在VGG16的基礎上做了修改:

  • VGG16的全連接層轉爲卷積
  • 最後的兩個池化層去掉了下采樣
  • 後續卷積層的卷積核改爲了空洞卷積(rate=2)
  • 在ImageNet上預訓練的VGG16權重上做finetune

當然,最後還採用了條件隨機場(CRF)進行進一步精修,細化邊緣分割效果。但是CRF已經被最新版DeepLabV3棄用了,所以這裏也不多少了。

DeepLabV2

V1的帶孔卷積是串行的,V2用一個ASPP模塊改爲並行的了,每個分支採用不同的rate(獲得不同的感知野),以解決多尺度問題。同時V2也保留了CRF作爲後處理手段。

V2相對V1的改進:

  • 用多尺度獲得更好的分割效果(使用ASPP)
  • 基礎層由VGG16轉爲ResNet
  • 使用不同的學習策略(poly)

這裏重點說說ASPP模塊。ASPP中在給定的Input Feature Map上以r=(6,12,18,24)的3×3空洞卷積並行採樣。ASPP各個空洞卷積分支採樣後結果最後融合到一起(通道相同,做像素加),得到最終預測結果.

在這裏插入圖片描述

效果:

在這裏插入圖片描述

DeepLabV3

DeepLabV3給我的第一感覺是把V1的串行方法和V2的並行方法結合起來了,細節之處(rate值和BN)有改進。

DeepLabV3提出了更通用的框架,適用於任何網絡。這裏所說的通用是指複製了ResNet最後的block,自然也可以複製其他網絡最後的block來用。

DeepLabV3 在論文中討論了串行和並行(ASPP-Atrous Spatial Pyramid Pooling)兩種風格的網絡,通過對比發現並行的效果更好,所以後來再提到DeepLabV3實際是說的ASPP風格的這個版本,最終參加各種比賽刷榜的也是這個結構。

爲了解決多尺度的問題,作者做了兩種嘗試:在串行網絡結構中依次double空洞卷積率;在ASPP網絡結構中採用全局池化和多種空洞卷積分支 平行計算後融合。

out_stride

論文裏的out_stride參數直譯過來就是輸出步長,實際含義是說最後端的特徵圖被主幹網絡縮小了多少倍。論文裏常用的out_stride就8和16這兩個,分別表示最終特徵圖變爲原圖寬高的1/8和1/16。

注意,out_stride雖然最終的輸出效果更好,但是計算量也大了很多。論文裏的策略是用out_stride=16訓練,用out_stride=8做推理。比賽打榜嘛,計算量什麼的都不是事。

Multi-grid

Multi-grid是指在一個block內部,採用不同的空洞卷積率。

比如,在resnet的block4內有3層卷積,那麼當Multi Grid = (r1, r2, r3)=(1, 2, 4),rate=2時,最終這三層卷積的空洞卷積率爲 rates= 2*(1, 2, 4) = (2,4,8)。

所以空洞卷積率數是Multi-grid和rate參數的乘積。下圖b中,block4的空洞卷積率爲2*(1, 2, 4) = (2,4,8),block5的空洞卷積率爲4*(1, 2, 4) = (4,8,16),後面的兩個block同理可知。注意這個規則僅僅在串行的Multi-grid有用,在ASSP中不需要相乘。

在這裏插入圖片描述

串行的DeepLabV3

上圖b中已經把串行的空洞卷積畫出來了,注意後面block5~7是複製的block4的結構,都是三層卷積(剛好使用Multi-grid的三個參數),只是rate參數不一樣。作者實驗了不同的網絡結構和不同的block個數,發現網絡越深效果越好。

table2表明更深的resnet101好於resnet50。table3表明使用更多block串行連接對結果也是有好處的。

在這裏插入圖片描述

同時作者還發現了一個有趣的實驗現象,那就是訓練時用output stride = 16,測試時用output stride = 8,效果更好。table還說明多尺度數據增廣和左右翻轉數據增廣也能漲點。

在這裏插入圖片描述

後續實驗應該都是在ResNet-101上進行的。

並行的DeepLabV3(ASPP)

這裏並行的版本是在保留block4的基礎上,加入了ASPP模塊。網絡結構如下:

在這裏插入圖片描述

相比於DeepLabv2,DeepLabV3在ASPP中應用了BN層。因爲作者實驗發現BN很重要。

table5中作者通過實驗對比發現block4的Multi Grid =(1, 2, 4)效果最好,而ASPP部分,rate爲(6,12,18,24)的4個分支並不比(6,12,18)三個分支效果好。block4內的空洞卷積率還要乘以2,ASPP內的空洞卷積率不需要做變換,就等於rate值。

table6中,作者同樣發現,out_stride=8做推理效果更好(訓練時是16)。同時跟蹤數據增廣(不同大小和翻轉圖像最後求平均)和使用更大的數據集預訓練都有收益。注意MS和Flip屬於多次計算求平均的辦法,會極大增加計算量

在這裏插入圖片描述

注意,作者在table5中單獨列了一欄image pooling。這是因爲作者發現空洞卷積率太大,效果就接近1x1卷積了,起不到獲取大的感受野的作用,所以作者增加了一個分支做全局平局,然後再上採樣回到原來的尺度。

ASPP 最終所有分支的特徵拼接在一起,再用1x1卷積將通道數降到輸入特徵相同的數量。

作者通過對比發現,ASPP版本的網絡比串行的網絡想過要好,所以最終選擇ASPP版本的結果作爲最終參賽的結構,後續實驗都是ASPP結構上做的。

測試效果

下標的JFT版本是在JFT300M數據庫上預訓練的。

在這裏插入圖片描述
在這裏插入圖片描述

代碼實現

看了幾個實現版本,基本都是在block4內的三層卷積把空洞卷積率都設置爲2。我猜測可能有兩個原因,1:作者描述Multi Grid不夠清晰,導致很多人沒理解;2:上面ASPP版本的網絡結構圖畫的block4的rate爲2,令人迷惑,實際還要用這個rate乘以Multi Grid值;3:很多人爲了利用tensorflow官方提供的預訓練版本的resnet,使用了tensorflow源碼中的構建計算圖的代碼,而這份代碼我看過之後覺得是給串行方式的deeplabv3準備的,直接在block4的三層卷積空洞卷積率都設置爲2,而不是遵循Multi Grid設置爲不同的值。

DeepLabV3+

DeepLabV3+可以看做是DeepLabV3的改進版(名字上也體現的很明顯)。主要改進就3點:

  • 主幹網絡是微軟的可變形卷積思想改造的Xception
  • 增加decoder部分,融合更底層的特徵
  • 使用深度可分離卷積改造ASPP和decoder部分,減少計算量

網絡結構

下圖左側是DeepLabV3的結構,中間是U-Net風格的編解碼結構,最右側就是DeepLabV3+的結構。和V3相比,V3+融合了一次底層特徵圖。

在這裏插入圖片描述

更詳細的結構如下:

在這裏插入圖片描述

底層的特徵先被1x1降維到48通道和ASPP輸出特徵的4倍上採樣拼接,然後通過兩層3x3卷積變換,最後4倍線性上採樣輸出到原圖大小。這裏的上採樣時雙線性插值,不是反捲積。

爲何融合前用1x1降到48通道而不是更多,爲何拼接後用兩層3x3卷積而不是1層和3層,爲何只融合一次底層特徵,這都是作者一個個實驗做出來最終結論,只看結果的話會失去很多樂趣。

這也許能告訴我們,計算量不是越多越好,融合哪一層特徵有額沒有定論,都要結合實驗結果來說話。網絡結構設計目前還處於煉丹極端,雖然有一些大的原則可以參考,但是沒有嚴密的方法。

對主幹網絡的修改

本作的backbone是基於可變形卷積網絡(Deformable Convolutional Networks)的,可變形卷積網絡是基於Xception改進的。在對Xception的修改方面,本文在以下幾個方面和可變形卷積網絡不同:

  • 雖然都增加深了Xception(中間層增加了repeat次數),但是爲了節省計算資源沒有修改entry flow
  • 最大池化操作都被stride爲2的3x3卷積代替了,爲的就是用帶孔卷積改造網絡結構
  • 每個3x3深度可分離卷積後都增加了BN和Relu

在這裏插入圖片描述

實驗結果

在這裏插入圖片描述
在這裏插入圖片描述

論文

DeepLabV1:SEMANTIC IMAGE SEGMENTATION WITH DEEP CONVOLUTIONAL
NETS AND FULLY CONNECTED CRFS

DeeplabV2:DeepLab: Semantic Image Segmentation with
Deep Convolutional Nets, Atrous Convolution,
and Fully Connected CRFs

DeeplabV3:Rethinking Atrous Convolution for Semantic Image Segmentation

DeeplabV3+:Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation

參考資料

知乎:如何理解空洞卷積(dilated convolution)?

DeepLabV3官方PPT,介紹了V1-V3的發展思路

Semantic Segmentation --DeepLab(1,2,3)系列總結

Deeplab 系列文章讀書筆記

Deeplab V3閱讀筆記

DeepLabv3+:語義分割領域的新高峯

谷歌開源最新語義圖像分割模型DeepLab-v3+

如何評價 MSRA 最新的 Deformable Convolutional Networks?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章