自駕車學習之路(ㄧ)

如何用深度學習模仿人類開車

前言:

我大學時選修過一些機器人相關的課程,可惜畢業後並沒有機會找到相關的工作。前陣子看見Udacity開了自動駕駛車的課程,這麼酷的課程當然馬上報名了!這也是為什麼我會寫這些個作業的原因,同時希望藉由文章紀錄一下幫自己的學習做點記錄,和更多人分享我上課的小小成就感。

正文開始

課程簡介

第一個學期從2016十二月開始,到2017三月結束。第一個學期總共有五個作業,本次要記錄的是業二與作業三,這兩個作業都是用深度學習來做自動車相關的應用。第一學期的內容主要是圍繞在深度學習(積卷神經網路)與 影像識別上。在這之前我對於機器學習的認識很有限,不過Udacity課程內容很生動有趣,因此學期來不會太痛苦,課程中不時也有一些Mini project讓學生透過用實作來學習一些複雜的概念,其中一次我們甚至用Python寫了一個簡單版本的Tensorflow。

作業二 : 用機器學習做交通號誌分類

作業二要我們用Tensorflow訓練機器分類路邊的告示牌,學生要使用德國交通號誌的圖像資料配合積卷神經元網路來完成作業指定的任務,雖然構建一個神經網路並沒有很困難,也有許多現成的架構(e.g. LeNet5)可以參考,但真正在完成作業的過程中才發現機器學習有很多眉眉角角要注意,例如如何切分訓練跟測試的資料,使用哪種Activation function,哪一種Optimizer,要如何在有GPU的機器上面跑訓練…等,經過了好幾天的奮戰,還是遲交了不少天,但最後我還是完成了我的作業看見九十幾趴準確率的時候還是非常的感動的!!

作業二要我們分類的路牌範例

作業三 : 用機器學習模仿人類開車

作業三的技術雖然是建構在作業二之上,但是卻比作業二好玩很多!作業要求如下:

  1. 學生先在Udacity提供的模擬器錄下自己開車的資料
  2. Keras實作一個CNN來學習人類的開車技術
  3. 讓學習出來的機器人在模擬器上面平穩的開車,並且任何一個輪胎都不能開出車道線外。

開始!

實作CNN本身並不會太困難,學生也可以參考Nvidia的論文改良成自己的神經網路,所以我很快地就做出了第一個版本並且拿到模擬器上面測試

這次的訓練資料是用鍵盤錄的,所以轉彎轉得很不自然
這次的Recovery角度設定太大了,所以他一直急轉彎

結果並沒有很理想,經過了一些時間的分析最後終於才找到原因…原來問題就在我提供給他的學習資料太過偏頗,絕大部分的時候只需要直直的往前開,神經網路很快地就會學習這種偷懶的開車方法,因此我必須要給他更多轉彎和從外側開回路中間的訓練資料。

如何讓車子穩穩的開回路中央

Nvidia 聰明的工程師們也想出了一些方法解決這種人工智慧偷懶的問題,他們在車子的左右兩側另外加裝了兩個攝影機來模擬車子開在馬路左邊和右邊的狀況,透過把這些攝影機的影像和配合加以微調後的汽車方向盤資料(汽車靠左的時候就應該往右轉一點,反之亦然)

圖片取自NVidia的論文

配合Nvidia的方法,手動錄製了更多順時針和逆時針的開車資料,同時也丟掉一些(大約80%)無用的直行訓練資料,最後我終於訓練出了一個比較厲害的人工智慧!

最終結果(兩倍速版本)

心得

深度學習真的是一個很猛的工具,連我這種才剛入門的人有了基礎概念之後,不必學習影像辨識就能用它來辨識圖片,甚至模擬人類的開車行為!但同時也必須要有很足夠的資料和很猛的運算能力,這應該也是為什麼深度學習一直到最近才紅起來的原因。

雖然我是報名自動駕駛車的課程,但是目前為止感覺更像是在上深度學習+影像處理的課程,但這也只是三個學期中的第一學期,第一學期五個作業裡面的兩個而已。期待課程之後有更多一樣好玩的作業和技術!