udacity無人駕駛工程師筆記

嗯嗯嗯,一直看大牛的博客和公眾號,他們將自己的精神財富,無論是自己遇到的坑還是所學之收貨或者學習思路,都毫無保留的分享、開源,小弱雞不敢說像他們一樣條理清楚思緒明白,只求一段時間再看此文時,能回味當時學習的痛並快樂,學習心得,也以此記錄自己的學習軌跡。今年上半年的學習計劃是Udacity無人駕駛的Term1,所以接下來一系列文章都會以此為主線,結合其他相關資料來做一個學習總結。若有不足之處,歡迎拍磚!若有想法,歡迎來擾!

Finding lane lines on the road

文章的結構分為兩部分,一部分是理論知識的補充,第二部分是代碼的講解。

典型的車道檢測一般分為以下幾個步驟:

  • Select the ROI
  • Gaussian Smoothing
  • Canny Edge Detection
  • Hough Extrapolation

首先是ROI,Region of Interest,目標區域,目標區域的選擇有兩個部分,顏色和區域範圍。

(圖片來源:udacity課程)

(恩,我小名叫靈魂畫手,不接受批評。)上述紅色區域是我們需要的目標區域,因為車的攝像頭在固定位置,因此檢測的車道在圖片中的固定範圍區域。這裡可以由兩個方法來確定目標區域的包絡區。一個是將圖片的坐標顯現出來,用頂點去把它框出來;第二個是按比率框區域。顏色的選擇稍微單純些,需要上下閥值來選出黃色或者是白色。顏色的閥值可以參考(RGBcode)

第二個知識點是Canny Edge Detection,這個理論是Canny老爺子在1986年提出。主要思想是利用梯度去檢測邊緣。下圖中我們可以很明顯的看到劇烈變化的C、E是車道線,內心毫無波瀾的D是馬路中間地段。這樣來理解,你看到的是一副彩色畫,而計算機看到的是(0,255)的三通道矩陣。顏色差不多的代號值差不多,顏色劇烈變化的值也與差距,可以參照rapidtables.com/web/col感受一下顏色和代號值的變化。

顏色本身,非常容易受到光照等因素的影響,同類的物體顏色有很多變化。所以顏色本身難以提供關鍵信息。所以就有了一個關鍵的東西,灰度圖。把白色與黑色之間按對數關係分為若干等級,也就是灰度圖其實可以表示圖片的強度分布。灰度圖的作用是大大的有。①與彩色圖片描述一致但儲存空間小,運算速度快 ②opencv的函數只支持單通道(別打我)。

(圖片來源:udacity課程)

第三個知識點是高斯平滑(Gaussian smothing),對圖片模糊處理和消除噪音。make一下再補充。(我的懶癌發作了,有資料補充的灰常棒,筒子們狗狗一下)

第四個知識點是Hough Transform,霍夫變換,演算流程大致如下,給定一個物件、要辨別的形狀的種類,演演算法會在參數空間(parameter space)中執行投票來決定物體的形狀,而這是由累加空間(accumulator space)裡的局部最大值(local maximum)來決定。我的理解是這樣的:有兩個空間,一個是笛卡爾坐標系空間,一個是參數空間也叫作霍夫空間。拿y=mx+b來解釋。在xy space 上,點1、2、3、4都在y=mx+b上,在mc space上,坐標軸分別是斜率和截距,直線1、2、3、4都經過唯一一個點(斜率,截距)。

圖片來源:The Hough Transform (Biomedical Image Analysis)

在實際操作中,我們將Hough Space劃分成網格,若經過該格格上的數目大於我們設置的某個閾值時,我們可以判斷原來Image Space上的點在同一條直線上。

第二部分是代碼。

①讀取所需要的python庫。

②載入圖片

排列照片的時候用一個Enumerate來循環排列圖片。Enumerate允許我們循環並自動計數。像這個樣子

用glob來載入圖片

③roi的選擇

目標區域的選擇在我的理解是分為兩種,一種是顏色的區分一種是圖片區域的裁剪。

顏色選擇的想法如下:車道的顏色有黃色和白色,思路是設置黃色和白色的上下兩個閥值,再把兩個圖片用cv2.bitwise_and結合起來。這裡代碼有兩種形式可以參考。一種是一個通道一個通道去設置閥值

第二種是整體設置,這裡用np.unit8將數值限制在(0,255)範圍內用,cv2.inRang(輸入,下限,上限)篩選顏色。(備註:請問盆友們有沒有顏色篩選相關好文,要不我總感覺顏色閾值的選擇是門玄學)

接下來是區域的裁剪。

設置一個大概的區域,過濾掉無關緊要的東西。

④灰度處理,用cv2.cvtColor(輸入,

cv2.COLOR_RGB2GRAY)。高斯平滑,用cv2.GaussianBlur(輸入,卷積核,0)。canny

edge detection,用cv2.Canny(輸入,下閾值,上閾值)。

⑤canny

檢測之後為只含有邊緣的圖片,我們得到的並不是完整的車道線,因為一些像素點會缺失,所以我們要將檢測出來的邊緣處理成為直線、圓、的集合。

我們使用OpenCV的函數HoughLinesP。附上官方解釋。

參考來源:docs.opencv.org/master/

我們一個一個解釋:input是需要我們輸入8-bit,單通道的圖片,此處我們輸入的是經過灰度處理(cv2.cvtColor)高斯平滑處理(cv2.GaussianBlur)之後的圖片。輸出是線段。參數rho,theta,threshold,min_line_length,max_line_gap。在這裡,rho,theta是指Hough Space的夾角和距離,可以用極坐標來理解。rho的取值最小取1,theta最小取1°(有什麼源頭?)threshold意味著圖像空間中至少需要閥值個點與每個線段相關聯,計量單位是圖像上的點。min_line_length是指構成一條直線的最小像素數,計量單位是像素,max_line_gap是指在連接的線段的像素之間的最大間隙,同樣計量單位是像素,可以通過改array[]改變目的區域。

⑥劃線,每個線段都循環,一個線段的的始末點(x1,y1),(x2,y2),線段用紅色表達出來。語法如下。

最後得出來的是這樣的

大體上做完了,接下來的工作就是看一下有哪些不足之處。

不足之處在於:底下的車道並未檢測到,及並不能分清楚是左還是右車道。

⑦加工車道

以斜率來分左右車道,需要注意的是圖片的y坐標與正常坐標下的y

坐標是反著的,所以斜率的判斷也是反著的。迭代計算各條線段的斜率與截距的平均值。求出左右平均斜率和截距後,通過假設y1.y2(這兩個一個是最底的縱坐標,另一個是上限的縱坐標),求出左右車道線段需要的兩個定點坐標。

⑧Done!Good job! 接下來就要應用到視頻上,你可以用一個class把結構搭建起來。一層套一層。視頻這邊卡了很久,然後有看別人的代碼,發現自己走了很多彎路,代碼寫的一點都不優雅,寫完的時候一點都不開心!

參考

[1]naokishibuya/car-finding-lane-lines

[2]udacity課程

[3]從零開始學習無人駕駛技術 --- 車道檢測

https://www.zhihu.com/video/952651710850646016 https://www.zhihu.com/video/952651778098008064 https://www.zhihu.com/video/952651832812617728
推薦閱讀:

TAG:優達學城Udacity | 無人駕駛車 |