【我們為什麼挑選這篇文章】到深度卷積網路那邊我就有點看不懂啦!不過這篇由 Google 工程師親自撰寫的無人駕駛基礎教學,從組建環境、資料蒐集與分析,到最後的附錄,都非常清晰。此外,也提供給各位讀者許多自學的關鍵字,讓大家能夠在「無人車」的領域上精進自己!(責任編輯:陳君毅)
技術要點:
- Simulator 安裝與使用
- 數據收集和處理
- 深度卷積網絡 (CNN) 訓練端到端 (end-to-end) 模型
代碼:Github 連結
概述
所謂 end-to-end 無人駕駛模型,指的是由傳感器的輸入,直接決定車的行為,例如油門,剎車,方向等。簡單來講,可以利用機器學習的算法直接學習人類司機的駕駛行為:首先,人類司機駕駛安裝有各種傳感器 (例如攝像頭) 的汽車來收集數據;然後,用傳感器收集的數據作為輸入,相應的人類行為數據作為輸出 label,訓練一個機器學習模型。
例如,如果攝像頭發現前方有行人,司機行為應當是剎車;最後,將訓練好的模型應用於無人車上。這種方法又叫做行為複製,其原理直觀,避免了無人車系統中各種複雜的問題,是無人車中很有趣的一個主題。
在這篇文章中,我們來一起動手做一個在 Simulator 中的 end-to-end 模型!和在真實世界中類似,我們需要:
- 在 Simulator 中駕駛無人車收集數據,像玩賽車遊戲一樣!
- 處理數據並訓練模型
- 將模型應用於 Simulator 中看效果
Setup
先把 Simulator 搭好— 這裡使用 Udacity 的 Self-Driving Simulator Platform,下載鏈接:
建議直接從上面的鏈接下載,如果對源代碼感興趣,這裡是 Github 連結 。
運行 Simulator 程序,選擇 Screen Resolution 和 Graphics Quality,建議開始時先選擇最低分辨率和對應最快的圖片質量。點擊 OK 進入主界面。
Controls:在 Simulator 中的按鍵指南
Training Mode:人為控制車輛模式,用來收集數據
Autonomous Mode:全自動模式,使用訓練好的模型進行無人駕駛
數據收集
進入 Training Mode 開始玩遊戲,熟練一下按鍵和操作!
在 Simulator 中,這輛車的傳感器是三個前置攝像頭,分別放置在左、中、右三個方向,對周圍的環境進行拍攝錄製,結果之後會以圖片形式保存到電腦上。
開始收集數據:
- 首先按下 R 鍵 (Record),選擇數據保存目錄,確認
- 再次按下 R 鍵,進入錄製模式
- 駕駛車輛在車道中行駛
- 行駛完畢後第三次按下 R 鍵,數據會被保存到硬盤上
這時,在相應目錄下會生成兩個文件: driving_log.csv 和 IMG 文件夾。顧名思義,driving_log.csv 中保存了用戶開車時的 log,IMG 文件夾中保存了攝像頭的照片。driving_log.csv 基本結構如下圖:
- 前三列分別表示在當時左中右攝像頭的照片路徑
- D 列表示車的方向盤角度
- E 列表示油門力度
- F 列表示剎車力度
- G 列表示當前速度
為了簡潔明了,在本文中我們只採用 A,B,C,D 列數據,即利用攝像頭照片預測方向盤角度。另外,收集數據時有幾個 tips:
- 首先大概收集兩圈比較完美的數據,盡量保持車在道路中間行駛;
- 在轉彎或模型訓練之後比較容易出錯的地方多收集幾次數據。
數據處理與細節
數據在機器學習中地位至關重要,保證數據質量是模型是否有效的關鍵因素。以下是我們遇到的幾個問題,在 model.py 中均有相應的代碼。
觀察一 :D 列 Steering Angle 大部分都是 0,這很正常,因為大部分情況下在拐彎的地方我們才會轉動方向盤。然而這對模型卻是致命的,因為會造成嚴重的數據不平衡。
解決方案 :隨機抽樣,盡量使數據平衡。在實際操作中,可以將整個 Steering Angle 範圍劃分成 n 個 bucket,保證每個 bucket 中數據樣本不超過 m 個。
觀察二 :在同一個位置,不同攝像頭的內容差距很大,但是車子的轉向角度只有一個。下圖給出了同一位置左中右攝像頭的照片。
解決方案 :以中間攝像頭照片為主訓練數據,對左右兩邊照片的轉向角度進行修正。最簡單的修正方法是對左邊圖片的轉向角度 +0.2,對右邊圖片的轉向角度 -0.2。
觀察三 :數據量可能不夠大。
解決方案 :將圖片進行左右反轉,同時將轉向角度取相反數,這樣就生成了新的數據。
觀察四 :地面是影響車子轉向角度的決定性因素,照片的上半部分信息冗餘,不利於模型的 generalization。
解決方案 :將上半部分圖片裁掉。
觀察五 :圖片 RGB 值均在 0-255 之間,範圍太大。
解決方案 :進行 normalization,使其值在 [0, 1] 之間或 [-0.5, 0.5] 之間。
模型
深度卷積神經網絡 (Deep Covolutional Neural Networks, DCNN)。
DCNN 及其衍生模型是目前對圖片處理最先進的方法,主要應用有圖片分類,物體檢測及定位,自動生成圖片標題等。DCNN 的一個最大特點是能夠抓取 local pattern——例如:人類識別一張圖片上的貓,並不取決於這張圖片還有什麼其他動物,也不取決於這隻貓位於圖片的什麼位置,甚至只露出半隻貓的身子我們也可以將其識別,這就是基於 local pattern。
DCNN 的這一特點還被用於 AlphaGo 中抓取圍棋的 local pattern,我在 這篇文章 中有簡述 AlphaGo 的算法。
關於 DCNN 的技術細節就不在這裡介紹了,有興趣的可以參考 Stanford 的同學們做的一個 tutorial (我第一次接觸 Deep Learning 時的學習網站) 或 這篇文章 。
我們在這裡可以採用最常用的 DCNN 架構:三個 Convolutional layer + 兩個 Fully Connected layer:
- 三個 covolutional layer 的 filter size 均 為 3×3,filter depth 分別是 8,16,32,使用 ReLU activation function,dropout rate 設為 0.2
- 兩個 fully connected layer 的 size 分別為 512,256,同樣使用 ReLU activation function,dropout rate 0.2。
- 最後輸出層 size 為 1,使用 linear activation 對 steering angle 做 regression。
具體代碼也在 model.py 中,使用 Keras 實現,我採用的是 Tensorflow 的後端。現在就可以直接運行 model.py 文件進行模型訓練了!如果對配置 Tensorflow 和 Keras 環境有疑問,最後的附錄給出了一個簡單步驟。
測試
在我的 Github 中我已經給出了一個用 GPU 訓練好的模型 model.h5,本文開始中的視頻就是使用這個模型生成的。
(1)運行模型
python drive.py model.h5
(2)進入 Autonomous Mode
(3)Enjoy the self-driving
附錄
關於環境配置,推薦使用 Anaconda!我的操作系統是 Ubuntu,基本步驟是
(1)下載 Anaconda 最新版並安裝
(2)創建 conda environment
conda create -n my_env python=PYTHON_VERSION
(3)啟用 conda environment,在這個環境下安裝的 python 或 conda package 會與系統及其他環境相互隔離
source activate my_env
(4)安裝 Tensorflow
(5)安裝 Keras
(6)使用 pip 或 conda 安裝其他所需的 package
——
(本文經合作夥伴 雷鋒網 授權轉載,並同意 TechOrange 編寫導讀與修訂標題,原文作者為夏飛,清華大學計算機軟件學士,卡內基梅隆大學人工智能碩士。現為 Google 軟件工程師,原文標題為 〈Google 工程師:從零開始學習無人駕駛技術——端到端無人駕駛 〉;圖片來源:Alexander Rakoczy, CC Licensed。)
延伸閱讀
國外工程師自幹自駕車 AI Charles,然後放到《俠盜獵車手 5》裡面去撞人啦
【你們的功夫還是我教的!】線上教育平台 Udacity 要做無人車,槓上 Uber 瞄準計程車市場
迎接未來最搶手的職業,Udacity 聯合 Benz 推出線上「無人駕駛車」課程
你對製作這些科技趨勢內容有興趣嗎? 想從 TO 讀者變成 TO 製作者嗎? 對內容策展有無比興趣的你,快加入我們的編輯團隊吧! TechOrange 社群編輯擴大徵才中 >> 詳細內容 意者請提供履歷自傳以及文字作品,寄至 jobs@fusionmedium.com 來信主旨請註明:【應徵】TechOrange 職缺名稱:您的大名