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

一.   概述

依照上一篇 【ATU Book-i.MX8 系列 - eIQ】eIQ 應用介紹(上) 演示如何啟用 Tensorflow Lite、ArmNN、Arm Compute Library(ACL) 的範例。
這裡將接續介紹博文的 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) 分別為 ONNXOpenCV !! 實不宜遲,接續探討與各推理引擎是如何應用,並展示出 DEMO !!


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

 



二.   eIQ DEMO 範例執行

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

1. ONNX Runtime

目前版本 : ONNX Runtime 1.1.2

ONNX Runtime是一套開源的機器學習推理引擎,能夠對不同的硬體平台作模組加速運算。與上述的推理引極為相似,Arm 核心的部分是利用 Neno 作硬體加速、GPU 核心的部分是利用 OpenCL作硬體加速、NPU 核心的部分是利用 OpenVX 作硬體加速,亦可以利用 C 與 Python 語言實現機器學習的推理 !! 此外, ONNX 是近年來相當熱門的模組格式,可以輕鬆地將 Caffe、CNTK、CoreML 等各家模組框架作轉換。

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

 ONNX 硬體核心應用架構圖 

如下圖所示,當 ONNX 模組託付給 ONNX Rutime 推理引擎時,而後續則有四種處理方式 ;
第一種就是左側路線,利用 ARM Compute Library (ACL) 與 ARM Neon 核心作多線程優化進行推理。
第二種則是偏左側路線,利用 ARM NN 與 ARM Neon 核心作多線程優化進行推理。
第三種則是偏右側路線,則是一般的 CPU 運算。
第四種則是右側路線,委託給神經網路推理引擎(NNRT),並透過 OVXLIB 與 OpenVX driver 來啟動 GPU 或 NPU 進行硬體加速來完成推理!!


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

ONNX DEMO 演示

說明 : 

提供一套可以運行 ONNX Model Zoo 的測試工具來檢測 ONNX 推理運行速度。
( 因 ONNX 模組的準確度與分類結果,皆取決於原先模組故這裡僅討論執行的運算速度 )

進行演示 : 

(1) 下載 ONNX Model Zoo 中的 mobilenetv2-7.tar.gz,並解壓縮

$ tar zxvf mobilenetv2-7.tar.gz

(2) 將 資料夾 mobilenetv2-7 傳送至 SD 卡系統內

$ scp -r mobilenetv2-7/ root@xx.xx.xx.xx:~

(3) 運行 ONNX model Test測試工具

$ onnx_test_runner -j 1 -c 1 -r 1 -e < inference engine> ./mobilenetv2-7/
-e 選項任選一個推理引擎 : armnn/vsi_npu/cpu/acl

(4) 運行 ONNX model Test測試工具 – 詳細用法

$ onnx_test_runner -h

運行結果 :

如下圖所示,利用 ONNX 工具運行了三筆資料測試,並使用 Arm Neno 來作硬體加速,共花費 0.578 秒,每筆資料推理時間平均約 0.193 秒。

 

2. OpenCV

目前版本 : OpenCV 4.2.0

OpenCV 是一個開源視覺資料庫,除了提供數種影像處理、電腦視覺算法之外,亦有提供經典的機器學習以及深度學習神經網路推理範例!! 同時也是能夠以 C 與 Python 語言進行推理實現,但美中不足的地方就是僅能以 CPU 進行運算。

 Downloading OpenCV demos 

說明 : 

在使用 OpenCV 範例前,須先下載所需要用到的模組。

進行演示 : 

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

$ cd /usr/share/opencv4/testdata/dnn

(2) 開始下載模組與資料 :

請記得連接網路,確定是否有連通
python3 download_models_basic.py --zoo

運行結果 :

如下圖所示,將開始下載必要用的模組…

 

 a. OpenCV DEMO 演示 - Image classification 

說明 :

此範例將已訓練好的神經網路架構 SqueezeNet模型進行影像分類。

進行演示 : 

(1) 下載 yml 並傳送至 SD 卡系統內

$ scp models.yml root@xx.xx.xx.xx: /usr/share/OpenCV/samples/bin

(2) 將測試影像 png 複製至 /usr/share/OpenCV/samples/bin

$ cd /usr/share/opencv4/testdata/dnn
$ cp dog416.png /usr/share/OpenCV/samples/bin

(3) 將模組 SqueezeNet複製至 /usr/share/OpenCV/samples/bin

$ cd /usr/share/opencv4/testdata/dnn
$ cp squeezenet_v1.1.caffemodel /usr/share/OpenCV/samples/bin
$ cp squeezenet_v1.1.prototxt /usr/share/OpenCV/samples/bin
$ cp classification_classes_ILSVRC2012.txt /usr/share/OpenCV/samples/data/dnn

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

$ cd /usr/share/OpenCV/samples/bin
$ ./example_dnn_classification --input=dog416.png --zoo=models.yml squeezenet

運行結果 :

如下圖所示,OpenCV 範例所花費的 推理時間(Inference Time) 約 98.14 ms ,識別為狗狗的機率為 10 %

 

 b. OpenCV DEMO 演示 - YOLO Objection Detection 

說明 : 

此範例將已訓練好的神經網路架構 yolo V3 模型進行物件偵測。

進行演示 : 

(1) 下載 models.yml並傳送至 SD 卡系統內

$ scp models.yml root@xx.xx.xx.xx: /usr/share/OpenCV/samples/bin

(2) 將測試影像 dog.png 複製至 /usr/share/OpenCV/samples/bin

$ cd /usr/share/opencv4/testdata/dnncp dog416.png /usr/share/OpenCV/samples/bin

(3) 將模組 yolo V3 複製至 /usr/share/OpenCV/samples/bin

$ cd /usr/share/opencv4/testdata/dnncp yolov3.weights /usr/share/OpenCV/samples/bincp yolov3.cfg /usr/share/OpenCV/samples/bin
$ cp object_detection_classes_yolov3.txt /usr/share/OpenCV/samples/data/dnn

(4) 運行範例

$ cd /usr/share/OpenCV/samples/bin
$ ./example_dnn_object_detection --width=1024 --height=1024 --scale=0.00392 --input=dog416.png --rgb --zoo=models.yml yolo

運行結果 :

如下圖所示,已成功識別到許多物件分別有 狗狗準確度為 100% 、腳踏車準確度為98%、汽車準確度 93%,該範例影像尺寸為 538x406則推理時間約 684.361 ms。

 

 c. OpenCV DEMO 演示 - Objection Segmentation 

說明 : 

此範例將已訓練好的神經網路架構 fcn8s-heavy-pascal 模型進行影像分割。

進行演示 : 

(1) 下載 models.yml並傳送至 SD 卡系統內

$ scp models.yml root@xx.xx.xx.xx: /usr/share/OpenCV/samples/bin

(2) 將測試影像 dog.png 複製至 /usr/share/OpenCV/samples/bin

$ cd /usr/share/opencv4/testdata/dnncp dog416.png /usr/share/OpenCV/samples/bin

(3) 將模組 fcn8s-heavy-pascal 複製至 /usr/share/OpenCV/samples/bin

$ cd /usr/share/opencv4/testdata/dnncp fcn8s-heavy-pascal.caffemodel /usr/share/OpenCV/samples/bin


$ cp fcn8s-heavy-pascal.prototxt /usr/share/OpenCV/samples/bin

(4) 運行範例

$ cd /usr/share/OpenCV/samples/bin
$ ./example_dnn_segmentation --width=500 --height=500 --rgb --mean=1 --input=dog416.png --zoo=models.yml fcn8s

運行結果 :

如下圖所示,已成功分割出許多物件分別有 狗狗、腳踏車、汽車,則推理時間約 41733.41 ms。



 d. OpenCV DEMO 演示 - Objection colorization 

說明 : 

此範例將已訓練好的神經網路架構 colorization 模型進行影像上色。

進行演示 : 

(1) 下載測試影像 basketball1.png 複製至 /usr/share/OpenCV/samples/bin

$ scp basketball1.png root@xx.xx.xx.xx:/usr/share/OpenCV/samples/bin

(2) 將模組 colorization 複製至 /usr/share/OpenCV/samples/bin

$ cd /usr/share/opencv4/testdata/dnn
$ cp colorization_release_v2.caffemodel /usr/share/OpenCV/samples/bincp colorization_deploy_v2.prototxt /usr/share/OpenCV/samples/bin

(3) 運行範例

$ cd /usr/share/OpenCV/samples/bin
$ ./example_dnn_colorization --model=colorization_release_v2.caffemodel --proto=colorization_deploy_v2.prototxt --image=basketball1.png

運行結果 :

如下圖所示,已成功將原始圖片重新上色還原色彩。

 

 e. OpenCV DEMO 演示 - Human pose detection 

說明 : 

此範例將已訓練好的神經網路架構 openpose_pose_coco模型進行人體姿勢預測。

進行演示 : 

(1) 將測試影像 grace_hopper_227.png 複製至 /usr/share/OpenCV/samples/bin

$ cd /usr/share/opencv4/testdata/dnn
$ cp grace_hopper_227.png /usr/share/OpenCV/samples/bin

(2) 將模組 openpose_pose_coco 複製至 /usr/share/OpenCV/samples/bin

$ cd /usr/share/opencv4/testdata/dnn
$ cp openpose_pose_coco.caffemodel /usr/share/OpenCV/samples/bin
$ cp openpose_pose_coco.prototxt /usr/share/OpenCV/samples/bin

(3) 運行範例

$ cd /usr/share/OpenCV/samples/bin
.$ /example_dnn_openpose --model=openpose_pose_coco.caffemodel --proto=openpose_pose_coco.prototxt --image=grace_hopper_227.png --width=227 --height=227 --dataset=COCO

運行結果 :

如下圖所示,已成功識別影像內人物的姿體動作。

 

 f.  OpenCV DEMO 演示 - Object Detection Example 

說明 : 

此範例將已訓練好的神經網路架構 SqueezeDet 模型進行物件偵測。

進行演示 : 

(1) 下載測試影像 aeroplane.jpg 傳送至 /usr/share/OpenCV/samples/bin

$ scp aeroplane.jpg root@xx.xx.xx.xx:/usr/share/OpenCV/samples/bin

(2) 將下載模組 SqueezeDet.caffemodel 複製至 /usr/share/OpenCV/samples/bins

$ cp SqueezeDet.caffemodel /usr/share/OpenCV/samples/bin

(3) 將下載模組 SqueezeDet_deploy.prototxt複製至 /usr/share/OpenCV/samples/bins

$ cp SqueezeDet_deploy.prototxt /usr/share/OpenCV/samples/bin

(4) 運行範例

$ cd /usr/share/OpenCV/samples/bin
$ ./example_dnn_objdetect_obj_detect SqueezeDet_deploy.prototxt SqueezeDet.caffemodel aeroplane.jpg

運行結果 :

如下圖所示,已成功識別影像內物件為 飛機(aeroplane)

 

 g. OpenCV DEMO 演示 - CNN image classification 

說明 : 

此範例將已訓練好的神經網路架構 SqueezeNet 模型進行影像分類。

進行演示 : 

(1) 下載測試影像 space_shuttle.jpg 傳送至 /usr/share/OpenCV/samples/bin

$ cd /usr/share/opencv4/testdata/dnncp space_shuttle.jpg /usr/share/OpenCV/samples/bin

(2) 將下載模組 SqueezeNet.caffemodel 複製至 /usr/share/OpenCV/samples/bin

$ scp SqueezeNet.caffemodel /usr/share/OpenCV/samples/bin

(3) 將下載模組 SqueezeNet_deploy.prototxt複製至 /usr/share/OpenCV/samples/bin

$ scp SqueezeNet_deploy.prototxt /usr/share/OpenCV/samples/bin

(4) 運行範例

$ cd /usr/share/OpenCV/samples/bin
$ ./example_dnn_objdetect_image_classification SqueezeNet_deploy.prototxt SqueezeNet.caffemodelspace_shuttle.jpg

運行結果 :

如下圖所示,成功將影像分類為太空梭(space shuttle),第 812 號標籤且機率為 15.8467 % ,推算時間約花費 584.7 ms

 

 h. OpenCV DEMO 演示 - Text detection 

說明 : 

此範例以已訓練好的神經網路架構 frozen_east_text_detection模型進行文字預測。

進行演示 : 

(1) 下載測試影像 imageTextN.png 傳送至 /usr/share/OpenCV/samples/bin

$ cd /usr/share/OpenCV/samples/datacp imageTextN.png /usr/share/OpenCV/samples/bin

(2) 將模組 frozen_east_text_detection.pb 複製至 /usr/share/OpenCV/samples/bin

$ cd /usr/share/opencv4/testdata/dnncp frozen_east_text_detection.pb /usr/share/OpenCV/samples/bin

(3) 運行範例

$ cd /usr/share/OpenCV/samples/bin
$ ./example_dnn_text_detection --model=frozen_east_text_detection.pb --input=imageTextN.png

運行結果 :

如下圖所示,成功識別各段落之文字,推理時間約花費 1637.03 ms



三.  結語

上述內容已介紹最具新穎的神經網路交換格式 ONNX 與 OpenCV 推理引擎,僅須依照文章內容即可快速展示應用 DEMO !! 若是對於 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次,發文人進小黑屋喔~

評論