從FCN到DeepLab

圖像語義分割

圖像語義分割,簡單而言就是給定一張圖片,對圖片上的每一個像素點分類。
這裏寫圖片描述

 圖像語義分割,從FCN把深度學習引入這個任務到現在,一個通用的框架已經大概確定了。即前端使用FCN全卷積網絡輸出粗糙的label map,後端使用CRF條件隨機場/MRF馬爾科夫隨機場等優化前端的輸出,最後得到一個精細的分割圖。
 這裏寫圖片描述

FCN

爲什麼需要FCN?

分類網絡通常會在最後連接幾層全連接層,它會將原來二維的矩陣(圖片)壓扁成一維的,從而丟失了空間信息,最後訓練輸出一個標量,這就是我們的分類標籤。
  而圖像語義分割的輸出需要是個分割圖,且不論尺寸大小,但是至少是二維的。所以,流行的做法是丟棄全連接層,換上全卷積層,而這就是全卷積網絡了。具體定義請參看論文:《Fully Convolutional Networks for Semantic Segmentation》

FCN結構

在FCN論文中,作者的FCN主要使用了三種技術:

  • convolutional
  • upsample
  • skip layer

convolutional即是將普通的分類網絡,比如VGG16,ResNet50/101等網絡丟棄全連接層,換上對應的卷積層即可。

upsample即是反捲積(Deconvolution)。當然關於這個名字不同框架不同,Caffe和Kera裏叫Deconvolution,而tensorflow裏叫conv_transpose,在信號與系統這門課上,我們學過反捲積有定義,不是這裏的上採樣。所以叫conv_transpose更爲合適。

衆所諸知,池化會縮小圖片的尺寸,比如VGG16 五次池化後圖片被縮小了32倍。爲了得到和原圖等大的分割圖,我們需要上採樣/反捲積。反捲積和卷積類似,都是相乘相加的運算。只不過後者是多對一,前者是一對多。而反捲積的前向和後向傳播,只用顛倒卷積的前後向傳播即可。所以無論優化還是後向傳播算法都是沒有問題。上池化的實現主要在於池化時記住輸出值的位置,在上池化時再將這個值填回原來的位置,其他位置填0。圖解如下:
這裏寫圖片描述
skip layer的作用就在於優化結果,因爲如果將全卷積之後的結果直接上採樣得到的結果是很粗糙的,所以作者將不同池化層的結果進行上採樣之後來優化輸出。具體結構如下:
這裏寫圖片描述
 不同上採樣得到的結果對比如下:
 這裏寫圖片描述
 當然,你也可以將pool1, pool2的輸出再上採樣輸出。不過,作者說了這樣得到的結果提升並不大。FCN是深度學習應用於圖像語義分割的開山之作,所以得了CVPR2015的最佳論文。但是,還是有一些處理比較粗糙的地方,具體和後面對比就知道了。

FCN-alike

《SegNet: A Deep Convolutional Encoder-Decoder Architecture for Robust Semantic Pixel-Wise Labelling》則是一種結構上更爲優雅的網絡,SegNet使用一種概率自編碼模型,這是一種無監督特徵特徵生成網絡。當然,他們的label還是需要監督的。
這裏寫圖片描述

DeepLab

DeepLab是Google搞出來的一個model,在VOC上的排名要比CRF as RNN的效果好。Deeplab仍然採用了FCN來得到score map,並且也是在VGG網絡上進行fine-tuning。但是在得到score map的處理方式上,要比原FCN處理的優雅很多。
還記得FCN中是怎麼得到一個更加dense的score map的嗎? 是一張500x500的輸入圖像,直接在第一個卷積層上conv1_1加了一個100的padding。最終在fc7層勉強得到一個16x16的score map。雖然處理上稍顯粗糙,但是畢竟人家是第一次將圖像分割在CNN上搞成end-to-end,並且在當時performance是state-of-the-art。
  而怎樣才能保證輸出的尺寸不會太小而又不必加100 padding這樣“粗糙的”做法呢?可能有人會說減少池化層不就行了,這樣理論上是可以的,但是這樣直接就改變了原先可用的結構了,而且最重要的一點是就不能用以前的結構參數進行fine-tune了。
所以,Deeplab這裏使用了一個非常優雅的做法:將VGG網絡的pool4和pool5層的stride由原來的2改爲了1,再加上 1 padding。就是這樣一個改動,使得vgg網絡總的stride由原來的32變成8,進而使得在輸入圖像爲514x514時,fc7能得到67x67的score map, 要比FCN確實要dense很多很多。
但是這種改變網絡結果的做法也帶來了一個問題: stride改變以後,如果想繼續利用vgg model進行fine tuning,會導致後面感受野發生變化。這個問題在下圖(a) (b)體現出來了,注意花括號就是感受野的大小:

參考鏈接

發佈了86 篇原創文章 · 獲贊 42 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章