【ATU Book-i.MX8 系列 - eIQ】eIQ 應用介紹(上)

一.   概述

依照上一篇 【ATU Book-i.MX8 系列 - eIQ】eIQ 介紹 完成搭建環境後,即可利用該文章的範例進行範例演示。這裡以系列博文的方式呈現 eIQ 的應用介紹。
如下圖文章架構圖所示,此文章機器學習開發環境 eIQ隸屬 eIQ(edge intelligence) 機器學習開發環境 - 應用層 的子系列,將延伸探討 eIQ 應用介紹()

*** 此文章系列將以 NXP i.MX8M Plus 開發平台為主


eIQ 系列博文 - 文章架構示意圖

 

eIQ 是 NXP 量身打造的機器學習開發環境(套件),主要語言是 C / C++。
如下圖所示,該套件裡面整合 OpenCV 4.2、Tensorflow Lite 2.2.0 、 ArmNN 20.02.01、 ONNX Runtime 1.1.2 等開源推理引擎(Inference Engines),並提供相當豐富的硬體加速應用資源,像是 Arm Compute Libray、OpenCL、OpenVX ,可以直接向 CPU(Arm Cotex-A) 、GPU(GC7000) 與 神經網路加速器 NPU(Vivante VIP8000) 溝通來達到硬體加速的目標 !

此篇文章主要介紹兩種推理引擎(Open Source Infrerence Engines) 分別為 Tensorflow LiteArmNN 。同時也向各位介紹 Arm Compute Library(ACL) 硬體加速函式庫的實際應用!! 事不宜遲,接續探討與各推理引擎是如何應用,並展示出 DEMO !!


eIQ 機器學習開發環境架構示意圖


 

二.   eIQ DEMO 範例執行

本篇文章提供數個範例用法,因首次使用會下載相關模組,故請確認開發版有連上網路 :

1. Tensorflow Lite 

 目前提供版本為 : Tensorflow Lite 2.2.0 

Tensorflow Lite 是一種輕量化網路架構,相當適合嵌入與移動式裝置作使用 !! 此外亦支援 CPU / ARM / GPU / NPU 等等多種不同的硬體核心資源來加速處理時間,並能夠搭配 C 與 Python 程式語言來實現機器學習 !!

*** 此章節僅介紹 C 語言相關的程式資源, Python 語言由 PyeIQ 進行介紹 !!

 Tensorflow Lite 硬體核心應用架構圖 

如下圖所示,當 輕量化模組(.tflite) 託付給 Tensorflow Lite 推理引擎時,則有兩種處理方式 ; 第一種就是左側路線,從 ARM Neon 核心作多線程優化進行推理。而第二種則是右側路線,從 NNAPI delegate 轉手委託給神經網路推理引擎(NNRT),並透過 OVXLIB 與 OpenVX driver 來啟動 GPU 或 NPU 進行硬體加速來完成推理!!


Tensorflow Lite 硬體核心應用架構圖示意圖

 Tensorflow Lite DEMO演示 - Object Classification  

說明 : 

此範例使用 Tensorflow lite 框架結合輕量化網路模型 MobileNet去分類物件。 

進行演示 : 

(1) 進入範例之所在位置 (SD Card 系統內) 

$ cd /usr/bin/tensorflow-lite-2.2.0/examples

(2-1) 範例之運行 CPU 使用方式  

原始代碼 : 點選查看

$ ./label_image -m mobilenet_v1_1.0_224_quant.tflite -i grace_hopper.bmp -l labels.txt 

(2-2) 範例之運行 NPU 使用方式 

$ ./label_image -m mobilenet_v1_1.0_224_quant.tflite -i grace_hopper.bmp -l labels.txt -a 1

運行結果 :

如下圖所示,分類結果依序 軍服(military uniform) 為 78 % 、溫莎領帶(Windsor tie) 為 10.5 % 、 領結(bow tie) 為 1.56 %。故此圖片最相似於 軍服(military uniform) 的特徵分類,在影像尺寸為 538x538 則 CPU 推理時間約0.00387 秒NPU 推理時間約0.00027 秒


 Tensorflow Lite DEMO 範例意圖


 補充說明 

補充說明 – 範例程式之細節操作 :

--accelerated, -a: [0|1], use Android NNAPI or not
--old_accelerated, -d: [0|1], use old Android NNAPI delegate or not
--allow_fp16, -f: [0|1], 是否允許執行 float point 32 的模組
--count, -c: 迴圈循還次數
--gl_backend, -g: 使用 OpenGL 的委託器
--hexagon_delegate: 使用 Hexagon的委託器
--input_mean, -b: 輸入均值
--input_std, -s: 輸入標準差
--image, -i: 輸入影像
--labels, -l: 輸入標籤
--tflite_model, -m: 輸入 Tensorflow 輕量化模組
--profiling, -p: [0|1], 是否分析細節
--num_results, -r: 顯示結果數
--threads, -t: 線程
--verbose, -v: [0|1] 顯示內部資訊
--warmup_runs, -w: 暖機次數

補充說明 – 範例之顯示內部資訊使用方式 : 

$ ./label_image -m mobilenet_v1_1.0_224_quant.tflite -i grace_hopper.bmp -l labels.txt -a 1 -v 1

補充說明 – 範例程式之編譯方式 : 

請於 Yocto SDK 環境下執行,即可生成二進制檔案
原始代碼專案 : 點選查看
$ CC label_image.cc bitmap_helpers.cc ../../tools/evaluation/utils.cc \
-I=/usr/include/tensorflow/lite/tools/make/downloads/flatbuffers/include \
-I=/usr/include/tensorflow/lite/tools/make/downloads/absl \ -O1 -DTFLITE_WITHOUT_XNNPACK
-ltensorflow-lite -lstdc++ -lpthread -lm -ldl -lrt

 

2. Arm Compute Library

目前提供版本為 : Arm Compute Library 20.02.01  

Arm Compute Library (ACL) 是一套硬體加速函式庫,透過 Arm Cortex CPU 中的 NEON 與 GPU 來達到優化。在 i.MX8 平台中,主要作用於 Arm NN framework 中的推理引擎之一。並支援 Neon 的多線程計算來加快運算速度 ! 且僅能用於 C 語言來實現機器學習 !!


 Arm Compute Library DEMO演示 - Object Classification 

說明 : 

此範例使用已訓練完成的神經網路模型 AlexNet去分類物件。

進行演示 : 

(1) 下載範例套件,並傳送至 SD 卡系統內

link : compute_library_alexnet.zip.scp compute_library_alexnet.zip
$ root@xx.xx.xx.xx: /usr/share/arm-compute-library/build/examples

(2) 進入範例之所在位置 (SD Card 系統內) :

cd /usr/share/arm-compute-library/build/examples

(3) 解壓縮範例套件 (SD Card 系統內) :

$  unzip compute_library_alexnet.zip -d assets_alexnet

(4) 設定環境路徑 (SD Card 系統內)  :

$ export PATH_ASSETS=/usr/share/arm-compute-library/build/examples/assets_alexnet/

(5) 範例之運行使用方式 (SD Card 系統內)  :

$ ./graph_alexnet --data=$PATH_ASSETS --image=$PATH_ASSETS/go_kart.ppm --labels=$PATH_ASSETS/labels.txt --target=neon --type=f32 --threads=4

運行結果 :

如下圖所示,分類結果依序 卡丁車(go-kart)  為 97.3 % 、安全帽(crash helnet) 為 1.1 % 、賽車(racer car) 為 1.08 %。故此圖片最相似於 卡丁車(go-kart) 的特徵分類。   

 

3. Arm NN

目前版本 : Arm NN 20.02.01 

ArmNN 是一套開源的機器學習推理引擎,由工程組織 Linaro Ltd 與 NXP 合作推動。其中 ArmNN 並非有自己的框架,而是可以運行多種深度學習模組框架的 推理引擎(inference engine) 或 委託器(delegates) ,像是 Caffe, TensorFlow, TensorFlow Lite, 以及 ONNX 。 除此之外,亦提供 CPU / GPU/ NPU 等硬體加速資源,並可以搭配 C++ 或 Python 語言進行推理 !!

 ArmNN 硬體核心應用架構圖 

如下圖所示,首先由各家模組 解譯(parser) 完成後,將託付給 Graph builder 與 Rutime Optimizer 進行優化,而後續則有三種處理方式 ; 第一種左側路線,就是純 CPU 的運算。第二種就是中間路線,利用 ARM Compute Lubrary 與 ARM Neon 核心作多線程優化進行推理。而第三種則是右側路線,委託給神經網路推理引擎(NNRT),並透過 OVXLIB 與 OpenVX driver 來啟動 GPU 或 NPU 進行硬體加速來完成推理 !!   


ArmNN 硬體核心應用架構圖示意圖 

 

ArmNN DEMO演示 – Image Classification 

說明 :

此範例使用神經網路模型 AlexNet (caffemodel 框架) 去分類物件。

進行演示 : 

(1) 於 ubuntu 18.04 環境下,安裝 Caffe 套件

$ sudo apt-get install caffe-cpu

(2) 於 ubuntu 18.04 環境下,使用 Python3 進行模組更新

將輸入的張量之批次數量改為 1 ,重新生成新模組

$ import caffe
$ net = caffe.Net('deploy.prototxt', 'bvlc_alexnet.caffemodel', caffe.TEST)
$ new_net = caffe.Net('deploy_new.prototxt', 'bvlc_alexnet.caffemodel', caffe.TEST)
$ new_net.save('bvlc_alexnet_1.caffemodel')

(3) 於 SD 系統中,建立 ArmNN 資料夾

$ cd && mkdir ArmNN
$ cd ~/ArmNN && mkdir models
$ cd ~/ArmNN && mkdir data

(4) 將測試圖片與新的模組傳送至 SD 卡系統

$ scp bvlc_alexnet_1.caffemodel root@xx.xx.xx.xx: ~/ArmNN/models
$ scp shark.jpg root@xx.xx.xx.xx: ~/ArmNN/data

(5) 範例之運行 CPU 使用方式

$ /usr/bin/CaffeAlexNet-Armnn --data-dir=data --model-dir=models --compute=CpuAcc

(6) 範例之運行 NPU使用方式

$ /usr/bin/CaffeAlexNet-Armnn --data-dir=data --model-dir=models --compute=VsiNpu 

運行結果 :

如下圖所示,分類結果依序為 鯊魚(shark) 70.6 % 、丁鱖(tench) 0.00126 % 。故此圖片最相似於 鯊魚(shark) 的特徵分類。在影像尺寸為 1024x685 則 CPU 推理時間約 0.117 秒、而 NPU 推理時間的計算似乎不夠完善,這裡就先形略過不討論!
*** 標籤分類請於該連結查看

 

 補充說明  

補充說明 - 硬體加速的部分 :

如下圖所示, CpuRef 為不啟用 CPU 加速 、CpuAcc 為使用 NEON Backend 啟用 CPU 加速 、VsiNpu 為 NPU 使用 VSI Backend (OpenVX) 作加速運算 或是 GPU 使用 VSI Backend (OpenCL) 作加速運算。

補充說明原廠提供範例 :

如下圖所示,原廠提供的 ArmNN 執行檔共有 CaffeAlexNet-Armnn、CaffeInception_BN-Armnn、CaffeMnist-Armn、CaffeResNet-Armnn、CaffeVGG-Armnn、CaffeCifar10AcrossChannels-Armnn、CaffeYolo-Armnn 共七個,但必非所有執行檔皆有提供詳細的範例 !!
詳細請參照原廠文件 : IMX-MACHINE-LEARNING-UG.pdf 

 


三.  結語

上述已經介紹了最廣為人知 Tensorflow Lite 輕量化推理引擎、ArmNN 推理引擎以及 Arm Compute Library 函式庫的 DEMO 使用方式,僅須依照文章內容即可快速應用!! 此外,此章節僅 Tensorflow Lite範例是如何使用,若要詳細撰寫 Tensorflow Lite 的程式,請參照官方網站的程式範例 !! 下一篇文章將介紹 eIQ 應用剩餘的兩個業界常用的推理引擎 OpenCV 與 ONNX !! 若是對於 Python 有興趣的讀者,可以參照另一個系列 【ATU Book-i.MX8 系列 - PyeIQ】系列博文。

 

四.  參考文件

[1] NXP Document - i.MX Machine Learning User's Guide
[2] NXP Document - i.MX Yocto Project User's Guide.pdf

如有任何相關 eIQ  技術問題,歡迎至博文底下留言提問 !!
接下來還會分享更多 eIQ  的技術文章 !!敬請期待 【ATU Book-i.MX8 系列 - eIQ】 !!


★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論