文 /Miguel de Andrés-Clavera,產(chǎn)品經(jīng)理,Google PI
在本文中,我想與大家分享我們用 TensorFlow Lite 為今年 Google I/O 大會(huì)構(gòu)建并展示的演示。很遺憾今年沒能夠進(jìn)行現(xiàn)場(chǎng)演示,期待這篇文章能為您帶來樂趣與啟發(fā)!
TensorFlow Lite
https://tensorflow.google.cn/lite
Pixelopolis 概覽
Pixelopolis 是一套由 TensorFlow Lite 構(gòu)建的無人駕駛微型汽車。每輛微型汽車都裝配有一部 Pixel 手機(jī),使用手機(jī)上的攝像頭檢測(cè)和理解周圍的信號(hào)。手機(jī)使用了Pixel Neural Core 芯片(Edge TPU 支持的端側(cè)機(jī)器學(xué)習(xí)),可感應(yīng)車道、避免碰撞和讀取交通標(biāo)志。
Pixel Neural Core 芯片
https://blog.google/products/pixel/pixel-4/
Edge TPU
https://cloud.google.com/edge-tpu/
邊緣計(jì)算是這類項(xiàng)目的理想實(shí)現(xiàn)選擇。由于延遲問題,不推薦使用基于云來進(jìn)行視頻處理和檢測(cè)物體。而設(shè)備端操作將大幅提升速度。
用戶可以通過“站點(diǎn)”(手機(jī)端的一個(gè)應(yīng)用)與 Pixelopolis 進(jìn)行交互,選擇車輛的目的地。車輛將自動(dòng)導(dǎo)航到該目的地,并在應(yīng)用顯示車輛行程的實(shí)時(shí)視頻流,這樣用戶便可以查看車輛周圍及所檢測(cè)到的物體。
△ 站點(diǎn)應(yīng)用界面(Pixelopolis 還內(nèi)置了多語(yǔ)言支持)
△ 車輛應(yīng)用
使用設(shè)備端的前置攝像頭,我們可以實(shí)時(shí)保持車道、進(jìn)行定位和目標(biāo)檢測(cè)。不僅如此,示例中的 Pixel 4 還支持通過 USB-C 接口的擴(kuò)展,如控制電機(jī)或其他電子元件,車輛可在檢測(cè)到其他車輛時(shí)停車,或者以正確的交互方式實(shí)現(xiàn)轉(zhuǎn)向。
如果您對(duì)技術(shù)細(xì)節(jié)感興趣,下文將繼續(xù)為您介紹車輛的主要組件以及我們的構(gòu)建過程。
保持車道
我們探索用于保持車道的多種模型 。作為基線,我們使用卷積神經(jīng)網(wǎng)絡(luò) (CNN) 來檢測(cè)每幀圖像內(nèi)的交通指示線,并以每幀為一個(gè)單位調(diào)整方向盤,這種方案效果良好。我們還通過添加了 LSTM 并使用前期拍攝的多個(gè)幀改進(jìn)了方案。經(jīng)過更多實(shí)驗(yàn)后,我們采用了與這篇論文類似的模型架構(gòu)。
論文
https://images.nvidia.com/content/tegra/automotive/images/2016/solutions/pdf/end-to-end-dl-using-px.pdf
△ CNN 模型的輸入和輸出
模型架構(gòu)
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)
數(shù)據(jù)收集
在使用此模型之前,我們需要為訓(xùn)練車輛收集圖像數(shù)據(jù)。但當(dāng)時(shí)我們并沒有汽車或軌道可以使用。因此,我們決定使用模擬器。我們使用 Unity 以及 Udacity 中的模擬器項(xiàng)目來收集車道保持?jǐn)?shù)據(jù)。
△ 模擬器中的軌道中上設(shè)有多個(gè)路徑點(diǎn)
通過在軌道上設(shè)置多個(gè)路徑點(diǎn),微型汽車可以行駛到不同的地點(diǎn),并從中收集數(shù)據(jù)。在此模擬器中,我們每 50 毫秒收集一次圖像數(shù)據(jù)和轉(zhuǎn)角數(shù)據(jù)。
微型汽車
https://assetstore.unity.com/packages/essentials/asset-packs/standard-assets-for-unity-2017-3-32351
圖像增強(qiáng)
△ 各種環(huán)境下的數(shù)據(jù)增強(qiáng)
由于所有數(shù)據(jù)收集工作都是在模擬器內(nèi)完成,我們需要在場(chǎng)景中創(chuàng)建各種不同的環(huán)境,因?yàn)槲覀兿MP湍軌驊?yīng)對(duì)不同的光照、背景環(huán)境和其他噪聲的影響。
我們將以下變量添加到場(chǎng)景中:隨機(jī)的 HDRI 球體(具有不同的旋轉(zhuǎn)模式和曝光值)、隨機(jī)的環(huán)境亮度和顏色以及隨機(jī)出現(xiàn)的車輛。
訓(xùn)練
△ 第一層神經(jīng)網(wǎng)絡(luò)的輸出
由于我們僅使用模擬器來訓(xùn)練機(jī)器學(xué)習(xí)模型,方案有可能在現(xiàn)實(shí)環(huán)境中無法奏效,或無法一次嘗試就成功。在我們的實(shí)驗(yàn)中,車輛在軌道上行駛數(shù)秒后便會(huì)因各種原因偏離軌道。
△ 早期版本中玩具車偏離了軌道
后來,我們發(fā)現(xiàn)這是由于我們大多使用直線軌道訓(xùn)練模型。為解決這種數(shù)據(jù)不均衡的問題,我們?cè)趫?chǎng)景中添加了各種形狀的曲線。
△(左)方形軌道與(右)彎曲軌道
修正數(shù)據(jù)集不均衡的問題后,車輛便開始能夠在彎道處正確轉(zhuǎn)向。
△車輛在彎道處成功轉(zhuǎn)彎
使用最終軌道設(shè)計(jì)進(jìn)行訓(xùn)練
△ 最終的軌道設(shè)計(jì)
我們開始為車輛設(shè)計(jì)更復(fù)雜的路況,如:在軌道上添加多個(gè)路口,更多可選擇的路線,我們希望車輛能夠應(yīng)對(duì)這些新路況。但是,我們立即遇到了新的問題:當(dāng)車輛試圖在路口處轉(zhuǎn)彎時(shí),由于看到軌道外的隨機(jī)出現(xiàn)的物體而轉(zhuǎn)向并撞到了側(cè)方軌道。
△ 在具有多種路線的軌道中訓(xùn)練模型
我們測(cè)試了多種解決方案,并選擇了最為簡(jiǎn)單有效的一種。我們僅裁剪圖像底部 ? 的部分,并將其錄入到車道保持模型中,然后將模型輸入尺寸調(diào)整為 120x40,有效地化解了上述問題。
△ 裁剪圖像底部以實(shí)現(xiàn)車道保持
目標(biāo)檢測(cè)
我們使用目標(biāo)檢測(cè)是出于兩個(gè)目的。一是定位。每輛車都需要通過檢測(cè)周圍環(huán)境中的物體來獲知其在城市中的位置(在本例中,我們所檢測(cè)的是城市中的交通標(biāo)志)。另一個(gè)則是檢測(cè)其他車輛,以免車輛相撞。
選擇目標(biāo)檢測(cè)器模型時(shí),TensorFlow 目標(biāo)檢測(cè)模型庫(kù)中已提供了許多模型。但針對(duì) Pixel 4 Edge TPU 設(shè)備,我們使用了 ssd_mobilenet_edgetpu 模型。
提供
https://github.com/tensorflow/models/tree/master/research/object_detection
Pixel 4 的“Neural Core” Edge TPU 上使用 ssd_mobilenet_edgetpu 模型可實(shí)現(xiàn)目前最快的 MobileNet 目標(biāo)檢測(cè)。每幀僅用時(shí) 6.6 毫秒,該檢測(cè)速度對(duì)于實(shí)時(shí)應(yīng)用的要求而言已綽綽有余。
ssd_mobilenet_edgetpu
https://storage.cloud.google.com/mobilenet_edgetpu/checkpoints/ssdlite_mobilenet_edgetpu_coco_quant.tar.gz
△ Pixel 4 Edge TPU 模型性能
數(shù)據(jù)標(biāo)注和模擬
我們使用模擬器和真實(shí)場(chǎng)景中的圖像數(shù)據(jù)來訓(xùn)練模型。接下來,我們使用 Unreal Engine 4 開發(fā)了自己的模擬器。模擬器會(huì)生成隨機(jī)物體和隨機(jī)背景,以及可在 TensorFlow 目標(biāo)檢測(cè) API中使用的 Pascal VOC 格式注解文件。
Unreal Engine 4
https://www.unrealengine.com/
TensorFlow 目標(biāo)檢測(cè) API
https://github.com/tensorflow/models/tree/master/research/object_detection
△ 使用 UE4 的目標(biāo)檢測(cè)模擬器
對(duì)于從真實(shí)場(chǎng)景拍攝的圖像,我們需要使用 labelImg 工具進(jìn)行手動(dòng)標(biāo)注。
△ 使用 labelImg 執(zhí)行數(shù)據(jù)標(biāo)注
訓(xùn)練
△ 損失報(bào)告
我們使用 TensorBoard來監(jiān)控訓(xùn)練進(jìn)度及評(píng)估 mAP(平均精度,需要手動(dòng)執(zhí)行該步驟)。
TensorBoard
https://tensorflow.google.cn/tensorboard
△ TensorBoard 界面
△ 檢測(cè)結(jié)果和實(shí)際標(biāo)簽
TensorFlow Lite
由于我們希望在運(yùn)行 Android 的 Pixel 4 設(shè)備上運(yùn)行機(jī)器學(xué)習(xí)模型,需將模型轉(zhuǎn)換為 .tflite 格式。當(dāng)然,對(duì)于 iOS 和其他設(shè)備(包括微控制器)也可使用 TensorFlow Lite。以下是我們執(zhí)行的步驟:
車道保持
首先,我們使用以下代碼將車道保持模型從 .h5 格式轉(zhuǎn)換為 .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()
現(xiàn)在,模型已經(jīng)為該 Android 項(xiàng)目準(zhǔn)備就緒。接下來,我們?cè)趹?yīng)用中建立車道保持類。我們從此處的示例 Android 項(xiàng)目著手。
目標(biāo)檢測(cè)我們必須將模型 checkpoint (.ckpt) 轉(zhuǎn)換為 TensorFlow Lite 格式 (.tflite)
使用 export_tflite_ssd_graph.py 腳本將 .ckpt 轉(zhuǎn)換為 .pb 文件(TensorFlow 目標(biāo)檢測(cè) API 中已提供該腳本)
使用 toco: TensorFlow Lite Converter 將 .pb 轉(zhuǎn)換為 .tflite 格式
export_tflite_ssd_graph.py
https://github.com/tensorflow/models/blob/master/research/object_detection/export_tflite_ssd_graph.py
使用 Neural Core
我們使用此處提供的 Android 示例項(xiàng)目。然后,我們使用以下代碼修改了 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
實(shí)時(shí)視頻流
在用戶選擇目的地后,車輛將開始無人駕駛。車輛行駛期間會(huì)將其周圍影像以視頻流傳輸?shù)健罢军c(diǎn)”手機(jī)。剛開始實(shí)現(xiàn)此部分時(shí),我們意識(shí)到無法流式傳輸原始的視頻流,因?yàn)樾枰诙嗖寇囕d手機(jī)和“站點(diǎn)”手機(jī)之間傳輸,數(shù)據(jù)量很大。因此我們將原始圖像幀壓縮為 JPEG 格式,然后以 HTTP Content-type:multipart/x-mixed-replace 的 http 協(xié)議流式傳輸 JPEG。這樣,我們就可以同時(shí)傳輸多個(gè)視頻流,且設(shè)備之間無明顯延遲。
服務(wù)器應(yīng)用
服務(wù)器堆棧
服務(wù)器端使用 NodeJS 與 MongoDB。
叫車
由于站點(diǎn)和車輛數(shù)量眾多,我們需要找到匹配兩者的有效方案。我們構(gòu)建了類似熱門打車應(yīng)用的預(yù)訂系統(tǒng)。我們的預(yù)訂系統(tǒng)包含 3 個(gè)步驟。首先,車輛連接到服務(wù)器,并告知服務(wù)器車輛已準(zhǔn)備好,可供預(yù)訂。然后,站點(diǎn) App 連接到服務(wù)器,并向服務(wù)器查詢車輛。最后,服務(wù)器將查找準(zhǔn)備就緒的車輛并將兩者匹配,并為匹配好的站點(diǎn) App 和車輛 App 儲(chǔ)存設(shè)備 ID。
導(dǎo)航
△ 節(jié)點(diǎn)/連線
由于將有多輛車穿梭于城市各處,我們需要找到一種有效的導(dǎo)航方法。我們采用了“節(jié)點(diǎn)/連線”的概念。節(jié)點(diǎn)是地圖上的一處地點(diǎn),連線是兩個(gè)節(jié)點(diǎn)之間的路徑。然后,我們將每個(gè)節(jié)點(diǎn)映射到城市中的實(shí)際標(biāo)志處。
△ 軌道和標(biāo)志位置俯視圖
在站點(diǎn)應(yīng)用中選擇目的地后,站點(diǎn)便會(huì)向服務(wù)器發(fā)送節(jié)點(diǎn) ID,接著,服務(wù)器將返回一個(gè)包含節(jié)點(diǎn)及其屬性列表的對(duì)象,以便車輛知道行程目的地以及將看到的預(yù)期標(biāo)志。
電子設(shè)備
部件
我們首先使用 NUCLEO-F411RE 作為開發(fā)板。我們選擇使用 Dynamixel 配置電機(jī)。
△ NUCLEO-F411RE
我們?cè)O(shè)計(jì)并開發(fā)了用于諸如電機(jī)等其他組件的屏蔽罩,以精簡(jiǎn)車輛底盤內(nèi)的布線量。屏蔽罩包含三個(gè)部分:1) 電池電壓測(cè)量電路,2) 帶 MOSFET 的 On/Off 開關(guān),3) 按鈕。
△(左)屏蔽罩和電機(jī),(右)電源插座、電源開關(guān)、電機(jī)啟動(dòng)按鈕、電機(jī)重置按鈕、開發(fā)板狀態(tài) LED、電機(jī)狀態(tài) LED
在后面的階段中,我們希望縮減車輛尺寸,因此我們從 NUCLEO-F411RE 遷移到 NUCLEO-L432KC,因?yàn)槠涑叽绺 ?/p>
△ NUCLEO-L432KC
車輛底盤和外觀
第一代
△ 第一代設(shè)計(jì)
我們?cè)O(shè)計(jì)并使用 PLA 材料 3D 打印了車輛底盤。前輪為腳輪。
第二代
△ 第二代設(shè)計(jì)
我們?cè)陂_發(fā)板上添加了電池測(cè)量電路,在手機(jī)拆下后開發(fā)板后將切斷電源。
第三代
△ 第三代設(shè)計(jì)
我們添加了狀態(tài) LED 指示燈,以實(shí)現(xiàn)輕松調(diào)試。在上一版本中,我們遇到了電機(jī)過熱的問題,因此在此版本中,我們?cè)陔姍C(jī)上添加風(fēng)扇來改善通風(fēng)效果。我們還在開發(fā)板上添加了 USB Type-C 電力傳輸電路,使手機(jī)可以使用車載電池。
第四代
△ 第四代設(shè)計(jì)
我們將所有控制按鈕和狀態(tài) LED 指示燈都移動(dòng)到了車輛后部,以方便操作。
第五代
△ 第五代設(shè)計(jì)
此為最終版本,我們需要盡可能縮小車輛尺寸。首先,我們將開發(fā)板從 NUCLEO-F411RE 改為 NUCLEO-L432KC,以實(shí)現(xiàn)更小占用空間。然后,我們將前輪更改為球形腳輪。接下來,我們將開發(fā)板的位置重新調(diào)整到車輛頂部,并將電池疊放到開發(fā)板下方。最后,我們?nèi)∠?USB Type-C 電力傳輸電路,因?yàn)槲覀兿M姵仉娏磕軌蛉抗?yīng)給開發(fā)板和電機(jī)而非手機(jī),從而延長(zhǎng)行駛時(shí)間。
性能指標(biāo)
未來計(jì)劃
我們計(jì)劃在多個(gè)方面改善體驗(yàn):
電池
目前,電機(jī)和控制器驅(qū)動(dòng)板由三組 3000mAh 鋰離子電池供電,我們?cè)O(shè)計(jì)了一個(gè)充電電路來充電。充電時(shí),車輛需移動(dòng)到充電站,并將電源適配器插入車輛后部進(jìn)行充電。這種設(shè)計(jì)有很多不足:車輛在充電時(shí)無法行駛,且充電時(shí)間長(zhǎng)達(dá)數(shù)小時(shí)。
△ 3000mAh 鋰離子電池(左)與 18650 鋰離子電池(右)
我們希望通過更換為 18650 鋰電池來縮短充電過程。后者因容量大、體積小的特點(diǎn),廣泛用于筆記本電腦、工具和電動(dòng)自行車等電子產(chǎn)品中。這樣,當(dāng)車子沒電時(shí)僅需更換電池,并用電池充電器為舊電池充電,而無需將車輛一直停放在充電站。
定位
△ SLAM 定位
定位過程對(duì)于此裝置而言至關(guān)重要,我們希望在應(yīng)用內(nèi)加入 SLAM 技術(shù)來提高定位的穩(wěn)定性。我們相信這將大大改善轉(zhuǎn)彎?rùn)C(jī)制。
了解詳情
非常感謝您的閱讀!手機(jī)攝像頭配合 TensorFlow,再加上一點(diǎn)點(diǎn)想象力,可以實(shí)現(xiàn)萬千可能。希望這篇文章能夠帶給您靈感并將其應(yīng)用于自己的項(xiàng)目 - 我們?cè)诒卷?xiàng)目中收獲了很多知識(shí)與經(jīng)驗(yàn),希望您也能在您的項(xiàng)目中有所收獲。本文提供了多項(xiàng)資源的鏈接,供您深入研究不同領(lǐng)域,您也可以從 TensorFlow Hub的開發(fā)者學(xué)習(xí)社區(qū)中提供的大量機(jī)器學(xué)習(xí)模型和教程來進(jìn)一步學(xué)習(xí)相關(guān)知識(shí)。
TensorFlow Hub
https://tfhub.dev/
如果您對(duì)制造無人駕駛汽車興趣濃厚,并且想要深入了解機(jī)器學(xué)習(xí)和深度學(xué)習(xí)如何推動(dòng)無人駕駛汽車行業(yè)的發(fā)展,請(qǐng)查看 Udacity 中的無人駕駛汽車納米學(xué)位項(xiàng)目。對(duì)于希望在無人駕駛汽車的各個(gè)方面(包括計(jì)算機(jī)視覺、傳感器融合與定位)獲得全面培訓(xùn)的工程師和學(xué)生而言,此項(xiàng)目是理想的選擇。
無人駕駛汽車納米學(xué)位項(xiàng)目
https://www.udacity.com/course/self-driving-car-engineer-nanodegree--nd013
致謝
本項(xiàng)目的實(shí)現(xiàn)離不開以下杰出才干的專業(yè)與付出: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。
責(zé)任編輯:xj
原文標(biāo)題:Pixelopolis:由 TensorFlow Lite 構(gòu)建無人駕駛微型汽車
文章出處:【微信公眾號(hào):TensorFlow】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
無人駕駛
+關(guān)注
關(guān)注
99文章
4164瀏覽量
123228 -
微型汽車
+關(guān)注
關(guān)注
0文章
2瀏覽量
5413 -
tensorflow
+關(guān)注
關(guān)注
13文章
330瀏覽量
61102 -
TensorFlow Lite
+關(guān)注
關(guān)注
0文章
26瀏覽量
735
原文標(biāo)題:Pixelopolis:由 TensorFlow Lite 構(gòu)建無人駕駛微型汽車
文章出處:【微信號(hào):tensorflowers,微信公眾號(hào):Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
智行者科技無人駕駛小巴落地海南

無人駕駛技術(shù)未來在哪里?低速才是突破口

內(nèi)蒙古首個(gè)超百臺(tái)增程式無人駕駛礦卡項(xiàng)目落地
FlexBuild構(gòu)建Debian 12,在“tflite_ethosu_delegate”上構(gòu)建失敗了怎么解決?
易控智駕發(fā)布礦山無人駕駛應(yīng)用落地成果
為什么聊自動(dòng)駕駛的越來越多,聊無人駕駛的越來越少?

測(cè)速雷達(dá)與無人駕駛技術(shù)的結(jié)合 測(cè)速雷達(dá)故障排除技巧
智能駕駛在城市交通中的應(yīng)用
特斯拉推出無人駕駛Model Y
特斯拉發(fā)布無人駕駛出租車,沒有方向盤和踏板
文遠(yuǎn)知行獲加州無人駕駛汽車載人測(cè)試許可
FPGA在自動(dòng)駕駛領(lǐng)域有哪些應(yīng)用?
馬斯克稱:通用因技術(shù)未成熟放棄無人駕駛
5G賦能車聯(lián)網(wǎng),無人駕駛引領(lǐng)未來出行

評(píng)論