使用深度學習做語義分割:簡介和代碼
本文為 AI 研習社編譯的技術博客,原標題 :
Semantic Segmentation with Deep Learning: A guide and code
翻譯 | 小豬咪 校對 | Lamaric 整理 | 孔令雙
https://towardsdatascience.com/semantic-segmentation-with-deep-learning-a-guide-and-code-e52fc8958823
什麼是語義分割?
大多數深度學習和計算機視覺大家庭中的人都知道什麼是圖像分類:我們想讓我們的模型告訴我們,圖片中存在的單個物體或場景是什麼。分類是一種非常模糊和高層次的任務。
很多人同樣對目標檢測很熟悉:我們嘗試定位和分類圖像中的多個物體,手段就是在它們周圍畫出範圍框,並對框內的東西進行分類。檢測是一種中層次的任務,我們可以得到一些很有用的細節信息,但由於我們只是畫出檢測框而沒有得到物體的準確形狀,所以還是略顯粗糙。
語義分割是這三者中信息量最大的,我們對圖片中的每一個像素都進行分類,就像你在上方的動態圖中看到的那樣!最近幾年,這些完全是基於深度學習完成的。
在這篇簡介中,你將會學到語義分割模型的基本結構和功能,以及最新最棒的高水平成果。
如果你想要自己試一試這些模型,你可以登陸我的語義分割程序組,對於很多這篇指南中出現的模型,那裡有我用 TensorFlow 實現的訓練和測試!
GeorgeSeif/Semantic-Segmentation-Suite
Semantic Segmentation Suite in TensorFlow. Implement, train, and test new Semantic Segmentation models easily! …github.com
基本結構
我將要向你展示的語義分割模型的基本結構在所有的頂尖工作中都存在。這使得實現不同的模型變得異常簡單,因為他們幾乎全部都有著相同的骨架、構造方法和構造流程。
U-Net 模型可以對這個結構給出很好的闡釋。模型左側表示了任何訓練出來可為圖片分類任務提取特徵的網路。包括了VGGNet, ResNets, DenseNets, MobileNets,和 NASNets!這裡你幾乎可以用任何你想用的結構。在選擇你的用以特徵提取的分類網路時,你心中的主要參考指標是網路的均衡。使用一個很深的 ResNet152 可以為你提供很高的準確度,速度卻不及 MobileNet。這些在圖像分類任務中出現的折衷因素在語義分割中同樣存在。你需要記住一個重要的事實:這些骨架將是你設計/選擇你的語義分割網路時的主要驅動力,我再強調也不為過。
用於語義分割的 U-Net
特徵被提取出來後將在不同的大小被處理,原因有二。首先,你的模型很可能遇到很多不同大小的物體;在不同的尺寸中處理特徵圖將賦予網路處理不同大小物體的能力。
第二點,當進行語義分割時有一點需要權衡折衷之處。如果你想得到好的分類準確度,你必須處理深層網路中那些高層級的特徵信息,因為它們更有辨識度並包含更多對語義分割有用的信息。但另一方面,如果你只採用深層特徵,你的定位將會變得很糟,因為此時的解析度太低了!
最近的高水準工作都利用了上述特徵提取結構並和多尺度處理技術,因此很多都很容易實現以及端到端地訓練。你的選擇將基於你對準確度和速度/內存的需求,其實這些工作也全部都在尋找新的方法,希望在保留效率的基礎上改善這種折衷。
接下來在對前沿工作的介紹中,我將主要關注最新的方法,因為在了解了上述基本結構後,這些方法可能對於大多數讀者來說是最有幫助的。我們將會大致以時間順序闡述,這也大致反映了前沿工作這些年來逐步發展改進的情況。
前沿概覽
全解析度殘差網路(FRRN)
FRRN 模型是多尺度處理技術中一個很典型的案例。它藉助兩條分立的流來完成:殘差流和池化流。
我們希望在處理語義特徵時獲得更高的分類準確度,所以 FRRN 在池化流中對特徵圖進行處理和下採樣。同時,在殘差流中以全解析度處理特徵圖。因此池化流負責處理高層的語義信息(為了更高的分類準確度),殘差流處理低層像素信息(為了更高的定位準確度)!
既然我們希望端到端地訓練網路,我們就不希望兩條流間完全沒有聯繫。所以在每次最大池化後,FRRN 會對來自雙流的特徵圖進行一些融合操作來結合他們的信息。
FRRN 的模型結構
金字塔場景解析網路(PSPNet)
FRRN 在直接施加多尺度處理方面做出了很好的工作。但是在每一種尺寸上做複雜處理的計算複雜度很高。以及 FRRN 的一些過程是在全像素下施加的,本身就是一種很慢的工作。
PSPNet 提出了一種巧妙的辦法來規避這個問題,就是利用多尺度池化。它會從一個標準的特徵提取網路(如 ResNet,DenseNet 等)開始,從第三個下採樣後提取出特徵進行進一步計算。
為了得到多尺度信息,PSPNet 應用了四種不同的最大池化操作,通過四種不同的窗口和步長尺寸。這高效地從四種不同的尺度中獲得了特徵信息而無需為它們每個都進行單獨運算。我們只需要在每個後面做一次輕量級的卷積,上採樣,這樣每個特徵圖都有同樣的解析度了,之後將它們拼合起來就可以了。
瞧!我們沒有做任何卷積就把多尺度的特徵圖結合起來了。
所有這些都是在低像素的特徵圖上提高速度的手段。最後,我們利用雙線性差值法把輸出的語義分割圖放大到想要的大小。這種在所有的步驟之後施加的放大手法存在於很多先進工作中。
PSPNet 的模型結構
一百層的提拉米蘇(FCDenseNet)
如果有一種深度學習帶來的極好的趨勢,那就是優秀的論文名字一百層提拉米蘇 FCDenseNet (聽起來就很美味)使用了一張和我們之前看到的 U-Net 相似的結構。它主要的貢獻是對密集連接的巧妙運用,和 DenseNet 分類模型有異曲同工之妙。
這真是強調了計算機視覺領域越來越強的導向:前端的特徵提取是任何其他任務想要效果好的核心骨架。因此,如果想要提高準確率,首先要考慮的就是前端的特徵提取。
FCDenseNet 模型結構
帶孔卷積核的再思考(DeepLabV3)
DeepLabV3 是另一種無需加設係數的多尺度處理方法。
這個模型十分輕量級。我們再次從一個特徵提取前端開始,從第四次下採樣後的特徵入手處理。現在的解析度已經很低(比輸入圖片小了16倍)所以我們就從這裡入手就很好!不太好的一點是,在這樣一種低解析度的情況下,由於像素的低準確度,很難得到很好的定位。
這就是體現 DeepLabV3 的突出貢獻之處了,對多孔卷積的巧妙運用。普通的卷積只能處理局部信息,因為權值總是一個挨著一個。例如,在一個標準的3*3卷積中,兩個權重值之間的距離只有一個步長/像素。
有了多孔卷積,我們可以直接增加卷積權重值之間的空間,而實際上在操作中不增加權重值的總數。所以我們仍然只有3*3也就是9個為參數總量,我們只是把它們分布得更開了。我們把每個權重值間的距離稱作擴張率。下面的模型圖解很好的闡釋了這個思想。
當我們使用一種低擴張率時,我們會得到非常局部/低尺度的信息。當我們採用高擴張率時,我們會處理到更多全局/高尺度的信息。因此 DeepLabV3 模型融合了不同擴張率的多孔卷積來獲取多尺度信息。
和 PSPNet 中解釋過的解釋過的處理手法類似,在最後也會有一步尺度提升的過程。
DeepLabV3 模型結構
多路徑細化網路(RefineNet)
之前我們看到了 FRRN 結構是如何在結合多尺度解析度信息時發揮巨大作用的。它的缺點是在處理高解析度時計算量巨大,我們還需要把那些特徵和低解析度的特徵結合!
因此 RefineNet 模型提出我們不需要這樣做。當我們把圖片送入特徵提取網路後,在每一次下採樣後我們自然而然地會得到多尺度的特徵圖。
細化網路之後採用自底而上的方式對這些多解析度特徵圖進行處理以結合多尺度信息。首先,每張特徵圖會被獨立處理。然後當我們升尺度的時候我們會把高/低解析度的結合起來,對它們同時進行一些處理。因此,我們的多尺度特徵圖既是獨立也是共同處理的。整個流程從左至右呈現在下面的圖解中。
和 PSPNet 中解釋過的解釋過的處理手法類似,在最後也會有一步尺度提升的過程。
RefineNet 模型的結構
大卷積核的情況(GCN)
之前我們看到了 DeepLabV3 模型是如何運用不同步長的多孔卷積來捕捉多尺度信息的。但問題是我們一次只能處理一個尺寸,之後還要把它們結合起來。比如說一個擴張率為16的多孔卷積與更小的擴張率相比,在語義分割時就不能很好地處理局部信息。
因此在之前的方法中,實際上多尺度的處理是先獨立、後整合的。如果我們同時關注多尺度的信息,將會更有意義。
為了完成這個想法, Global Convolutional Network (GCN) 機智地提出採用大型一維卷積核而不是方形的。如果用如3*3,7*7的卷積核,我們不能把它們做得太大,否則就需要很大的計算速度和內存的小號。一維卷積核就很高效了,我們可以做得很大而不拖慢網路太多。這篇文章甚至做到了15的大小。
一件重要的事情是你一定要做的,就是橫縱卷積的平衡。此外,這篇文章還是用了小型的3*3卷積核作為優化,以防一維卷積會遺漏什麼信息。
GCN 和前面的工作一樣,從前端特徵提取網路中處理不同尺度的信息。由於一維卷積的高效率, GCN 連全像素的層數都處理到了,而不是停留在低像素的層上最後再升尺度。這對於提升尺度後的語義分割的結果提供了很好的細化,而避免了由於停留在低解析度而可能導致的瓶頸問題。
GCN 模型的結構。
DeepLabV3+
DeepLabV3+ 模型就像它名字所說的那樣,是 DeepLabV3 的一個快速延伸,借用了它之前工作的一些優勢。如我們之前看到的那樣,如果我們僅僅在最後利用雙線性差值升尺度的話就會遇到潛在的瓶頸。事實上,原來的 DeepLabV3 在最後把尺度放大了16倍!
為了處理這件事, DeepLabV3+ 在 DeepLabV3 上加入了中間的解碼模塊,通過 DeepLabV3 處理後,首先特徵圖會被放大4倍。之後它們會和前端特徵提取的原特徵圖一起處理,之後再放大4倍。這減輕了後端網路的負擔,並提供了一條從前端特徵提取到網路後面部分的捷徑。
DeepLabV3+ 模型結構
CVPR 和 ECCV 2018
我們在以上部分說的網路結構代表了你在語義分割領域需要知道的大部分技巧!今年在計算機會議里發表的工作只有些微新意和準確度上很小的提升,並沒有特別關鍵而值得說明的地方。為了敘述的完整和徹底性,我把他們的工作在這裡為可能有興趣的讀者整理出了一個快速的回顧清單。
Image Cascade Network (ICNet)?—使用了深度監督,並在不同尺度上處理輸入圖片,每一個尺度都有自己的子網路,最後逐漸合併結果。?
Discriminative Feature Network (DFN)?—?使用了深度監督,並嘗試著把分割區域的邊緣和內部區域分開處理。
DenseASPP?—?結合了多孔卷積的密集連接。
Context Encoding?—利用全局環境增加準確度?,通過加入了一個通道注意力模塊,並基於一個新設計的損失函數把觸發注意力放在特定的特徵圖上。損失函數是基於網路中判斷哪個類別存在的這一部分分支設計的(比如高層級的全局內容)。
Dense Decoder Shortcut Connections?—?在解碼階段使用了密集連接以達到更高的準確度(之前僅在特徵提取/編碼階段使用)。
Bilateral Segmentation Network (BiSeNet)?—?有兩個分支:一個為了得到語義信息而很深,一個為了保存低層級的像素信息而僅對輸入進行了很少的操作。
ExFuse?—?使用了深度監督,特別是把從前端特徵提取中得到的多尺度特徵結合起來之後進行處理,這是為了保證多尺度信息可以在同等程度上一起處理。
ICNet 模型結構
長話短說:如何做語義分割
要明白分類網路的折衷效果。你的分類網路是你特徵提取的主要驅動,而最終效果中大多數的得失源自於此。
分尺度處理並把信息融合。
多尺度池化、多孔卷積和大型一維卷積都對語義分割有益。
你無需在高解析度上做很多的處理步驟,為了速度起見把大多數步驟放在低解析度上吧,之後再提升尺度,如果有必要的話在最後再進行一些輕量級的處理。
深度監督可以提升一點準確率(雖然建立起訓練變得更加棘手了)


※國慶不想「堵王爭霸」?你需要一份乾貨大禮包
※歐拉角中從物體坐標系向世界坐標系與從世界坐標系向物體坐標系旋轉一樣嗎?
TAG:AI研習社 |