學(xué)習(xí)模型指導(dǎo)駕駛過程分為五步
與人類用雙眼去觀察路面、用手去操控方向盤類似,無人車用一排攝像機(jī)去感知環(huán)境,用深度學(xué)習(xí)模型指導(dǎo)駕駛。大體來說,這個過程分為五步:
記錄環(huán)境數(shù)據(jù)
分析并處理數(shù)據(jù)
構(gòu)建理解環(huán)境的模型
訓(xùn)練模型
精煉出可以隨時間改進(jìn)的模型
如果你想了解無人車的原理,那這篇文章不容錯過。
記錄環(huán)境數(shù)據(jù)
一輛無人車首先需要具備記錄環(huán)境數(shù)據(jù)的能力。
具體來說,我們的目標(biāo)是得到左右轉(zhuǎn)向角度的均勻分布。這倒也不難操作,可以以順時針和逆時針方向在測試場地內(nèi)繞圈的方式實(shí)現(xiàn)。這種訓(xùn)練有助于減少轉(zhuǎn)向偏差,避免長時間駕駛后汽車從道路一邊慢慢漂移到道路另一邊的尷尬情境。
此外,以慢速(例如每小時10英里)行駛也有助于在轉(zhuǎn)彎時記錄平滑的轉(zhuǎn)向角,在這里駕駛行為被分類為:
直線行駛:0<=X<0.2
小轉(zhuǎn)彎:0.2<=X<0.4
急轉(zhuǎn):X>=0.4
恢復(fù)到中心
其中,X為轉(zhuǎn)向角,r為旋轉(zhuǎn)半徑(單位為米),計算轉(zhuǎn)向角的公式為X=1/r。上面提到的“恢復(fù)到中心”在數(shù)據(jù)記錄過程中很重要,它幫助車輛學(xué)會在即將撞上,馬路崖子時回到車道中心。這些記錄數(shù)據(jù)保存在driving_log.csv中,其中每一行都包含:
文件路徑到鏡頭前中央相機(jī)圖像
文件路徑到前左相機(jī)圖像
文件路徑到前右相機(jī)圖像
轉(zhuǎn)向角
在記錄環(huán)境數(shù)據(jù)的過程中,我們需要記錄約100000個轉(zhuǎn)向角的圖像,以便提供足夠的數(shù)據(jù)訓(xùn)練模型,避免因樣本數(shù)據(jù)不足導(dǎo)致的過擬合。通過在數(shù)據(jù)記錄過程中定期繪制轉(zhuǎn)向角直方圖,可以檢查轉(zhuǎn)向角是否為對稱分布。
分析處理數(shù)據(jù)
第二步是為構(gòu)建模型分析和準(zhǔn)備剛剛記錄的數(shù)據(jù),此時的目標(biāo)是為模型生成更多的訓(xùn)練樣本。
下面這張圖片由前中央相機(jī)拍攝,分辨率為320*160像素,包含紅色、綠色和藍(lán)色的channel。在Python中,可以將其表示為一個三維數(shù)組,其中每個像素值的范圍在0到255之間。
司機(jī)視線以下的區(qū)域和兩邊的車道標(biāo)志一直是自動駕駛技術(shù)中研究的重點(diǎn)。這兩部分可以使用Keras中的Cropping2D裁剪圖像,減少輸入到模型中的噪聲。
我們可以用開源的計算機(jī)視覺庫OpenCV從文件中讀取圖像,然后沿垂直軸翻轉(zhuǎn),生成一個新的樣本。
OpenCV非常適合自動駕駛汽車用例,因為它是用C++語言編寫的。像傾斜和旋轉(zhuǎn)這樣的其他圖像增強(qiáng)技術(shù),也有助于產(chǎn)生更多的訓(xùn)練樣本。
此外,還需要通過乘以-1.0翻轉(zhuǎn)其轉(zhuǎn)向角。
之后,可以用Numpy開源庫將圖像重新塑造成一個三維數(shù)組,方便下一步的建模。
構(gòu)建理解環(huán)境的模型
圖像數(shù)據(jù)搞定后,我們需要為無人車構(gòu)建理解環(huán)境信息的深度學(xué)習(xí)模型,從記錄的圖像中提取特征。
具體來說,我們的目標(biāo)是將包含153600像素的輸入圖像映射到包含單個浮點(diǎn)值的輸出。英偉達(dá)之前提出的模型的每一層都提供了特定的功能,作為基礎(chǔ)架構(gòu)效果應(yīng)該不錯。
英偉達(dá)模型相關(guān)論文地址:https://arxiv.org/pdf/1604.07316v1.pdf
之后,我們需要將三維數(shù)組規(guī)范化為單位長度,防止模型中較大的值偏差。注意我們將其除以255.0,因為這是一個像素的最大可能值。
還要適當(dāng)減少人類視野以下的車前場景和車前上方圖像的像素,以減少噪音。
之后,我們需要將車道標(biāo)記等三維數(shù)組進(jìn)行卷積,提取關(guān)鍵特征,這些信息對于預(yù)測轉(zhuǎn)向角至關(guān)重要。
我們想讓開發(fā)的模型能夠駕馭任何道路類型,因此需要用dropout減少過擬合。
最后,我們需要將轉(zhuǎn)向角輸出為float。