佘黎煌,童文昊,孫健偉,許洪瑞
(東北大學(xué) 計(jì)算機(jī)科學(xué)與工程學(xué)院,遼寧 沈陽 110000)
隨著人工智能理論方法的快速發(fā)展應(yīng)用,以及自動(dòng)駕駛技術(shù)、VR/AR 領(lǐng)域、機(jī)器人定位導(dǎo)航方面等人工智能技術(shù)的發(fā)展。如何在嵌入式系統(tǒng)中使用FPGA 和GPU等高性能邊緣技術(shù),成為嵌入式系統(tǒng)技術(shù)發(fā)展應(yīng)用的重要內(nèi)容之一。因此,在高校的嵌入式系統(tǒng)課程中為本科生開展目前流行的嵌入式GPU 應(yīng)用技術(shù)介紹,不僅是嵌入式系統(tǒng)課程與時(shí)俱進(jìn)的必要課程內(nèi)容,也可以為學(xué)生今后就業(yè)和深造提供重要嵌入式高性能邊緣計(jì)算的重要基礎(chǔ)。
本系統(tǒng)基于Nvidia Jetson TX2 的ARM+GPU 嵌入式平臺(tái),該平臺(tái)類似傳統(tǒng)的PC 機(jī)中處理器搭載GPU 顯卡的模式,但是在可靠性和功耗等方面有著極大的優(yōu)化,適合于嵌入式系統(tǒng)的應(yīng)用。其中ARM 核心嵌入式操作系統(tǒng)運(yùn)行和系統(tǒng)管理,開發(fā)的架構(gòu),GPU 負(fù)責(zé)繁雜的計(jì)算,極大的拓展了嵌入式技術(shù)的能力范圍。本文將以嵌入式GPU 和雙目攝像頭為主要硬件,以雙目SLAM 和目標(biāo)識(shí)別運(yùn)算為示例來展示嵌入式GPU 的性能。
SLAM 技術(shù)是無人智能機(jī)器必備技術(shù),它使用光學(xué)傳感器,以設(shè)備自身為中心對(duì)周圍環(huán)境進(jìn)行建圖,并且確定自身位置。SLAM 技術(shù)有多重,其中雙目SLAM 效果優(yōu)秀,代價(jià)是運(yùn)算量很高。
同時(shí)我們注意到,智能設(shè)備的任務(wù)往往是有特定目標(biāo)的,如無人駕駛車需要識(shí)別出什么位置有車輛,什么位置有人,紅綠燈在哪等等。所以我們將目標(biāo)識(shí)別也加入到我們的系統(tǒng)中,形成能夠目標(biāo)識(shí)別的SLAM 建圖系統(tǒng)。
雙目攝像頭測(cè)距的方案有很多種,既有將兩個(gè)攝像頭豎直放置也有水平放置。在本例中使用的是模仿人類雙眼的平行成像模式,兩個(gè)攝像頭平行成像。如圖1、圖2所示。
兩側(cè)攝像頭的成像CMOS 焦點(diǎn)處分別為Cl和Cr,Pl和Pr為攝像頭最外側(cè)外鏡片頂點(diǎn),P 為成像物體。由于對(duì)于已知的攝像機(jī)兩個(gè)成像交點(diǎn)處的距離為定值其在生產(chǎn)時(shí)就已經(jīng)確定并且是已知的量,其距離為L(zhǎng)。而每個(gè)攝像頭都有其固定的焦距為D。對(duì)于物體發(fā)射光線同外側(cè)鏡片交點(diǎn)處與光軸的距離分別定義為xl和xr對(duì)于這兩者差值的絕對(duì)值為視差值。根據(jù)這些已知的參量使用簡(jiǎn)單的三角形相似原理就能得出攝像機(jī)和P 點(diǎn)間的距離Y。
從公式中可直觀的看出對(duì)于雙目攝像頭成像影響較大的有視差和焦距,可以通過改變焦距來提高遠(yuǎn)處物體的測(cè)距能力,這一點(diǎn)類似于使用不同焦距的攝像頭拍攝不同距離的物體。而對(duì)于視差無法控制時(shí),盡量距離物體較近以獲得更好的測(cè)距效果[1]。
圖1 雙目測(cè)距模型
圖2 雙目測(cè)距數(shù)學(xué)模型
雙目立體視覺是基于仿生的雙目視覺系統(tǒng),其原理可以看為雙目測(cè)距原理在空間三個(gè)維度上的推廣,三維立體的成像即在空間坐標(biāo)系中確定一物體在X Y Z 三個(gè)維度上分別獲得攝像頭與物體間的距離信息,基于此信息建立起整個(gè)物體的在空間中的立體信息。如圖3 所示。
圖中Or和Ol則為平行入射光線同相機(jī)鏡頭最外側(cè)鏡片交點(diǎn)。f 為焦距,P 點(diǎn)為空間中的要在相機(jī)內(nèi)成像的點(diǎn)。Pl(Xl,Yl),Pr(Xr,Yr)為目標(biāo)點(diǎn)P 在兩個(gè)相機(jī)內(nèi)所成的像。類似于雙目測(cè)距的原理,得到如下公式[2]。
圖3 雙目立體視覺模型
定義D=Xl-Xr為視差,由三角測(cè)量原理可以用以下公式計(jì)算出P 點(diǎn)的三維坐標(biāo)。
對(duì)于單獨(dú)一個(gè)點(diǎn)的情況根據(jù)以上公式可以得到其空間坐標(biāo),而對(duì)于一個(gè)實(shí)際物體的建圖則涉及到對(duì)應(yīng)點(diǎn)的匹配。需要使用特征點(diǎn)匹配算法。
通過雙目攝像頭獲取了左右攝像機(jī)拍攝的兩張不同方位的照片,使用SIFT 算法進(jìn)行特征點(diǎn)匹配,能夠得到匹配圖,算法能夠自動(dòng)匹配圖中相似的點(diǎn)、線、面,從這些匹配點(diǎn)看,SIFT 算法提取的特征點(diǎn)大部分都是圖像中物體結(jié)構(gòu)的輪廓,這些點(diǎn)反映了這一物體的整體結(jié)構(gòu),能夠幫助計(jì)算機(jī)理解空間位置。通過計(jì)算點(diǎn)在空間中相對(duì)相機(jī)的位置,將其標(biāo)注在3D 建圖中,進(jìn)一步得到由點(diǎn)云構(gòu)成的3D 建圖。
本項(xiàng)目使用TensorFlow 深度學(xué)習(xí)框架和訓(xùn)練完成的圖像識(shí)別訓(xùn)練集,在嵌入式GPU 和深度學(xué)習(xí)加速器的幫助下,能夠做到對(duì)每一幀畫面實(shí)時(shí)識(shí)別,其識(shí)別原理如下。
機(jī)器學(xué)習(xí)的原理就是對(duì)輸入進(jìn)行解析,將提取出的信息乘上參數(shù),累加后得出結(jié)果,而參數(shù)的確定就是訓(xùn)練過程,通過大量的輸入和結(jié)果糾正,程序自行對(duì)參數(shù)進(jìn)行調(diào)整。最終得到訓(xùn)練完成的機(jī)器學(xué)習(xí)網(wǎng)絡(luò)。
圖4 設(shè)計(jì)架構(gòu)
本文選用SSD 算法。它采用多層卷積的方式,用不同大小的卷積核對(duì)圖像卷積,將輸入圖像以不同的規(guī)格劃分為多個(gè)區(qū)塊并強(qiáng)化特征信息,之后采取池化,將多個(gè)子矩陣以取平均壓縮,最終得到一個(gè)高度凝練的矩陣,以這種方式將圖像矩陣快速縮小并且提取、壓縮出主要特征信息,值得注意的是,在卷積與池化的過程中必然有信息損失,這些信息損失會(huì)導(dǎo)致較小或不清晰物體丟失,或者識(shí)別邊界不準(zhǔn)確。最后再采取全連接的方式分配神經(jīng)元進(jìn)行加權(quán)求和、判斷置信區(qū)間,得到結(jié)果。
我們選用如下硬件搭建系統(tǒng):
(1)NVIDIA 的嵌入式 GPU 開發(fā)板 Jetson TX2,它集成了8 核CPU、GPU 等電路,單精度浮點(diǎn)運(yùn)算性能為2.8Tflops,雙精度為1.4Tflops 而功耗僅有20W,能在低功耗下情況下提供高計(jì)算力。此外,它提供了靈活的驅(qū)動(dòng)和接口,既可以直接使用熟悉設(shè)備,也可以自己編寫強(qiáng)化技能,非常利于教學(xué)。
(2)ZED 雙目攝像機(jī),它能夠高清高幀率地傳輸圖像,且其生產(chǎn)公司提供了豐富的庫、工具集和接口,能夠快速計(jì)算深度信息,方便其他程序調(diào)用。
(3)載具,我們使用自己搭建的小車作為平臺(tái),配有舵機(jī)、蓄電池等,受ROS 系統(tǒng)控制,能滿足中低速平穩(wěn)運(yùn)動(dòng)的需要。
軟件方面,我們?cè)趈etson TX2 開發(fā)板上運(yùn)行的系統(tǒng)是NVIDIA 公司定制的Ubuntu 系統(tǒng)JetPack OS,它優(yōu)化了系統(tǒng)對(duì)GPU 和深度學(xué)習(xí)的支持。使用ZED 官方工具軟件進(jìn)行建圖,TensorFlow 作為深度學(xué)習(xí)框架,ROS 系統(tǒng)對(duì)小車進(jìn)行控制。
JetPack OS 的安裝需要一臺(tái)Ubuntu 系統(tǒng)的PC 主機(jī)輔助,將它們連在同一路由器下,并使用官方提供的數(shù)據(jù)線將TX2 與PC 相連,運(yùn)行官網(wǎng)下載的SDK Manager 刷機(jī)工具,跟隨指引完成刷機(jī)安裝。進(jìn)入系統(tǒng)后,桌面操作與Ubuntu 無異。
進(jìn)入ZED 相機(jī)官網(wǎng),下載Nvidia Jetson 專有版本的ZED SDK,這是官方提供的ZED 相機(jī)驅(qū)動(dòng)工具,用以下指令運(yùn)行下載的.run 文件即可安裝成功。(其中zed_sdk_file 指的是run 文件所在文件夾,zed_sdk 指的是下載的.run 文件全名)
cd ~/ zed_sdk_file
chmod +x zed_sdk
./zed_sdk
由于TX2 是ARM+GPU 的結(jié)構(gòu),所以我們安裝的版本實(shí)際上是TensorFlow-GPU。我們使用如下指令安裝:
pip3 install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu==1.13.1+nv19.3 --user
如果網(wǎng)絡(luò)狀態(tài)良好,沒有報(bào)錯(cuò),則安裝完成。在終端輸入以下代碼進(jìn)行測(cè)試,如果最后看到輸出"hello,world"則說明安裝成功。
python3
import tensorflow as tf
hello=tf.constant("hello,world")
sess=tf.Session()
print(sess.run(hello))
API 是一些預(yù)先定義的函數(shù),官方提供了ZED Python API 和 TensorFlow Object Detection API,前者提供ZED 相機(jī)的調(diào)用函數(shù),后者是深度學(xué)習(xí)的函數(shù)庫。二者代碼均在GitHub 下載。
如果JetPack OS 的安裝順利的話,系統(tǒng)中已經(jīng)帶有其他所需的軟件,但是我們了解到,部分情況下,這些軟件沒有安裝成功,就需要手動(dòng)安裝,包括cuDNN、OpenCV和CUDA 等。
我們用終端指令啟動(dòng)建圖程序和目標(biāo)識(shí)別程序,
./ZED oolEDfu
python3 object_detection_zed.py
可以在屏幕上看到實(shí)時(shí)3D 建圖與計(jì)算出的相機(jī)移動(dòng)軌跡(如圖5 所示),以及實(shí)時(shí)目標(biāo)識(shí)別的結(jié)果,同時(shí)在系統(tǒng)中,可以調(diào)整算法精度,以適應(yīng)不同場(chǎng)合。
圖5 建圖結(jié)果
經(jīng)測(cè)試,使用嵌入式GPU 與雙目攝像頭結(jié)合的方式,能夠?qū)崿F(xiàn)對(duì)載具經(jīng)過的空間進(jìn)行實(shí)時(shí)構(gòu)建3D 模型并對(duì)自身定位,同時(shí)對(duì)當(dāng)前攝像頭內(nèi)的物體進(jìn)行實(shí)時(shí)識(shí)別。這套系統(tǒng),結(jié)合尋路避障程序,可以實(shí)現(xiàn)自主巡航建圖的無人車,進(jìn)入人類無法進(jìn)入的空間進(jìn)行自主勘探或工作。