想學做無人車的工程師注意!Google 工程師教你從零開始學「無人駕駛技術」

【我們為什麼挑選這篇文章】到深度卷積網路那邊我就有點看不懂啦!不過這篇由 Google 工程師親自撰寫的無人駕駛基礎教學,從組建環境、資料蒐集與分析,到最後的附錄,都非常清晰。此外,也提供給各位讀者許多自學的關鍵字,讓大家能夠在「無人車」的領域上精進自己!(責任編輯:陳君毅)

技術要點:

  • Simulator 安裝與使用
  • 數據收集和處理
  • 深度卷積網絡 (CNN) 訓練端到端 (end-to-end) 模型

代碼:Github 連結

概述

所謂 end-to-end 無人駕駛模型,指的是由傳感器的輸入,直接決定車的行為,例如油門,剎車,方向等。簡單來講,可以利用機器學習的算法直接學習人類司機的駕駛行為:首先,人類司機駕駛安裝有各種傳感器 (例如攝像頭) 的汽車來收集數據;然後,用傳感器收集的數據作為輸入,相應的人類行為數據作為輸出 label,訓練一個機器學習模型。

例如,如果攝像頭發現前方有行人,司機行為應當是剎車;最後,將訓練好的模型應用於無人車上。這種方法又叫做行為複製,其原理直觀,避免了無人車系統中各種複雜的問題,是無人車中很有趣的一個主題。

在這篇文章中,我們來一起動手做一個在 Simulator 中的 end-to-end 模型!和在真實世界中類似,我們需要:

  • 在 Simulator 中駕駛無人車收集數據,像玩賽車遊戲一樣!
  • 處理數據並訓練模型
  • 將模型應用於 Simulator 中看效果

Setup

先把 Simulator 搭好— 這裡使用 Udacity 的 Self-Driving Simulator Platform,下載鏈接:

LinuxMacWindows

建議直接從上面的鏈接下載,如果對源代碼感興趣,這裡是 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 職缺名稱:您的大名 

點關鍵字看更多相關文章: