1. 程式人生 > >基於深度學習的影象語義分割演算法綜述(截止20180715)

基於深度學習的影象語義分割演算法綜述(截止20180715)

這篇文章講述卷積神經網路影象語義分割(semantic image segmentation)的應用。影象分割這項計算機視覺任務需要判定一張圖片中特定區域的所屬類別。

這個影象裡有什麼?它在影象中哪個位置?

更具體地說,影象語義分割的目標是將影象的每個畫素所屬類別進行標註。因為我們是預測影象中的每個畫素,這個任務通常被稱為密集預測(dense prediction)。

image.png-298.3kB

語義分割例項:預測影象中每個畫素點的類別(來源:VOC 2012)

需要注意的一點是我們不對同一類的例項進行分離; 我們只關心每個畫素的類別。 換句話說,如果輸入影象中有兩個相同類別的物件,則分割圖本身並不一定將它們區分為單獨的物件。 存在另外一類不同的模型,稱為例項分割

(instance segmentation)模型,其將分離同一類的各個物件。

分割模型廣泛應用在各領域中,包括:

  • 自動駕駛(Autonomous vehicles)  汽車需要安裝必要的感知系統以瞭解它們的環境,這樣自動駕駛汽車才能夠安全地駛入現有的道路。

deeplabcityscape.gif-6035.9kB

用於自動駕駛的道路場景實時分割

  • 醫療影像診斷(Medical image diagnostics)  機器在分析能力上比放射科醫生更強,而且可以大大減少診斷所需時間。

image.png-74.4kB

分割後的胸部X片,其中紅色是心臟,綠色是肺,藍色是鎖骨

任務描述

簡單來說,我們的目標是輸入一個RGB彩色圖片(height×width×3)或者一個灰度圖(height×width×1),然後輸出一個包含各個畫素類別標籤的分割圖(height×width×1)。

image.png-551.5kB

注意:為了清晰起見,這裡給出的是一個低解析度的預測圖。在現實中,分割標籤的解析度應該與原始輸入的解析度是一致的。

與我們處理標準分類值的方式類似,我們的預測目標可以採用one-hot編碼,即為每一個可能的類建立一個輸出通道。通過取每個畫素點在各個channel的argmax可以得到最終的預測分割圖(如上圖所示)。

image.png-192.7kB

我們可以將分割圖疊加到原始影象上可以檢驗分割效果。當我們將預測結果疊加到單個channel時,稱這為一個mask,它可以給出一張影象中某個特定類的所在區域。

image.png-252.9kB

架構設計

對於影象語義分割任務,構建神經網路架構的一種簡單方法是簡單地堆疊多個卷積層(使用same padding

以維持維度大小)並輸出最終的分割圖。 這通過特徵對映的連續變換直接學習從輸入影象到其對應分割的對映關係;但是,在整個網路中保持影象原始解析度的計算成本非常高。

image.png-186.8kB

缺點:在整個網路中維持影象原始維度計算成本很高(來源:cs231n)

回想一下,對於深度卷積網路,前面的層傾向於學習低階特徵,而後面的層學習更高階的特徵對映。為了保持表現力,我們通常需要在網路更深時增加特徵圖(channels)的數量。

這不一定對影象分類的任務造成問題,因為對於該任務,我們只關心影象中包含的物體(而不是它所在的位置)。 因此,我們可以通過通過池化或跨步卷積(即壓縮空間解析度)週期性地對特徵圖進行下采樣來減輕計算負載。然而,對於影象分割,我們希望我們的模型最後給出全解析度的語義預測。

用於影象分割模型的一種流行方法是遵循編碼器/解碼器(encoder/decoder)結構,其中我們先對輸入進行下采樣(downsample),得到較低解析度的特徵對映,其學習到了如何高效地區分各個類,然後對這些特徵進行上取樣(upsample)以得到一個全解析度分割圖。

image.png-150.5kB

上取樣(upsampling)方法

可以採用不同的方法來上取樣以提高特徵圖的解析度。 pooling操作聚合一個區域性區域(平均或最大池化)來下采樣,相對應地,unpooling操作通過將單個值分配到更高的解析度來上取樣。

image.png-133.8kB

然而目前為止最流行的方法是轉置卷積(transpose convolutions),因為它是通過學習得到的上取樣方法。

image.png-59.5kB

而典型的卷積運算將視野中所有值求點積並在相應位置輸出單個值,而轉置卷積恰恰相反。對於轉置卷積,低解析度特徵圖中某個值,乘以卷積核中的權重值,將這些加權值對映到輸出特徵圖。

image.png-31.8kB

 1D轉置卷積的簡化例項

某些卷積核可能在輸出特徵圖中產生重疊(例如的卷積, 如下圖所示),此時重疊值就簡單地加在一起。 不好的是,這往往會在輸出中形成棋盤效應(不均勻重疊,可以參考Deconvolution and Checkerboard Artifacts),這是不希望被看到的,因此最好確保選擇的卷積核不會導致重疊。

padding_strides_transposed--1-.gif-266.1kB

全卷積網路(Fully convolutional networks)

2014年底,Long等人介紹了使用“全卷積”網路解決畫素級影象分割任務,其實現了端到端的訓練。 該論文的作者採用已有的較優影象分類網路(例如AlexNet)作為網路的編碼器模組,並增加了帶有轉置卷積層的解碼器模組,以便對粗粒度的特徵圖進行上取樣以得到全解析度分割圖。

image.png-108.9kB

整個網路如下所示,它採用畫素級交叉熵損失函式進行訓練。 image.png-133.4kB

然而,由於編碼器模組將輸入的解析度降低了32倍,所以解碼器模組很難得到細粒度的分割(如下所示)。

image.png-36.1kB

作者對這種困境做出瞭如下評論:

語義分割面臨語義和位置之間的內在矛盾:全域性資訊解決的是“是什麼”問題,而區域性資訊解決的是“在哪裡”的問題......結合細粒度層和粗粒度層使模型能在全域性資訊下做出區域性預測。

新增短路連線(Adding skip connections)

作者對編碼的特徵緩慢上取樣(分階段)來解決上面的問題,並添加了從前面層的短路連線,最後對這樣的兩個特徵圖求和。

image.png-94kB

這些從網路中較早層的短路連線(在下采樣操作之前)應該包含必要的細節,這樣可以重建準確的分割邊界。 因而,我們可以通過加上這些短路連線來恢復更精密的細節。

image.png-41.3kB

Ronneberger等人通過擴大網路解碼器模組的容量來改進“全卷積”架構。更具體地說,他們提出了U-Net架構,它包括一個可以捕獲上下文資訊的收縮路徑(contracting path)和一個能夠實現精確定位的與收縮路徑對稱的擴充套件路徑。這種更簡單的架構已經變得非常流行,並且已經對一系列分割問題有效。

image.png-77.6kB

注意:由於使用了valid填充,原始網路會出現解析度降低。然而,一些人會選擇使用same填充來保證解析度不變。

Long等人(FCN論文)指出資料增強(隨機映象,或者通過將影象平移32畫素來隨機抖動)並沒有導致效能的顯著提升。Ronneberger等人(U-Net論文)卻發現數據增強(對訓練樣本作隨機的彈性變形)是訓練成功的關鍵之一。似乎資料增強的有效性(和型別)取決於問題所在的領域。

高階的U-Net變體(Advanced U-Net variants)

標準U-Net模型的block中由一系列卷積層組成。有一些更高階的block可以替代這些堆疊卷積層。

Drozdzal等人(The Importance of Skip Connections in Biomedical Image Segmentation)採用了殘差塊(residual blocks)。除了標準U-Net結構中已有的長短路連線(在編碼器和解碼器模組的相應特徵圖之間),該殘差塊在塊內引入短路連線。他們發現這種短路連線使得訓練過程收斂更快,並可以訓練更深層的網路模型。

更進一步,Jegou等人(Pattern Recognition The One Hundred Layers Tiramisu: Fully Convolutional DenseNets for Semantic Segmentation)採用了密集連線塊(DenseNet網路單元),仍然使用U-Net架構,他們指出DenseNet的特點對語義分割很有效,因為它自然地引入短路連線,並實現了多尺度監督。這些密集塊有效之處在於它們不僅包含從最近層得到的高階特徵,還包含了從前面層傳遞的低階特徵,這實現了高效的特徵重用。

image.png-102.9kB

該架構的一個非常重要點是上取樣路徑在密集塊的輸入和輸出之間沒有短路連線。作者指出,由於上取樣路徑會增加特徵圖的空間解析度,因此特徵數量的線性增長對記憶體要求太高。因此,只有密集塊的輸出在解碼器模組中被傳遞。

image.png-164.2kB

FC-DenseNet103模型在CamVid資料集上所實現的分割效果。

空洞卷積(Dilated/atrous convolutions)

對特徵圖進行下采樣的一個好處是,在給定卷積核情況下,它會增加後續卷積的感受野(相對於輸入)。由於大卷積核的引數效率低(在Rethinking the Inception Architecture for Computer Vision 的3.1節中討論),這種方法比增加捲積核大小更好。 然而,這是以降低空間解析度為代價的。

空洞卷積為獲得寬感受野提供了另一種方法,其可以保持完整的空間維度。如下圖所示,用於空洞卷積的值是在某個指定的擴張率(dilation rate)下間隔開的。

dilation.gif-122kB

損失函式

用於影象分割任務的最常用的損失函式是畫素級的交叉熵損失(pixel-wise cross entropy loss)。 該損失單獨地檢查每個畫素點,將類預測(深度方向的畫素向量)與one-hot編碼的目標向量進行比較。

image.png-82.6kB

因為交叉熵損失函式單獨評估每個畫素向量的分類預測,然後對所有畫素求平均值,所以我們基本上假定同等地對待影象中每個畫素點。 如果各種類在影象分佈不平衡時,這可能會是一個問題,因為訓練過程將受最多的類所支配。Long等人(FCN論文)為每個輸出通道的損失使用了權重,以抵消資料集中類不平衡問題。

同時,Ronneberger等人(U-Net論文)為每個畫素的損失設定權重,使得分割物件的邊界處具有更高的權重。該損失加權方案使得U-Net模型以不連續的方式分割生物醫學影象中的細胞,這樣可以在二元分割圖中容易地分離出單個細胞。

image.png-152.9kB

二元分割圖可以給出單個細胞的清晰邊界

用於影象分割任務另一種流行的損失函式是基於Dice係數的損失,其本質上是衡量兩個樣本之間的重疊度。該度量值在0~1之間,其中Dice係數為1表示完全重疊。Dice係數最初針對二進位制資料而提出的,計算公式如下: 

其中表示A和B集合的共有元素數,而表示A集合中的元素數,與之類似。

為了根據預測的分割mask計算Dice係數,我們可以將預測mask和目標mask相乘(元素級)並且求矩陣元素和作為。

image.png-38.5kB

因為我們的目標mask是二進位制的,所以我們首先將預測結果中在目標mask中為0的畫素清零。對於剩餘的畫素,我們基本上是在懲罰低置信度的預測值;該表示式的值越高(在分子中),Dice係數越高。

image.png-23.7kB

你可能會問想知道,為什麼Dice係數的分子中有2,這是因為我們的分母重複計算了兩集合之間的共同元素。 由於損失函式要最小化,我們將簡單地使用1-Dice作為損失函式。這種損失函式被稱為soft Dice損失,因為我們直接使用預測概率而不是先設定閾值並將它們轉換為二進位制mask。

對於神經網路的輸出,分子關注的是預測和目標mask之間的共同啟用值,而分母與每個mask中的啟用量相關。 這產生一種根據目標mask的大小來歸一化損失的效果,使得soft mask損失不會難以從影象中分佈較少的類中學習。

注意soft Dice是對於每個類是單獨計算的,然後平均各個類的結果作為最終的評分。例子如下圖所示。

image.png-88.8kB

常用資料集以及影象分割大賽

下面,我列出了一些常用資料集,研究人員使用這些資料集來訓練新模型和並作為現有技術的基準。 你還可以看一下之前的Kaggle比賽,並瞭解獲勝方的解決方案是如何在特定任務贏得比賽的。

資料集

以往的Kaggle競賽

延伸閱讀

論文

課程

部落格

圖片標註工具