無(wú)人車(chē)到底是怎樣一步一步學(xué)會(huì)開(kāi)車(chē)的?
與人類用雙眼去觀察路面、用手去操控方向盤(pán)類似,無(wú)人車(chē)用一排攝像機(jī)去感知環(huán)境,用深度學(xué)習(xí)模型指導(dǎo)駕駛。大體來(lái)說(shuō),這個(gè)過(guò)程分為五步:
記錄環(huán)境數(shù)據(jù)
分析并處理數(shù)據(jù)
構(gòu)建理解環(huán)境的模型
訓(xùn)練模型
精煉出可以隨時(shí)間改進(jìn)的模型
如果你想了解無(wú)人車(chē)的原理,那這篇文章不容錯(cuò)過(guò)。
記錄環(huán)境數(shù)據(jù)
一輛無(wú)人車(chē)首先需要具備記錄環(huán)境數(shù)據(jù)的能力。
具體來(lái)說(shuō),我們的目標(biāo)是得到左右轉(zhuǎn)向角度的均勻分布。這倒也不難操作,可以以順時(shí)針和逆時(shí)針?lè)较蛟跍y(cè)試場(chǎng)地內(nèi)繞圈的方式實(shí)現(xiàn)。這種訓(xùn)練有助于減少轉(zhuǎn)向偏差,避免長(zhǎng)時(shí)間駕駛后汽車(chē)從道路一邊慢慢漂移到道路另一邊的尷尬情境。
此外,以慢速(例如每小時(shí)10英里)行駛也有助于在轉(zhuǎn)彎時(shí)記錄平滑的轉(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)半徑(單位為米),計(jì)算轉(zhuǎn)向角的公式為X=1/r。上面提到的“恢復(fù)到中心”在數(shù)據(jù)記錄過(guò)程中很重要,它幫助車(chē)輛學(xué)會(huì)在即將撞上,馬路崖子時(shí)回到車(chē)道中心。這些記錄數(shù)據(jù)保存在driving_log.csv中,其中每一行都包含:
文件路徑到鏡頭前中央相機(jī)圖像
文件路徑到前左相機(jī)圖像
文件路徑到前右相機(jī)圖像
轉(zhuǎn)向角
在記錄環(huán)境數(shù)據(jù)的過(guò)程中,我們需要記錄約100000個(gè)轉(zhuǎn)向角的圖像,以便提供足夠的數(shù)據(jù)訓(xùn)練模型,避免因樣本數(shù)據(jù)不足導(dǎo)致的過(guò)擬合。通過(guò)在數(shù)據(jù)記錄過(guò)程中定期繪制轉(zhuǎn)向角直方圖,可以檢查轉(zhuǎn)向角是否為對(duì)稱分布。
分析處理數(shù)據(jù)
第二步是為構(gòu)建模型分析和準(zhǔn)備剛剛記錄的數(shù)據(jù),此時(shí)的目標(biāo)是為模型生成更多的訓(xùn)練樣本。
下面這張圖片由前中央相機(jī)拍攝,分辨率為320*160像素,包含紅色、綠色和藍(lán)色的channel。在Python中,可以將其表示為一個(gè)三維數(shù)組,其中每個(gè)像素值的范圍在0到255之間。
司機(jī)視線以下的區(qū)域和兩邊的車(chē)道標(biāo)志一直是自動(dòng)駕駛技術(shù)中研究的重點(diǎn)。這兩部分可以使用Keras中的Cropping2D裁剪圖像,減少輸入到模型中的噪聲。
我們可以用開(kāi)源的計(jì)算機(jī)視覺(jué)庫(kù)OpenCV從文件中讀取圖像,然后沿垂直軸翻轉(zhuǎn),生成一個(gè)新的樣本。OpenCV非常適合自動(dòng)駕駛汽車(chē)用例,因?yàn)樗怯?a href="http://wenjunhu.com/tags/C++/" target="_blank">C++語(yǔ)言編寫(xiě)的。像傾斜和旋轉(zhuǎn)這樣的其他圖像增強(qiáng)技術(shù),也有助于產(chǎn)生更多的訓(xùn)練樣本。
此外,還需要通過(guò)乘以-1.0翻轉(zhuǎn)其轉(zhuǎn)向角。
之后,可以用Numpy開(kāi)源庫(kù)將圖像重新塑造成一個(gè)三維數(shù)組,方便下一步的建模。
構(gòu)建理解環(huán)境的模型
圖像數(shù)據(jù)搞定后,我們需要為無(wú)人車(chē)構(gòu)建理解環(huán)境信息的深度學(xué)習(xí)模型,從記錄的圖像中提取特征。
具體來(lái)說(shuō),我們的目標(biāo)是將包含153600像素的輸入圖像映射到包含單個(gè)浮點(diǎn)值的輸出。英偉達(dá)之前提出的模型的每一層都提供了特定的功能,作為基礎(chǔ)架構(gòu)效果應(yīng)該不錯(cuò)。
英偉達(dá)模型相關(guān)論文地址:
https://arxiv.org/pdf/1604.07316v1.pdf
之后,我們需要將三維數(shù)組規(guī)范化為單位長(zhǎng)度,防止模型中較大的值偏差。注意我們將其除以255.0,因?yàn)檫@是一個(gè)像素的最大可能值。
還要適當(dāng)減少人類視野以下的車(chē)前場(chǎng)景和車(chē)前上方圖像的像素,以減少噪音。
之后,我們需要將車(chē)道標(biāo)記等三維數(shù)組進(jìn)行卷積,提取關(guān)鍵特征,這些信息對(duì)于預(yù)測(cè)轉(zhuǎn)向角至關(guān)重要。
我們想讓開(kāi)發(fā)的模型能夠駕馭任何道路類型,因此需要用dropout減少過(guò)擬合。
最后,我們需要將轉(zhuǎn)向角輸出為float。
訓(xùn)練模型
構(gòu)建了模型后,我們需要訓(xùn)練模型自己學(xué)習(xí)開(kāi)車(chē)了。
從技術(shù)角度上講,現(xiàn)階段的目標(biāo)是盡量準(zhǔn)確地預(yù)測(cè)轉(zhuǎn)向角。在此,我們將損失定義為預(yù)測(cè)和實(shí)際轉(zhuǎn)向角之間的均方誤差。
從driving_log.csv中隨機(jī)抽取樣例減少順序偏差。
可以將樣本的80%設(shè)為訓(xùn)練集,20%設(shè)為驗(yàn)證集,這樣我們就能看到模型在預(yù)測(cè)轉(zhuǎn)向角時(shí)的精確程度。
之后,需要用Adam(自適應(yīng)矩估計(jì))將平均平方誤差最小化。與梯度下降相比,Adam的一大優(yōu)勢(shì)是借用了物理中的動(dòng)量概念收斂到全局最優(yōu)值。
最后,我們用生成器來(lái)適應(yīng)模型。由于圖像數(shù)量龐大,我們無(wú)法一次性將整個(gè)訓(xùn)練集輸入到內(nèi)訓(xùn)中。因此,需要用生成器批量生產(chǎn)圖像以進(jìn)行訓(xùn)練。
隨時(shí)間精煉模型
完善模型是我們的最后一步,需要讓模型的準(zhǔn)確性和穩(wěn)健性隨著時(shí)間的推移而提高。我們的實(shí)驗(yàn)采用不同的體系結(jié)構(gòu)和超參數(shù),觀察其對(duì)減少均方誤差的影響。什么樣的模型最好?不好意思,這個(gè)問(wèn)題沒(méi)有一個(gè)統(tǒng)一的答案,因?yàn)榇蟛糠指倪M(jìn)都需要犧牲其他的一些東西,比如:
用更好的圖形處理單元(GPU)減少訓(xùn)練時(shí)間,需要注意這樣會(huì)增加成本
通過(guò)降低訓(xùn)練時(shí)間來(lái)降低學(xué)習(xí)速度,增加最佳值收斂的概率
通過(guò)使用灰度圖像減少訓(xùn)練時(shí)間,需要注意這樣會(huì)損失紅色、綠色和藍(lán)色通道提供的顏色信息
通過(guò)較大的batch size提高梯度估計(jì)的準(zhǔn)確性,這會(huì)以犧牲使用的內(nèi)存為代價(jià)
每個(gè)階段都選用大量樣例來(lái)減少損失的波動(dòng)
概覽全文,其實(shí)可以發(fā)現(xiàn),自動(dòng)駕駛汽車(chē)開(kāi)發(fā)的過(guò)程,也是我們了解計(jì)算機(jī)視覺(jué)和深度學(xué)習(xí)的優(yōu)勢(shì)和局限性的過(guò)程。
我堅(jiān)信,未來(lái)是屬于自動(dòng)駕駛的。
-
攝像機(jī)
+關(guān)注
關(guān)注
3文章
1603瀏覽量
60076 -
自動(dòng)駕駛
+關(guān)注
關(guān)注
784文章
13826瀏覽量
166503 -
無(wú)人車(chē)
+關(guān)注
關(guān)注
1文章
302瀏覽量
36486 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5503瀏覽量
121207
原文標(biāo)題:無(wú)人車(chē)是怎樣一步步學(xué)會(huì)開(kāi)車(chē)的?|自動(dòng)駕駛科普
文章出處:【微信號(hào):cas-ciomp,微信公眾號(hào):中科院長(zhǎng)春光機(jī)所】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論