介紹
Donkey Car是一種為模型車開源的DIY自動駕駛平臺,它利用一個帶有相機(jī)的樹莓派單片機(jī),讓模型車可在賽道上自動駕駛,Donkey Car會學(xué)習(xí)你的駕駛方法,在訓(xùn)練后懂得自動駕駛。對于那些沒有背景知識的人來說,該平臺能提供你所需要的必要細(xì)節(jié),它既包含硬件也帶有軟件。閱讀完這一教程,你也可以無需硬件背景知識組裝一輛自己的自動駕駛汽車。
現(xiàn)在,訓(xùn)練汽車進(jìn)行自動駕駛最常見的方法就是行為克隆和路線跟隨。在高級層面,行為克隆是利用卷積神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)汽車前方攝像機(jī)所拍攝的圖像之間的映射,并通過監(jiān)督學(xué)習(xí)控制方向和油門大小。而路線跟隨是利用計算機(jī)視覺技術(shù)跟蹤路線,并且利用一個PID控制器讓小車跟著該路線。我嘗試了兩種方法,它們都很有用!
用行為克隆訓(xùn)練Donkey Car避開障礙物
用強(qiáng)化學(xué)習(xí)訓(xùn)練Donkey Car
重要的一點(diǎn)是,Donkey Car的目標(biāo)是搭建一輛在比賽中跑的最快的車(能以最快速度跑完一圈)。我認(rèn)為強(qiáng)化學(xué)習(xí)是訓(xùn)練的好方法,只需設(shè)計一種獎勵,讓汽車的速度達(dá)到最快,并且讓它能一直保持在軌道內(nèi)即可。聽上去很簡單對吧?但事實(shí)上,很多研究表示在實(shí)體目標(biāo)上訓(xùn)練強(qiáng)化學(xué)習(xí)是很困難的。強(qiáng)化學(xué)習(xí)主要通過試錯法訓(xùn)練,放在汽車身上,我們只能保佑車子不會在一次次的實(shí)驗中撞碎。另外,訓(xùn)練時長也是一個問題,通常,強(qiáng)化學(xué)習(xí)智能體都要訓(xùn)練個幾百回合才能掌握些許規(guī)律。所以,強(qiáng)化學(xué)習(xí)很少用在現(xiàn)實(shí)物體中。
模擬現(xiàn)實(shí)
最近有一些科學(xué)家們研究對現(xiàn)實(shí)進(jìn)行模擬,即先用強(qiáng)化學(xué)習(xí)在虛擬模擬器上訓(xùn)練小車,然后將其遷移到現(xiàn)實(shí)世界里。例如,最近OpenAI就訓(xùn)練了一個靈活的機(jī)械手臂,可以做出多種動作,整個過程就是在虛擬中訓(xùn)練的。除此之外,谷歌大腦也曾訓(xùn)練過一個四足機(jī)器人,可以用模擬現(xiàn)實(shí)的技術(shù)學(xué)習(xí)靈活的動作。在虛擬器中學(xué)習(xí)控制策略,然后再將其部署到真正的機(jī)器人上。這樣看來,若想用強(qiáng)化學(xué)習(xí)訓(xùn)練Donkey Car,一個可行方案就是先用模擬器訓(xùn)練,再把學(xué)到的策略用在真的小車上。
OpenAI訓(xùn)練的機(jī)械手
Donkey Car模擬器
第一步是先為Donkey Car建造一個高保真度的模擬器。幸運(yùn)的是,Donkey Car社區(qū)里一位愛好者在Unity中創(chuàng)建好了一個模擬器。但是它設(shè)計的目的主要針對行為學(xué)習(xí)(即將相機(jī)中的圖片保存在對應(yīng)的控制角度和油門大小文件中以進(jìn)行監(jiān)督學(xué)習(xí)),但是和強(qiáng)化學(xué)習(xí)無關(guān)。我希望的是有一個類似OpenAI Gym那樣的交互界面,可以用reset( )重置環(huán)境、對其進(jìn)行操作。所以,我決定在現(xiàn)有的Unity模擬器基礎(chǔ)上對其進(jìn)行修改,讓它更適合強(qiáng)化學(xué)習(xí)。
4.1 創(chuàng)建一種能用Python和Unity溝通的方法
因為我們要用Python書寫強(qiáng)化學(xué)習(xí)代碼,所以我們首先要找到一種方法能讓Python在Unity環(huán)境中使用。結(jié)果我發(fā)現(xiàn)這現(xiàn)有的模擬器也是用Python代碼進(jìn)行溝通的,但它是通過Websocket協(xié)議進(jìn)行的,Weosocket和HTTP不同,它支持服務(wù)器和客戶端之間進(jìn)行雙向通信。在我們的案例中,我們的Python“服務(wù)器”可以直接向Unity推送信息(方向和油門),而我們的Unity“客戶端”也可以反向?qū)Ψ?wù)器推送信息(狀態(tài)和反饋)。
除了Websocket,我還考慮使用gRPC,這是一種高性能服務(wù)器-客戶端通信框架,用谷歌在2016年八月開源。Unity將其用于機(jī)器學(xué)習(xí)智能體接口通信的協(xié)議。但是它的設(shè)置有點(diǎn)麻煩,并不高效,所以我還是選擇Websocket。
4.2 為Donkey Car創(chuàng)建一個定制化的環(huán)境
下一步是創(chuàng)建一個類似于OpenAI gym的交互界面,用于訓(xùn)練強(qiáng)化學(xué)習(xí)算法。之前訓(xùn)練過強(qiáng)化學(xué)習(xí)算法的人可能對各種API的使用很熟悉。常見的就是reset( )、step( )、isgameover( )等。我們可以將OpenAI gym的種類進(jìn)行擴(kuò)展,然后用上面的方法創(chuàng)建自己的gym環(huán)境。
最終成果能和OpenAI gym相媲美,我們科用類似的指令與Donkey環(huán)境交互:
env = gym.make("donkey-v0")
state = env.reset()
state, action, rewards, next_state = env.step(action)
環(huán)境同樣可以讓我們設(shè)置frame_skipping,并且用headless模式訓(xùn)練智能體(也就是無需Unity GUI)。
同時,Tawn Kramer還有3中Unity場景可用:生成道路、倉庫和Sparkfun AVC,都可以用于訓(xùn)練。在我們開始運(yùn)行自己的強(qiáng)化學(xué)習(xí)算法之前,我們要么自己搭建Donkey Car的Unity環(huán)境,要么下載預(yù)先搭建好的環(huán)境可執(zhí)行程序。具體的環(huán)境設(shè)置和訓(xùn)練指導(dǎo)可以在我的GitHub中找到:github.com/flyyufelix/donkey_rl
4.3 用DDQN訓(xùn)練Donkey Car
準(zhǔn)備好了對強(qiáng)化學(xué)習(xí)友好的環(huán)境,我們現(xiàn)在就可以搭建自己的強(qiáng)化學(xué)習(xí)算法啦!我采取的是用Keras書寫的Double Deep Q學(xué)習(xí)算法,這是DeepMind開發(fā)的經(jīng)典強(qiáng)化學(xué)習(xí)算法,易于測試,編寫簡單。我已經(jīng)在OpenAI gym中的cartpole和VizDoom中測試了,所以如果有什么問題,應(yīng)該是Unity環(huán)境的問題,算法沒有問題。關(guān)于DQN的文章,大家可以參考我之前的博文。flyyufelix.github.io/2017/10/12/dqn-vs-pg.html
4.3.1 狀態(tài)空間
我們用Donkey Car前方安裝的攝像機(jī)所拍攝的像素照片,執(zhí)行以下轉(zhuǎn)換:
將尺寸從(120, 160)改為(80, 80)
變?yōu)榛叶葓D像
框架堆疊:去前面幾個步驟中的4個框架堆在一起
最后的狀態(tài)維度應(yīng)該是(1, 80, 80, 4)。
4.3.2 動作空間
現(xiàn)實(shí)和虛擬世界中的Donkey Car都是將持續(xù)的方向控制和油門數(shù)值作為輸入。為了簡介,我們將油門數(shù)值設(shè)為常量(例如0.7),僅僅改變控制方向。控制方向的值從-1到1,但是,DQN只能處理分離的動作,所以我將方向的值分為15個種類。
4.3.3 Q網(wǎng)絡(luò)框架
我們的Q網(wǎng)絡(luò)是一個3層卷積神經(jīng)網(wǎng)絡(luò),以堆疊的框架狀態(tài)為輸入,輸出表示方向值分類的15個值。
4.3.4 獎勵
獎勵是有關(guān)汽車偏離中線程度的函數(shù),它由Unity環(huán)境所提供。獎勵函數(shù)用以下公式表達(dá):
其中maxcte是一個歸一化常數(shù),所以獎勵的范圍在0到1之間。如果abs(cte)大于maxcte,循環(huán)即終止。
4.3.5 其他重要變量
Frame skipping設(shè)置為2以穩(wěn)定訓(xùn)練。Memory replay buffer的值為10000.Target Q網(wǎng)絡(luò)在最終訓(xùn)練時會更新。CNN訓(xùn)練時的Batch size為64。貪婪函數(shù)用于探索。Epsilon初始值為1,逐漸在10000次訓(xùn)練后會成為0.02。
4.3.6 結(jié)果
經(jīng)過上面的設(shè)置,在單個CPU和一個GTX 1080 GPU上,我訓(xùn)練了DDQN差不多100次。整個訓(xùn)練用了2到3個小時。可以從上面的視頻中看到,小車跑得很好!
去除背景噪聲
我們想讓我們的強(qiáng)化學(xué)習(xí)智能體只根據(jù)路線的位置和方向進(jìn)行決策輸出(即方向控制),不要受環(huán)境中的其他因素影響。但是,由于我們的輸入是全像素的圖像,它可能對背景模式過度擬合,而無法認(rèn)出行進(jìn)路線。這在現(xiàn)實(shí)中尤其重要,因為旁邊的車道可能會有障礙物(例如桌子、椅子、行人等)。如果我們想從虛擬世界將學(xué)習(xí)策略進(jìn)行遷移,我們應(yīng)該讓智能體顧略背景中的噪音,只關(guān)注于車道。
為了解決這個問題,我創(chuàng)建了一個預(yù)處理通道,可以將行車路線從原始像素圖像中分離出去,再輸入到CNN中。分割過程受這篇博文的啟發(fā)(https://medium.com/@ldesegur/a-lane-detection-approach-for-self-driving-vehicles-c5ae1679f7ee)。這一過程概括如下:
用Canny Edge檢測器檢測并提取所有邊框
用Hough直線轉(zhuǎn)換確定所有直線
將直線分成positive sloped和negative sloped兩類
刪除所有不屬于車道的直線
最終轉(zhuǎn)換出的圖片應(yīng)該有最多2條直線,具體情況如下:
接著我把分割后的圖像重新調(diào)整到(80, 80)的,將4個連續(xù)的框架堆疊在一起,用它們作為新的輸入狀態(tài)。我使用新狀態(tài)再次訓(xùn)練了DDQN,生成的強(qiáng)化學(xué)習(xí)智能體可以學(xué)習(xí)良好策略進(jìn)行駕駛!
然而,我注意到不僅僅訓(xùn)練時間會變長,學(xué)習(xí)策略也會變得不穩(wěn)定,車子會經(jīng)常在轉(zhuǎn)彎的時候搖晃。我想可能是因為在訓(xùn)練的時候丟掉了有用的背景信息。不然的話,智能體應(yīng)該不會過度擬合。
下一步
在這篇文章中,我們介紹了一種能和OpenAI gym相比的環(huán)境,用來訓(xùn)練Unity模擬器中的Donkey Car。還用DDQN訓(xùn)練它自動成功地自動駕駛。接下來,我計劃讓小車通過訓(xùn)練加速到最大值,并且將這一策略遷移到現(xiàn)實(shí)中。
-
計算機(jī)視覺
+關(guān)注
關(guān)注
8文章
1705瀏覽量
46458 -
自動駕駛
+關(guān)注
關(guān)注
788文章
14117瀏覽量
168760 -
強(qiáng)化學(xué)習(xí)
+關(guān)注
關(guān)注
4文章
269瀏覽量
11466 -
Unity
+關(guān)注
關(guān)注
1文章
127瀏覽量
22201
原文標(biāo)題:教程 | 如何在Unity環(huán)境中用強(qiáng)化學(xué)習(xí)訓(xùn)練Donkey Car
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
一種基于FPGA的飛行模擬器通信接口設(shè)計流程介紹
一種基于SIMULINK工具的太陽能電池陣列模擬器的仿真模型設(shè)計
飛行模擬器的運(yùn)動系統(tǒng)
一種雷達(dá)回波信號模擬器的設(shè)計與實(shí)現(xiàn)
一種多普勒模擬器的設(shè)計與實(shí)現(xiàn)The Design and I
基于開物2000、PLC 和I/O 擴(kuò)展的訓(xùn)練模擬器Based ControX2000, P
駕駛訓(xùn)練模擬器車速表驅(qū)動模塊設(shè)計
一種新型的基于LabView設(shè)計的脈壓模擬器

一種同步Slave FIFO模式的USB數(shù)據(jù)傳輸設(shè)計

一種基于FPGA嵌入式系統(tǒng)的雷達(dá)信號模擬器的實(shí)現(xiàn)

一種新的微結(jié)構(gòu)模擬器設(shè)計

南加州大學(xué)研究了一個模擬器 能訓(xùn)練機(jī)器人拼裝宜家家具
R-Car DNN模擬器的介紹
工程師說 | R-Car DNN模擬器的介紹 (2)

評論