DeepLab系列

論文:git

 

 

0.簡介

DeepLab爲一系列的工做,從14年到如今跨度也比較久,我會把每篇工做的關鍵點都梳理一下,這四篇工做自己也是一代代改進來的,因此會有一些一直延用並改進的東西,也會有DeepLab放棄了的東西,前者咱們深刻學習,後者簡單瞭解。ide

 

1.DeepLab V1

這裏只簡單說下V1作了什麼,詳細的講解我想放到V2裏開始講,由於那時候的研究已經有更深的認識。這裏就看成個前情提要吧。函數

 

2014年,正是DCNN在圖像領域爆發後的那段時間,圖像分類、目標檢測等領域基於DCNN取得空前進展,語義分割領域固然也會一頭扎進去。但對於語義分割這一須要準確位置信息的像素級任務,使用DCNN還須要解決以下問題:工具

  • 重複池化下采樣致使分辨率大幅降低,位置信息難以恢復。
  • DCNN的空間不變性,位置信息丟失會使最後的分割結果粗糙,丟失細節。

因此本文也出一下兩點來解決:學習

  1. 空洞卷積。基於VGG-16改造:設計

    • 由於是作分割,因此把全鏈接層改爲卷積層。
    • 把最後兩個池化層去掉,後續使用空洞卷積。

    v1

  2. Fully Connected CRFs(條件隨機場)。

    改善DCNN的輸出結果,更好捕捉邊緣細節。

 

2. DeepLab V2

到了DeepLabV2的時候,多尺度問題已經被研究着們普遍且深入的認識到,因此在V2的原文中,把DCNN應用到語義分割須要解決的問題又多了一個多尺度方面的,由原來v1中的兩大問題變成此時的三個:

  • 重複池化下采樣致使分辨率大幅降低,位置信息難以恢復。
  • 不一樣尺度物體的存在。
  • DCNN的空間不變性,位置信息丟失會使最後的分割結果粗糙,丟失細節

而後原文給出了對應的三個解決方法:

  • 空洞卷積
  • ASSP(Atrous Spatial Pyramid Pooling)
  • Fully Connected CRF

 

總體結構

v2_all

圖像輸入,進入到改造過的DCNN(VGG-16或ResNet-101,空洞卷積、ASSP都是在這裏),獲得分辨率略小的特徵圖,而後進行雙線性插值恢復分辨率,使用全鏈接CRFl來改善分割結果(去噪、平滑、更好的捕捉邊界)。

 

空洞卷積

DCNN隨着進行,會使feature map變小,獲得更high-level的特徵。主要是由於:

  1. conv的stride>1 —— 爲了獲得更大感覺野
  2. max pooling操做 —— 爲了獲得更high-level的特徵

獲得這樣high-level的特徵有利於圖像分類、目標檢測等任務,但DCNN這樣的特色不能直接用於語義分割這樣的要求高精密的像素級任務。

對於這一問題,做者強調(卷積+上採樣濾波器)or(空洞卷積)是有力的解決工具,實際使用空洞卷積來解決,空洞卷積由兩個優點:一是能夠控制圖像的分辨率不至於過小,解決上述問題;二是增長感覺野。

首先要明白,經過控制參數,在緊密特徵圖上的空洞卷積能夠產生和在係數特徵圖上標準卷積如出一轍的結果;也能夠產生更緊密的特徵,即高分辨率的特徵圖,以下圖所示:

atrous_conv

atrous_conv2

再結合第三節DeepLabV3串聯結構中講的,應該就徹底理解了。

 

ASSP

圖像中存在多種尺度的物體,這是影響視覺檢測、分割等任務精度的一大問題,若是網絡抽象能力較強則更容易識別大尺度的物體但會忽略小尺度的物體,若是抽象能力較弱則能夠較好識別小物體但抽象大物體的能力勢必較弱,就是這樣一種矛盾,研究者們提出各類方法來解決,本文基於空洞卷積設計了ASSP結構(Atrous Spatial Pyramid Pooling)。

即獲得一feature map後,接入一個並行結構,並行結構中的每一個分支結構都同樣,惟一不同的就是各自卷積的膨脹率。以下圖所示。不一樣膨脹率的卷積能夠獲得不一樣的感覺野,膨脹率小的卷積感覺野小,對小尺度的物體識別效果較好;膨脹率大的卷積感覺野大,對大尺度的物體識別效果好。空洞卷積對於感覺野、並行空洞卷積解決多尺度問題,推薦閱讀目標檢測領域的一項工做,原理解釋、實驗很是充實——TridentNet。Scale-Aware Trident Networks for Object Detection

assp

assp_2

Fully Connected CRF

(這一方法在以後的版本就放棄了,我對此暫時也沒有多大興趣,僅限於跟着論文學習了一遍,這裏就簡單介紹吧,數學及原理就再也不梳理了)

條件隨機場(CRF,Conditional Random Field)通常用來處理分割不平滑問題,它只考慮到目標像素點的附近點,是一個短距離的CRFs。因爲網絡中獲得的結果已經比較光滑了,更但願的是修復一些小的結構,處理邊緣細節,因此用到了全鏈接CRF模型。能量函數中有一部分高斯核函數,其值由兩點間的位置和顏色決定,位置爲主,顏色爲輔,算是一句話說一下淺顯的說明一下原理吧。

 

3.DeepLab V3

串聯結構

cascaded

基於ResNet。使用標準卷積時,當網絡愈來愈深,output stride越大,feature map越小。每個block中有三個3×3的卷積,最後一個卷積的stride=2,feature map就是由於這個變小的(除最後一個block的最後一個卷積,它的stride=1)。

低分辨率的feature map難以恢復位置信息獲得好的分割結果。分辨率變低是由於stride=2,令stride=2的緣由是,但願隨着網絡的深刻,感覺野愈來愈大,越有利於得到high-level的信息。

那有沒有什麼辦法既能得到較大感覺野,又能有高分辨率(output stride低)的特徵圖呢?就是DeepLab在使用的空洞卷積了!有了第二節DeepLabV2中的空洞卷積介紹基礎,看到這裏應該徹底理解了。

做者設計的這一使用空洞卷積的串聯結構,把block4重複了四遍,即block5, block6, block7都是block4的複製品,惟一不一樣的是其中的膨脹率(rate / dilation),取決於想要的output stride。

做者還考慮了multi-grid方法,即每一個block中的三個卷積有各自unit rate,例如Multi Grid = (1, 2, 4),block的dilate rate=2,則block中每一個卷積的實際膨脹率=2* (1, 2, 4)=(2,4,8)。

 

並聯結構

parallel

如上圖所示,block4以後鏈接並聯結構,其中上面四個爲ASSP,下面一個爲image-level feature,他們的輸入都爲前面的feature map,最後這五個結果拼接成一組特徵,看源碼torch.cat就很好理解了。

ASSP改進

相校對DeepLabV2的ASSP,惟一的區別就是加了BN層...

當想讓output stride=16時,ASSP包括了一個1×1卷積,和rate=(6,12 ,18)的3×3卷積,都是256通道。

image-level feature

用ASSP並列加入image-level feature是由於做者爲了解決空洞卷積帶來的一個問題:

vilid_conv

隨着空洞卷積的膨脹率(rate/dilation)增大,卷積核有效參數愈來愈少。是的,這個很容易理解,3×三、rate=1即標準卷積,只有在feature map最外面一圈會有卷積核參數超出邊界而無效,當rate變大,愈來愈多外圈的位置是有卷積核參數失效的,用極限思想思考一下,若是rate=size(feature map),那麼每次卷積都是卷核中心對應的feature map像素點被計算了,卷積核參數也只有中心那個點沒有失效,退化成了1×1卷積核。

做者正式爲了解決這一問題,纔在並聯結構中加入image-level feature。作法是對輸入的feature map全局平均池化(global average pooling),256通道的1×1卷積層,BN層,最後用戶雙線性插值的方法上採樣到目標大小,即與ASSP輸出的feature map尺寸相同。

 

4.DeepLab V3+

加入decoder

decoder1

做者把DeepLavV3做爲Encoder部分,加入decoder部分,稱造成了一種融合了SSP和Encoder-Decoder的新方法。

decoder2

把整個網絡DeepLabV3做爲Encoder,提取融合多尺度特徵;加入一個簡單的結構做爲Decoder,可以改善分割結構的物體邊界。

圖中的decoder的輸入,即low-level features,並非和ASSP的輸入同樣,而是backbone的某個中間計算結果,而後經過一個1×1卷積(爲了減小通道數),結果與encoder輸出(1×1卷積減小通道數,也上採樣了到原來4倍)融合,再通過3×3卷積,再上採樣4倍(至此16倍,已經恢復到原圖大小)。

 

深度可分離卷積(depthwise separable convolution)

本做中使用了depthwise separable convolution代替標準卷積,Depthwise separable convolution由depthwise convolution和pointwise convoution兩步完成。由於它能經過將標準卷積運算分爲兩步從而減小參數,但實現和標準卷積操做相同的效果。即depthwise separable convolution = depthwise convolution + pointwise convolution(既指流程,也值參數量)。詳細內容和具體參數量計算請見下面的我的獨立博客,由於我也是學習來的,並且博主寫的很清晰明瞭,因此就不板門弄斧了:https://yinguobing.com/separable-convolution/

固然做者雖然使用了depthwise separable convolution方法來代替標準卷積操做,但依然是仍是空洞卷積,看完上面那篇博客(或者自己就掌握深度可分離卷積),應該很容易就明白這句話。Atrous separable convolution只須要更改第一步爲間隔取樣,第二部pointwise convolution無需特別處理。

atrous_depthwise

 

 

 

DeepLab系列,尤爲是後面兩做,他們的貢獻除了提出新算法模型之外,還包括進行了大量的實驗,包括模型中選擇某些小結構、參數的對比實驗,對於後面的研究者提供了寶貴的經驗,節省了大量的實驗資源與時間。

另外,學習時參考的代碼是第三方pytorch實現的,Github地址放在參考連接裏。

 

 

 

參考及引圖:

相關文章
相關標籤/搜索