從簡單車道線識別認識調參的重要性
在簡單車道線識別項目中,我們僅僅使用了以下幾種演算法:
1. 顏色選擇過濾
2. 高斯雜訊過濾
3. Canny輪廓過濾
4. 車道區域選擇
5. Hough變換檢測直線
用它們在三種不同的場景中來取得比較精準的車道線跟蹤。
第一種場景是正常的白線、光照、直線車道。這是最容易的場景,因為白色車道線與周圍背景有很強的對比度,Canny輪廓過濾之後再加一個車道區域限制,基本上送入Hough變換函數的圖像就只包含車道線了。通過Hough變換取得直線的坐標,就可以用紅色正確標出車道線。
該場景中的調參重點是Hough變換檢測直線的參數,要能夠將車道線的短的、長的線段全部檢出。主要調整2個參數,min_line_len = 3和max_line_gap = 100。
第二種場景是黃色線,正常光照和直線車道,但路面比較臟,有各種白色短橫線干擾直線的檢測。黃線與周圍背景的對比度不強,在Canny過濾中容易被濾除出去。如果降低Canny對比度的low_threshold雖然留住了黃色線,但同時又會引入更多的雜訊。這時候,首先要做的是將黃線通過顏色過濾找出來,並把它們填成白色,將問題恢復成白色車道線的檢測問題。然後再做高斯雜訊過濾等步驟。而路面上各種其他白色橫線的干擾需要在Hough變換檢測之後的直線中做篩選和過濾。主要是以下幾步:
1. 由於攝像機鏡頭位置固定的原因,左右車道線在視角中的斜率是比較固定的。通過·np.polyfit()得到斜率,用以下代碼濾除斜率誇張的干擾線
for line in lines: #Hough檢測返回的所有線段n for x1,y1,x2,y2 in line:n fit = np.polyfit((x1,x2),(y1,y2),1) #查看每一段線的斜率 n if fit[0]<-0.5: #將斜率滿足左車道線斜率的放入left_linesn left_lines.append(line)n elif fit[0]>0.5: #將斜率滿足右車道線斜率的放入right_linesn right_lines.append(line)n
2. 左右車道線如果找到多條線段,例如包含點劃線或者虛線,要將它們連成一條直線。這是一個挑戰題,我是這樣實現的:
if len(left_lines)>1: #判斷多於一條線段n left_array=np.vstack(left_lines) #將多條線段以堆棧方式變成一個數組n x1=np.min(left_array[:,0]) #列向量索引的0,1,2,3分別對應的是2個點坐標(x1,y1),(x2,y2)n x2=np.max(left_array[:,2]) n y1=left_array[np.argmin(left_array[:,0]),1] n y2=left_array[np.argmax(left_array[:,2]),3] ncv2.line(img, (x1,y1), (x2,y2), color, thickness)n
該場景中的調參重點是顏色選擇閾值和左右車道線斜率閾值。
顏色閾值:red_threshold = 200;green_threshold = 50;blue_threshold = 0
斜率:> 0.5, < -0.5
第三種場景非常具有挑戰性。車道線是黃色,而且時淡時濃,時暗時亮;整個視頻都是彎道;路面上有斑駁的樹蔭和各種深深淺淺的水泥顏色;路邊的欄杆投影下方有一條又直又白的線,可以完美掩蓋車道線的檢測。顯示的6張圖,圖一,欄杆投影下的白線;圖二,二種顏色的路面;圖三,樹蔭+不同顏色路面+漸淡的黃線;圖四,被樹蔭遮擋的斷續的黃線;圖五,難以辨認的黃線;圖六,兩條車道均被樹蔭遮擋。
棘手的問題還需要各個擊破。黃線呢仍然是用顏色選擇過濾然後填成白色,選擇漏過的只能寄望於Canny能夠發揮理想的過濾功能。彎道問題是上面5個演算法都不能解決的,只能通過區域選擇將圖片上方曲率大的曲線濾除出去。同時也是用區域選擇將欄杆投影的白線干擾排除在外。路面的斑駁陰影和不同水泥色需要用高斯雜訊過濾來模糊化,使得它們與附近周圍的路面顏色盡量融合在一起。
該場景的調參重點是高斯雜訊濾波和Canny的高低過濾閾值。
以上是方法,下面講的是具體的參數該怎麼調整。需要調整的參數有:
Gaussian_kernel_size
Canny_low_threshold
Canny_high_threshold
Hough_min_line_len
Hough_max_line_gap
對比度明顯的情況下,Gaussian Blur基本不需要,它的kernel_size=3或5就可以了。值越大表明需要和周圍進行模糊平均化的面積越大。
Canny的low_threshold是指要排除的圖形邊緣。越大排除的圖形越多。High_threshold本來是用於抑制高對比度的圖形,我們這裡需要它,所以設200就夠了。
Hough的min_line_len是用來設定多長的線段可以算作線段的。設的小就意味著那些點劃線的車道線也要計算在內。Max_line_gap是用來設定線段之間間隔的大小,即多少像素點間隔內的兩段小線段可以被看成是一個線段。設較大值可以避免Hough變換返回太多的線段列表。
理解了這些,那麼三種場景的參數設置分別就是:
它們的表現在下面三個視頻中。1. 白色車道線;2. 黃色車道線;3. 複雜環境。
https://www.zhihu.com/video/887596577789718528 https://www.zhihu.com/video/887596653710807040 https://www.zhihu.com/video/887596719431385088推薦閱讀:
※無人駕駛:或許只是一場不切實際的「春夢」
※什麼是 ADV 技術?
TAG:无人驾驶车 |