文 /Miguel de Andrés-Clavera,產品經理,Google PI
在本文中,我想與大家分享我們用 TensorFlow Lite 為今年 Google I/O 大會構建并展示的演示。很遺憾今年沒能夠進行現場演示,期待這篇文章能為您帶來樂趣與啟發!
TensorFlow Lite
https://tensorflow.google.cn/lite
Pixelopolis 概覽
Pixelopolis 是一套由 TensorFlow Lite 構建的無人駕駛微型汽車。每輛微型汽車都裝配有一部 Pixel 手機,使用手機上的攝像頭檢測和理解周圍的信號。手機使用了Pixel Neural Core 芯片(Edge TPU 支持的端側機器學習),可感應車道、避免碰撞和讀取交通標志。
Pixel Neural Core 芯片
https://blog.google/products/pixel/pixel-4/
Edge TPU
https://cloud.google.com/edge-tpu/
邊緣計算是這類項目的理想實現選擇。由于延遲問題,不推薦使用基于云來進行視頻處理和檢測物體。而設備端操作將大幅提升速度。
用戶可以通過“站點”(手機端的一個應用)與 Pixelopolis 進行交互,選擇車輛的目的地。車輛將自動導航到該目的地,并在應用顯示車輛行程的實時視頻流,這樣用戶便可以查看車輛周圍及所檢測到的物體。
△ 站點應用界面(Pixelopolis 還內置了多語言支持)
△ 車輛應用
使用設備端的前置攝像頭,我們可以實時保持車道、進行定位和目標檢測。不僅如此,示例中的 Pixel 4 還支持通過 USB-C 接口的擴展,如控制電機或其他電子元件,車輛可在檢測到其他車輛時停車,或者以正確的交互方式實現轉向。
如果您對技術細節感興趣,下文將繼續為您介紹車輛的主要組件以及我們的構建過程。
保持車道
我們探索用于保持車道的多種模型 。作為基線,我們使用卷積神經網絡 (CNN) 來檢測每幀圖像內的交通指示線,并以每幀為一個單位調整方向盤,這種方案效果良好。我們還通過添加了 LSTM 并使用前期拍攝的多個幀改進了方案。經過更多實驗后,我們采用了與這篇論文類似的模型架構。
論文
https://images.nvidia.com/content/tegra/automotive/images/2016/solutions/pdf/end-to-end-dl-using-px.pdf
△ CNN 模型的輸入和輸出
模型架構
net_in = Input(shape = (80, 120, 3)) x = Lambda(lambda x: x/127.5 - 1.0)(net_in) x = Conv2D(24, (5, 5), strides=(2, 2),padding="same", activation='elu')(x) x = Conv2D(36, (5, 5), strides=(2, 2),padding="same", activation='elu')(x) x = Conv2D(48, (5, 5), strides=(2, 2),padding="same", activation='elu')(x) x = Conv2D(64, (3, 3), padding="same",activation='elu')(x) x = Conv2D(64, (3, 3), padding="same",activation='elu')(x) x = Dropout(0.3)(x) x = Flatten()(x) x = Dense(100, activation='elu')(x) x = Dense(50, activation='elu')(x) x = Dense(10, activation='elu')(x) net_out = Dense(1, name='net_out')(x) model = Model(inputs=net_in, outputs=net_out)
數據收集
在使用此模型之前,我們需要為訓練車輛收集圖像數據。但當時我們并沒有汽車或軌道可以使用。因此,我們決定使用模擬器。我們使用 Unity 以及 Udacity 中的模擬器項目來收集車道保持數據。
△ 模擬器中的軌道中上設有多個路徑點
通過在軌道上設置多個路徑點,微型汽車可以行駛到不同的地點,并從中收集數據。在此模擬器中,我們每 50 毫秒收集一次圖像數據和轉角數據。
微型汽車
https://assetstore.unity.com/packages/essentials/asset-packs/standard-assets-for-unity-2017-3-32351
圖像增強
△ 各種環境下的數據增強
由于所有數據收集工作都是在模擬器內完成,我們需要在場景中創建各種不同的環境,因為我們希望模型能夠應對不同的光照、背景環境和其他噪聲的影響。
我們將以下變量添加到場景中:隨機的 HDRI 球體(具有不同的旋轉模式和曝光值)、隨機的環境亮度和顏色以及隨機出現的車輛。
訓練
△ 第一層神經網絡的輸出
由于我們僅使用模擬器來訓練機器學習模型,方案有可能在現實環境中無法奏效,或無法一次嘗試就成功。在我們的實驗中,車輛在軌道上行駛數秒后便會因各種原因偏離軌道。
△ 早期版本中玩具車偏離了軌道
后來,我們發現這是由于我們大多使用直線軌道訓練模型。為解決這種數據不均衡的問題,我們在場景中添加了各種形狀的曲線。
△(左)方形軌道與(右)彎曲軌道
修正數據集不均衡的問題后,車輛便開始能夠在彎道處正確轉向。
△車輛在彎道處成功轉彎
使用最終軌道設計進行訓練
△ 最終的軌道設計
我們開始為車輛設計更復雜的路況,如:在軌道上添加多個路口,更多可選擇的路線,我們希望車輛能夠應對這些新路況。但是,我們立即遇到了新的問題:當車輛試圖在路口處轉彎時,由于看到軌道外的隨機出現的物體而轉向并撞到了側方軌道。
△ 在具有多種路線的軌道中訓練模型
我們測試了多種解決方案,并選擇了最為簡單有效的一種。我們僅裁剪圖像底部 ? 的部分,并將其錄入到車道保持模型中,然后將模型輸入尺寸調整為 120x40,有效地化解了上述問題。
△ 裁剪圖像底部以實現車道保持
目標檢測
我們使用目標檢測是出于兩個目的。一是定位。每輛車都需要通過檢測周圍環境中的物體來獲知其在城市中的位置(在本例中,我們所檢測的是城市中的交通標志)。另一個則是檢測其他車輛,以免車輛相撞。
選擇目標檢測器模型時,TensorFlow 目標檢測模型庫中已提供了許多模型。但針對 Pixel 4 Edge TPU 設備,我們使用了 ssd_mobilenet_edgetpu 模型。
提供
https://github.com/tensorflow/models/tree/master/research/object_detection
Pixel 4 的“Neural Core” Edge TPU 上使用 ssd_mobilenet_edgetpu 模型可實現目前最快的 MobileNet 目標檢測。每幀僅用時 6.6 毫秒,該檢測速度對于實時應用的要求而言已綽綽有余。
ssd_mobilenet_edgetpu
https://storage.cloud.google.com/mobilenet_edgetpu/checkpoints/ssdlite_mobilenet_edgetpu_coco_quant.tar.gz
△ Pixel 4 Edge TPU 模型性能
數據標注和模擬
我們使用模擬器和真實場景中的圖像數據來訓練模型。接下來,我們使用 Unreal Engine 4 開發了自己的模擬器。模擬器會生成隨機物體和隨機背景,以及可在 TensorFlow 目標檢測 API中使用的 Pascal VOC 格式注解文件。
Unreal Engine 4
https://www.unrealengine.com/
TensorFlow 目標檢測 API
https://github.com/tensorflow/models/tree/master/research/object_detection
△ 使用 UE4 的目標檢測模擬器
對于從真實場景拍攝的圖像,我們需要使用 labelImg 工具進行手動標注。
△ 使用 labelImg 執行數據標注
訓練
△ 損失報告
我們使用 TensorBoard來監控訓練進度及評估 mAP(平均精度,需要手動執行該步驟)。
TensorBoard
https://tensorflow.google.cn/tensorboard
△ TensorBoard 界面
△ 檢測結果和實際標簽
TensorFlow Lite
由于我們希望在運行 Android 的 Pixel 4 設備上運行機器學習模型,需將模型轉換為 .tflite 格式。當然,對于 iOS 和其他設備(包括微控制器)也可使用 TensorFlow Lite。以下是我們執行的步驟:
車道保持
首先,我們使用以下代碼將車道保持模型從 .h5 格式轉換為 .tflite 格式:
import tensorflow as tf converter = tf.lite.TFLiteConverter.from_keras_model_file("lane_keeping.h5") model = converter.convert() file = open("lane_keeping.tflite",'wb') file.write( model ) file.close()
現在,模型已經為該 Android 項目準備就緒。接下來,我們在應用中建立車道保持類。我們從此處的示例 Android 項目著手。
目標檢測我們必須將模型 checkpoint (.ckpt) 轉換為 TensorFlow Lite 格式 (.tflite)
使用 export_tflite_ssd_graph.py 腳本將 .ckpt 轉換為 .pb 文件(TensorFlow 目標檢測 API 中已提供該腳本)
使用 toco: TensorFlow Lite Converter 將 .pb 轉換為 .tflite 格式
export_tflite_ssd_graph.py
https://github.com/tensorflow/models/blob/master/research/object_detection/export_tflite_ssd_graph.py
使用 Neural Core
我們使用此處提供的 Android 示例項目。然后,我們使用以下代碼修改了 delegate 以使用 Pixel 4 Edge TPU。
Interpreter.Options tfliteOptions = new Interpreter.Options(); nnApiDelegate = new NnApiDelegate(); tfliteOptions.addDelegate(nnApiDelegate); tfLite = new Interpreter(loadModelFile(assetManager, modelFilename),tfliteOptions);
此處
https://tensorflow.google.cn/lite/models/object_detection/overview
實時視頻流
在用戶選擇目的地后,車輛將開始無人駕駛。車輛行駛期間會將其周圍影像以視頻流傳輸到“站點”手機。剛開始實現此部分時,我們意識到無法流式傳輸原始的視頻流,因為需要在多部車載手機和“站點”手機之間傳輸,數據量很大。因此我們將原始圖像幀壓縮為 JPEG 格式,然后以 HTTP Content-type:multipart/x-mixed-replace 的 http 協議流式傳輸 JPEG。這樣,我們就可以同時傳輸多個視頻流,且設備之間無明顯延遲。
服務器應用
服務器堆棧
服務器端使用 NodeJS 與 MongoDB。
叫車
由于站點和車輛數量眾多,我們需要找到匹配兩者的有效方案。我們構建了類似熱門打車應用的預訂系統。我們的預訂系統包含 3 個步驟。首先,車輛連接到服務器,并告知服務器車輛已準備好,可供預訂。然后,站點 App 連接到服務器,并向服務器查詢車輛。最后,服務器將查找準備就緒的車輛并將兩者匹配,并為匹配好的站點 App 和車輛 App 儲存設備 ID。
導航
△ 節點/連線
由于將有多輛車穿梭于城市各處,我們需要找到一種有效的導航方法。我們采用了“節點/連線”的概念。節點是地圖上的一處地點,連線是兩個節點之間的路徑。然后,我們將每個節點映射到城市中的實際標志處。
△ 軌道和標志位置俯視圖
在站點應用中選擇目的地后,站點便會向服務器發送節點 ID,接著,服務器將返回一個包含節點及其屬性列表的對象,以便車輛知道行程目的地以及將看到的預期標志。
電子設備
部件
我們首先使用 NUCLEO-F411RE 作為開發板。我們選擇使用 Dynamixel 配置電機。
△ NUCLEO-F411RE
我們設計并開發了用于諸如電機等其他組件的屏蔽罩,以精簡車輛底盤內的布線量。屏蔽罩包含三個部分:1) 電池電壓測量電路,2) 帶 MOSFET 的 On/Off 開關,3) 按鈕。
△(左)屏蔽罩和電機,(右)電源插座、電源開關、電機啟動按鈕、電機重置按鈕、開發板狀態 LED、電機狀態 LED
在后面的階段中,我們希望縮減車輛尺寸,因此我們從 NUCLEO-F411RE 遷移到 NUCLEO-L432KC,因為其尺寸更小。
△ NUCLEO-L432KC
車輛底盤和外觀
第一代
△ 第一代設計
我們設計并使用 PLA 材料 3D 打印了車輛底盤。前輪為腳輪。
第二代
△ 第二代設計
我們在開發板上添加了電池測量電路,在手機拆下后開發板后將切斷電源。
第三代
△ 第三代設計
我們添加了狀態 LED 指示燈,以實現輕松調試。在上一版本中,我們遇到了電機過熱的問題,因此在此版本中,我們在電機上添加風扇來改善通風效果。我們還在開發板上添加了 USB Type-C 電力傳輸電路,使手機可以使用車載電池。
第四代
△ 第四代設計
我們將所有控制按鈕和狀態 LED 指示燈都移動到了車輛后部,以方便操作。
第五代
△ 第五代設計
此為最終版本,我們需要盡可能縮小車輛尺寸。首先,我們將開發板從 NUCLEO-F411RE 改為 NUCLEO-L432KC,以實現更小占用空間。然后,我們將前輪更改為球形腳輪。接下來,我們將開發板的位置重新調整到車輛頂部,并將電池疊放到開發板下方。最后,我們取消了 USB Type-C 電力傳輸電路,因為我們希望電池電量能夠全部供應給開發板和電機而非手機,從而延長行駛時間。
性能指標
未來計劃
我們計劃在多個方面改善體驗:
電池
目前,電機和控制器驅動板由三組 3000mAh 鋰離子電池供電,我們設計了一個充電電路來充電。充電時,車輛需移動到充電站,并將電源適配器插入車輛后部進行充電。這種設計有很多不足:車輛在充電時無法行駛,且充電時間長達數小時。
△ 3000mAh 鋰離子電池(左)與 18650 鋰離子電池(右)
我們希望通過更換為 18650 鋰電池來縮短充電過程。后者因容量大、體積小的特點,廣泛用于筆記本電腦、工具和電動自行車等電子產品中。這樣,當車子沒電時僅需更換電池,并用電池充電器為舊電池充電,而無需將車輛一直停放在充電站。
定位
△ SLAM 定位
定位過程對于此裝置而言至關重要,我們希望在應用內加入 SLAM 技術來提高定位的穩定性。我們相信這將大大改善轉彎機制。
了解詳情
非常感謝您的閱讀!手機攝像頭配合 TensorFlow,再加上一點點想象力,可以實現萬千可能。希望這篇文章能夠帶給您靈感并將其應用于自己的項目 - 我們在本項目中收獲了很多知識與經驗,希望您也能在您的項目中有所收獲。本文提供了多項資源的鏈接,供您深入研究不同領域,您也可以從 TensorFlow Hub的開發者學習社區中提供的大量機器學習模型和教程來進一步學習相關知識。
TensorFlow Hub
https://tfhub.dev/
如果您對制造無人駕駛汽車興趣濃厚,并且想要深入了解機器學習和深度學習如何推動無人駕駛汽車行業的發展,請查看 Udacity 中的無人駕駛汽車納米學位項目。對于希望在無人駕駛汽車的各個方面(包括計算機視覺、傳感器融合與定位)獲得全面培訓的工程師和學生而言,此項目是理想的選擇。
無人駕駛汽車納米學位項目
https://www.udacity.com/course/self-driving-car-engineer-nanodegree--nd013
致謝
本項目的實現離不開以下杰出才干的專業與付出:Sina Hassani、Ashok Halambi、Pohung Chen、Eddie Azadi、Shigeki Hanawa、Clara Tan Su Yi、Daniel Bactol、Kiattiyot Panichprecha Praiya Chinagarn、Pittayathorn Nomrak、Nonthakorn Seelapun、Jirat Nakarit、Phatchara Pongsakorntorn、Tarit Nakavajara、Witsarut Buadit、Nithi Aiempongpaiboon、Witaya Junma、Taksapon Jaionnom 和 Watthanasuk Shuaytong。
責任編輯:xj
原文標題:Pixelopolis:由 TensorFlow Lite 構建無人駕駛微型汽車
文章出處:【微信公眾號:TensorFlow】歡迎添加關注!文章轉載請注明出處。
-
無人駕駛
+關注
關注
98文章
4058瀏覽量
120477 -
微型汽車
+關注
關注
0文章
2瀏覽量
5372 -
tensorflow
+關注
關注
13文章
329瀏覽量
60530 -
TensorFlow Lite
+關注
關注
0文章
26瀏覽量
621
原文標題:Pixelopolis:由 TensorFlow Lite 構建無人駕駛微型汽車
文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論