Coursera自动驾驶课程第12讲:Semantic Segmentation
在上一講《Coursera自動駕駛課程第11講:2D Object Detection》我們學習了深度學習的一個重要應用:目標檢測。
本講我們將學習深度學習的另一個重要應用:語義分割。這是圖片像素級的一個重要應用。
B站視頻鏈接:https://www.bilibili.com/video/BV1PE411D72p。
文章目錄
- 1. The Semantic Segmentation Problem
- 1.1 Overview
- 1.2 Mathematical Problem Formulation
- 1.3 Evaluation Metrics
- 2. ConvNets for Semantic Segmentation
- 2.1 Review
- 2.2 Upsampling Layer
- 2.3 Feature Decoder
- 3. Semantic Segmentation for Road Scene Understanding
- 3.1 3D Drivable Surface Estimation
- 3.2 Semantic Lane Estimation
1. The Semantic Segmentation Problem
1.1 Overview
讓我們從定義語義分割問題開始:給定輸入圖像,我們要對每個像素進行分類。類別可以是靜態道路元素,例如道路,人行道,立桿,交通信號燈和交通標志,也可以是動態運動目標,例如汽車,行人和騎自行車的人。此外,我們始終有一個背景類,其中包含我們未包含在預設類別中的任何類別。
1.2 Mathematical Problem Formulation
與目標檢測一樣,我們定義一個語義分割函數,輸入是圖像,函數參數為θ\thetaθ。
f(x;θ)=[Sclass?1,…,Sclass?k]f(x ; \theta)=\left[S_{\text {class }_{1}}, \ldots, S_{\text {class }_{k}}\right]f(x;θ)=[Sclass?1??,…,Sclass?k??]
那么,我們如何調整神經網絡來進行分割呢? 給定圖像,我們將每個像素作為輸入,并輸出每個像素的分類得分。
在下圖中,道路像素的道路得分應該很高,而其他類別的得分要低得多。
嘗試執行語義分割時,我們通常會遇到許多與目標檢測相同的問題。例如,遮擋和截斷使得難以準確預測目標邊界??s放也是一個主要問題,因為我們需要處理具有精細細節的近距離目標和僅由幾個像素捕獲的遠距離目標。我們還需要能夠處理場景中的光照變化。
造成這種困難的原因是圖像空間中的邊界不明確,尤其是對于諸如桿子之類的細小物體,諸如道路和人行道之類的外觀相似的物體以及距離較遠的物體。
1.3 Evaluation Metrics
現在讓我們介紹一些評價指標。
- 第一個指標是真陽性(TP):正確分類的像素數。
- 第二個指標是假陽性(FP):即錯誤分類的像素數。
- 第三個指標是假陰性(FN) :即應進行分類但最終未分類的像素數。
使用以上三個評價指標,我們可以計算出最常用的語義分割評估度量,即IOUclassIOU_{class}IOUclass?。 計算公式為:
IOUclass?=TPTP+FP+FNI O U_{\text {class }}=\frac{T P}{T P+F P+F N}IOUclass??=TP+FP+FNTP?
讓我們看一個直觀示例。道路分割數據表示為每個像素對應一個類。類似地,通過將??輸出得分最高的類別作為我們的預測類別,將預測也以相似的格式進行。
現在,我們開始計算由RRR表示的道路類別的IOU得分。第一個要度量的指標是TP=3TP=3TP=3。我們可以通過計算預測中正確分類的道路像素數。第二個指標FP=0FP=0FP=0;第三個指標FN=2FN=2FN=2。那么,我們最終的IOU得分為:
IOURoad?=33+0+2=35I O U_{\text {Road }}=\frac{3}{3+0+2}=\frac{3}{5}IOURoad??=3+0+23?=53?
同樣地,輔路的IOU得分為:
IOURoad?=44+2+0=46I O U_{\text {Road }}=\frac{4}{4+2+0}=\frac{4}{6}IOURoad??=4+2+04?=64?
2. ConvNets for Semantic Segmentation
2.1 Review
在本小節,我們將學習如何使用卷積神經網絡執行語義分割任務。 使用置信度進行語義分割比目標檢測要容易一些。 與用于目標檢測的卷積網絡不同,對于語義分割,訓練和推理階段實際上是相同的。 但是,也有一些需要我們注意的。
讓我們先快速回顧一下語義分割問題。 語義分割輸入為攝像機圖像,并為該圖像中的每個像素進行類別判斷。 我們將此問題建模為函數逼近問題。和目標檢測一樣, 我們可以使用哪種卷積網絡來執行此函數逼近呢?
一種想法是使用與目標檢測相同的網絡模型。 也就是說,特征提取器后面是輸出層。 我們在這里不需要使用錨盒,因為我們沒有嘗試定位目標。 與用于目標檢測的特征提取器一樣,我們可以使用VGG網絡。
讓我們看看通過此特征提取器時輸入圖像的大小會如何變化? 與目標檢測一樣,在每個池化層之后,圖像大小將減小一半。 另一方面,由于卷積層,特征深度將增加。 最終特征提取器的輸出特征圖將被下采樣16倍。 我們可以根據需要添加任意數量的卷積池塊,但這將進一步縮小我們的特征圖。 但是,我們希望我們的輸出對圖像中的每個像素都有一個分類。
那么,如果給定的下采樣特征映射比原始輸入小16倍,我們如何實現上述目標?
2.2 Upsampling Layer
一個簡單的解決方案如下:
- 首先可以將16倍下采樣的輸出特征圖通過softmax層來計算輸出。
- 然后,通過獲取softmax層獲得的最高類別得分來確定子采樣輸出中每個像素的類別。
- 最后一步是上采樣,將下采樣后的輸出恢復為原始圖像大小。
現在讓我們看一下上采樣如何提高圖像分辨率。 我們想在2×22\times22×2的圖像上使用近鄰上采樣。 圖像塊的像素顏色代表每個像素的不同值。 我們進行上采樣以使其原始大小增加一倍。 上采樣后的填充圖像顏色為近鄰圖像顏色。上采樣引起的問題是上采樣的輸出圖像具有非常粗糙的邊界。因此,上采樣乘數SSS為2。最終得到的輸出維度大小為:
Wout?=S×Win?Hout?=S×Hin?Dout?=Din?W_{\text {out }}=S \times W_{\text {in }} \\H_{\text {out }}=S \times H_{\text {in }} \\D_{\text {out }}=D_{\text {in }}Wout??=S×Win??Hout??=S×Hin??Dout??=Din??
回顧一下,語義分割中最具挑戰性的問題之一是在目標周圍很難獲得平滑的邊界,因為圖像空間中的邊界通常是模棱兩可的,尤其是對于諸如水池之類的細小物體,諸如道路和人行道之類的外觀相似的物體以及距離較遠的物體而言。
原始的上采樣還會引發另外一個問題。 寬度或高度小于16像素大小的目標通常會在其上采樣圖像中完全消失。那么我們如何解決呢?
2.3 Feature Decoder
為了解決以上問題,研究人員為此提出了特征解碼器。 特征解碼器可以被認為是特征提取器的鏡像。當我們通過特征解碼器時,通常會提供所需的平滑邊界。
現在,讓我們分析一下特征圖在通過特征解碼器時尺寸如何變化。 提醒一下,輸入特征圖以512的深度下采樣16倍。類似于特征提取器,每個上采樣卷積塊稱為反卷積。 當然,當前的研究人員之間就該術語是否準確存在爭議。 但是我們將在這里使用它來指代卷積池的逆操作。 當我們經過第一個反卷積塊時,我們的輸入特征圖被上采樣到輸入分辨率的2倍。 當我們繼續進行解碼器的其余部分時,最終會得到分辨率與輸入圖像相似大小的特征圖。為了降低計算復雜度,我們通常會縮小特征圖的深度。但這是一個取決于具體的應用程序。請注意,在許多建議的語義分割方法中,這種上采樣機制是最簡單的。
現在,我們已經具有與輸入圖像相似大小的特征圖,我們需要生成語義分割輸出。我們可以通過線性輸出層執行語義分割,然后再執行softmax函數。該層與我們在目標檢測中描述的分類輸出層非常相似。實際上,該層為每個像素提供了一個kkk維矢量,其中第kkk個元素是神經網絡對像素屬于第kkk類的置信。
根據定義,語義分割問題要求神經網絡為每個像素提供一個單獨的類。 為了學習如何執行此任務,將交叉熵分類損失再次用于訓練神經網絡。 這種損失類似于我們用于目標檢測分類中的損失。 函數形式為:
Lcls=1Ntotal∑iCrossEntropy?(si?,si)L_{c l s}=\frac{1}{N_{t o t a l}} \sum_{i} \operatorname{CrossEntropy}\left(s_{i}^{*}, s_{i}\right)Lcls?=Ntotal?1?i∑?CrossEntropy(si??,si?)
總結一下:我們得出了以下用于語義分割的模型。特征提取器將圖像作為輸入,得到特征圖;然后,解碼器獲取此特征圖并對其進行上采樣以獲得與原始輸入圖像相似分辨率的特征圖。最終,線性層后跟softmax函數,為輸入圖像中的每個像素生成分類向量。
3. Semantic Segmentation for Road Scene Understanding
3.1 3D Drivable Surface Estimation
現在,讓我們使用語義分割為自動駕駛汽車執行一些有用的任務。我們將要討論的第一個任務是從3D語義分割輸出中可駕駛道路。可駕駛空間定義為車輛前方安全駕駛的區域。在語義分割的上下文中,可駕駛表面包括公路,人行橫道,車道標記線,停車區域。估計可駕駛道路非常重要,因為它是從3D深度傳感器構建占用柵格的主要步驟之一。
但是現在,讓我們描述如何從語義分割輸出中執行可駕駛的道路估計。
- 首先,我們使用ConvNet生成圖像的語義分割輸出。
- 然后將點云投影到圖像平面來生成該幀中像素的3D坐標。通過傳感器之間的已知外部標定,我們可以將激光雷達點投影到圖像平面中,并將其與相應的像素匹配。
- 然后,我們繼續選擇屬于可駕駛路面類別的3D點。
- 最后,我們使用3D點的此子集來估計可駕駛道路模型。
現在讓我們描述在分割圖像數據和激光雷達點的情況下,如何擬合可駕駛的曲面模型。
我們首先定義平面模型:
ax+by+z=da x+b y+z=dax+by+z=d
我們可以得到一個線性方程組,以使用該平面模型的參數作為度量來估計參數,每個點都被標識為屬于可駕駛曲面上的點。
p=[a,b,d],argmin?A(Ap?B)p=[a, b, d], \quad \underset{A}{\operatorname{argmin}}(A p-B)p=[a,b,d],Aargmin?(Ap?B)
A=[x1y1?1x2y2?1???xNyN?1],B=[?z1?z2??zN]A=\left[\begin{array}{ccc}x_{1} & y_{1} & -1 \\ x_{2} & y_{2} & -1 \\ \vdots & \vdots & \vdots \\ x_{N} & y_{N} & -1\end{array}\right], \quad B=\left[\begin{array}{c}-z_{1} \\ -z_{2} \\ \vdots \\ -z_{N}\end{array}\right]A=??????x1?x2??xN??y1?y2??yN???1?1??1???????,B=???????z1??z2???zN????????
現在,向量ppp為模型參數,并且測量值為矩陣AAA和BBB。我們可以使用最小二乘法找到該線性方程組的解。 最終的結果為:
p=(ATA)?1ATBp=\left(A^{T} A\right)^{-1} A^{T} Bp=(ATA)?1ATB
該模型具有三個參數,因此,至少需要三個非共線點才能求解。這里我們我們使用RANSAC算法來擬合可駕駛曲面模型。
- 首先,我們隨機選擇適合模型的最小數據點。在這種情況下,我們隨機選擇3D中的三個點。
- 其次,我們使用這三個點來計算模型參數a,b,da,b,da,b,d,并使用最小二乘法求解平面參數。
- 然后,我們繼續確定滿足這些模型參數的3D點的數量。通常,對于可駕駛的曲面估計,大多數異常值是位于邊界處的錯誤分割輸出的結果。如果異常點數比較少,則終止并返回計算的平面參數。否則,我們將隨機采樣三個新點并重復該過程。如果道路實際上是平坦的,則使用平面模型非常有效,這在許多駕駛場景中都是有效的假設。對于更復雜的場景,例如從平坦的道路進入陡峭的高速公路入口,則需要更復雜的模型。
3.2 Semantic Lane Estimation
盡管我們估計了可駕駛的路面,但我們仍未確定允許汽車在該庫面上行駛的位置。通常,車輛應行駛在車道內,這取決于車道標記或道路邊界。車道線估計是估計自動駕駛汽車在給定的可行駛路面下可以行駛的位置的任務。文獻中存在許多方法可以完成此任務。例如,某些方法直接從ConvNets估計車道線標記,以確定汽車可以行駛到哪里。但是,對于更高級別的決策,無人駕駛汽車也應了解車道邊界處的情況。
我們將估計車道及其邊界處發生的事情稱為語義車道估計。注意,如果我們使用語義分割的輸出來估計車道,我們將輕松獲得邊界分類。讓我們通過一個簡單的方法來解決這個問題,以弄清車道估計任務。
- 給定語義分割模型的輸出,我們首先提取屬于作為車道分隔符的類的像素的掩碼。例如,此類可以包括路緣石,車道標記或欄桿。
- 然后,我們將邊緣檢測器應用于掩碼。在這里,我們使用著名的邊緣檢測器canny邊緣檢測器。輸出是分類為邊緣的像素,將用于估計車道邊界。
- 最后一步是確定要使用哪種模型來估算車道。為了檢測輸出邊緣圖中的線,我們需要對齊的檢測器?;舴蜃儞Q檢測算法被廣泛使用,并且能夠檢測邊緣圖中的多條線。
- 可以根據當前情況應用進一步的優化。例如,我們知道如果攝像機朝向與運動方向一致,則車道不應為水平線。此外,我們可以刪除任何不屬于可駕駛曲面的線,以獲得最終的車道邊界元集。
總結
以上是生活随笔為你收集整理的Coursera自动驾驶课程第12讲:Semantic Segmentation的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opera.exe - opera进程是
- 下一篇: 微博网友:快财商学院不正规,宣传虚假课程