轉自:http://www.2cto.com/kf/201609/545237.html
前言
(嘔血制作啊!)前幾天剛好做了個圖像語義分割的匯報,把最近看的論文和一些想法講了一下。所以今天就把它總結成文章啦,方便大家一起討論討論。本文只是展示了一些比較經典和自己覺得比較不錯的結構,畢竟這方面還是有挺多的結構方法了。
介紹
圖像語義分割,簡單而言就是給定一張圖片,對圖片上的每一個像素點分類
從圖像上來看,就是我們需要將實際的場景圖分割成下面的分割圖:
不同顏色代表不同類別。
經過我閱讀“大量”論文(羞澀)和查看Pascal VOC 2012 Learderboard,我發現圖像語義分割從深度學習引入這個任務(FCN)到現在而言,一個通用的框架已經大概確定了。即:
原圖FCNCRF/MRF分割圖 FCN-全卷積網絡 CRF-條件隨機場 MRF-馬爾科夫隨機場
前端使用FCN進行特征粗提取,后端使用CRF/MRF優化前端的輸出,最后得到分割圖。
接下來,我會從前端和后端兩部分進行總結。
前端
為什么需要FCN
我們分類使用的網絡通常會在最后連接幾層全連接層,它會將原來二維的矩陣(圖片)壓扁成一維的,從而丟失了空間信息,最后訓練輸出一個標量,這就是我們的分類結果。
而圖像語義分割的輸出需要是個分割圖,且不論尺寸大小,但是至少是二維的。所以,我們需要丟棄全連接層,換上全卷積層,而這就是全卷積網絡了。具體定義請參看論文:Fully Convolutional Networks for Semantic Segmentation
前端結構
FCN
此處的FCN特指Fully Convolutional Networks for Semantic Segmentation論文中提出的結構,而非廣義的全卷積網絡。
作者的FCN主要使用了三種技術:
卷積化(Convolutional) 上采樣(Upsample) 跳躍結構(Skip Layer)
卷積化
卷積化即是將普通的分類網絡,比如VGG16,ResNet50/101等網絡丟棄全連接層,換上對應的卷積層即可。如下圖:
上采樣
此處的上采樣即是反卷積(Deconvolution)。當然關於這個名字不同框架不同,Caffe和Kera里叫Deconvolution,而tensorflow里叫conv_transpose。CS231n這門課中說,叫conv_transpose更為合適。
眾所諸知,普通的池化(為什么這兒是普通的池化請看后文)會縮小圖片的尺寸,比如VGG16 五次池化后圖片被縮小了32倍。為了得到和原圖等大的分割圖,我們需要上采樣/反卷積。
反卷積和卷積類似,都是相乘相加的運算。只不過后者是多對一,前者是一對多。而反卷積的前向和后向傳播,只用顛倒卷積的前后向傳播即可。所以無論優化還是后向傳播算法都是沒有問題。圖解如下:
但是,雖然文中說是可學習的反卷積,但是作者實際代碼並沒有讓它學習,可能正是因為這個一對多的邏輯關系。代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
layer {
name:
"upscore"
type:
"Deconvolution"
bottom:
"score_fr"
top:
"upscore"
param {
lr_mult:
0
}
convolution_param {
num_output:
21
bias_term:
false
kernel_size:
64
stride:
32
}
}
|
可以看到lr_mult被設置為了0.
跳躍結構
(這個奇怪的名字是我翻譯的,好像一般叫忽略連接結構)這個結構的作用就在於優化結果,因為如果將全卷積之后的結果直接上采樣得到的結果是很粗糙的,所以作者將不同池化層的結果進行上采樣之后來優化輸出。具體結構如下:
而不同上采樣結構得到的結果對比如下:
當然,你也可以將pool1, pool2的輸出再上采樣輸出。不過,作者說了這樣得到的結果提升並不大。
這是第一種結構,也是深度學習應用於圖像語義分割的開山之作,所以得了CVPR2015的最佳論文。但是,還是有一些處理比較粗糙的地方,具體和后面對比就知道了。
SegNet/DeconvNet
這樣的結構總結在這兒,只是我覺得結構上比較優雅,它得到的結果不一定比上一種好。
SegNet
DeconvNet
這樣的對稱結構有種自編碼器的感覺在里面,先編碼再解碼。這樣的結構主要使用了反卷積和上池化。即:
反卷積如上。而上池化的實現主要在於池化時記住輸出值的位置,在上池化時再將這個值填回原來的位置,其他位置填0即OK。
DeepLab
接下來介紹一個很成熟優雅的結構,以至於現在的很多改進是基於這個網絡結構的進行的。
首先這里我們將指出一個第一個結構FCN的粗糙之處:為了保證之后輸出的尺寸不至於太小,FCN的作者在第一層直接對原圖加了100的padding,可想而知,這會引入噪聲。
而怎樣才能保證輸出的尺寸不會太小而又不會產生加100padding這樣的做法呢?可能有人會說減少池化層不就行了,這樣理論上是可以的,但是這樣直接就改變了原先可用的結構了,而且最重要的一點是就不能用以前的結構參數進行fine-tune了。所以,Deeplab這里使用了一個非常優雅的做法:將pooling的stride改為1,再加上1padding。這樣池化后的圖片尺寸並未減小,並且依然保留了池化整合特征的特性。
但是,事情還沒完。因為池化層變了,后面的卷積的感受野也對應的改變了,這樣也不能進行fine-tune了。所以,Deeplab提出了一種新的卷積,帶孔的卷積:Atrous Convolution.即:
而具體的感受野變化如下:
a為普通的池化的結果,b為“優雅”池化的結果。我們設想在a上進行卷積核尺寸為3的普通卷積,則對應的感受野大小為7.而在b上進行同樣的操作,對應的感受野變為了5.感受野減小了。但是如果使用hole為1的Atrous Convolution則感受野依然為7.所以,Atrous Convolution能夠保證這樣的池化后的感受野不變,從而可以fine tune,同時也能保證輸出的結果更加精細。即:
總結
這里介紹了三種結構:FCN, SegNet/DeconvNet,DeepLab。當然還有一些其他的結構方法,比如有用RNN來做的,還有更有實際意義的weakly-supervised方法等等。
后端
終於到后端了,后端這里會講幾個場,涉及到一些數學的東西。我的理解也不是特別深刻,所以歡迎吐槽。
全連接條件隨機場(DenseCRF)
對於每個像素i具有類別標簽xi還有對應的觀測值yi,這樣每個像素點作為節點,像素與像素間的關系作為邊,即構成了一個條件隨機場。而且我們通過觀測變量yi來推測像素i對應的類別標簽xi。條件隨機場如下:
條件隨機場符合吉布斯分布:(此處的x即上面說的觀測值)
P(X=x|I)=1Z(I)exp(?E(x|I))
其中的E(x|I)是能量函數,為了簡便,以下省略全局觀測I:
E(x)=∑iΨu(xi)+∑i<jψp(xi,xj)< nobr="">
其中的一元勢函數∑iΨu(xi)即來自於前端FCN的輸出。而二元勢函數如下:
Ψp(xi,xj)=u(xi,xj)∑m=1Mω(m)k(m)G(fi,fj)
二元勢函數就是描述像素點與像素點之間的關系,鼓勵相似像素分配相同的標簽,而相差較大的像素分配不同標簽,而這個“距離”的定義與顏色值和實際相對距離有關。所以這樣CRF能夠使圖片盡量在邊界處分割。而全連接條件隨機場的不同就在於,二元勢函數描述的是每一個像素與其他所有像素的關系,所以叫“全連接”。
關於這一堆公式大家隨意理解一下吧… …而直接計算這些公式是比較麻煩的(我想也麻煩),所以一般會使用平均場近似方法進行計算。而平均場近似又是一堆公式,這里我就不給出了(我想大家也不太願意看),原意了解的同學直接看論文吧。
CRFasRNN
最開始使用DenseCRF是直接加在FCN的輸出后面,可想這樣是比較粗糙的。而且在深度學習中,我們都追求end-to-end的系統,所以CRFasRNN這篇文章將DenseCRF真正結合進了FCN中。這篇文章也使用了平均場近似的方法,因為分解的每一步都是一些相乘相加的計算,和普通的加減(具體公式還是看論文吧),所以可以方便的把每一步描述成一層類似卷積的計算。這樣即可結合進神經網絡中,並且前后向傳播也不存在問題。當然,這里作者還將它進行了迭代,不同次數的迭代得到的結果優化程度也不同(一般取10以內的迭代次數),所以文章才說是as RNN。優化結果如下:
馬爾科夫隨機場(MRF)
在Deep Parsing Network中使用的是MRF,它的公式具體的定義和CRF類似,只不過作者對二元勢函數進行了修改:
Ψ(yui,yvi)=∑k=1Kλkuk(i,u,j,v)∑?z∈Njd(j,z)pvz
其中,作者加入的λk為label context,因為uk只是定義了兩個像素同時出現的頻率,而λk可以對一些情況進行懲罰,比如,人可能在桌子旁邊,但是在桌子下面的可能性就更小一些。所以這個量可以學習不同情況出現的概率。而原來的距離d(i,j)只定義了兩個像素間的關系,作者在這兒加入了個triple penalty,即還引入了j附近的z,這樣描述三方關系便於得到更充足的局部上下文。具體結構如下:
這個結構的優點在於:
將平均場構造成了CNN 聯合訓練並且可以one-pass inference,而不用迭代
高斯條件隨機場(G-CRF)
這個結構使用CNN分別來學習一元勢函數和二元勢函數。這樣的結構是我們更喜歡的:
而此中的能量函數又不同於之前:
E(x)=12xT(A+λI)x?Bx
而當(A+λI)是對稱正定時,求E(x)的最小值等於求解:
(A+λI)x=B
而G-CRF的優點在於:
二次能量有明確全局 解線性簡便很多
感悟
FCN更像一種技巧。隨着基本網絡(如VGG, ResNet)性能的提升而不斷進步。 深度學習+概率圖模型(GPM)是一種趨勢。其實DL說白了就是進行特征提取,而GPM能夠從數學理論很好的解釋事物本質間的聯系。 概率圖模型的網絡化。因為GPM通常不太方便加入DL的模型中,將GPM網絡化后能夠是GPM參數自學習,同時構成end-to-end的系統。