語義分割之DeepLab v1、v2、v3、v3+個人總結
1. 基本流程
deeplab v1、v2、v3也用到了空洞卷積–dilated convolution,因為這麼做可以獲得較大的感受野同時又不損失影象的解析度。
然而,經過了poolling,雖然可以提高影象的語義資訊(即"what"),卻會丟失解析度資訊(即"where")。這對精細的分割任務來說,會很有難度。
於是,本文應用了CRF(condition random field),對初步的pixel-level分類進行進一步的修正,是一種後處理的手段。
2. CRF
我們得到雙線性插值後的feature map,每個pixel處的特徵向量記為I = { I1,I2,…,In }, n為影象畫素的個數
令x= { L1,L2,…,Lnum_cls} 為畫素的label。
X={X1,X2,…,Xn} 表示輸出的標記序列,X取值於x。
此時,對於給定的觀測序列I,得到標記序列X的條件概率為:
其中,Z(I) 為規範化因子,表示X取所有不同L時,exp(-E(x|I)) 的和。形式類似於softmax。
E(x|I)為能量函式(注意: 這裡的xi和xj表示畫素i和j的label,可能和上面的定義有衝突)。
能量函式由一元勢函式和二元勢函式組成。
一元勢函式為:
這裡的P(xi)則表示畫素i的標記為對應label的置信度。
二元勢函式為:
其中,
二元勢函式鼓勵位置相近且特徵相似的點屬於同一類。
如果位置相近且特徵相似卻不屬於同一類,則二元勢函式將會比較大,最終標記序列的條件概率也會比較小。
3. ASPP(Atrous Spatial Pyramid Pooling)
v2在用空洞卷積時,為了更好的分割各個尺度的物體,比如同一類物體在圖中既有很小的尺度又有很大的尺度。於是借鑑SPPNet裡的思想(不同尺度的roi pooling,組成特徵向量),對於同一個input feature map。將不同dilated rate得到的feature map進行了Eltwise Add。(dilated convolution中只是串聯)
這種金字塔結構可以獲得不同尺度的感受野的資訊,有利於提高分割效果。
4. DeepLab v3
首先還是再總結一下空洞卷積的好處:
- 允許調整卷積核的感受野,獲得不同尺度的資訊,且不增加引數,且不減小解析度
- 允許顯式的控制特徵提取的密度。空洞卷積rate越大,會讓輸出的feature map提取到的特徵越密集。(feature map中很多grid cell都能提取到相同部分的特徵)
然後是v3的改進,新的ASPP
新的ASPP增加了一個1x1的卷積核,以及一個global ave pooling。最後concat,再經過一個1x1卷積輸出。(對了,這塊還引入了normalization)
關於引入global ave pooling,文中是這樣解釋的:
(1) 當空洞rate越大(eg: 卷積核的感受野和feature map一樣大),越來越多的kernel實際卷積到的是padded zero。當卷積核變得和feature map一樣大時,相當於卷積核退化成了1x1,因為padded feature map只有最中心的部分才是有效的。
(2) 為了解決上面的問題,同時為了加入全域性資訊。直接用global ave pooling。
5. Atrous Separable Convolution (v3+)
v3的幾個改進包括:
(2) 新的encoder-decoder結構
encoder和v3一樣。
(3) 新的Xception
max pooling被separable convolution with stride替換了。