【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次,发文人进小黑屋喔~

评论