deeplab系列總結(deeplab v1& v2 & v3 & v3+)

原文鏈接:https://blog.csdn.net/Dlyldxwl/article/details/81148810

最近花了幾天時間把deeplab系列擼了一遍,直觀感受是不如當初看RCNN系列來的激動啊......像RPN這種劃時代的改變沒有看到--直奔主題。

Deeplab v1&v2

paper: deeplab v1 && deeplab v2

遠古版本的deeplab系列,就像RCNN一樣,其實瞭解了後面的v3和v3+就可以不太管這些了(個人拙見)。但是爲了完整性和連貫性,所以讀了這兩篇paper。

Astrous conv

參考deeplab v2的插圖。其實這個圖經常可以看到,想說明什麼呢?該圖是一維卷積示意圖。對於使用了s=2後的low resolution feature map再進行standard conv的效果和在原feature map上使用rate=2 的dilation conv是一模一樣的。實際中使用s=2+standard conv和rate = 2的dilation conv僅僅是對應的感受野相同,並不是使用的像素點一樣,這張圖個人覺得有點障眼法的感覺。作者用了sparse/dense feature map的概念,其實就是low/high resolution feature map,直觀上看起來分辨率低的當然稀疏啊。

ASPP結構

圖右的結構,作者對比了單獨的rate(左邊結構),有不小的提升。多尺度進行dilation conv,其實RFBnet(2017 CVPR )對SSD的改進就是參考這個思路,inception + aspp。Receptive Field Block Net for Accurate and Fast Object Detection

 

v2用Resnet 101作爲backbone,有一定提升,v1和v2都用了CRF。關於CRF的不再贅述了,其實後面的版本都沒有用這個了。訓練用的poly策略。


Deeplab v3

paper: Rethinking Atrous Convolution for Semantic Image Segmentation

implementation:  github

v3的創新點一是改進了ASPP模塊;二是參考了圖森組的Understanding Convolution for Semantic Segmentation中HDC的思想。其實就是對應縱橫兩種結構。backbone還是resnet 101.

論文中Fig2畫了幾種常見的捕獲multi-scale context的方法。

(a)圖像金字塔。輸入圖像進行尺度變換得到不同分辨率input,然後將所有尺度的圖像放入CNN中得到不同尺度的分割結果,最後將不同分辨率的分割結果融合得到原始分辨率的分割結果,類似的方法爲DeepMedic;

(b)編碼-解碼。FCN和UNet等結構;

(c)本文提出的串聯結構。

(d)本文提出的Deeplab v3結構。最後兩個結構右邊其實還需要8×/16×的upsample,在deeplab v3+中有所體現。當然論文的Sec 4.1也有提到,下采樣GT容易在反向傳播中丟失細節,因此上採樣feature map效果更好。

ASPP的改進

改進後的aspp長下圖那個樣子,多了個1*1的conv和global avg pool。關於1*1卷積,論文中3.3第一段解釋的有點意思,當rate=feature map size時,dilation conv就變成了1*1 conv,所以這個1*1conv相當於rate很大的空洞卷積。此外引入了全局池化這個branch,這個思想是來源於PSPnet(參考博客),簡言之就是spp在分割上的應用,多尺度pooling。根據代碼實現來看,每個branch後面都沒有relu,其實有沒有BN,個人覺得不是很要緊,畢竟BN是線性操作,可以合併到conv裏面,論文的Sec 4.1 說明了V3的所有層是用了BN的,BN可以加速訓練還有弱正則,所以一般都會用。針對ASPP,作者設計了一種“縱式”的結構,如下圖fig5。

"串聯"結構

如下圖所示,複製conv4的結構3次,後面的每個block都有一個基準dilation Rate,在每一個block裏面參考HDC的思想,又設置了[1,2,1]的rate,所以每個conv的rate = Rate*rate.在論文4.2的Multi-grid部分詳細進行了解釋對比。

兩種方法的結構合併並不會帶來提升,相比較來說,aspp的縱式結構要好一點。所以deeplab v3一般也是指aspp的結構。


Deeplab v3+

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

Implementation:github

在deeplab v3中說到了需要8×/16×的upsample 最終的feature map,很明顯這是一個很粗糙的做法。

v3+的創新點一是設計基於v3的decode module,二是用modify xception作爲backbone。

論文中同樣給出了一幅對比圖,(a)是v3的縱式結構,(b)是常見的編碼—解碼結構,(c)是本文提出的基於deeplab v3的encode-decode結構。

論文中介紹了兩種backbone,一是Resnet101,二是改進後的xception。xception效果好於resnet,所以我只關注了xception,畢竟v3+主打也是xception backbone。下面從backbone和decode來簡要概括v3+的結構。

Modify Xception

具體結構參照下圖。和原來的xception不一樣的地方有三,一是Middle flow重複了16次,ori xception是8次,也就是用了more layers;二是pooling均換爲了dw+pw+s=2,本人在很多網絡也實驗過,把pool換成conv或者合併到現有的卷積層,均能提高一定的map。在Entry flow中stride =16,所以訓練的時候需要把Exit flow的stride=2換爲rate=2的dilation conv(Middle不改變resolution)(train_os=16),因此後面的層也都是rate=2,這又導致The Gridding Effect,然而論文4.3中說明了這個地方用HDC思想並不會帶來提升,因此保留了一系列的rate=2;三是在所有的dw層後面加上了BN和relu,加BN無可厚非,線性操作而已,但是重新加relu是真的玄學啊。

Decoded module

xception的輸出2048維特徵接到ASPP上得到256維multi-scale context feature map(一般s=16),再4×上採樣,和backbone上的同分辨率的low-level feature map concat(一般是entry flow的第一個shortcut block的輸出,剛好s=4)。這個時候要讓low-level feature map在concat後的總特徵圖中佔比小,因爲它的語義信息太少了,所以接了1*1的低維conv,這個地方可不是爲了降低計算量,關於這個conv的channel選取,論文給出了對比試驗Table 1。concat後再接3*3 conv block,它的channel和block個數,論文中也進行了實驗驗證Table 2.最後再進行4×上採樣,達到原圖的分辨率。此外,作者還實驗了將aspp和decode中的卷積替換爲depthwise conv,mIOU沒有明顯降低,flops大大降低了。

本人簡繪了一下deeplab v3和v3+的ASPP模塊結構,如下圖所示:參照我貼的重實現的代碼來看,ASPP每個部分後面均有relu。

官方給出過一個PPT,內容是關於deeplab v1,2.3的主要區別,鏈接: https://download.csdn.net/download/dlyldxwl/10557350

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