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

评论