識(shí)別道路上的車道是所有司機(jī)的共同任務(wù),以確保車輛在駕駛時(shí)處于車道限制之內(nèi),并減少因越過車道而與其他車輛發(fā)生碰撞的機(jī)會(huì)。
對自動(dòng)駕駛汽車來說,這同樣也是一項(xiàng)關(guān)鍵任務(wù)。事實(shí)證明,使用計(jì)算機(jī)視覺技術(shù)識(shí)別道路上的車道標(biāo)記是可能的。本算法將介紹其中的一些技術(shù)。
這個(gè)項(xiàng)目的目標(biāo)是創(chuàng)建一種方法,使用Python和OpenCV在道路上找到車道線。
實(shí)例圖像
Udacity提供了960 x 540像素的示例圖像,用于訓(xùn)練我們的算法。下面是提供的兩個(gè)圖像。
算法步驟
在這一部分中,我們將詳細(xì)介紹本算法所需的不同步驟,這將使我們能夠識(shí)別和分類車道線,如下所示:
將原始圖像轉(zhuǎn)換為HSL
從HSL圖像中分離出黃色和白色
將分離的HSL與原始圖像相結(jié)合
將圖像轉(zhuǎn)換為灰度,便于操作
應(yīng)用高斯模糊來平滑邊緣
跟蹤感興趣的區(qū)域,并剔除其他區(qū)域的信息
執(zhí)行一個(gè)霍夫變換,在我們感興趣的區(qū)域內(nèi)找到車道,并用紅色跟蹤它們
分開左車道和右車道
插入直線梯度來創(chuàng)建兩條平滑的直線
每個(gè)步驟的輸入都是前一步的輸出(例如,我們對區(qū)域分割圖像應(yīng)用Hough變換)。
轉(zhuǎn)換到不同的色彩空間
雖然我們的圖像目前是RBG格式,但是我們應(yīng)該探索在不同的顏色空間,如HSL或HSV中進(jìn)行可視化,看看它們是否能夠幫助我們更好地隔離車道。注意,HSV通常被稱為HSB(色相飽和度和亮度)。
下面的圖表使我們能夠看到兩者之間的區(qū)別:
HSV
HSL
下圖顯示了原始圖像及其HSV和HSL格式。
可以看出,HSL比HSV更擅長對比車道線。HSV對白線“模糊”了太多,所以在這種情況下不適合我們選擇。至少,使用HSL隔離黃色和白色的車道會(huì)更容易些。
分離出黃色和白色
我們首先從原始圖像中分離出黃色和白色。在這樣做之后,我們可以觀察到黃色和白色的車道是如何很好地隔離。
現(xiàn)在我們使用OR操作合并這兩個(gè)掩碼,然后使用AND操作與原始映像合并,并僅保留相交的元素。
到目前為止,結(jié)果非常令人滿意??纯次覀兊腍SL黃面罩是如何清晰地識(shí)別黃色路標(biāo)的!接下來,我們將對圖像進(jìn)行灰度化處理。
轉(zhuǎn)換為灰度圖
我們感興趣的是如何檢測圖像上的白線或黃線,當(dāng)圖像是灰度的時(shí)候,這些線的對比度特別高。記住,道路是黑色的,所以任何在道路上更亮的東西都會(huì)在灰度圖像中產(chǎn)生高對比度。
從HSL到灰度的轉(zhuǎn)換有助于進(jìn)一步降低噪聲。在我們能夠運(yùn)行更強(qiáng)大的算法來隔離行之前,這也是一個(gè)必要的預(yù)處理步驟。
高斯模糊
高斯模糊(也稱為高斯平滑)是一種預(yù)處理技術(shù),用于平滑圖像的邊緣以減少噪聲。我們反直覺地采取這個(gè)步驟來減少我們檢測到的行數(shù),因?yàn)槲覀冎幌腙P(guān)注最重要的線條(車道線),而不是每個(gè)對象上的條。我們必須小心,不要把圖像弄得太模糊,否則很難畫出一條線條來。
高斯模糊的OpenCV實(shí)現(xiàn)采用整數(shù)核參數(shù)來表示平滑的強(qiáng)度。對于我們的任務(wù),我們選擇一個(gè)值為11。
下面的圖像顯示了典型的高斯模糊對圖像的影響,原始圖像在左邊,而模糊圖像在右邊。
Canny邊緣檢測
現(xiàn)在已經(jīng)對圖像進(jìn)行了充分的預(yù)處理,我們可以應(yīng)用Canny邊緣檢測器,它的作用是識(shí)別圖像中的邊緣并剔除所有其他數(shù)據(jù)。最終得到的圖像是線條型的,這使我們更關(guān)注于車道檢測,因?yàn)槲覀冴P(guān)注的是線條。
OpenCV實(shí)現(xiàn)除了模糊圖像外,還需要傳遞兩個(gè)參數(shù),一個(gè)低閾值和一個(gè)高閾值,它決定是否包含給定的邊緣。閾值捕獲給定點(diǎn)的變化強(qiáng)度(可以將其視為梯度)。
超過高閾值的任何點(diǎn)都將包含在我們的結(jié)果圖像中,而閾值之間的點(diǎn)只有在接近高閾值的邊緣時(shí)才會(huì)包含。低于閾值的邊被丟棄。推薦低:高閾值比率為1:3或1:2。對于低閾值和高閾值,我們分別使用值50和150。
下面我們一起展示平滑的灰度和精明的圖像:
關(guān)注區(qū)域
下一步是確定感興趣的區(qū)域,并丟棄這個(gè)區(qū)域之外的任何線。在這項(xiàng)任務(wù)中,一個(gè)關(guān)鍵的假設(shè)是,攝像機(jī)在所有這些圖像上都保持在相同的位置,而且車道是平的,因此我們可以識(shí)別我們關(guān)注的關(guān)鍵區(qū)域。
看看上面的圖片,我們根據(jù)汽車所在車道的輪廓“猜測”這個(gè)區(qū)域可能是什么,并定義一個(gè)多邊形,它將作為我們的關(guān)注區(qū)域。
我們將精明的分割圖像并排放在一起,觀察如何只保留最相關(guān)的細(xì)節(jié):
霍夫變換
下一步是應(yīng)用霍夫變換技術(shù)提取線條并給它們上色。霍夫變換的目標(biāo)是通過識(shí)別所有的點(diǎn)來找到線。這是通過將我們當(dāng)前用軸(x,y)表示的系統(tǒng)轉(zhuǎn)換成軸為(m, b)的參數(shù)系統(tǒng)來實(shí)現(xiàn)的。
直線被表示為點(diǎn)
點(diǎn)被表示為線
相交的線意味著同一點(diǎn)在多條線上
因此,在這樣的平面中,我們可以更容易地識(shí)別出經(jīng)過同一點(diǎn)的直線。然而,我們需要從當(dāng)前的系統(tǒng)移動(dòng)到使用極坐標(biāo)系統(tǒng)的霍夫空間,因?yàn)楫?dāng)m=0(即垂直線)時(shí),我們的原始表達(dá)式是不可微的。
所有直線將通過一個(gè)給定的點(diǎn)對應(yīng)于一個(gè)正弦曲線(ρ和θ)。因此,一組點(diǎn)相同的直線在笛卡爾空間將產(chǎn)生正弦曲線交叉的點(diǎn)(ρ和θ)。這自然意味著在笛卡爾空間的直線上探測點(diǎn)的問題被簡化為在霍夫空間中尋找交叉的正弦信號(hào)。
霍夫變換返回的車道線如下所示:
區(qū)分車道
為了能夠跟蹤整條線并連接圖像上的車道標(biāo)記,我們必須能夠區(qū)分左車道和右車道。幸運(yùn)的是,有一種簡單的方法可以做到這一點(diǎn)。如果仔細(xì)觀察圖像(使用精明的分割圖像可能更容易),您可以得到任何左車道線或右車道線的梯度。
左車道:當(dāng)x值(即寬度)增大時(shí),y值(即高度)減小:因此斜率必須為負(fù)
右車道:當(dāng)x值(即寬度)增加時(shí),y值(即高度)增加:因此斜率必須為正
因此,我們可以定義一個(gè)函數(shù),將行分隔為左和右。當(dāng)梯度的分母(dy/dx)為0時(shí),我們必須小心,忽略任何有這條直線的直線。
在下面的圖片中,我們用紅色標(biāo)注屬于左車道的線條,而屬于右車道的線條用藍(lán)色標(biāo)注:
梯度插值和線性外推
要從屏幕底部跟蹤到感興趣區(qū)域的最高點(diǎn),我們必須能夠插入霍夫變換函數(shù)返回的不同點(diǎn),并找到一條使這些點(diǎn)之間的距離最小化的線。基本上這是一個(gè)線性回歸問題。我們將嘗試通過最小化最小二乘誤差來找到給定車道上的直線。我們方便地使用scipy.stats. linregress(x,y)函數(shù)的作用是:求車道線的斜率和截距。
我們成功地做到了這一點(diǎn),如下圖所示:
視頻上的應(yīng)用
我們還提供了三段視頻來驗(yàn)證本算法:
(1)10秒的視頻,只有白色的車道線
(2)一段27秒的視頻,左邊是一條連續(xù)的黃線,右邊是白色的線
(3)這是一個(gè)挑戰(zhàn)視頻,道路稍微彎曲,幀的分辨率更高
首要任務(wù)
算法在前兩個(gè)視頻中運(yùn)行得還不錯(cuò),但在挑戰(zhàn)練習(xí)中完全失敗了。
為了使車道檢測更平滑,并利用每一幀的排序和位置(因此也包括車道),我決定在幀之間插入泳道梯度和截取,并剔除任何與前一幀的計(jì)算平均值偏離太多的線。
車道檢測器
記住,視頻是一系列的幀。因此,如果在t坐標(biāo)系下,我們計(jì)算出的直線與我們在坐標(biāo)系[0,t-1]中計(jì)算出的直線斜率和截距的平均值有不相稱的差異,那么我們就可以利用之前坐標(biāo)系中的信息來平滑我們在路上跟蹤的直線,并采取糾正步驟。
因此,我們需要將內(nèi)存的概念引入管道中。我們將使用一個(gè)標(biāo)準(zhǔn)的Pythondeque來存儲(chǔ)最后的N個(gè)(我現(xiàn)在將它設(shè)置為15)計(jì)算的行系數(shù)。
這工作相當(dāng)首先在兩個(gè)視頻,甚至設(shè)法體面地挑戰(zhàn)視頻檢測車道線,但由于有曲率的車道直線由一個(gè)簡單的多項(xiàng)式學(xué)位1(即y = Ax1+ b)是不夠的。將來我將在彎曲的道路上設(shè)計(jì)更好的車道線。
存在的問題
我觀察到目前車道線檢測的一些問題:
在第二節(jié)的挑戰(zhàn)視頻中,車道上覆蓋了一些陰影,我的代碼最初沒有檢測到它。我通過將HSL顏色過濾作為另一個(gè)預(yù)處理步驟來解決這個(gè)問題。
當(dāng)?shù)缆飞嫌袕澋罆r(shí),直線就不起作用了。
霍夫變換的參數(shù)很難處理正確。
后續(xù)改進(jìn)
算法的另一個(gè)探索是計(jì)算內(nèi)存探測器中線系數(shù)的加權(quán)平均值,使最近的系數(shù)具有更高的權(quán)重,因?yàn)樗鼈儗儆谧罱膸?。我相信幀的局部性將在視頻中獲得接近完美的車道線起著至關(guān)重要的作用。
我們還應(yīng)該考慮將車道線表示為二級(jí)多項(xiàng)式來處理。
在未來,我們還計(jì)劃利用深度學(xué)習(xí)來識(shí)別車道,并將這些結(jié)果與我用純粹的計(jì)算機(jī)視覺方法得到的結(jié)果進(jìn)行比較。
這是一個(gè)令人興奮和富有挑戰(zhàn)性的算法,它讓我們對色彩空間、圖像處理和一些線性代數(shù)的應(yīng)用有了更多的了解。
-
計(jì)算機(jī)視覺
+關(guān)注
關(guān)注
8文章
1685瀏覽量
45810 -
python
+關(guān)注
關(guān)注
53文章
4752瀏覽量
84066 -
自動(dòng)駕駛
+關(guān)注
關(guān)注
781文章
13449瀏覽量
165250
原文標(biāo)題:自動(dòng)駕駛 | 車道線檢測算法
文章出處:【微信號(hào):IV_Technology,微信公眾號(hào):智車科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評(píng)論請先 登錄
相關(guān)推薦
評(píng)論