佘黎煌,童文昊,孫健偉,許洪瑞
(東北大學 計算機科學與工程學院,遼寧 沈陽 110000)
隨著人工智能理論方法的快速發展應用,以及自動駕駛技術、VR/AR 領域、機器人定位導航方面等人工智能技術的發展。如何在嵌入式系統中使用FPGA 和GPU等高性能邊緣技術,成為嵌入式系統技術發展應用的重要內容之一。因此,在高校的嵌入式系統課程中為本科生開展目前流行的嵌入式GPU 應用技術介紹,不僅是嵌入式系統課程與時俱進的必要課程內容,也可以為學生今后就業和深造提供重要嵌入式高性能邊緣計算的重要基礎。
本系統基于Nvidia Jetson TX2 的ARM+GPU 嵌入式平臺,該平臺類似傳統的PC 機中處理器搭載GPU 顯卡的模式,但是在可靠性和功耗等方面有著極大的優化,適合于嵌入式系統的應用。其中ARM 核心嵌入式操作系統運行和系統管理,開發的架構,GPU 負責繁雜的計算,極大的拓展了嵌入式技術的能力范圍。本文將以嵌入式GPU 和雙目攝像頭為主要硬件,以雙目SLAM 和目標識別運算為示例來展示嵌入式GPU 的性能。
SLAM 技術是無人智能機器必備技術,它使用光學傳感器,以設備自身為中心對周圍環境進行建圖,并且確定自身位置。SLAM 技術有多重,其中雙目SLAM 效果優秀,代價是運算量很高。
同時我們注意到,智能設備的任務往往是有特定目標的,如無人駕駛車需要識別出什么位置有車輛,什么位置有人,紅綠燈在哪等等。所以我們將目標識別也加入到我們的系統中,形成能夠目標識別的SLAM 建圖系統。
雙目攝像頭測距的方案有很多種,既有將兩個攝像頭豎直放置也有水平放置。在本例中使用的是模仿人類雙眼的平行成像模式,兩個攝像頭平行成像。如圖1、圖2所示。
兩側攝像頭的成像CMOS 焦點處分別為Cl和Cr,Pl和Pr為攝像頭最外側外鏡片頂點,P 為成像物體。由于對于已知的攝像機兩個成像交點處的距離為定值其在生產時就已經確定并且是已知的量,其距離為L。而每個攝像頭都有其固定的焦距為D。對于物體發射光線同外側鏡片交點處與光軸的距離分別定義為xl和xr對于這兩者差值的絕對值為視差值。根據這些已知的參量使用簡單的三角形相似原理就能得出攝像機和P 點間的距離Y。

從公式中可直觀的看出對于雙目攝像頭成像影響較大的有視差和焦距,可以通過改變焦距來提高遠處物體的測距能力,這一點類似于使用不同焦距的攝像頭拍攝不同距離的物體。而對于視差無法控制時,盡量距離物體較近以獲得更好的測距效果[1]。

圖1 雙目測距模型

圖2 雙目測距數學模型
雙目立體視覺是基于仿生的雙目視覺系統,其原理可以看為雙目測距原理在空間三個維度上的推廣,三維立體的成像即在空間坐標系中確定一物體在X Y Z 三個維度上分別獲得攝像頭與物體間的距離信息,基于此信息建立起整個物體的在空間中的立體信息。如圖3 所示。
圖中Or和Ol則為平行入射光線同相機鏡頭最外側鏡片交點。f 為焦距,P 點為空間中的要在相機內成像的點。Pl(Xl,Yl),Pr(Xr,Yr)為目標點P 在兩個相機內所成的像。類似于雙目測距的原理,得到如下公式[2]。

圖3 雙目立體視覺模型

定義D=Xl-Xr為視差,由三角測量原理可以用以下公式計算出P 點的三維坐標。

對于單獨一個點的情況根據以上公式可以得到其空間坐標,而對于一個實際物體的建圖則涉及到對應點的匹配。需要使用特征點匹配算法。
通過雙目攝像頭獲取了左右攝像機拍攝的兩張不同方位的照片,使用SIFT 算法進行特征點匹配,能夠得到匹配圖,算法能夠自動匹配圖中相似的點、線、面,從這些匹配點看,SIFT 算法提取的特征點大部分都是圖像中物體結構的輪廓,這些點反映了這一物體的整體結構,能夠幫助計算機理解空間位置。通過計算點在空間中相對相機的位置,將其標注在3D 建圖中,進一步得到由點云構成的3D 建圖。
本項目使用TensorFlow 深度學習框架和訓練完成的圖像識別訓練集,在嵌入式GPU 和深度學習加速器的幫助下,能夠做到對每一幀畫面實時識別,其識別原理如下。
機器學習的原理就是對輸入進行解析,將提取出的信息乘上參數,累加后得出結果,而參數的確定就是訓練過程,通過大量的輸入和結果糾正,程序自行對參數進行調整。最終得到訓練完成的機器學習網絡。

圖4 設計架構
本文選用SSD 算法。它采用多層卷積的方式,用不同大小的卷積核對圖像卷積,將輸入圖像以不同的規格劃分為多個區塊并強化特征信息,之后采取池化,將多個子矩陣以取平均壓縮,最終得到一個高度凝練的矩陣,以這種方式將圖像矩陣快速縮小并且提取、壓縮出主要特征信息,值得注意的是,在卷積與池化的過程中必然有信息損失,這些信息損失會導致較小或不清晰物體丟失,或者識別邊界不準確。最后再采取全連接的方式分配神經元進行加權求和、判斷置信區間,得到結果。
我們選用如下硬件搭建系統:
(1)NVIDIA 的嵌入式 GPU 開發板 Jetson TX2,它集成了8 核CPU、GPU 等電路,單精度浮點運算性能為2.8Tflops,雙精度為1.4Tflops 而功耗僅有20W,能在低功耗下情況下提供高計算力。此外,它提供了靈活的驅動和接口,既可以直接使用熟悉設備,也可以自己編寫強化技能,非常利于教學。
(2)ZED 雙目攝像機,它能夠高清高幀率地傳輸圖像,且其生產公司提供了豐富的庫、工具集和接口,能夠快速計算深度信息,方便其他程序調用。
(3)載具,我們使用自己搭建的小車作為平臺,配有舵機、蓄電池等,受ROS 系統控制,能滿足中低速平穩運動的需要。
軟件方面,我們在jetson TX2 開發板上運行的系統是NVIDIA 公司定制的Ubuntu 系統JetPack OS,它優化了系統對GPU 和深度學習的支持。使用ZED 官方工具軟件進行建圖,TensorFlow 作為深度學習框架,ROS 系統對小車進行控制。
JetPack OS 的安裝需要一臺Ubuntu 系統的PC 主機輔助,將它們連在同一路由器下,并使用官方提供的數據線將TX2 與PC 相連,運行官網下載的SDK Manager 刷機工具,跟隨指引完成刷機安裝。進入系統后,桌面操作與Ubuntu 無異。
進入ZED 相機官網,下載Nvidia Jetson 專有版本的ZED SDK,這是官方提供的ZED 相機驅動工具,用以下指令運行下載的.run 文件即可安裝成功。(其中zed_sdk_file 指的是run 文件所在文件夾,zed_sdk 指的是下載的.run 文件全名)
cd ~/ zed_sdk_file
chmod +x zed_sdk
./zed_sdk
由于TX2 是ARM+GPU 的結構,所以我們安裝的版本實際上是TensorFlow-GPU。我們使用如下指令安裝:
pip3 install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu==1.13.1+nv19.3 --user
如果網絡狀態良好,沒有報錯,則安裝完成。在終端輸入以下代碼進行測試,如果最后看到輸出"hello,world"則說明安裝成功。
python3
import tensorflow as tf
hello=tf.constant("hello,world")
sess=tf.Session()
print(sess.run(hello))
API 是一些預先定義的函數,官方提供了ZED Python API 和 TensorFlow Object Detection API,前者提供ZED 相機的調用函數,后者是深度學習的函數庫。二者代碼均在GitHub 下載。
如果JetPack OS 的安裝順利的話,系統中已經帶有其他所需的軟件,但是我們了解到,部分情況下,這些軟件沒有安裝成功,就需要手動安裝,包括cuDNN、OpenCV和CUDA 等。
我們用終端指令啟動建圖程序和目標識別程序,
./ZED oolEDfu
python3 object_detection_zed.py
可以在屏幕上看到實時3D 建圖與計算出的相機移動軌跡(如圖5 所示),以及實時目標識別的結果,同時在系統中,可以調整算法精度,以適應不同場合。

圖5 建圖結果
經測試,使用嵌入式GPU 與雙目攝像頭結合的方式,能夠實現對載具經過的空間進行實時構建3D 模型并對自身定位,同時對當前攝像頭內的物體進行實時識別。這套系統,結合尋路避障程序,可以實現自主巡航建圖的無人車,進入人類無法進入的空間進行自主勘探或工作。