介紹
基于視覺的機器學習推理是一個熱門話題,現(xiàn)在邊緣計算普遍用于從車輛檢測到運動跟蹤以及物體識別的一系列應用。
由于卷積神經(jīng)網(wǎng)絡的復雜性,實現(xiàn)機器學習推理可能是計算密集型的。這使得使用傳統(tǒng)計算架構實現(xiàn)高幀速率具有挑戰(zhàn)性。像 Zynq 和 Zynq MPSoC 這樣的芯片上的異構系統(tǒng)將高性能 ARM 處理器與可編程邏輯相結合,提供可顯著提高性能的解決方案。
以前的挑戰(zhàn)是創(chuàng)建可編程邏輯實現(xiàn),該實現(xiàn)易于使用并且可以使用常見的機器學習流程,例如 Caffe 和 TensorFlow。
深度神經(jīng)網(wǎng)絡開發(fā)套件
為了解決使用通用行業(yè)框架并在可編程邏輯中實現(xiàn)加速的需求。Deephi(由 Xilinx 擁有)開發(fā)了深度神經(jīng)網(wǎng)絡開發(fā)套件(DNNDK)。
DNNDK 基于 C / C ++ API,允許我們使用通用的行業(yè)標準框架,以及流行的網(wǎng)絡,包括 VGG,ResNet,GoogLeNet,YOLO,SSD 和 MobileNet。
深度學習處理器單元(DPU)是 DNNDK 的核心,它可以加速深度學習算法。在我們的 Zynq 或 Zynq MPSoC 系統(tǒng)上,DPU 位于可編程邏輯中。為了支持不同的深度學習加速,可以實現(xiàn)幾種不同的 DPU 變體。
DPU 的結構
使用 DNNDK 在 Zynq / Zynq MPSoC 中部署 AI / ML 應用程序的基本階段是:
壓縮神經(jīng)網(wǎng)絡模型? - 采用網(wǎng)絡模型(prototext),訓練權重(Caffe)并生成使用 INT8 表示的量化模型。為此,通常還需要一個小型輸入訓練集 - 這包含 100 到 1000 個圖像。
編譯神經(jīng)網(wǎng)絡模型?- 這將生成 DPU 實例化所需的 ELF 文件。它還將識別 DPU 不支持的網(wǎng)絡元素,以便在 CPU 上實現(xiàn)。
使用 DNNDK API 創(chuàng)建程序? - 創(chuàng)建 DPU 內核后,我們現(xiàn)在可以構建管理輸入和輸出的應用程序,執(zhí)行 DPU 內核生命周期管理和 DPU 任務管理。在此階段,我們還需要在 CPU 上實現(xiàn) DPU 不支持的網(wǎng)絡元素。
編譯混合 DPU 應用程序?- 一旦應用程序準備就緒,我們就可以運行混合編譯器,它將生成 CPU 代碼并將其鏈接到可編程邏輯中的 DPU 的 ELF。
在我們的目標上運行混合 DPU 可執(zhí)行文件。
混合編譯
為了執(zhí)行這五個步驟,DNNDK 提供了幾種不同的工具,這些工具在主機和目標之間分開。
在主機方面,我們提供以下工具:
DECENT? - 深度壓縮工具,預先壓縮網(wǎng)絡模型。
DNNC ?- 深度神經(jīng)網(wǎng)絡編譯器,執(zhí)行網(wǎng)絡編譯。DNNC 有一個子組件 DNNAS - 深度神經(jīng)網(wǎng)絡匯編器,它為 DPU 生成 ELF 文件。
在目標方面:
N2Cube ?- 這是 DPU 運行時引擎,提供 DNNDK 應用程序的加載,調度和資源分配。N2Cube 的核心組件包括 DPU 驅動程序,DPU 加載程序和 DPU 跟蹤程序。
DExplorer ?- 在運行時提供 DPU 信息。
DSight ?- 分析工具,提供基于 Dtracer 信息的可視化數(shù)據(jù)。
部署
在這個項目中,我們將看看如何在 Ultra96 和 ZCU104 板上啟動和運行示例。
一旦我們啟動并運行,我們將對其中一個示例進行一些簡單的修改,以便我們可以看到它從實時視頻源運行。
配置
在我們看到第一個示例啟動并運行之前,我們需要從 Xilinx 網(wǎng)站下載 DNNDK。一旦我們下載 DNNDK,下一步就是提取壓縮文件。
在解壓縮的目錄中,您將注意到以下目錄
- Common - 包含許多用于分類的圖像
- Host_x86 - 主機開發(fā)工具,例如 DECENT 和 DNNC
- DP-8020 / DP-N1 / ZCU102 / ZCU104 / Ultra96 - 這些是參考命名板的工具鏈和示例應用程序。
要安裝工具鏈和電路板,我們需要首先從 Xilinx Deephi 網(wǎng)站下載感興趣的電路板的 linux 映像。
下載完這些后,我們可以解壓縮圖像并將圖像寫入 SD 卡,用于 Ultra96 或 ZCU104(確保使用正確的圖像)。
為此,我使用了 Disk Imager 或 Etcher 等程序。
一旦電路板啟動了映像,我們還需要能夠在運行時將下載的 DNNDK 示例和工具傳輸?shù)诫娐钒濉?/p>
為此,我們將使用 MObaXTerm,它允許我們在連接到網(wǎng)絡時將信息傳輸?shù)侥繕税濉?/p>
MObaXTerm
?
接下來要做的就是設置電路板,這兩個過程非常相似,只需稍微改編一下 Ultra96 及其 WIFI 連接即可。
設置 ZCU104
我們要檢查的第一塊板是 ZCU104,一張 SD 卡,圖像準備就緒。仔細檢查 ZCU104 上的啟動模式開關并打開電路板。
確保 ZCU104 連接到以太網(wǎng)連接,幾秒鐘后您將看到啟動過程完成。
如果在任何時候您被要求輸入用戶名和密碼,則它們都是 root 用戶。
在 ZCU104/ultra96 上啟動的 Linux
一旦 Linux 映像啟動并運行,首先要確定分配的 IP 地址。我們可以通過輸入命令來完成此操作:
ifconfig
分配 IP 地址
現(xiàn)在電路板已啟動并運行并連接到網(wǎng)絡,我們可以使用 mobaXterm 來傳輸 ZCU 104 的工具和示例。
在 mobaXterm 中輸入命令:
scp -r /ZCU104 root@<ZCU104 IP address>:~/
這會將文件從開發(fā)機器傳輸?shù)?ZCU104。
傳輸文件
然后,我們可以使用 SSH 或串行終端安裝 DNNDK 及其示例。
使用終端,您會注意到安裝了一個名為 ZCU104 的新目錄。在這里,您將看到安裝腳本使用該命令安裝腳本:
./install.sh
安裝 DNNDK
這將開始安裝過程,如下所示
開始安裝
作為安裝過程的一部分,您將看到 Linux 映像重新啟動
在 DNNDK 安裝期間重新啟動 ZCU04 Linux 映像
我們現(xiàn)在可以使用為特定板提供的示例應用程序。
但是,對于每個示例,我們首先需要編譯它,這是通過調用您希望看到的示例中的 make 函數(shù)來實現(xiàn)的。
設置 Ultra96
我們以與 ZCU104 類似的方式設置 Ultra96 但是,我們需要對 WIFI 進行一些調整。
一旦初始 Ultra96 映像啟動就能安裝 DNNDK 工具和應用程序,我們需要先連接到 WIFI。
為此,我們需要使用 USB 集線器,它允許我們連接到鼠標和鍵盤,并將 Mini DisplayPort 輸出連接到合適的監(jiān)視器。
打開 Ultra96 電源,您將看到它啟動到桌面環(huán)境
DNNDK 桌面
要連接到 WIFI,請單擊菜單,然后選擇 Internet-> Wicd Network Manager。這將打開列出所有可用網(wǎng)絡的網(wǎng)絡管理。
可用網(wǎng)絡
選擇所需的一個,然后單擊“連接”,如果有加密,則會發(fā)出警告并要求輸入密碼。
安全配置
輸入密碼后,單擊“確定”,然后單擊“連接”。連接到網(wǎng)絡可能需要幾秒鐘。
我們可以再次使用 mobaXterm 上傳 Ultra96 目錄,然后像我們?yōu)?ZCU104 那樣在板上安裝工具和應用程序:
scp -r /Ultra96 root@<Ultra6 IP address>:~/
上傳 Ultra96 文件
我們再次通過運行命令安裝 Ultra96 工具和應用程序:
./install.sh
我們現(xiàn)在準備開始與我們的董事會合作。對于本項目的其余部分,我們將重點關注 Ultra96,但使用 ZCU104 是完全相同的。
構建和運行示例
我們可以使用 Ultra96 上的鼠標,鍵盤和終端窗口在 Ultra96 上運行 DNNDK 示例。
如上所述,為了運行每個示例,我們首先需要通過在應用程序目錄中運行 Make 來實現(xiàn)它。
但是,我們可能還想使用其他工具,這些工具隨 DNNDK 一起提供。
我們可以使用 dexploerer 來獲取有關 PL 中包含的核心的信息。輸入以下命令將列出:
dexplorer -w.
此命令將顯示 PL 中實現(xiàn)的 DPU 的類型類型,我們可以在下面的 ZCU104 和 Ultra96 實現(xiàn)中看到
ZCU 104 中的 B4096F DPU
Ultra96 中的 B1152F DPU
?
我們還可以使用 status 命令,它將列出 DPU 的狀態(tài):
dexplorer-s
DPU 狀態(tài)
另一個有趣的命令是 profiling 命令,這將創(chuàng)建分析信息。
要開始分析,我們運行命令:
dexplorer -m profile
應用程序完成后,我們可以使用以下命令將配置文件信息轉換為 HTML。每個跟蹤將具有不同的 PID,具體取決于進程 ID。
dsight -p dpu_trace_[PID].prof
重新運行應用程序示例時,我們還將捕獲配置文件信息。
運行 ADAS 示例
讓我們舉個例子來運行 Ultra96 ADAS 示例。要運行它,我們需要使用以下命令:
cd Ultra96/samples/adas_detection
make
dexplorer -m profile
./adas_detection video/adas.avi
這將運行應用程序,卸載元件到可編程邏輯中的 DPU。
當我們運行此應用程序時,桌面上會出現(xiàn)一個視頻,您將看到在檢測到并識別和跟蹤汽車的情況下運行的視頻
應用程序完成后,我們可以通過使用該命令將其轉換為 HTML 來查看配置文件應用程序:
dsight -p dpu_trace_[PID].prof
在運行 ADAS 實現(xiàn)時捕獲的配置文件信息上運行此結果將生成下圖。
ADAS 檢測配置文件信息
修改姿勢示例以使用實時源
隨著應用程序和工具全部在我們的主板上運行,我們可以開始開發(fā)自己的應用程序。為此我們有兩個選擇,一個使用 TensorFlow / Caffe,DECENT 和 DNNC 訓練新的網(wǎng)絡權重,或者我們可以調整其中一個示例。
我們將調整 pose_detection 算法以使用直播流而不是視頻。這是一個非常簡單的修改,我們可以通過以下更改來實現(xiàn)。
更新視頻捕獲的聲明,如下所示:
VideoCapture cap(0);
修改主要功能如下:
int main(int argc, char **argv) {
?? // Attach to DPU driver and prepare for running
?? dpuOpen();
?? if (!cap.isOpened()) {
????? return -1;
?? }
cap.set(CV_CAP_PROP_FRAME_WIDTH,640);
cap.set(CV_CAP_PROP_FRAME_HEIGHT,320);
?? // Run tasks for SSD
?? array<thread, 4> threads = {thread(Read, ref(is_reading)),
?????????????????????????????? thread(runGestureDetect, ref(is_running_1)),
?????????????????????????????? thread(runGestureDetect, ref(is_running_1)),
?????????????????????????????? thread(Display, ref(is_displaying))};
?? for (int i = 0; i < 4; ++i) {
?????? threads[i].join();
?? }
?? // Detach from DPU driver and release resources
?? dpuClose();
?? cap.release();
?? return 0;
}
?
修改 Read 功能,如下所示:
void Read(bool &is_reading) {
?? while (is_reading) {
?????? Mat img;
?????? if (read_queue.size() < 30) {
?????????? if (!cap.read(img)) {
?????????????? cout << "Finish reading the video." << endl;
?????????????? is_reading = false;
?????????????? break;
?????????? }
?????????? mtx_read_queue.lock();
?????????? read_queue.push(make_pair(read_index++, img));
?????????? mtx_read_queue.unlock();
?????? } else {
?????????? usleep(20);
?????? }
?? }
}
然后我們可以使用 pose 命令在 pose_detection 目錄中再次編譯應用程序:
make
dexplorer -m profile
./pose_detection
在 Ultra96 上運行它并讓我的妻子為測試做了一些建模。
最后要做的是觀察個人資料信息
實時饋送姿勢檢測的配置文件信息
結論
該項目有望為 DNNDK 提供一個很好的介紹,以及我們如何輕松地啟動和運行它。如果我們愿意,我們可以調整現(xiàn)有的應用程序。
如果我們想要訓練一個新的網(wǎng)絡進行部署,我們將很快在另一個項目中進行檢查。
如果你對這個項目感興趣,想獲取完整信息請訪問: