一. 概述
依照上一篇 【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 Lite 与 ArmNN 。同时也向各位介绍 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】 !!
评论