自動(dòng)駕駛是機(jī)器學(xué)習(xí)的一個(gè)重要的應(yīng)用領(lǐng)域,作為普通學(xué)習(xí)者,我們是否可以運(yùn)用自己學(xué)到的機(jī)器學(xué)習(xí)方法訓(xùn)練自動(dòng)駕駛模型,完成自動(dòng)駕駛的任務(wù)呢?是否需要一輛真實(shí)的汽車和真實(shí)的馬路環(huán)境呢?
對(duì)于普通學(xué)習(xí)者來(lái)說(shuō),我們當(dāng)然沒(méi)有必要去駕駛真實(shí)的汽車。使用模擬器可以大大降低自動(dòng)駕駛研究的門檻,這篇文章我們就簡(jiǎn)單地介紹一下 Carla 這個(gè)開(kāi)源的用于自動(dòng)駕駛研究的開(kāi)源模擬器。
1. CARLA 簡(jiǎn)介
Carla 是一個(gè)開(kāi)源的模擬器,可以模擬真實(shí)的交通環(huán)境,行人行為,汽車傳感器信號(hào)等等。如下圖所示,模擬器使用C++ 和虛幻 (Unreal) 引擎構(gòu)成,使用者可以通過(guò) Python API 使用 Python 腳本代碼對(duì)模擬器的環(huán)境進(jìn)行操作和控制。

image from carla with MIT license
2. CARLA 簡(jiǎn)單上手
CARLA的快速上手指南請(qǐng)參考官方文檔, 本文僅做簡(jiǎn)單介紹和總結(jié)
- CARLA 目前僅支持 Linux 和 Windows,需要去下載相應(yīng)的版本。在本文寫作的時(shí)間,Windows 僅支持到 0.9.5 版本,Linux 支持到0.9.6。
- 需要 安裝 numpy 和 pygame.
- 下載解壓文件夾之后,Windows 環(huán)境下直接運(yùn)行 “CarlaUE4.exe” 文件,linux 環(huán)境下 終端命令: “./CarlaUE4.sh” 即可打開(kāi)模擬器。
模擬器就是一個(gè)小鎮(zhèn)的環(huán)境,有道路,建筑,街道,交通燈等等。不過(guò)目前是沒(méi)有行人和車輛的。需要運(yùn)行 python 腳本代碼。
終端 cd 到 \PythonAPI\examples 目錄,里面有不少python 腳本實(shí)例,首先我們運(yùn)行 spawn_npc.py 可以在模擬器中增加 80 倆汽車。
python spawn_npc.py -n 80
也可以運(yùn)行這個(gè)腳本添加天氣變量(天黑,下雨,刮風(fēng)等)
python dynamic_weather.py
當(dāng)然也可以體驗(yàn)一下手動(dòng)駕駛汽車的感覺(jué),僅需要運(yùn)行這個(gè)腳本就可以了。
python manual_control.py

image from carla with MIT license
如上圖所示,可以像玩游戲一樣手動(dòng)操作窗口中汽車前進(jìn)、后退、轉(zhuǎn)彎和剎車等動(dòng)作,同時(shí)環(huán)境的及時(shí)反饋也可以收集到??梢愿袘?yīng)到周圍車輛的大小,交通燈信號(hào),是否有撞擊等等。
當(dāng)然你也可以用快捷鍵 P 讓汽車處于自動(dòng)駕駛狀態(tài)。不過(guò)需要注意的是,此時(shí)汽車的自動(dòng)駕駛并不是通過(guò)機(jī)器學(xué)習(xí)得到的模型,而是通過(guò)對(duì)模擬器中設(shè)置的汽車行駛交通規(guī)則實(shí)現(xiàn)的。
注意如果在運(yùn)行腳本的時(shí)候出現(xiàn)導(dǎo)入 carla 失敗的錯(cuò)誤,請(qǐng)檢測(cè)python版本。在PythonAPI\carla\dist 目錄中可以看到相應(yīng)的python 版本的.egg 文件。筆者使用的是0.9.5 版本 carla 其中 Windows 10 需要使用 python 3.7. Linux 需要使用 python 3.5.
3. Python 控制汽車快速上手
為了便于進(jìn)后機(jī)器學(xué)習(xí)的需要,本文我們快速在模擬器中創(chuàng)建一輛汽車,并讓他直線行駛,通過(guò)攝像頭將感知到的圖片顯示出來(lái)。之后我們便可用攝像頭收集到的圖像信息以及汽車在環(huán)境中的反饋訓(xùn)練(強(qiáng)化學(xué)習(xí))模型,完成自動(dòng)駕駛的任務(wù)。詳細(xì)指南請(qǐng)參考官方 Python API 指南。
- 初始化環(huán)境。創(chuàng)建 Client 連接模擬器的服務(wù)器,并通過(guò) "blueprint" 創(chuàng)建一個(gè)汽車blueprint。
# set up the environment
client = carla.Client("localhost", 2000)
client.set_timeout(2.0)
world = client.get_world()
blueprint_library = world.get_blueprint_library()
bp = blueprint_library.filter("model3")[0]
- 初始化汽車,在模擬器世界中,隨機(jī)出現(xiàn)一輛汽車
spawn_point = random.choice(world.get_map().get_spawn_points())
vehicle = world.spawn_actor(bp,spawn_point)
- 控制汽車,當(dāng)然你可以用自動(dòng)駕駛模式"vehicle.set_autopilot(True)"讓汽車根據(jù)模擬器制定的規(guī)則行駛,不過(guò)我們?cè)谶@里讓汽車直行
vehicle.apply_control(carla.VehicleControl(throttle=1.0,steer=0.0)) # car go straight
actor_list.append(vehicle)
- 設(shè)置攝像頭
cam_bp = blueprint_library.find("sensor.camera.rgb")
cam_bp.set_attribute("image_size_x", "{}".format(IM_WIDTH))
cam_bp.set_attribute("image_size_y", "{}".format(IM_HEIGHT))
cam_bp.set_attribute("fov","110") #"fov" feel of view
spawn_point = carla.Transform(carla.Location(x=2.5,z=0.7)) #locate the camera
sensor = world.spawn_actor(cam_bp, spawn_point, attach_to = vehicle)
actor_list.append(sensor)
-
獲取攝像頭圖片,這里通過(guò) .listen 的 lambda 函數(shù)傳回?cái)?shù)據(jù)。當(dāng)然不要忘了設(shè)計(jì)一個(gè)延時(shí)。
sensor.listen(lambda data: process_img(data)) time.sleep(25)其中通過(guò) process_img() 方法傳回?cái)z像頭圖像
def process_img(image): i = np.array(image.raw_data) # print(i.shape) i2 = i.reshape((IM_HEIGHT,IM_WIDTH,4)) #4 changels "rgba" i3 = i2[:,:,:3] # 3 changels "rgb" cv2.imshow("",i3) cv2.waitKey(1) return i3/255.0這里需要注意的是,攝像頭得到的圖片有4個(gè)通道 “rgba”,需要將第四個(gè)通道去掉,并用opencv 的 cv2.imshow() 將攝像頭捕捉到的圖片 歸一化之后回傳回來(lái)。
最后,我們運(yùn)行一下這個(gè)python 腳本獲取汽車直線前進(jìn),攝像頭所“看到” 的畫(huà)面。汽車直行然后撞在了隧道的墻壁上。

gif animation created by @hongtao
4. 總結(jié)
本文簡(jiǎn)單介紹了 Carla 這個(gè)開(kāi)源自動(dòng)駕駛的環(huán)境,并簡(jiǎn)單上手并實(shí)現(xiàn)了創(chuàng)建汽車,控制汽車直線運(yùn)動(dòng),同時(shí)將汽車上攝像頭捕捉的圖像信號(hào)傳回。后面我們將使用這些圖像信號(hào)和環(huán)境的其他反饋,通過(guò)強(qiáng)化學(xué)習(xí)的方式訓(xùn)練模型,實(shí)現(xiàn)自動(dòng)駕駛。
參考資料
[1] Reinforcement Learning: An Introduction (2nd Edition)
[2] David Silver's Reinforcement Learning Course (UCL, 2015)
[3] Github repo: Reinforcement Learning
相關(guān)文章
用 Keras 搭建 Double DQN 模型
深度強(qiáng)化學(xué)習(xí)——Policy Gradient 玩轉(zhuǎn) CartPole 游戲
強(qiáng)化學(xué)習(xí)——MC(蒙特卡洛)玩21點(diǎn)撲克游戲
強(qiáng)化學(xué)習(xí)實(shí)戰(zhàn)——?jiǎng)討B(tài)規(guī)劃(DP)求最優(yōu)MDP
強(qiáng)化學(xué)習(xí)——強(qiáng)化學(xué)習(xí)的算法分類
強(qiáng)化學(xué)習(xí)——重拾強(qiáng)化學(xué)習(xí)的核心概念
AI學(xué)習(xí)筆記——Sarsa算法
AI學(xué)習(xí)筆記——Q Learning
AI學(xué)習(xí)筆記——?jiǎng)討B(tài)規(guī)劃(Dynamic Programming)解決MDP(1)
AI學(xué)習(xí)筆記——?jiǎng)討B(tài)規(guī)劃(Dynamic Programming)解決MDP(2)
AI學(xué)習(xí)筆記——MDP(Markov Decision Processes馬可夫決策過(guò)程)簡(jiǎn)介
首發(fā)steemit
歡迎掃描二維碼關(guān)注我的微信公眾號(hào)“tensorflow機(jī)器學(xué)習(xí)”,一起學(xué)習(xí),共同進(jìn)步
