創造自主駕駛系統

OReillyData發表於2017-01-06

編者注:想更深入地學習本文和其他深度學習技術,可以檢視《The Deep Learning Video Collection: 2016》來了解世界級專家介紹他們是如何實現深度神經網路、解決常見的挑戰以及處理大規模場景下的分散式訓練等內容。

我們正處在下一代自主駕駛時代的開端。自主駕駛的現狀是什麼?會怎麼發展?在預測它的未來前,先讓我們先回顧一下歷史。

資訊科技發端與上世紀60年代。由快捷半導體和因特爾開創出的矽基微處理器打下了這個行業的基石(也創立了矽谷)。微處理器技術極大地提升了工業界的生產力,但普通大眾依然很難使用到它,並獲得益處。到上世紀80年代,隨著使用圖形使用者介面的施樂的Alto計算機、蘋果的Lisa計算機以及後來的微軟的視窗系統的出現,第二層基礎被鋪設好。“個人”電腦的設想變成可能。

到2000年,幾乎每個人都能使用計算機的時候,Google鋪下了第三層基礎——通過資訊間接地聯接起了世界。

從2004年的FaceBook開始發端,社交網路鋪下了資訊科技的第四層基礎,讓人們直接通過網路聯絡起來。從而有效地把人類社會擴充到了全球資訊網的空間。

伴隨著熟悉網際網路的人群逐漸成為主流,由Airbnb(2008年)和Uber(2009年)引領的網際網路商務服務大潮又為資訊科技鋪下了第五層的基礎。

每一層新的基礎都為資訊科技帶來了新的改進,並促進了網際網路的使用,同時也帶來新的需求。需要注意的是,儘管大部分的網際網路商務網站是通過網際網路接受並建立的服務,但實際提供服務的還是人類。

640?wx_fmt=jpeg

圖1 資訊科技的歷史。圖片由Shaoshan Liu友情提供

現在,我們正在鋪下這第六層——使用機器人而不是人類來提供服務。

這一趨勢的一個例子就是自主駕駛汽車(AV)的出現。自主駕駛技術驅動的車輛可以把乘客送往目的地而無需人類駕駛員。它不是一項單純的技術,而是一個由很多部分組成的系統。

在這篇博文裡,我會遍歷自主駕駛所涉及的技術,並探討如何把這些技術整合在一起,形成一個安全、有效和高效的自主駕駛系統。

自主駕駛技術概覽

自主駕駛技術是一個複雜的系統,由三個主要的子系統組成:核心演算法、車載客戶端系統和雲端平臺系統。核心演算法包括感知、理解和決策部分;車載客戶端系統包括機器人作業系統(ROS)和硬體平臺;雲端平臺包括資料儲存部分、模擬系統、高清晰度地圖部分和深度學習模型訓練部分。

640?wx_fmt=jpeg

圖2 自主駕駛系統的架構總覽。圖片由Shaoshan Liu友情提供

演算法子系統從感測器收集來的原始資料中抽取出有意義的資訊,從而能理解周圍的環境,並對於要採用什麼行動做出決策。車載客戶端子系統整合了這些演算法,並保證滿足實時和可靠性的需求(例如,如果感測攝像頭以60Hz的頻率生成資料,那麼客戶端子系統必須保證處理管道的最長時間必須少於16毫秒)。雲端平臺是為車輛提供離線的計算和儲存能力。基於雲平臺,我們可以測試新的演算法、升級高清晰度地圖以及訓練更好的識別、跟蹤和決策模型。

自主駕駛演算法

演算法部分包括:從感測器採集的原始資料裡感知和抽取有意義的資訊;理解資訊來定位車輛位置和了解當前的環境;決定採用什麼行動來讓車輛可靠安全地抵達目的地。

感知

通常,一輛自主駕駛汽車包括多個主要的感測器。因為每種型別的感測器都有自己的優缺點,所以必須組合使用來自多個感測器的資料。常見的感測器型別包括如下幾種:

1. GPS/IMU(全球定位系統和慣性測量單元):GPS和IMU系統通過高頻(例如200Hz)收集慣性變化和地理位置估計來幫助自主駕駛汽車定位自身。儘管GPS是一個相當精確的定位感測器,但它的更新頻率是10Hz,無法提供實時的資訊。經管IMU的準確度隨著時間變長而降低,從而導致不能長時間地依賴於它提供精確的位置資訊。但它能提供更快的更新頻率(200Hz或更高),這就能滿足實時的需求。通過結合GPS與IMU,就可以提供實時且準確的車輛定位資訊。

2. LIDAR(鐳射雷達):LIDAR被用於繪圖、定位以及避障。它的工作原理是通過發射鐳射,並測量反射回來的時間來測量自身與其他物體的距離。它的準確度很高。因此在大多數自主駕駛實現裡,它都是主要的感測器。LIDAR可以被用於生成高清晰度地圖、比對移動中的車輛和地圖的位置以及探測前方的障礙物等。通常一個LIDAR單元(比如Velodyne的64束鐳射器)會以10Hz的頻率掃描,每秒採集大約一千三百萬的讀數。

3.攝像頭:攝像頭主要是用於物體識別和物體追蹤的任務,比如車道探測、訊號燈探測和行人探測等。為了增強自主駕駛車輛的安全性,通常的實現是在車身前後安裝八個甚至更多的攝像頭,用於探測、識別和追蹤前後左右的物體。這些攝像頭的工作頻率一般是60Hz,總計會在一秒鐘產生約1.8GB的原始資料。

4. 雷達和聲吶:雷達和聲吶系統是規避障礙物的最後一道防線。由它們產生的資料顯示了車輛與前方最近的物體間的距離。當檢測到前方有物體並可能有碰撞的危險時,自主駕駛汽車可以通過剎車或是轉向來進行規避。因此由雷達和聲吶產生的資料並不要求多少處理,通常是直接輸出給控制處理器(沒有通過主要的計算管道)來完成緊急的任務,比如急轉、剎車或是預先拉緊安全帶等。

理解

第二步,感測器收集的資料被髮送給理解子系統來了解車輛的周圍環境。自主駕駛車輛的理解系統的三大主要任務就是定位、物體探測和物體跟蹤。

定位

GPS和IMU都可以被用於定位。GPS提供相當精確的定位,但更新速度較慢;而IMU可以提供快速更新,但精度較差。我們可以使用卡爾曼濾波來組合這兩者的優點,提供精確且及時的位置更新。如圖3所示,IMU每5ms推測一次車輛的位置,但隨著時間的流逝,錯誤逐漸累積。不過每100ms,我們就可以得到GPS提供的更新,從而能糾正IMU的錯誤。通過使用這個推測與更新模型,就能得到GPS和IMU共同產生的快速且精確的定位結果。

不過我們不能僅僅依賴於這個組合方法得到的定位結果。這主要是因為三個原因:1)定位結果的精度僅有1米;2)GPS的訊號會有多路的問題,即GPS訊號可能會被建築物反射,從而引入很多的噪音;3)使用GPS要求車輛上方空間無遮攔,因此無法在封閉空間裡工作,比如隧道。

640?wx_fmt=jpeg

圖3 GPS和IMU定位。圖片由Shaoshan Liu友情提供

攝像頭也能被用於定位。基於視覺的定位過程遵循如下簡化的管道:1)通過三角定位雙目影象對,就可以獲得一個視差圖。它可以用來推匯出影象裡每個點的深度資訊;2)通過比對連續兩幀立體影象裡的顯著特徵,就能夠估算出兩幀圖片間的移動;3)通過比較視訊圖片裡的顯著特徵和已知的地圖,就推匯出車輛的當前位置。然而,基於視訊的定位方法對於光線非常敏感。因此這個方法單獨使用時也不夠可靠。

640?wx_fmt=jpeg

圖4 雙目影象測距法。圖片由Shaoshan Liu友情提供

因此,嚴重依賴於粒子濾波的LIDAR(鐳射雷達)成為主要的定位感測器。由LIDAR產生的點雲提供了對環境的“形狀描述”,但它也很難來對單獨的點進行差異化。通過使用粒子濾波,系統把一個特別的觀測形狀和已知的地圖進行比對,從而提升確定性。

為了定位車輛與地圖的相對位置,我們應用粒子濾波技術來把來自LIDAR的測量和地圖關聯。粒子濾波方法已經被證明能獲得實時的定位,精度在10釐米,同時對於城市環境也有效。然而,LIDAR也有它自己的問題:當空氣中有非常多的懸浮顆粒(如雨滴和灰塵)的時候,它的測量值可能會非常得混亂。

因此,為了能獲得可靠且精確的定位,我們需要一個感測器融合的過程來合併這些感測器的優點,如圖5所示。

640?wx_fmt=jpeg

圖5 感測器融合定位管道。圖片由Shaoshan Liu友情提供

物體識別與追蹤

因為LIDAR提供了精確的關於深度的資訊,所以它最初在自主駕駛汽車上是被用於物體識別和追蹤的。但近年來,隨著深度學習技術的飛速發展,它在物體識別和追蹤的準確度上有了顯著的提高。

深度神經網路之一的卷積神經網路(CNN)已經被廣泛地用於物體識別。一個普通的CNN評估管道一般包括下述的幾層:1)卷積層,使用不同的過濾器來從輸入影象裡抽取不同的特徵。每個過濾器都包括一套在訓練階段結束後“可學習到”的引數;2)啟動層,決定是否要啟動目標神經元;3)pooling層,降低影象表徵的空間尺寸,從而能降低引數的數量,以及隨之帶來的網路計算量的降低;最後4)全連線層,連線前一層所有的啟動神經元到本層的所有的神經元。

一旦用CNN識別了一個物體,下一步就是自動地估計物體移動的軌跡了,或叫物體追蹤。

物體追蹤技術可以被用來跟蹤附近行駛中的車輛,也能用來跟蹤橫穿馬路的行人。從而保證車輛不會和其他移動的物體發生碰撞。近年來,深度學習技術已經展示出比傳統的計算機視覺技術更好的跟蹤能力。通過使用輔助的自然圖片,一個堆疊化的自動編碼器可以被離線的訓練來學習常見的圖片特徵。這樣獲得的模型比從實際車輛的位置和視角上看到的震動的圖片去訓練的模型要更魯邦。這個離線訓練的模型就可以被用來做物體追蹤。

決策

在決策階段,行為預測、路徑規劃和避障機制被組合起來,實時地產生一個有效的操作計劃。

行為預測

人類司機在行駛過程中所面對的一大挑戰就是如何去應對其他司機可能的行為。因為其他司機的這些行為會直接影響他自己的駕駛策略。這在有多個車道的路面以及行駛改變點的時候尤其重要。為了保證自主駕駛汽車在這些情況下能安全行駛,決策單元會預測附近其他車輛的行為,並依據這些預測來做出自己的操作計劃。

為了預測它車的行為,我們可以生成一個其他車輛可達的位置集合的統計模型,並給出這些集合的概率分佈。

路徑規劃

在一個動態變化的環境裡,規劃一個自主駕駛、自主反應的汽車的路徑是一個複雜的問題,尤其當要求車輛完全利用它自己的操控能力的時候。一種方法是使用確定性全域性演算法,即搜尋全部可能的路徑,並用一個損失函式來決定最佳路徑。但是這個方法的計算量非常大,並有可能無法提供實時的導航計劃。為了規避這個計算複雜度並提供有效的實時路徑規劃,一般使用概率性規劃器。

避障

自主駕駛中,安全是極其重要的考慮因素,所以我們應該使用至少兩級避障機制來保證車輛不會撞到其他東西。第一級是主動的,基於交通情況預測的。交通預測機制產生類似於預計碰撞時間或是預計最小距離的指標。基於這些指標,避障機制被觸發來進行區域性路徑的再規劃。如果主動機制失效,第二級使用雷達資料的被動機制就會接管控制。一旦雷達探測到路徑前方有障礙,它就要獲取車輛的控制權,並設法避障。

車載客戶端系統

車載客戶端子系統整合了上訴演算法,來滿足實時和可靠性的需求。客戶端系統要應對三大主要的挑戰:1)系統需要確保處理管道足夠快,才能及時消化掉感測器產生的海量資料;2)如果系統的部分失效了,系統自己必須保證足夠魯棒,從而能從失效中恢復;3)系統需要在有限的供電和計算資源的情況下完成所有的運算。

機器人作業系統

機器人作業系統(ROS)是一個專門為機器人應用而設計的,被廣泛使用的高效能分散式的計算框架(參見圖6)。

每個機器人所要完成的任務(如自身定位)都由一個ROS的子節點處理。這些節點間是通過話題和服務進行相互連線的。它對於自主駕駛而言是一個合適的作業系統,但也有一些問題:

  • 可靠性:ROS只有一個主節點而且對子節點沒有監控,從而無法實現失效恢復。

  • 效能:在傳送廣播訊息的時候,ROS會把訊息複製多份,這就導致效能的降低。

  • 安全性:ROS沒有認證和加密的機制。

雖然ROS 2.0版宣稱要修復這些問題,但它還沒有被廣泛的測試過,並且很多特性也沒有實現。

為了在自主駕駛車輛上使用ROS,我們需要先解決這幾個問題。

640?wx_fmt=jpeg

圖6 機器人作業系統(ROS)。圖片由Shaoshan Liu友情提供

可靠性

現有版本的ROS的實現僅有一個主節點。因此當主節點崩潰時,整個系統就崩潰了。這一點並不能滿足自主駕駛的安全性要求。為了解決這一問題,我們在ROS上實現了一個類似ZooKeeper的機制。如圖7所示,這個設計包含一個主節點和一個備份主節點。當主節點失效時,備份節點就接替主節點,並確保系統能持續執行無間斷。另外,ZooKeeper的機制還可以監控所有節點,並在節點失效時重啟它們。從而可以確保整個系統的可靠性。

640?wx_fmt=jpeg

圖7 ROS上使用ZooKeeper。圖片由Shaoshan Liu友情提供

效能

效能問題是現有ROS實現的另外一個缺陷。ROS節點間通訊很頻繁,因此節點之間的通訊就必須是非常高效的。首先,ROS客戶端節點間的通訊採用的是環回機制。每完成一次環回的管道,就會帶來約20毫秒的開銷。為了降低這個節點間通訊的開銷,我們可以使用共享記憶體的機制來避免訊息傳輸必須經過TCP/IP的打包/拆包的過程。另外,ROS的節點在廣播訊息的時候,訊息會被複制多次,極大地佔用了系統頻寬。改用多點傳送機制就能夠很好地提升系統吞吐量。

安全性

安全性問題是ROS的最大的死穴。設想兩個場景:第一個,某個ROS的節點被“黑”了,隨後作業系統記憶體被持續的佔用並最終導致記憶體溢位,從而開始殺掉其他的ROS的節點。最終黑客成功地讓整個系統崩潰。第二個場景,ROS的訊息預設是不加密的。黑客可以很容易地監聽節點間的通訊,然後使用訊息攔截機制發動攻擊。

為了解決第一個安全問題,我們可以使用Linux容器機制(LXC)來限制每個節點可以使用的資源數量,並提供沙箱機制來防止一個節點被其他節點破壞。這樣可以有效地防止資源溢位。對於第二個問題,可以通過加密訊息來阻止訊息被竊聽。

硬體平臺

為了能更好地理解為自主駕駛車輛設計硬體平臺的挑戰,讓我們先看看某個行業領先的企業的計算平臺的實現。這個計算平臺包括兩個計算系統,每個裝備了Intel Xeon E5處理器,以及4到8個Nvidia Tesla K80 GPU加速處理器。第二個系統完成與第一個系統一模一樣的任務,從而保證了可靠性。當第一個系統失效的時候,第二個系統可以立即接手工作。

最差的情況下,如果兩套系統都工作在最大功耗,共計使用超過5000瓦的電量,同時產生非常多的熱量。每套系統的價格在2萬到3萬美元之間,遠遠超出了一般消費者的承受能力。

這種設計所帶來的高功耗、高散熱以及高價格都讓自動駕駛汽車(目前)還不能為廣大消費所使用。為了探索技術的極限以及更好地理解在ARM的移動片上系統(SoC)裡開發自主駕駛系統,我們基於ARM的移動片上系統實現了一個簡化的、基於視覺的自主駕駛系統。它的最高功率只有15瓦。

令人驚訝的是,這個設計的效能根本不差。定位計算管道可以每秒處理25幀畫面,幾乎能跟上系統每秒產生30幀畫面的速度。深度學習計算管道可以每秒識別兩到三個物體。路徑規劃和控制管道可以在6毫秒內完成路徑規劃。使用這一系統,我們可以讓車輛以每小時5英里的速度行駛並且沒有丟失位置的情況發生。

雲端平臺

自主駕駛車輛是一個移動系統,因此需要一個雲平臺來提供支援。雲端主要提供兩大功能,包括分散式計算和分散式儲存。這一系統還包括幾個應用,即模擬(可以被用於驗證新演算法)、高解析度地圖的生成以及深度學習模型的訓練。為了構建這樣的一個系統,我們使用Spark來做分散式計算,OpenCL來做異構計算,並用Alluxio進行記憶體分佈儲存。

我們通過整合這三個框架,提供了一個可靠、低延時、高吞吐的自主駕駛雲平臺。

模擬

雲平臺的第一個應用就是模擬。當我們開發了一個新的演算法,都需要在正式部署到車輛前進行測試。否則代價會很高且挽救時間會很長。

因此我們首先會在模擬器上測試新演算法,例如在ROS節點上做資料重現。然而,如果只是在一個單機上測試新演算法,要不會花費很長時間,要不就沒有能做到全覆蓋測試。

為了解決這個問題,我們可以使用一個分散式的模擬平臺,如圖8所示。

這裡,Spark被用於管理分散式計算節點。每個節點上,我們可以執行一個ROS再播放例項。在一個單機伺服器上做自動駕駛物體識別測試將會需要3個多小時。而使用分散式系統,水平擴充套件到8個伺服器,整個測試在25分鐘內完成。

640?wx_fmt=jpeg

圖8 Spark和基於ROS的模擬平臺。圖片由Shaoshan Liu友情提供

高清晰度地圖生成

如圖9所示,高清晰度地圖的生成是一個複雜的過程,涉及到很多步驟。包括原始資料處理,點雲生成,點雲對齊,2維反射地圖生成,高精度地圖示記以及最終地圖生成。

使用Spark,我們可以把所有的這些步驟放入一個任務中完成。Spark的一大優點是它提供基於記憶體的運算機制。這樣我們就可以不用儲存中間資料到硬碟上,從而可以級大地提升地圖生成的速度。

640?wx_fmt=jpeg

圖9 基於雲平臺的高清晰度地圖生成。圖片由Shaoshan Liu友情提供

深度學習模型訓練

因為我們為自主駕駛使用了多種不同的深度學習模型,所以持續更新模型來保證它們的有效性和高效性就非常重要。然而,由於原始資料的量非常的大,僅僅靠單機是很難快速地完成模型的訓練的。

為了解決這個問題,我們使用Spark和Paddle(最近由百度開源的一個深度學習平臺)開發了一個高可擴充套件的分散式深度學習系統。

在Spark驅動程式裡,它可以管理Spark Context和Paddle Context。在每個節點裡,Spark執行器容納了一個Paddle的訓練例項。在此架構之上,我們使用Alluxio作為這個系統的引數伺服器。使用這一系統,我們可以實現線性的效能擴充套件(甚至在增加了更多資源後),從而證明它是高可擴充套件的。

這僅僅只是開端

如你所見到的,自主駕駛(以及人工智慧)不是單一技術,它是多種技術的綜合。它包括創新的演算法、系統整合和雲端平臺。這還僅僅只是開端,機遇無限。我預計到2020年,我們會正式的開啟人工智慧(AI)時代,在市場上見到更多基於AI的產品。讓我們做好準備吧!

640?wx_fmt=jpeg

Shaoshan Liu

Shaoshan Liu是Perceptln的聯合創始人和主席,致力於開發下一代的機器人平臺。在創立PerceptIn之前,他在百度(美國)的自主駕駛和深度學習基礎設施(Autonomous Driving and Deep Learning Infrastructure)工作。Liu擁有加州大學歐文分校的計算機工程博士學位。

640?wx_fmt=png

相關文章