那些一鍵摳圖的軟體是怎麼做到的?這些語義分割方法瞭解一下
分類問題是為整個影象分配一個標籤,而語義分割則是將從屬於同一類的物件看成一個整體,為影象中的每一個畫素點分配一個標籤。本文對一些經典語義分割方法和基於深度學習的語義分割方法進行了討論,此外還討論了常見的選擇和應用損失函式的方法。
語義分割。
經典方法
在深度學習時代到來之前,大量的影象處理技術被用來將影象分割成一些感興趣的區域(ROI)。下面列出了一些常用的方法。
灰度分割
這是最簡單的 語義分割 形式,它包括將一個區硬編碼的規則或某個區域必須滿足的特定的標籤屬性賦予這個區域。可以根據畫素的屬性(如灰度值)來構建這樣的規則。「分裂-合併」演算法就是一種用到了灰度分割技術的方法。該演算法遞迴地將影象劃分成若干子區域,直到可以為劃分出的子區域分配一個標籤,然後通過合併將相鄰的帶有相同標籤的子區域融合起來。
該方法存在的問題是,規則必須是硬編碼的。此外,僅使用灰度資訊來表示複雜的類(比如人)是極其困難的。因此,需要特徵提取和優化技術來恰當地學習這些複雜類所需的表徵形式。
條件隨機場
不妨考慮通過訓練模型為每個畫素分配一個類來分割影象。如果我們的模型不完美,我們可能會得到自然界中可能不存在的帶有噪聲的分割結果(如圖中所示,狗畫素與貓畫素混合在一起)。

帶有狗標籤的畫素和帶有貓標籤的畫素混合的結果(圖 c)。圖 d 顯示了一個更加符合真實情況的分割結果。
可以通過考慮畫素之間的先驗關係來避免這些問題,如果目標是連續的,那麼相鄰的鄰畫素往往具有相同的標籤。使用 條件隨機場 (CRF)對這樣的關係進行建模。
CRF 是一種用於結構化預測的統計建模方法。與離散分類器不同,CRF 在進行預測之前可以考慮相鄰的上下文環境,比如畫素之間的關係。這使得它成為語義分割的理想候選建模方案。本節將探討把 CRF 用於語義分割的方法。
影象中的每一個畫素都與一組有限的可能狀態相關聯。在我們的例子中,目標標籤是一組可能的狀態。將一個狀態(或標籤 u)分配給單個畫素(x)的成本被稱為一元成本。為了對畫素之間的關係建模,我們還考慮了將一對標籤(u,v)分配給一對畫素(x,y)的代價,這被稱為成對代價。我們可以考慮相鄰的畫素對(網格 CRF)或者考慮影象中的所有畫素對(密集 CRF)。

密集 CRF vs 網格 CRF
所有畫素的一元成本和成對成本之和被稱為 CRF 的能量(或成本/損失)。通過最小化能量,可以得到一個好的分割輸出結果。
深度學習方法
深度學習極大地簡化了進行語義分割的工作流程,並且得到了非常好的分割結果。在本節中,我們將討論用於訓練這些深度學習方法的流行的模型架構和損失函式。
1. 模型架構
全卷積網路 (FCN)是最簡單、最流行的用於語義分割的架構之一。在論文「 FCN for Semantic Segmentation 」中,作者使用 FCN 首先通過一系列卷積操作將輸入圖片下采樣至一個較小的尺寸(同時得到更多的通道)。這組卷積操作通常被稱為編碼器(encoder)。然後通過雙線性插值或者一系列轉置卷積對編碼後的輸出進行上取樣。這組轉置卷積通常被稱為解碼器(decoder)。

FCN 中的下采樣和上取樣過程。
儘管這個基礎的架構很有效,但是它也有一些缺點。其中一個缺點就是由於轉置卷積(或稱反捲積)操作的輸出不均勻重疊而導致棋盤狀偽影的存在。

棋盤狀偽影的形成過程。
另一個缺點是,由於編碼過程中損失了一部分資訊,導致邊界的解析度很低。
研究人員提出了一些解決方案來提高基礎 FCN 模型的效能。下面是一些被證明行之有效的流行的解決方案:
U-Net
U-Net 是對簡單的 FCN 模型架構的一種升級方案。它具有從卷積塊的輸出到相應的同一級的轉置卷積塊的輸入之間的跳躍連線。

U-Net
這種跳躍連線讓梯度可以更好地流動,並提供了來自多個尺度的影象大小的資訊。來自更大尺度(較上層)的資訊可以幫助模型更好地分類。來自更小尺度(較底層)的資訊可以幫助模型更好地進行分割。
Tiramisu 模型
Tiramisu 模型類似於 U-Net,而不同的是,它使用 Dense 塊進行卷積和轉置卷積(正如 DenseNet 的論文中所做的那樣)。一個 Dense 塊由若干層卷積組成,其中所有較早的層的特徵圖會被用作所有後續層的輸入。生成的網路具有極高的引數效率,可以更好地利用較早的層的特徵。

Tiramisu 網路
這種方法的缺點是,由於幾個機器學習框架中的連線操作的性質,它的記憶體效率不是很高(需要大型 GPU 才能執行)。
多尺度方法
一些深度學習模型顯式地引入了整合來自多個尺度的資訊的方法。例如,金字塔場景解析網路(PSPNet)使用四種不同尺寸的卷積核和步長來執行池化操作(最大池化或平均池化),從而輸出卷積神經網路(如 ResNet)的特徵圖。然後,它使用雙線性插值對所有池化輸出和卷積神經網路的輸出特徵圖的尺寸進行上取樣,並在相應的通道上將它們連線起來。最後對這個連線的輸出進行卷積操作從而生成預測結果。

PSPNet
Atrous 卷積(膨脹卷積)是一種可以在不增加大量引數的情況下,結合多尺度的特徵的高效的方法。通過調節膨脹率(dilated rate),同一個卷積核的權值可以在空間中拓展地更遠。這使其能夠學習更多的全域性上下文。

級聯的 Atrous 卷積。
DeepLabv3 網路的論文使用了不同膨脹率的Atrous 卷積捕獲來自多個尺度的資訊,從而避免了顯著的影象尺寸損失。他們通過級聯的方式(如上圖所示)和以並行的 Atrous 空間金字塔池化的方式(如下圖所示)對 Atrous 卷積進行了實驗。

並行的 Atrous 卷積。
CNN-CRF 的混合方法
一些方法使用卷積神經網路作為特徵提取器,然後將特徵作為一元成本(勢)輸入給密集 CRF(Dense CRF)。由於CRF具有對畫素間關係建模的能力,這種 CNN-CRF 的混合方法得到了很好的分割結果。

使用 CNN 和 CRF 相結合的方法。
某些方法將 CRF 包含在了神經網路中,正如「CRF-as-RNN」( https://www.robots.ox.ac.uk/~szheng/papers/CRFasRNN.pdf )一文中所描述的,其中密集 CRF被建模為一個迴圈神經網路。這種端到端的訓練如上圖所示。
2. 損失函式
和一般的分類器不同,語義分割必須選擇不同的損失函式。下面是一些常用的語義分割損失函式。
通過交叉熵實現的畫素級 softmax 用於語義分割的標籤尺寸與原始影象相同。標籤可以用one-hot編碼的形式表示,如下圖所示:

語義分割的獨熱編碼形式
由於標籤以方便的one-hot編碼的形式存在,它可以直接被用作計算交叉熵的參考標準(目標)。然而,在應用交叉熵之前,必須對預測的輸出在畫素級上應用 softmax,因為每個畫素可能屬於我們的任何一種目標類。
焦點損失(Focal Loss)
《Focal Loss for Dense Object Detection》一文中介紹的焦點損失是對標準的交叉熵損失的一種改進,用於類別極度不平衡的情況。
讓我們看看如下圖所示的標準交叉熵損失方程(藍色)。即使在我們的模型對畫素的類的置信度很高的情況下(比如 80%),它也存在一定的損失值(這裡大約是 0.3)。另一方面,當模型對一個類的置信度很高時,焦點損失(紫色,gamma=2)不會對模型造成如此大的影響(即置信度為 80% 的情況下損失接近於 0)。

標準的交叉熵損失(藍色曲線)vs 帶有 gamma 變數的焦點損失
讓我們用一個直觀的例子來探究一下為什麼這很重要。假設我們有一個 10000 畫素的影象,畫素只有兩個類:背景類(one-hot編碼形式下表示為 0)和目標類(one-hot編碼形式下表示為 1)。假設影象的 97% 是背景,3% 是目標。現在,假設我們的模型以 80% 的置信度確定某畫素是背景,但只有 30% 的置信度確定某畫素是目標類。
使用交叉熵時,背景畫素損失等於 (10000 的 97%)*0.3 = 2850,目標畫素損失等於(10000 的3%)* 1.2 = 360 。顯然,由於置信度更高的類造成的損失占主導地位,模型學習目標類的動機非常低。相比之下,對於焦點損失,由於背景畫素的損失等於(10000 的 97%)* 0,即0。這讓模型可以更好地學習目標類。
Dice 損失
Dice 損失是另一種流行的損失函式,用於類極度不平衡的語義分割問題。Dice 損失在《V-Net: Fully Convolutional Neural Networks for Volumetric Medical Image Segmentation 》一文中被提出,它被用於計算預測出的類和真實類之間的重疊。Dice 係數(D)如下所示:

Dice 係數
我們的目標是最大化預測類和真實參考標準之間的重疊部分(即最大化 Dice 係數)。因此,我們通常將(1-D)最小化來實現相同的目標(由於大多數機器學習程式庫只提供最小化損失函式的操作)。

Dice 係數的求導過程
雖然 Dice 損失對類不平衡的樣本很有效,但計算其導數的公式(如上所示)在分母中有平方項。當這些值很小時,我們就可以得到很大的梯度,導致訓練不穩定。
應用場景
語義分割技術被用於了各種各樣的真實生活場景下的應用。下面是語義分割的一些重要的用例。
自動駕駛
語義分割用於識別車道、車輛、人和其他感興趣的物體。其結果可用於智慧決策,以正確引導車輛。

用於自動駕駛汽車的語義分割。
自動駕駛汽車的限制之一是:語義分割模型必須是實時執行的。解決上述問題的一個方法是將 GPU 與車輛進行本地整合。為了提高上述解決方案的效能,可以使用更輕量級(引數更少)的神經網路,或實現適用於邊緣計算的技術。
醫學影像分割
語義分割技術也被用於在醫學掃描影像中識別顯著性元素。該方法對識別影象中的異常(如腫瘤)十分有效。提升演算法的準確率並解決低召回率的問題對於這種應用十分重要。

醫學掃描影像的分割
我們還可以將一些不那麼關鍵的操作自動化處理,比如根據語義分割後的 3D 掃描影像估計器官的體積。
場景理解
語義分割通常是更復雜任務的基礎,如場景理解和視覺化問答(VQA)。場景理解演算法的輸出通常是一個場景圖或一段字幕。

場景理解的工作示意圖。
時尚產業
語義分割在時尚產業中被用來從影象中提取出服裝物件,為零售商店提供類似的建議。更先進的演算法可以在影象中「重新設計」特定的衣服。

語義分割被用來作為根據輸入文字重新為某人設計衣服的一箇中間步驟。
衛星(或航拍)影象處理
語義分割還被用於從衛星影象中識別土地型別。典型的用例包括對水體進行分割以提供準確的地圖資訊。其他高階用例包括繪製道路圖、確定作物型別、確定免費停車位等等。

衛星/航拍影象的語義分割結果。
結語
深度學習技術極大地提升並簡化了語義分割演算法,為語義分割在現實生活中更廣泛的應用鋪平了道路。由於研究社群不斷努力地提高這些演算法的準確性和實時效能,本文中列舉出的概念可能並不詳盡。話雖如此,本文介紹了這些演算法的一些流行的變體和他們在現實生活中的一些應用。