【我們為什麼挑選這篇文章】到深度卷積網路那邊我就有點看不懂啦!不過這篇由 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