【DL】第 11 章:自动驾驶汽车的深度学习
?🔎大家好,我是Sonhhxg_柒,希望你看完之后,能對你有所幫助,不足請指正!共同學習交流🔎
📝個人主頁-Sonhhxg_柒的博客_CSDN博客?📃
🎁歡迎各位→點贊👍 + 收藏?? + 留言📝?
📣系列專欄 - 機器學習【ML】?自然語言處理【NLP】? 深度學習【DL】
?
?🖍foreword
?說明?本人講解主要包括Python、機器學習(ML)、深度學習(DL)、自然語言處理(NLP)等內容。
如果你對這個系列感興趣的話,可以關注訂閱喲👋
文章目錄
自動駕駛汽車簡介
AV研究簡史
自動化水平
視音頻系統的組件
環境感知
傳感
本土化
運動物體檢測與跟蹤
路徑規劃
3D數據處理簡介
模仿駕駛政策
使用 PyTorch 進行行為克隆
生成訓練數據集
實現代理神經網絡
訓練
讓代理開車
把它們放在一起
使用 ChauffeurNet 的駕駛政策
輸入和輸出表示
模型架構
訓練
概括
讓我們想想自動駕駛汽車?(?AV?)將如何發展?影響我們的生活。一方面,我們可以在旅途中做其他事情,而不是把注意力集中在駕駛上。滿足這些旅行者的需求本身可能會催生一個完整的行業。但這只是一個額外的好處。如果我們在旅行期間可以更有效率或只是放松一下,那么我們很可能會開始更多地旅行,更不用說對自駕能力有限的人的好處了。讓交通這樣一種必不可少的基本商品變得更容易獲得,有可能改變我們的生活。這只是對我們個人的影響——從交付服務到準時制造,自動駕駛汽車也可以對經濟產生深遠的影響。簡而言之,讓 AV 工作是一項非常高風險的游戲。那么難怪,近年來,該領域的研究已從學術界轉向實體經濟。從 Waymo、Uber 和 NVIDIA 到幾乎所有主要汽車制造商,公司都在爭相開發 AV。
但是,我們還沒有到達那里。原因之一是自動駕駛是一項復雜的任務,由多個子問題組成,每個子問題本身就是一項主要任務。為了成功導航,車輛程序需要一個準確的環境 3D 模型。構建這種模型的方法是將來自多個傳感器的信號組合起來。一旦我們有了模型,我們仍然需要解決實際的駕駛任務。想想駕駛員必須克服的許多意外和獨特的情況而不會撞車。但即使我們創建了一個駕駛策略,它也需要幾乎 100% 準確。假設我們的 AV 將成功停在 100 個紅綠燈中的 99 個。99% 的準確率對于任何其他機器學習(ML?) 任務;?自動駕駛并非如此,即使是一個錯誤也可能導致撞車。
在本章中,我們將探討深度學習在 AV 中的應用。我們將研究如何使用深度網絡來幫助車輛了解其周圍環境。我們還將了解如何在實際控制車輛時使用它們。
本章將涵蓋以下主題:
- 自動駕駛汽車簡介
- 視音頻系統的組件
- 3D數據處理簡介
- 模仿駕駛政策
- 使用 ChauffeurNet 的駕駛政策
自動駕駛汽車簡介
我們將從 AV 研究的簡史開始本節(令人驚訝的是很久以前就開始了)。我們還將嘗試根據汽車工程師協會(?SAE?) 定義不同級別的 AV 自動化。
AV研究簡史
實施自動駕駛汽車的第一次認真嘗試?始于?1980 年代的歐洲和美國。自 2000 年代中期以來,進展迅速加快。該領域的第一個重大努力是Eureka?Prometheus 項目 (?https://en.wikipedia.org/wiki/Eureka_Prometheus_Project?),該項目從?1987 年到 1995 年。它在 1995 年達到頂峰,當時一輛自動駕駛的梅賽德斯-奔馳 S-Class 使用計算機視覺從慕尼黑到哥本哈根進行了 1,600 公里的旅行,然后返回。在某些時候,這輛車在德國高速公路上的速度高達 175 公里/小時(有趣的事實:高速公路的某些路段沒有速度限制)。這輛車能夠自行超越其他汽車。人工干預之間的平均距離為 9 公里,在沒有干預的情況下,它曾一度行駛 158 公里。
1989 年,卡內基梅隆大學的院長 Pomerleau 發表了ALVINN: An Autonomous Land Vehicle in a Neural Network?(?https://papers.nips.cc/paper/95-alvinn-an-autonomous-land-vehicle-in-a-neural -network.pdf?),一篇關于在 AV 中使用神經網絡的開創性論文。這項工作特別有趣,因為它應用了我們在 30 年前的 AV 中討論過的許多主題。讓我們看看 ALVINN 最重要的屬性:
- 它使用一個簡單的神經網絡來決定車輛的轉向角度(它不控制加速和剎車)。
- 該網絡由一個輸入層、一個隱藏層和一個輸出層全連接。
- 輸入包括以下內容:
- 來自安裝在車輛上的前置攝像頭的 30?× 32 單色圖像(他們使用 RGB 圖像中的藍色通道)。
- 來自激光測距儀的 8?× 32 圖像。這只是一個網格,其中每個單元格包含到視野中該單元格覆蓋的最近障礙物的距離。
- 一個標量輸入,表示道路強度,即道路比攝像頭圖像中的非道路更亮還是更暗。該值遞歸地來自網絡輸出。
- 具有 29 個神經元的單個全連接隱藏層。
- 具有 46 個神經元的全連接輸出層。道路的曲率由 45 個神經元以類似于 one-hot 編碼的方式表示——也就是說,如果中間的神經元具有最高的激活,那么道路是直的。相反,左右神經元代表增加的道路曲率。最終輸出單位表示道路強度。
- 該網絡在 1200 張圖像的數據集上訓練了 40 個 epoch:
接下來,讓我們看一下(主要是)商業 AV 進展的最新時間表:
- DARPA 大挑戰賽 (?https://en.wikipedia.org/wiki/DARPA_Grand_Challenge?) 于 2004 年、2005 年和 2007 年組織。第一年,參賽隊伍的 AV 必須在莫哈韋沙漠中導航 240 公里的路線.?性能最好的 AV 只跑了 11.78 公里的路線,然后就被掛在了巖石上。2005 年,車隊必須在加利福尼亞州和內華達州克服 212 公里的越野路線。這一次,有五輛車成功行駛了整條路線。2007 年的挑戰是在一個建于空軍基地的模擬城市環境中導航。總路線長度為89公里,參與者必須遵守交通規則。六輛車完成了整個過程。
- 2009 年,谷歌開始開發自動駕駛技術。這一努力促成了 Alphabet(谷歌的母公司)子公司 Waymo(https://waymo.com/?)的創建。2018 年 12 月,他們在亞利桑那州鳳凰城推出了首個使用 AV 的商業按需乘車服務。2019 年 10 月,Waymo 宣布推出首批真正無人駕駛汽車,作為其機器人出租車服務的一部分(此前,一直有安全司機在場)。
- Mobileye (?Mobileye | Driver Assist and Autonomous Driving Technologies?) 使用深度神經網絡來提供駕駛員輔助系統(例如,車道保持輔助)。該公司開發了一系列片上系統(?SOC?) 設備,專門針對運行汽車所需的低能耗神經網絡進行了優化。其產品被許多主要汽車制造商使用。2017 年,Mobileye 被英特爾收購?153 億美元。此后,寶馬、英特爾、菲亞特克萊斯勒、上汽、大眾、蔚來以及汽車供應商德爾福(現為安波福)就聯合開發自動駕駛技術展開合作。2019 年前三個季度,Mobileye 的總銷售額為 8.22 億美元,而 2016 年四個季度的總銷售額為 3.58 億美元。
- 2016 年,通用汽車以超過 5 億美元的價格收購了自動駕駛技術開發商Cruise Automation(?https://getcruise.com/ )(具體數字未知)。從那時起,Cruise Automation 已經在舊金山測試并展示了多個 AV 原型。2018 年 10 月,宣布本田也將參與該合資企業,投資7.5 億美元換取 5.7% 的股份。2019 年 5 月,Cruise 從一群新老投資者那里獲得了 11.5 億美元的額外投資。
- 2017 年,福特汽車公司收購了自動駕駛初創公司 Argo AI 的多數股權。2019 年,大眾汽車宣布將向 Argo AI 投資 26 億美元,作為與福特達成更大交易的一部分。大眾汽車將提供 10 億美元的資金,并為其位于慕尼黑的擁有 150 多名員工的自動智能駕駛子公司提供 16 億美元的資金。
自動化水平
當我們談論 AV 時,我們通常會?想象?完全無人駕駛的車輛。但實際上,我們的汽車需要司機,但仍提供一些自動化功能。
SAE 開發了一個包含六個自動化級別的規模:
- 0 級:駕駛員處理車輛的轉向、加速和制動。此級別的功能只能為駕駛員的行為提供警告和即時幫助。此級別的功能示例包括:
- 車道偏離警告只是在車輛越過其中一個車道標記時警告駕駛員。
- 當另一輛車位于汽車的盲區區域(車輛后端的左側或右側區域)時,盲區警告會向駕駛員發出警告。
- 1 級:為駕駛員提供轉向或加速/制動輔助的功能。當今車輛中最受歡迎的這些功能如下:
- 車道保持輔助?(?LKA?):車輛可以檢測車道標記并使用轉向將自身保持在車道中心。
- 自適應巡航控制?(?ACC?):車輛可以檢測到?其他?車輛并根據情況使用制動和加速來保持或降低預設速度。
- 自動緊急制動(AEB):如果車輛檢測到障礙物并且駕駛員沒有反應,車輛可以自動停止。
- 2 級:為駕駛員提供轉向和制動/加速輔助的功能。其中一項功能是 LKA 和自適應巡航控制的組合。在這個級別,汽車可以隨時將控制權交還給駕駛員,而無需提前警告?。因此,他或她必須始終關注道路狀況。例如,如果車道標記?突然消失,LKA 系統可以提示駕駛員立即控制轉向。
- 第 3 級:這是我們可以談論真正自治的第一個級別。類似于2級,汽車可以在一定的限制條件下自行行駛,并能提示駕駛員進行控制;但是,這可以保證提前發生,并有足夠的時間讓注意力不集中的人熟悉路況。例如,假設汽車在高速公路上自行行駛,但云連接的導航會獲取有關前方道路建設工程的信息。在到達施工區域之前,將提示駕駛員進行控制。
- 4 級:與 3 級相比,處于 4 級的車輛在更廣泛的情況下是完全自主的。例如,本地地理圍欄(即僅限于某個區域)的出租車服務可能處于 4 級。沒有要求以便駕駛員控制。相反,如果車輛駛出該區域,它應該能夠安全地中止行程。
- 5 級:在任何情況下完全自主。方向盤是可選的。
今天所有的商用車輛最多都具有 2 級的功能(甚至是特斯拉的自動駕駛儀)。唯一的例外(根據制造商的說法)是 2018 年的奧迪 A8,它具有稱為 AI Traffic Jam Pilot 的 3 級功能。該系統負責在多車道道路上以高達 60 公里/小時的速度行駛,兩個交通方向之間有物理障礙。?可以通過 10 秒的提前警告提示駕駛員進行控制。此功能在車輛發布期間已展示,但在撰寫本章時,奧迪引用了監管限制,并未將其包含在所有市場中。我沒有關于此功能在哪里(或是否)可用的信息。
在下一節中,我們將了解構成 AV 系統的組件。
視音頻系統的組件
在本節中,我們將從軟件架構的角度概述兩種類型的 AV 系統。第一種類型使用具有多個組件的順序架構,如下圖所示:
視音頻系統的組成部分該系統類似于我們在第 10 章“元學習”中簡要討論過的強化學習框架。我們有一個反饋循環,其中環境(物理世界或模擬)為代理(車輛)提供其當前狀態。反過來,代理決定它的新軌跡,環境對其做出反應,等等。讓我們從環境感知子系統開始,它具有以下模塊(我們將在以下部分更詳細地討論它們):
- 傳感器:物理設備,例如相機和雷達。
- 定位:確定車輛在高清地圖中的準確位置(精確到厘米)。
- 移動物體檢測和跟蹤:檢測和跟蹤其他交通參與者,例如車輛和行人。
感知系統的輸出結合了來自其各個模塊的數據,以產生周圍環境的中級虛擬表示。這種表示通常是環境的自上而下(鳥瞰)2D 視圖,稱為占用圖。以下屏幕截圖顯示了 ChauffeurNet 系統的示例占用地圖,我們將在本章后面討論。它包括路面(白線和黃線)、交通信號燈(紅線)和其他車輛(白色矩形)。最好以彩色方式查看圖像:
ChauffeurNet 的占用地圖。來源:https?: //arxiv.org/abs/1812.03079占用圖用作路徑規劃模塊的輸入,該模塊使用它來確定車輛的未來軌跡。控制模塊采用所需的軌跡并將其轉換為車輛的低級控制輸入。
中層表示方法有幾個優點。首先,它非常適合路徑規劃和控制模塊的功能。此外,我們可以使用模擬器生成它,而不是使用傳感器數據來創建自上而下的圖像。通過這種方式,收集訓練數據會更容易,因為我們不必駕駛真正的汽車。更重要的是,我們將能夠模擬現實世界中很少發生的情況。例如,我們的 AV 必須不惜一切代價避免崩潰,但現實世界的訓練數據將很少(如果有的話)崩潰。如果我們只使用真實的傳感器數據,最重要的駕駛情況之一將被嚴重低估。
第二種類型的 AV 系統使用單個端到端組件,它將原始傳感器數據作為輸入,并以轉向控制的形式生成駕駛策略,如下圖所示:
???????????????????????????????????????????????
?????????????????????????????????????????????????????????端到端的視音頻系統
事實上,我們在討論 ALVINN 時已經提到了端到端系統(在?AV 研究簡史部分)。接下來,我們將關注順序系統的不同模塊。我們將在本章后面更詳細地介紹端到端系統。
環境感知
要使任何自動化功能發揮作用,?車輛需要對其周圍環境有良好的感知。環境感知系統必須識別移動物體(例如行人、騎自行車者和其他車輛)的準確位置、距離和方向。此外,它必須創建路面的精確映射以及車輛在該路面和整個環境中的準確位置。讓我們討論幫助 AV 創建這個虛擬環境模型的硬件和軟件組件。
傳感
建立良好環境模型的關鍵是車輛傳感器。以下是最重要的傳感器列表:
- 攝像頭:其圖像用于?檢測?路面、車道標線、行人、騎自行車的人、其他車輛等。汽車環境中的一個重要相機屬性(除了分辨率)是視野。它測量相機在任何給定時刻看到的可觀察世界的多少。例如,在 180?o的視野下,它可以看到前面的一切,而后面什么也看不見。憑借 360 度的視野,它可以看到它前面的一切和車輛后面的一切(全面觀察)。存在以下不同類型的相機系統:
- 單聲道攝像頭:使用單個前置攝像頭,通常安裝在擋風玻璃頂部。?大多數自動化功能都依賴于這種類型的相機來工作。單聲道相機的典型視場為 125?o。
- 立體攝像頭:由兩個前置攝像頭組成的系統,彼此略微分開。相機之間的距離使它們能夠從稍微不同的角度捕捉到同一張照片,并將它們組合成 3D 圖像(以我們使用眼睛的相同方式)。立體系統可以測量到圖像中某些物體的距離,而單聲道相機僅依靠啟發式來完成這項工作。
- 360?o周圍環境?視圖:一些車輛具有四個攝像頭(前、后、左、右)的系統。
- 夜視攝像頭:一種系統,其中車輛包括一種特殊類型的前照燈,除了其常規功能外,它還會發出紅外光譜中的光。紅外攝像機記錄的光線可以向駕駛員顯示增強的圖像并在夜間檢測障礙物。
- 雷達:使用發射器向不同方向發射電磁波(在無線電或微波頻譜中)的系統。當波到達一個物體時,它們通常會被反射,其中一些反射到雷達本身的方向。雷達可以?探測到?它們帶有特殊的接收器天線。由于我們知道無線電波以光速傳播,我們可以通過測量發射和接收信號之間經過的時間來計算到反射物體的距離。我們還可以通過測量出射波和入射波的頻率差(多普勒效應)來計算物體(例如,另一輛車)的速度。與攝像機圖像相比,雷達的“圖像”噪聲更大、更窄且分辨率更低。例如,遠程雷達可以在 160 m 的距離內探測到物體,但在 12?o的狹窄視野內。雷達可以檢測到其他車輛和行人,但無法檢測路面或車道標記。它通常用于ACC和AEB,而LKA系統則使用攝像頭。大多數車輛都有一個或兩個前置雷達,在極少數情況下,還有一個后置雷達。
- 激光雷達?(光探測和測距):這種傳感器?有點?類似于?雷達,但它不是無線電波,而是發射近紅外光譜的激光束。正因為如此,一個發射的脈沖可以準確地測量到單個點的距離。激光雷達以一種非常快速的模式發射多個信號,從而創建環境的 3D 點云(傳感器可以非常快速地旋轉)。下圖顯示了車輛如何使用激光雷達觀察世界:
- 聲納(聲音和導航測距) :該傳感器發出超聲波脈沖,并通過聽取周圍物體反射的波的回聲來繪制環境圖。與雷達相比,聲納價格低廉,但有效探測范圍有限。因此,它們通常用于停車輔助功能。
來自多個傳感器的數據可以通過稱為傳感器融合的過程合并到一個環境模型中。傳感器融合通常使用卡爾曼濾波器 (?https://en.wikipedia.org/wiki/Kalman_filter?)實現。
本土化
定位是確定車輛?在?地圖上的準確位置的過程。為什么這很重要?HERE (?HERE Technologies | The world's #1 location platform?) 等公司專注于創建極其精確的道路地圖,其中道路表面的整個區域已知在幾厘米以內。這些地圖還可以包括有關靜態感興趣對象的信息,例如車道標記、交通標志、交通信號燈、限速、斑馬線、減速帶等。因此,如果我們?知道車輛在道路上的準確位置,就不難計算出最優軌跡。
一種明顯的解決方案是使用 GPS。但是,在完美的條件下,GPS 可以精確到 1-2 米以內。在有高層建筑或山區的地區,精度可能會受到影響,因為 GPS 接收器無法從足夠數量的衛星獲得信號。解決此問題的一種方法是使用同步定位和映射?(?SLAM?) 算法。這些算法超出了本書的范圍,但我鼓勵?你?對這個主題進行自己的研究。
運動物體檢測與跟蹤
我們現在對車輛使用的傳感器有所了解,并且我們已經簡要提到了了解其在地圖上的確切位置的重要性。有了這些知識,車輛理論上可以通過簡單地跟蹤細粒度點的面包屑路徑導航到目的地。然而,自動駕駛的任務并沒有那么簡單,因為環境是動態的,因為它包括移動的物體,如車輛、行人、騎自行車的人等。自動駕駛汽車必須不斷了解移動物體的位置,并在規劃其軌跡時對其進行跟蹤。這是我們可以將深度學習算法應用于原始傳感器數據的一個領域。首先,我們將為相機執行此操作。第5章,目標檢測和圖像分割?,我們討論了如何?在兩個高級視覺任務——對象檢測和語義分割中使用卷積網絡?(?CNN )。
回顧一下,對象檢測會在圖像中檢測到的不同類別的對象周圍創建一個邊界框。語義分割為圖像的每個像素分配一個類標簽。我們可以使用分割來檢測路面的確切形狀和攝像頭圖像上的車道標記。我們可以使用物體檢測對環境中感興趣的運動物體進行分類和定位;但是,我們已經在第 5 章,目標檢測和圖像分割中介紹了這些主題。在本章中,我們將重點關注激光雷達傳感器,并討論如何在該傳感器產生的 3D 點云上應用 CNN。
現在我們已經概述了感知子系統組件,在下一節中,我們將介紹路徑規劃子系統。
路徑規劃
路徑規劃(或駕駛策略)是計算?車輛?軌跡和速度的過程。盡管我們可能有準確的地圖和車輛的確切?位置?,但我們仍然需要牢記環境的動態。汽車被其他移動的車輛、行人、紅綠燈等包圍。如果前面的車輛突然停下來怎么辦?或者如果它移動得太慢?我們的 AV 必須做出超車決定,然后執行機動。這是一個機器學習和深度學習特別有用的領域,我們將在本章討論兩種實現它們的方法。更具體地說,我們將討論在端到端學習系統中使用模仿駕駛策略,以及由 Waymo 開發的稱為 ChauffeurNet 的駕駛策略算法。
AV 研究的一個障礙是構建 AV 并獲得必要的許可來測試它是非常昂貴和耗時的。值得慶幸的是,我們仍然可以在 AV 模擬器的幫助下訓練我們的算法。
一些最受歡迎的模擬器如下:
- Microsoft AirSim?,基于虛幻引擎?(?https://github.com/Microsoft/AirSim/?)
- CARLA,基于虛幻引擎 (?GitHub - carla-simulator/carla: Open-source simulator for autonomous driving research.?)
- Udacity 的自動駕駛汽車模擬器,使用 Unity 構建 (?https://github.com/udacity/self-driving-car-sim?)
- OpenAI Gym 的環境(我們將在模仿駕駛政策部分看到一個示例)?CarRacing-v0
我們對 AV 系統組件的描述到此結束。接下來,我們將討論如何處理 3D 空間數據。
3D數據處理簡介
激光雷達產生一個點云——三維空間中的一組數據點。請記住,激光雷達會發射激光束。從表面反射并返回接收器的光束會生成點云的單個數據點。如果我們假設激光雷達設備是坐標系的中心,并且每個激光束是一個矢量,那么一個點由矢量的方向和大小定義。因此,點云是一組無序的向量。或者,我們可以通過它們在空間中的笛卡爾坐標來定義點,如下圖左側所示。在這種情況下,點云是一組向量,其中每個向量包含點的三個坐標。為了清楚起見,每個點都表示為一個立方體:
左:3D 空間中的點(表示為立方體);右:體素的 3D 網格接下來,讓我們關注神經網絡的輸入數據格式,特別是 CNN。2D 彩色圖像表示為具有三個切片(每個通道一個)的張量,每個切片是由像素組成的矩陣(2D 網格)。CNN 使用 2D 卷積(參見第 2 章,了解卷積網絡)。直覺上,我們可能會認為我們可以為 3D 點云使用類似的 3D 體素網格(體素是 3D 像素),如上圖的右圖所示。假設點云點沒有顏色,我們可以將網格表示為 3D 張量,并將其用作具有 3D 卷積的 CNN 的輸入。
但是,如果我們仔細觀察這個 3D 網格,我們會發現它是稀疏的。例如,在上圖中,我們有一個包含 8 個點的點云,但網格包含 4 x 4 x 4 = 64 個單元。在這個簡單的例子中,我們將數據的內存占用增加了八倍,但在現實世界中,情況可能會更糟。在本節中,我們將介紹 PointNet(參見PointNet:Deep Learning on Point Sets for 3D?Classification and Segmentation,https?://arxiv.org/abs/1612.00593 ),它提供了該問題的解決方案。
PointNet 將點云向量p?i集合作為輸入,而不是它們的 3D 網格表示。為了理解它的架構,我們將從導致網絡設計的點云向量集的屬性開始(以下項目符號包含原始論文的引用):
- 無序:與圖像中的像素陣列或 3D 網格中的體素陣列不同,點云是一組沒有特定順序的點。因此,一個消耗N個 3D 點集的網絡需要對N保持不變!數據饋送順序中輸入集的排列。
- 點之間的交互:類似于圖像的像素,3D 點之間的距離可以指示它們之間的關系級別——也就是說,與遠處的點相比,附近的點更有可能是同一對象的一部分。因此,模型需要能夠從附近的點捕獲局部結構以及局部結構之間的組合相互作用。
- 變換下的不變性:作為一個幾何對象,點集的學習表示應該對某些變換是不變的。例如,一起旋轉和平移點不應該修改全局點云類別,也不應該修改點的分割。
現在我們知道了這些先決條件,讓我們看看 PointNet 如何解決它們。我們將從網絡架構開始,然后更詳細地討論它的組件:
點網架構。來源:https://arxiv.org/abs/1612.00593PointNet 是一個多層感知器(?MLP?)。這是一個前饋網絡,僅由完全連接的層(和最大池,但稍后會詳細介紹)組成。正如我們所提到的,輸入點云向量p?i的集合表示為一個n?× 3 張量。重要的是要注意網絡(直到最大池化層)在集合的所有點之間共享。也就是說,盡管輸入大小為n?× 3,但我們可以將 PointNet 視為在 n 上應用相同的網絡n次輸入向量大小為 1 × 3。換句話說,網絡權重在點云的所有點之間共享。這種順序排列還允許任意數量的輸入點。
輸入通過輸入變換(稍后我們將更詳細地討論),它輸出另一個n?× 3 張量,其中每個n個點由三個分量定義(類似于輸入張量)。該張量被饋送到一個上采樣全連接層,該層將每個點編碼為一個 64 維向量,用于n?× 64 輸出。網絡繼續進行另一個轉換,類似于輸入轉換。然后用 64、128、最后 1,024 個全連接層逐漸對結果進行上采樣,以產生最終的n?× 1024 輸出。該張量用作最大池化層的輸入,該層取所有n中同一位置的最大元素點并產生一個 1,024 維的輸出向量。該向量是整個點集的聚合表示。
但是為什么首先使用最大池呢?請記住,最大池化是一種對稱操作——也就是說,無論輸入的順序如何,它都會產生相同的輸出。同時,點集也是無序的。使用最大池確保網絡將產生相同的結果,而不管點的順序如何。該論文的作者選擇了最大池而不是其他對稱函數,例如平均池和求和,因為最大池在基準數據集中展示了最高的準確性。
在最大池化之后,網絡根據任務的類型分為兩個網絡(參見上圖):
- 分類:1024D 聚合向量作為幾個全連接層的輸入,這些全連接層以k路 softmax 結束,其中k是類的數量。這是一個標準的分類管道。
- 分割:這為集合的每個點分配一個類。分類網絡的擴展,他的任務需要結合本地和全局知識。如圖所示,我們將n 個64D 中間點表示中的每一個與全局 1024D 向量連接起來,以獲得一個組合的n?× 1088 張量。與網絡的初始段一樣,該路徑也在所有點之間共享。每個點的向量通過一系列(1088 到 512,然后到 256,最后到 128)全連接層被下采樣到 128D。最后的全連接層有m個單元(每個類一個)和 softmax 激活。
到目前為止,我們已經通過最大池化操作明確地解決了輸入數據的無序性質,但我們仍然需要解決點之間的不變性和交互性。這就是輸入和特征轉換將有所幫助的地方。讓我們從輸入變換開始(在上圖中,這是 T-net)。T-net 是一個 MLP,類似于完整的 PointNet(它被稱為 mini-PointNet),如下圖所示:
輸入(和特征)變換 T 網輸入變換 T-net 將n?× 3 點集(與完整網絡相同的輸入)作為輸入。與完整的 PointNet 一樣,T-net在所有點之間共享。首先,輸入被上采樣到n?× 1024,有 64 個,然后是 128 個,最后是 1024 個單元的全連接層。上采樣的輸出被饋送到最大池操作,該操作輸出 1 × 1024 向量。然后,使用兩個 512 和 256 單元的全連接層將向量下采樣到 1 × 256。1 × 256 向量乘以 256 × 9 全局(共享)可學習權重矩陣。結果被重新整形為一個 3 × 3 矩陣,在所有點上乘以原始輸入點p?i以產生最終的n× 3 輸出張量。中間的 3 × 3 矩陣在點集上充當一種可學習的仿射變換矩陣。通過這種方式,這些點被歸一化為一個熟悉的關于網絡的視角——也就是說,網絡在變換下變得不變。第二個 T-net(特征變換)與第一個幾乎相同,不同之處在于輸入張量是n?× 64,這會產生一個 64 × 64 的矩陣。
盡管全局最大池化層確保網絡不受數據順序的影響,但它還有另一個缺點,因為它創建了整個輸入點集的單一表示;但是,這些點可能屬于不同的對象(例如,車輛和行人)。在這種情況下,全局聚合可能會出現問題。為了解決這個問題,PointNet 的作者介紹了 PointNet++(參見PointNet++:Deep Hierarchical Feature Learning on Point Sets in a Metric Space?at?https://arxiv.org/abs/1706.02413),它是一種分層神經網絡,將 PointNet 遞歸應用于輸入點集的嵌套分區。
在本節中,我們研究了 AV 環境感知系統背景下的 3D 數據處理。在下一節中,我們將把注意力轉移到具有模仿駕駛策略的路徑規劃系統上。
模仿駕駛政策
在AV 系統的組件部分,我們概述了自動駕駛系統所需的幾個模塊。在本節中,我們將了解如何在 DL 的幫助下實施其中之一——驅動策略。一種方法是使用 RL,其中汽車是代理,環境就是環境。另一種流行的方法是模仿學習,其中模型(網絡)學習模仿專家(人類)的行為。讓我們看看模仿學習在 AV 場景中的屬性:
- 我們將使用一種模仿學習,稱為行為克隆。這僅僅意味著我們將以有監督的方式訓練我們的網絡。或者,我們可以在強化學習 (RL) 場景中使用模仿學習,這被稱為逆 RL。
- 網絡的輸出是駕駛策略,由所需的轉向角和/或加速或制動表示。例如,我們可以有一個用于轉向角的回歸輸出神經元和一個用于加速或制動的神經元(因為我們不能同時擁有兩者)。
- 網絡輸入可以是以下任意一種:
- 端到端系統的原始傳感器數據——例如,來自前置攝像頭的圖像。單個模型使用原始傳感器?輸入?并輸出駕駛策略的 AV 系統被稱為端到端。
- 順序復合系統的中級環境表示。
- 我們將在專家的幫助下創建訓練數據集。我們將讓專家在現實世界或模擬器中手動駕駛車輛。在旅程的每一步,我們都會記錄以下內容:
- 環境的當前狀態。這可能是原始傳感器數據或自上而下的視圖表示。我們將使用當前狀態作為模型的輸入。
- 專家在當前環境狀態下的動作(轉向角和制動/加速)。這將是網絡的目標數據。在訓練期間,我們將簡單地使用熟悉的梯度下降來最小化網絡預測和駕駛員行為之間的誤差。這樣,我們將教網絡模仿驅動程序。
行為克隆場景如下圖所示:
行為克隆場景正如我們已經提到的,ALVINN(來自?AV 研究簡史部分)是一個行為克隆端到端系統。最近,論文End to End Learning for Self-Driving Cars?(?https://arxiv.org/abs/1604.07316?) 介紹了一個類似的系統,該系統使用具有五個卷積層的 CNN,而不是完全連接的網絡。在他們的實驗中,車輛上前置攝像頭的圖像作為輸入輸入到 CNN。CNN 的輸出是單個標量?值,代表汽車所需的轉向角。網絡不控制加速和制動。為了構建訓練數據集,該論文的作者收集了大約 72 小時的真實駕駛視頻。在評估期間,該車能夠在郊區 98% 的時間內自行駕駛(不包括變道和從一條道路轉向另一條道路)。此外,它還設法在一條多車道分隔的高速公路上無干預地行駛了 16 公里。在下一節中,我們將實現一些有趣的東西——一個使用 PyTorch的行為克隆示例。
使用 PyTorch 進行行為克隆
在本節中,我們將使用 PyTorch 1.3.1實現一個?行為克隆示例。?為了幫助我們完成這項任務,我們將使用 OpenAI Gym (?Gym Documentation?),這是一個用于開發和比較強化學習算法的開源工具包。它允許我們教代理承擔各種任務,例如走路或玩乒乓球、彈球、其他一些 Atari 游戲甚至 Doom 等游戲。
我們可以安裝它:?pip
pip install gym[box2d]在本例中,我們將使用OpenAI Gym 環境,如以下屏幕截圖所示:?CarRacing-v0
在 CarRacing-v0環境中,代理是賽車;全程使用鳥瞰圖 此示例包含多個 Python 文件。在本節中,我們將提到最重要的部分。完整的源代碼位于https://github.com/PacktPublishing/Advanced-Deep-Learning-with-Python/tree/master/Chapter11/imitation_learning。目標是讓紅色賽車(稱為代理)在不滑離路面的情況下盡可能快地在賽道上行駛。我們可以使用四種動作來控制汽車:加速、剎車、左轉和右轉。每個動作的輸入是連續的——例如,我們可以指定全油門值為 1.0,半油門值為 0.5(其他控件也是如此)。
為了簡單起見,我們假設我們只能指定兩個離散的動作值:0 表示無動作,1 表示完全動作。由于最初這是一個 RL 環境,因此代理將在沿軌道前進的每一步獲得獎勵;但是,我們不會使用它,因為代理會直接從我們的操作中學習。我們將執行以下步驟:
介紹完之后,讓我們繼續準備訓練數據集。
生成訓練數據集
在本節中,我們將了解如何生成訓練數據集并將其作為 PyTorchtorch.utils.data.DataLoader類的實例加載。我們將突出顯示代碼中最相關的部分,但完整的源代碼位于https://github.com/PacktPublishing/Advanced-Deep-Learning-with-Python/blob/master/Chapter11/imitation_learning/train。 py
我們將分幾個步驟創建訓練數據集:
- 第一個元素有一個范圍內的值[-1, 1],表示轉向角(-1對于右,1對于左)。
- 第二個元素在[0, 1]范圍內,代表油門。
- 第三個元素在[0, 1]?范圍內,代表制動力。
一旦我們有了訓練樣本的數組,我們將使用該函數將它們轉換為實例。這些類只允許我們以小批量提取數據并應用數據增強。?numpy?create_datasetstorch.utils.data.DataLoader
但首先,讓我們實現data_transform轉換列表,在將圖像輸入網絡?之前?對其進行修改。完整的實現可在Advanced-Deep-Learning-with-Python/util.py at master · PacktPublishing/Advanced-Deep-Learning-with-Python · GitHub獲得。我們將圖像轉換為灰度,標準化[0, 1]范圍內的顏色值,并裁剪框架的底部(黑色矩形,?顯示?獎勵和其他信息)。實現如下:
data_transform = torchvision.transforms.Compose([torchvision.transforms.ToPILImage(),torchvision.transforms.Grayscale(1),torchvision.transforms.Pad((12, 12, 12, 0)),torchvision.transforms.CenterCrop(84),torchvision.transforms.ToTensor(),torchvision.transforms.Normalize((0,), (1,)), ])接下來,讓我們將注意力轉移到create_datasets函數上。我們將從聲明開始:
def create_datasets():然后,我們將實現幫助類,以便能夠對輸入圖像應用轉換。實現如下(請記住縮進,因為這段代碼仍然是函數的一部分):TensorDatasetTransforms?data_transform?create_datasets
class TensorDatasetTransforms(torch.utils.data.TensorDataset):def __init__(self, x, y):super().__init__(x, y)def __getitem__(self, index):tensor = data_transform(self.tensors[0][index])return (tensor,) + tuple(t[index] for t in self.tensors[1:])接下來,我們將完整讀取之前生成的數據集:
x, y = read_data()x = np.moveaxis(x, 3, 1) # channel first (torch requirement)然后,我們將創建訓練和驗證數據加載器(train_loader和val_loader)。最后,我們將它們作為create_datasets函數的結果返回:
# train datasetx_train = x[:int(len(x) * TRAIN_VAL_SPLIT)]y_train = y[:int(len(y) * TRAIN_VAL_SPLIT)]train_set = TensorDatasetTransforms(torch.tensor(x_train), torch.tensor(y_train))train_loader = torch.utils.data.DataLoader(train_set, batch_size=BATCH_SIZE,shuffle=True, num_workers=2)# test datasetx_val, y_val = x[int(len(x_train)):], y[int(len(y_train)):]val_set = TensorDatasetTransforms(torch.tensor(x_val), torch.tensor(y_val))val_loader = torch.utils.data.DataLoader(val_set, batch_size=BATCH_SIZE,shuffle=False, num_workers=2)return train_loader, val_loader接下來,讓我們關注代理 NN 架構。
.
實現代理神經網絡
代理由具有以下屬性的 CNN 表示:
- 單輸入 84 × 84 切片。
- 三個卷積層,跨步用于下采樣。
- ELU 激活。
- 兩個全連接層。
- 七個輸出神經元(每個神經元一個)。
- 批量歸一化和 dropout,在每一層(甚至是卷積層)之后應用,以防止過度擬合。這個任務中的過度擬合特別夸張,因為我們不能使用任何有意義的數據增強技術。例如,假設我們隨機水平翻轉圖像。在這種情況下,我們還必須更改標簽以反轉轉向值。因此,我們將盡可能多地依賴正則化。
以下代碼塊顯示了網絡?實現:
def build_network():return torch.nn.Sequential(torch.nn.Conv2d(1, 32, 8, 4),torch.nn.BatchNorm2d(32),torch.nn.ELU(),torch.nn.Dropout2d(0.5),torch.nn.Conv2d(32, 64, 4, 2),torch.nn.BatchNorm2d(64),torch.nn.ELU(),torch.nn.Dropout2d(0.5),torch.nn.Conv2d(64, 64, 3, 1),torch.nn.ELU(),torch.nn.Flatten(),torch.nn.BatchNorm1d(64 * 7 * 7),torch.nn.Dropout(),torch.nn.Linear(64 * 7 * 7, 120),torch.nn.ELU(),torch.nn.BatchNorm1d(120),torch.nn.Dropout(),torch.nn.Linear(120, len(available_actions)),)實現了訓練數據集和代理后,我們可以繼續訓練。
訓練
我們將在函數的幫助下實現訓練本身,該train?函數將網絡和設備作為參數。我們將使用交叉熵損失和 Adam 優化器(分類任務的常用組合)。該函數簡單地迭代時間并為每個時期調用and函數。以下是實現:?cuda?EPOCHS?train_epoch?test
def train(model: torch.nn.Module, device: torch.device):loss_function = torch.nn.CrossEntropyLoss()optimizer = torch.optim.Adam(model.parameters())train_loader, val_order = create_datasets() # read datasets# trainfor epoch in range(EPOCHS):print('Epoch {}/{}'.format(epoch + 1, EPOCHS))train_epoch(model, device, loss_function, optimizer, train_loader)test(model, device, loss_function, val_order)# save modelmodel_path = os.path.join(DATA_DIR, MODEL_FILE)torch.save(model.state_dict(), model_path)然后,我們將實現train_epoch?單個 epoch 訓練。此函數迭代所有小批量并為每個小批量執行前向和后向傳遞。以下是實現:
def train_epoch(model, device, loss_function, optimizer, data_loader):model.train() # set model to training modecurrent_loss, current_acc = 0.0, 0.0for i, (inputs, labels) in enumerate(data_loader):inputs, labels = inputs.to(device), labels.to(device) # send to deviceoptimizer.zero_grad() # zero the parameter gradientswith torch.set_grad_enabled(True):outputs = model(inputs) # forward_, predictions = torch.max(outputs, 1)loss = loss_function(outputs, labels)loss.backward() # backwardoptimizer.step()current_loss += loss.item() * inputs.size(0) # statisticscurrent_acc += torch.sum(predictions == labels.data)total_loss = current_loss / len(data_loader.dataset)total_acc = current_acc / len(data_loader.dataset)print('Train Loss: {:.4f}; Accuracy: {:.4f}'.format(total_loss, total_acc)) 和函數類似于我們在第 2 章“理解卷積網絡”中為遷移學習代碼示例實現的函數。為避免重復,我們不會在此處實現該功能,盡管它在 GitHub 存儲庫中可用。train_epochtesttest我們將運行大約 100 個 epoch 的訓練,但您可以將其縮短到 20 或 30 個 epoch 以進行快速實驗。使用默認訓練集,一個 epoch 通常需要不到一分鐘的時間。現在我們已經熟悉了訓練,讓我們看看如何在我們的模擬環境中使用代理 NN 來駕駛賽車。
讓代理開車
我們將從實現nn_agent_drive?允許代理玩游戲的功能開始(在https://github.com/PacktPublishing/Advanced-Deep-Learning-with-Python/blob/master/Chapter11/imitation_learning/nn_agent 中定義。 py?)。該?函數?將以初始狀態(游戲幀)啟動環境。我們將使用它作為網絡的輸入。然后,我們將 softmax 網絡輸出從 one-hot 編碼轉換為基于數組的動作,并將其發送到環境以進行下一步。我們將重復這些步驟,直到劇集結束。該功能還允許用戶通過按Escape 退出。請注意,我們仍然使用與訓練相同的轉換。?env?nn_agent_drivedata_transform
首先,我們將實現初始化部分,它綁定Esc鍵并初始化環境:
def nn_agent_drive(model: torch.nn.Module, device: torch.device):env = gym.make('CarRacing-v0')global human_wants_exit # use ESC to exithuman_wants_exit = Falsedef key_press(key, mod):"""Capture ESC key"""global human_wants_exitif key == 0xff1b: # escapehuman_wants_exit = Truestate = env.reset() # initialize environmentenv.unwrapped.viewer.window.on_key_press = key_press接下來,我們將實現主循環,其中代理(車輛)獲取一個action,環境返回新的state,等等。這種動態反映在無限while循環中(請注意縮進,因為這段代碼仍然是 的一部分nn_agent_play):
while 1:env.render()state = np.moveaxis(state, 2, 0) # channel first imagestate = torch.from_numpy(np.flip(state, axis=0).copy()) # np to tensorstate = data_transform(state).unsqueeze(0) # apply transformationsstate = state.to(device) # add additional dimensionwith torch.set_grad_enabled(False): # forwardoutputs = model(state)normalized = torch.nn.functional.softmax(outputs, dim=1)# translate from net output to env actionmax_action = np.argmax(normalized.cpu().numpy()[0])action = available_actions[max_action]action[2] = 0.3 if action[2] != 0 else 0 # adjust brake powerstate, _, terminal, _ = env.step(action) # one stepif terminal:state = env.reset()if human_wants_exit:env.close()return我們現在擁有運行程序的所有要素,我們將在下一節中進行。
把它們放在一起
最后,我們可以運行整個事情。完整代碼可在Advanced-Deep-Learning-with-Python/main.py at master · PacktPublishing/Advanced-Deep-Learning-with-Python · GitHub獲得。
以下?代碼?段構建和恢復(如果可用)網絡、運行訓練并評估網絡:
# create cuda device dev = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")# create the network model = build_network()# if true, try to restore the network from the data file restore = False if restore:model_path = os.path.join(DATA_DIR, MODEL_FILE)model.load_state_dict(torch.load(model_path))# set the model to evaluation (and not training) mode model.eval()# transfer to the gpu model = model.to(dev)# train train(model, dev)# agent play nn_agent_drive(model, dev)雖然我們無法在此處顯示代理的運行情況,但您可以按照本節中的說明輕松查看它的運行情況。盡管如此,?我們可以說它學得很好,并且能夠定期(但并非總是)在賽道上跑完整圈。有趣的是,網絡的駕駛風格與生成數據集的操作員的風格非常相似。這個例子還表明我們不應該低估監督學習。我們?能夠?用一個小數據集創建一個表現不錯的代理,并且訓練時間相對較短。
至此,我們結束了我們的模仿學習示例。接下來,我們將討論一種更復雜的駕駛策略算法,稱為 ChauffeurNet。
使用 ChauffeurNet 的駕駛政策
在本節中,我們將討論最近發表的一篇名為ChauffeurNet:通過模仿最佳和綜合最差來學習駕駛(?https://arxiv.org/abs/1812.03079?) 的論文。它由 AV 領域的領導者之一 Waymo 于 2018 年 12 月發布。讓我們看一下ChaffeurNet模型的一些屬性:
- 它是兩個相互連接的網絡的組合。第一個是稱為 FeatureNet 的 CNN,它從環境中提取特征。這些特征作為?輸入饋送?到稱為 AgentRNN 的第二個循環網絡,該網絡確定駕駛策略。
- 它以與我們在模仿駕駛策略?部分中描述的算法類似的方式使用模仿監督學習。訓練集是根據真實世界駕駛事件的記錄生成的。ChauffeurNet?可以處理復雜的駕駛情況,例如變道、紅綠燈、交通標志、從一條街道到另一條街道的變化等等。
我們將從輸入和輸出數據表示開始討論 ChauffeurNet。
輸入和輸出表示
端到端方法將原始傳感器數據(例如,相機圖像)提供給 ML 算法 (NN),進而生成駕駛策略(轉向角和加速度)。相比之下,ChauffeurNet 使用我們在AV 系統的組件部分中介紹的中級輸入和輸出。讓我們先看看 ML 算法的輸入。這是一系列自上而下(鳥瞰)視圖的 400 × 400 圖像,類似于CarRacing-v0環境圖像,但要復雜得多。?時間t的?一個時刻由多個圖像表示,其中每個圖像都包含環境的不同元素。
我們可以在下圖中看到一個 ChauffeurNet 輸入/輸出組合的示例:
ChauffeurNet 輸入。來源:https://arxiv.org/abs/1812.03079讓我們按字母順序查看輸入元素((a)到(g)):
- (a) 是路線圖的精確表示。它是一個 RGB 圖像,它使用不同的顏色來表示各種道路特征,例如車道、人行橫道、交通標志和路緣石。
- (b) 是交通信號燈的灰度圖像的時間序列。與 (a) 的特征不同,交通信號燈是動態的——也就是說,它們在不同時間可以是綠色、紅色或黃色。為了正確傳達它們的動態,該算法使用一系列圖像,顯示每個車道在過去T場景?秒內直到當前時刻的交通燈狀態。每個圖像中線條的顏色代表每個交通燈的狀態,其中最亮的顏色為紅色,中間為黃色,最暗為綠色或未知。
- (c) 是具有已知每條車道限速的灰度圖像。不同的顏色強度代表不同的速度限制。
- (d) 是起點和終點之間的預定路線。把它想象成谷歌地圖生成的方向。
- (e) 是表示代理當前位置的灰度圖像(顯示為白框)。
- (f) 是灰度圖像的時間序列,表示環境的動態元素(顯示為框)。這些可能是其他車輛、行人或騎自行車的人。隨著這些對象隨時間改變位置,該算法通過一系列快照圖像傳達它們的軌跡,代表它們在最后T個場景?秒內的位置。這與交通信號燈 (b) 的工作方式相同。
- (g) 是直到當前時刻的過去T姿勢秒的代理軌跡的單個灰度圖像。?代理位置在圖像上顯示為一系列點。請注意,我們將它們顯示在單個圖像中,而不是像其他動態元素那樣使用時間序列。時刻t的代理在同一個自上而下的環境中表示,其中是坐標,是方向(或航向),是速度。
- (h) 是算法中層輸出:代理的未來軌跡,表示為?一系列點。這些點與過去的軌跡 (g) 具有相同的含義。通過使用直到當前時刻 t 的過去軌跡 (g) 生成時間t+1的未來位置輸出。我們將 ChauffeurNet 表示為:
這里,I是所有前面的輸入圖像,pt?是時間t的代理位置,δt?是 0.2 s 的時間增量。δt的值是任意的,由論文作者選擇。一旦我們有了t+δt,我們就可以將它添加到過去的軌跡 (g) 中,并且我們可以使用它在步驟t+2δt以循環方式生成下一個位置。新生成的軌跡被饋送到車輛的控制模塊,該模塊盡力通過車輛控制(轉向、加速和制動)來執行它。
正如我們在AV 系統的組件部分中提到的,這種中級輸入表示允許我們輕松使用不同來源的訓練數據。它可以通過融合車輛傳感器輸入(如攝像頭和激光雷達)和地圖數據(如街道、交通信號燈、交通標志等)從現實世界的駕駛中生成。但我們也可以在模擬環境中生成相同格式的圖像。這同樣適用于中級輸出,其中控制模塊可以連接到各種類型的物理車輛或模擬車輛。使用模擬可以從現實世界中很少發生的情況中學習,例如緊急制動甚至碰撞。為了幫助代理了解這種情況,論文的作者使用模擬明確地合成了多個罕見的場景。
現在我們已經熟悉了數據表示,讓我們將注意力轉移到模型的核心組件上。
模型架構
下圖說明了ChauffeurNet 模型架構:
(a) ChauffeurNet 架構和 (b) 迭代中的內存更新來源:?https ://arxiv.org/abs/1812.03079首先,我們有 FeatureNet(在上圖中,這由 (a) 標記)。這是一個帶有殘差連接的 CNN,其輸入是我們在輸入和輸出表示部分中看到的自上而下的圖像。FeatureNet 的輸出是一個特征向量F?,它代表了合成網絡對當前環境的理解。該向量作為循環網絡 AgentRNN 的輸入之一,它迭代地預測駕駛軌跡中的連續點。假設我們想在步驟k預測智能體軌跡的下一個點。在這種情況下,AgentRNN 具有以下輸出:
- p?k是在該步驟中預測的行駛軌跡的下一個點。從圖中我們可以看出,AgentRNN 的輸出實際上是一個與輸入圖像具有相同維度的熱圖。它表示空間坐標上的概率分布P?k?(x, y),它表示下一個航點在熱圖的每個單元(像素)上的概率。我們使用該arg-max操作從該熱圖中獲得粗略的姿態預測p?k。
- B?k是第 k 步代理的預測邊界框。像路點輸出一樣,B?k是一個熱圖,但是,在這里,每個單元都使用 sigmoid 激活并表示代理占據該特定像素的概率。
- 還有兩個未顯示在圖表中的附加輸出:θ?k代表智能體的航向(或方向),s?k代表所需速度。
ChauffeurNet 還包括一個附加記憶,用M表示(在上圖中,用 (b) 標記)。M是我們在輸入和輸出表示部分中定義的單通道輸入圖像 (g)?。它表示過去步驟k的航路點預測 (?p?k,?p?k-1?, ....,?p?0?) 。當前航路點p?k?在每一步都被添加到內存中,如上圖所示。
?輸出p?k?和B?k作為下一步k+1的 AgentRNN 的輸入遞歸地反饋。AgentRNN 輸出的公式如下:
??????????????????????????????????????
?接下來,讓我們檢查一下 ChauffeurNet 如何在順序 AV 管道中集成:
完整的端到端駕駛管道中的 ChauffeurNet。來源:https://arxiv.org/abs/1812.03079該系統類似于我們在AV 系統組件部分介紹的反饋回路。讓我們看看它的組成部分:
- 數據渲染器:接收來自環境和動態路由器的輸入。它的作用是將這些信號轉換為我們在輸入和輸出表示部分中定義的自上而下的輸入圖像。
- 動態路由器:根據代理是否能夠到達先前的目標坐標,提供動態更新的預期路線。將其視為導航系統,您可以在其中輸入目的地,并為您提供前往目標的路線。您開始導航這條路線,如果您偏離路線,系統將根據您當前的位置和目的地動態計算一條新路線。
- 神經網絡:ChauffeurNet 模塊,輸出期望的未來軌跡。
- 控制優化:接收未來軌跡并將其轉換為驅動車輛的低級控制信號。
ChauffeurNet 是一個相當復雜的系統,所以現在讓我們看看如何訓練它。
訓練
ChauffeurNet 使用模仿監督學習訓練了 3000 萬個專家駕駛示例。模型輸入是我們在輸入和輸出表示部分中定義的自上而下的圖像,如下面的扁平(聚合)輸入圖像所示:
???????????????????????????????????????????????????????????????????????????????????
?????????????????最好以彩色方式查看圖像。來源:https?: //arxiv.org/abs/1812.03079
接下來,我們看一下ChauffeurNet訓練過程的組成部分:
?????????????????ChauffeurNet 訓練組件:(a) 模型本身,(b) 附加網絡,以及 (c) 損失。來源:https :?//arxiv.org/abs/1812.03079
我們已經熟悉了ChauffeurNet 模型本身(在上圖中標記為 (a))。讓我們關注該過程中涉及的兩個附加網絡(在上圖中標記為(b)):
- Road Mask?N?et:在當前輸入圖像上輸出具有路面精確區域的分割掩碼。為了更好地理解這一點,下圖說明了目標道路掩碼(左)和網絡的預測道路掩碼(右):
?????????????????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????來源:https?: //arxiv.org/abs/1812.03079
- PerceptionRNN:輸出一個分割掩碼,其中包含環境中每個其他動態對象(車輛、騎自行車的人、行人等)的預測未來位置。PerceptionRNN 的輸出如下圖所示,顯示了其他車輛的預測位置(淺色矩形):
這些網絡不?參與?最終的車輛控制,僅在訓練期間使用。使用它們的目的是,與簡單地從 AgentRNN 獲得反饋相比,如果 FeatureNet 網絡從樹任務(AgentRNN、Road Mask Net 和 PerceptionRNN)接收反饋,它將學習更好的表示。
現在,讓我們關注各種損失函數(ChauffeurNet 模式的底部 (c))。我們將從模仿損失開始,它反映了未來智能體位置的模型預測與人類專家基礎事實的不同之處。以下列表顯示了AgentRNN輸出及其相應的損失函數:
- 預測航路點p?k的空間坐標上的概率分布P?k?(x, y)。我們將使用以下損失來訓練這個組件:
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????
這里,是交叉熵損失,是預測分布,是真實分布。
- 代理邊界框B?k的熱圖。我們可以使用以下損失來訓練它(沿著熱圖的單元格應用):
這里,W和H是輸入圖像的尺寸,是預測的熱圖,是地面實況熱圖。
- 具有以下損失的代理θ?k的航向(方向) :
???????????????????????????????????????????????????????????????????????????????????
?這里,θ?k是預測方向,是地面實況方向。
該論文的作者還介紹了過去的運動丟失。我們可以通過引用論文來最好地解釋這一點:
在訓練期間,模型被提供過去的運動歷史作為輸入之一(輸入和輸出表示部分中的模式的圖像(g))。由于訓練期間過去的運動歷史來自專家演示,因此網絡可以通過僅從過去推斷而不是找到行為的根本原因來學習“作弊”。在閉環推理期間,這會失敗,因為過去的歷史來自網絡自己過去的預測。例如,這樣一個訓練有素的網絡可能會學會僅在看到過去歷史中的減速時才停止停車標志,因此在閉環推理期間永遠不會因為停車標志而停車。為了解決這個問題,我們在過去的姿勢歷史上引入了一個 dropout,對于 50% 的示例,我們只保留當前位置(u0?, v?0?)過去代理的代理構成輸入數據的通道。這迫使網絡查看環境中的其他線索來解釋訓練示例中的未來運動曲線。他們還觀察到,當駕駛情況與專家駕駛訓練數據沒有顯著差異時,模仿學習方法效果很好。但是,代理必須為許多不屬于訓練的駕駛情況做好準備,例如碰撞。如果代理只依賴于訓練數據,它將不得不隱式學習碰撞,這并不容易。為了解決這個問題,本文針對最重要的情況提出了明確的損失函數。其中包括:
- 路點損失:地面實況與預測的代理未來位置p?k之間的誤差。
- 速度損失:地面實況與預測的智能體未來速度 sk 之間的誤差。
- 航向損失:地面實況與預測的代理未來方向θ?k之間的誤差。
- Agent-box loss:ground truth 和預測的 agent bounding box?B?k之間的誤差。
- 幾何損失:強制代理明確地遵循目標軌跡,與速度曲線無關。
- 道路損失:強制代理僅在道路表面區域上導航,并避開環境的非道路區域。如果代理的預測邊界框與道路掩模網絡預測的圖像的非道路區域重疊,這種損失將增加。
- 碰撞損失:明確強制代理避免碰撞。如果代理的預測邊界框與環境中任何其他動態對象的邊界框重疊,這種損失將會增加。
概括
在本章中,我們探討了深度學習在 AV 中的應用。我們從對 AV 研究的簡要歷史概述開始,并討論了不同程度的自治。然后我們描述了 AV 系統的組件,并確定了何時適合使用 DL 技術。接下來,我們研究了 3D 數據處理和 PointNet。然后我們介紹了使用行為克隆實現駕駛策略的主題,并使用 PyTorch 實現了一個模仿學習示例。最后,我們查看了 Waymo 的 ChauffeurNet 系統。
總結
以上是生活随笔為你收集整理的【DL】第 11 章:自动驾驶汽车的深度学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Matisse图片选择
- 下一篇: window10 wls2 安装dock