深度學習筆記(二十三)Semantic Segmentation(FCN/U-Net/PSPNet/SegNet/U-Net++/ICNet/DFANet/Fast-SCNN)


 

借助一張 COCO 數據集中的圖片來展示下分類、檢測、語義分割、實例分割的區別。

語義分割的本質是圖片信息的編解碼(encoder-decoder)過程:

當時這個結構提出的主要作用並不是分割,而是壓縮圖像和去噪聲。輸入是一幅圖,經過下采樣的編碼,得到一串比原先圖像更小的特征,相當於壓縮,然后再經過一個解碼,理想狀況就是能還原到原來的圖像。這樣的話我們存一幅圖的時候就只需要存一個特征和一個解碼器即可。

本文按照下面這張圖的順序簡單理一下語義分割:

1. FCN

FCN 全名 Fully Convolutional Networks for Semantic Segmentation,算是利用深度學習進行語義分割的開山之作了。

 

 

 它將傳統的分類網絡改造成了分割網絡:替換全連接層為卷積層,利用反卷積操作上采樣獲得高分辨率的語義特征圖。輸出 feature map 每一維通道預測一個類別的分割結果。

 

 

為了加強特征表示,在編碼器階段將不同階段的特征融合

2. U-Net

U-Net 全名為 U-Net: Convolutional Networks for Biomedical Image Segmentation.

1.1 DataAugmentation

U-Net 的實驗環境是醫學圖像的語義分割,這類圖像由於其特殊性,因而通常無法獲得大量的數據,而深度學習卻依賴於大量的訓練數據來擬合。因此文章中描述到,作者主要針對平移、旋轉、形變、灰度值方面做了數據增廣。具體細節就要參考源碼了

1.2 Network Architecture

網絡將編碼和解碼(encoder-decoder)思想用在了圖像分割的問題上,也就是現在我們看到的U-Net結構,在它被提出的幾年中,有很多很多的論文去講如何改進 U-Net 或者 FCN,不過這個分割網絡的本質的拓撲結構是沒有改動的。

網絡設計的很規整對稱,讓我們來看圖說話:下采樣階段,重復使用兩個 3x3 的卷積層(no padding),每一個卷積層跟上一個 ReLU 激活層,隨后跟上一個大小為 2x2 , stride=2 的最大池化層。每次下采樣過后,將特征通道數加倍。上采樣階段和下采樣階段保持對稱,上采樣采用大小為 2x2 , stride=2 的反卷積層。上采樣的同時,采用 skip connection,將對應的下采樣的 feature map crop 后通道維度 concat 到上采樣的 feature map 上,隨后跟上兩個連續的 3x3 卷積層,第一個卷積層會將特征通道減半。特別的,由於使用 unpadded convolution,因此每次卷積過后,feature map 的的尺度會有些許變小(邊界信息丟失),這就是為什么 concat feature map 的時候需要 crop 的原因了。而為了保證分割的無縫平鋪,需要合理地選擇輸入圖像尺寸,以保證池化操作時能被整除。上采樣同樣采用 反卷積(Deconvolution Conv.)

1.3 Training

在那個時期,GPU 的計算能力還不是很強,為了有效利用 GPU, 作者采用 batch_size=1 的設置。為此,使用高動量(0.99),使得大量先前看到的訓練樣本確定當前優化步驟中的更新。

Loss 層面為逐像素層級的 softmax_cross_entropy 損失函數。而為了凸顯鄰近的相同類別不同實例之間的邊界,作者在基礎 Loss 上增加了一個權重項 $w(x)$:

\begin{equation}
\label{loss}
\begin{split}
& E = \sum_{x \in \Omega} w(x) log(p_{l(x)} (x)) \\
& w(x) = w_c(x) + w_0 \cdot exp(-\frac{(d_1(x) + d_2(x))^2}{2 \sigma^2}) \\
\end{split}
\end{equation}

這里$w_c$ 是根據每個類別像素點數量確定的一個權重系數(用以避免類別不平衡),  $d_1$ 表示該像素點到最近實例的邊界的距離,$d_2$ 則表示該像素點到次近實例的邊界的距離。實驗中設定 $w_0=10$, $\sigma \approx 5$。

權重初始化方面,實驗標准差為 $\sqrt{2/N}$ 的高斯分布中繪制初始化權重來實現,其中 $N$ 表示一個輸出節點對於的輸入節點數量(kernel_size * input_channel) 。

1.4 Others

為了預測圖像邊界區域中的像素,通過鏡像輸入圖像來外推缺失的上下文。這種圖像塊策略對於將網絡應用於大的圖像非常重要,否則分辨率將受到GPU內存的限制。

 

3. SegNet

SegNet 全名為 SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation.

這其實和 U-Net 很像,區別在於它使用 Pooling 操作來完成上采樣:

4. U-Net++

3.1 分析 U-Net 的缺點

對於 Encode 階段來說,UNet 采用了四次降采用操作,那么問題來了,對比分類網絡,這里是不是網絡越深越好?

我們知道淺層特征提取的是一些我們容易理解的紋理外觀信息,而深層特征提取的則是一些比較深層次的我們不理解的高維特征,從理論上來說,淺層特征和深層特征對於分割任務都有其重要性。

UNet++ 作者做了這樣一個實驗:實驗不同下采樣的次數對分割性能的影響,結論是對於不同的數據集來說,並不是越深越好。

針對上面那個問題,U-Net++ 的做法是下圖這樣的:

U-Net++ 的思想是,在對於某個數據集,我們不知道選擇幾次下采樣更好的情況下,我們選擇讓網絡自己去選擇。這里的 Backbone 是共用的。

這里可以理解為將 U-Net 和 Deep Layer Aggregation 結合起來(當然需要強調這只是創新點的偶遇):

U-Net DLA U-Net++


 這里面隱含了一個問題就是:UNet++ 的性能提升是否來自於計算量的增加?

作者通過擴展 U-Net 的參數量(增加 channel)到與 UNet++ 差不多大小的情況下,來對比性能。

實際使用中,作者在上面網絡的基礎上加了一個深監督信息,來讓網絡自己學習哪個層次的特征更重要:

這里一個更有意思的地方在於,我們可以通過這個網絡在不同的數據集中來剪枝

如上圖所示,訓練階段每個節點都是對前面的節點作貢獻的,而在測試階段,我們可以從后往前丟棄某一層次或某幾層次節點。按照作者的說法,這使得 U-Net++ 比 U-Net 更加靈活!

U-Net++ 的優勢在於一方面長短連接加強了特征的表示能力,另一方面允許剪枝操作使得網絡更加靈活。

5. PSPNet

PSPNet 全名為 Pyramid Scene Parsing Network.

 

作者對比 FCN 的分割結果,發現 FCN 算法有上面的三個缺點,這些問題產生的原因作者分析為,FCN 的感受野一方面對於大目標不夠大,另一方面又對小目標不夠小。

 

PSPNet 的核心思想就是:利用空洞卷積增加感受野,不同大小感受野的 feature map cancat 到一起實現多尺度分割。

6. ICNet

ICNet 全名 ICNet for Real-Time Semantic Segmentation on High-Resolution Images.

 

它的核心思想,是設計 Cascade Feature Fusion 和 Cascade Label Guidance 多階段多 Loss 學習,小尺度的輸入經過較大的網絡提取粗糙的分割結果,大尺度的輸入經過較小的網絡提取精細的分割結果,小尺度輸入 提取的特征 會融合到 大尺度輸入 提取的特征中,從 Loss 角度來看有點 相關的多任務學習,彼此之間可以互相促進 的味道。

7. DFANet

 DFANet 全稱 DFANet: Deep Feature Aggregation for Real-Time Semantic Segmentation。DFANet 與 ICNet 形式上很像,區別在於利用多尺度融合特征來替換多尺度圖片輸入(sub-network Aggregation),不同支路之間的 feature map 之間也加上短連接來增強特征融合(sub-stage Aggregation)。

 

網絡主要采用 depthwise separable convolution,同時加入了 SENet 里面的 channel-wise attention 機制以及類似 EncNet 中的上下文編碼結構。

 

 性能看上去還是挺屌的!這里的 DFANet A’ 應該是輸入圖片尺度為 512x1024Backbone A x3+HL+LL 的網結構,這里的 Backbone A = Xception A + SENet, ’HL’ means that fusing high-level features. ’LL’ means fusing low-level features.

該文章官方沒有公布源碼,第三方實現我這邊 512x1024 尺度下訓練,2 GFlops,1024x2048 尺度下測試能夠達到 67 mIoU.

8. Fast-SCNN

Fast-SCNN uses standard convolution (Conv2D), depthwise separable convolution (DSConv), inverted residual bottleneck blocks (bottleneck), a pyramid pooling module (PPM) and a feature fusion module (FFM) block. Parameters t, c, n and s represent expansion factor of the bottleneck block, number of output channels, number of times block is repeated and stride parameter which is applied to first sequence of the repeating block. The horizontal lines separate the modules: learning to down-sample, global feature extractor, feature fusion and classifier (top to bottom).

可以理解為 PSPNet 的加強版!

該文章官方沒有公布源碼,第三方實現我這邊 512x1024 尺度下訓練,2 GFlops,1024x2048 尺度下測試能夠達到 69 mIoU.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM