【无标题】

NXP eIQ 机器学习 — 3

第六章 ONNX运行时
ONNX Runtime是一个用于运行ONNX模型的开源推理引擎,它能够使用一组API加速所有部署目标的机器学习模型。源代码可以在https://source.codeaurora.org/external/imx/onnxruntime-imx上找到。
请注意:有关CPU支持的操作符的完整列表,请参阅“操作符内核”文档部分:OperatorKernel。
特点:
ONNX运行时1.10.0
在ACL和Arm NN执行提供商提供的Cortex-A内核上使用Arm Neon SIMD指令进行加速的多线程计算
使用由VSI NPU和NNAPI执行提供商提供的GPU/NPU硬件加速(在着色器或卷积单元上)的并行计算
c++和Python API(支持Python版本3)
ONNX Runtime 1.10.0支持ONNX 1.10和Opset版本15。
请注意:opset只定义了所有可用的操作符。这并不一定意味着它们在使用的执行提供程序中实现。有关详细信息,请参阅执行提供程序一节。
6.1 ONNX运行时软件栈
ONNX Runtime软件栈如下图所示。ONNX运行时支持以下硬件单元的计算:
•使用CPU、ACL和Arm NN执行提供程序的CPU Arm Cortex-A内核
•使用VSI NPU或NNAPI执行提供程序的GPU/NPU硬件加速器(已弃用)
有关GPU/NPU硬件加速器在不同硬件平台上支持计算的详细信息,请参阅软件栈介绍。
在这里插入图片描述
6.2 执行供应商
执行提供程序(EP)是一种将推理执行委托给底层框架或硬件的机制。默认情况下,ONNX运行时使用CPU EP,它在CPU上执行推断。
与默认的CPU EP相比,官方支持的执行提供商提供了加速方式:
•acl-在CPU上运行,并使用Arm计算库中的NEON实现来利用加速。
•armnn—在CPU上运行,并利用Arm计算库NEON后端进行加速。
• vsi_npu -根据可用硬件在GPU或NPU上运行。直接利用OpenVX实现。
•nnapi-根据可用硬件在GPU或NPU上运行。利用使用OpenVX的NNAPI实现
请注意:NNAPI执行提供程序已弃用,并将在将来被删除。
6.2.1 ONNX模型测试
ONNX运行时提供了一个工具,可以运行ONNX模型动物园提供的标准测试集合。安装在“/usr/bin/onnxruntime-1.10.0”目录下的工具名为onnx_test_runner。
ONNX模型可以在https://github.com/onnx/models上找到,包括模型和样本测试数据。由于一些型号需要大量的磁盘空间,建议将ONNX测试文件存储在更大的分区上,如SD卡映像闪烁部分所述。
下面是运行mobilenet版本2测试所需步骤的示例:
下载并解压mobilenet版本2的测试文件到某个文件夹,例如/home/root:

$ cd /home/root
$ wget https://github.com/onnx/models/raw/main/vision/classification/mobilenet/model/mobilenetv2-7.tar.gz
$ tar -xzvf mobilenetv2-7.tar.gz
$ ls ./mobilenetv2-7
mobilenetv2-7.onnx test_data_set_0 test_data_set_1 test_data_set_2

运行onnx_test_runner工具,提供mobilenetv2-7文件夹路径,并设置执行提供商为Arm NN:

$ /usr/bin/onnxruntime-1.10.0/onnx_test_runner -j 1 -c 1 -r 1 -e [cpu/armnn/acl/vsi_npu/nnapi] ./mobilenetv2-7/
result:
Models: 1
Total test cases: 3
Succeeded: 3
Not implemented: 0
Failed: 0
Stats by Operator type:
Not implemented(0):
Failed:Failed Test Cases:
$ 

请注意:使用onnx_test_runner -h获得支持的选项的完整列表。
6.2.2 C API
ONNX运行时还提供了一个C API示例代码:https://github.com/microsoft/onnxruntime/blob/v1.10.0/docs/C_API_Guidelines.md。
要从存储库中构建示例,在生成的Yocto SDK环境下运行以下构建命令(确保onnxruntime-dev Yocto包安装在SDK中,默认应该安装):

$CXX -std=c++0x -I$SDKTARGETSYSROOT/usr/include/onnxruntime/core/session -lonnxruntime C_Api_Sample.cpp -o onnxruntime_sample

请注意:BSP中包含的SqueezeNet模型可以与可执行文件一起使用。
6.2.2.1启用执行提供程序
要启用一个特定的执行提供程序,你需要在你的代码中做以下事情:
在代码中设置执行提供程序(参见前面的C API示例,如何为CUDA EP设置执行提供程序)。如果没有设置,默认的CPU EP将被使用:

OrtSessionOptionsAppendExecutionProvider_<execution_provider>(<parameters>);

根据代码中使用的EP包含头文件:#include "<execution_provider>_provider_factory.h".
在构建命令中添加包含: -I/usr/include/onnxruntime/core/providers/<execution_provider>/
6.2.3 ONNX性能测试
为了运行模型基准测试,ONNX运行时提供了一个测量性能的工具。安装在“/usr/bin/onnxruntime-1.10.0”目录下的工具名为onnxruntime_perf_test。为了运行它,用户必须提供一个.onnx模型文件和测试数据。要使用VSI NPU执行提供商对SqueezeNet模型进行单次迭代测试,请执行以下命令:

$/usr/bin/onnxruntime-1.10.0/onnxruntime_perf_test /usr/bin/onnxruntime-1.10.0/squeezenet/model.onnx -r 1 -e vsi_npu

请注意:使用onnxruntime_perf_test -h获取支持的选项的完整列表。
第七章 PyTorch

PyTorch是一个基于Python的科学计算包,它有助于使用强大的图形处理单元构建深度学习项目。
特点:
PyTorch 1.9.1
支持Python版本3
基于磁带的自适应系统的深度神经网络
请注意:PyTorch目前还不支持NXP GPU/NPU上的张量计算。只支持CPU。默认情况下,PyTorch运行时使用浮点模型运行。为了实现量化模型,量化的引擎应明确指定如下:

torch.backends.quantized.engine = ' qnnpack '

7.1运行图像分类示例
在examples文件夹中有一个示例,它需要urllib、PIL,可能还需要其他一些Python3模块,这取决于您的映像。您可以使用pip3安装缺失的模块。

$ cd /usr/bin/pytorch/examples

要在CPU上运行带有推断计算的示例,请使用以下命令。没有参数,资源会被脚本自动下载:

$ python3 pytorch_mobilenetv2.py

输出应该类似如下:

File does not exist, download it from https://download.pytorch.org/models/mobilenet_v2-b0353104.pth ... 100.00%, downloaded size: 13.55 MB File does not exist, download it from https://raw.githubusercontent.com/Lasagne/Recipes/master/examples/resnet50/imagenet_classes.txt ... 100.00%, downloaded size: 0.02 MB File does not exist, download it from https://s3.amazonaws.com/model-server/inputs/kitten.jpg ... 100.00%, downloaded size: 0.11 MB ('tabby, tabby cat', 46.34805679321289) ('Egyptian cat', 15.802854537963867) ('lynx, catamount', 1.1611212491989136) ('lynx, catamount', 1.1611212491989136) ('tiger, Panthera tigris', 0.20774540305137634)

7.2构建和安装车轮包
这个版本包括在aarch64平台上的PyTorch和TorchVision的构建脚本。目前,它通过BSP SDK支持NXP aarch64平台上的原生构建。
请注意:
通常,在BSP SDK的yocto rootfs中,PyTorch和TorchVision轮包已经集成在一起了。不需要从头构建和安装。如果您想自己构建它们,请执行以下步骤。
7.2.1如何构建
请执行以下步骤:

  1. 从https://source.codeaurora.org/external/imx/imx-manifest获取最新的i.MX BSP。
  2. 设置一个NXP aarch64平台的构建环境,并编辑local.conf,为PyTorch本地构建添加以下依赖项:
IMAGE_INSTALL_append = " python3-dev python3-pip python3-wheel python3-pillow python3-setuptools python3-numpy python3-pyyaml python3-cffi python3-future cmake ninja packagegroup-core-buildessential git git-perltools libxcrypt libxcrypt-dev

3.使用以下命令构建BSP映像:
$ bitbake imx-image-full
4. 进入pytorch文件夹,在NXP aarch64平台上执行构建脚本,生成wheel包。你也可以从https://github.com/NXPmicro/pytorch-release获取源码:

$ cd /path/to/pytorch/src 
$ ./build.sh

7.2.2安装方法
如果构建成功,车轮包应该在/path/to/pytorch/src/dist下面找到:

$ pip3 install /path/to/torch-1.9.1-cp37-cp37m-linux_aarch64.whl 
$ pip3 install /path/to/torchvision-0.8.2-cp37-cp37m-linux_aarch64.whl

第八章 OpenCV机器学习演示
OpenCV是一个开源的计算机视觉库,其中一个模块ML提供了传统的机器学习算法。OpenCV为神经网络推理(DNN模块)和经典机器学习算法(ML模块)提供了统一的解决方案。
特点:
OpenCV 4.5.4
C++和Python API(支持Python版本3)
只支持CPU计算
支持输入图像或实时摄像头(网络摄像头)
8.1下载OpenCV演示
OpenCV DNN演示(二进制)位于: /usr/share/OpenCV/samples/bin
输入数据和模型配置位于: /usr/share/opencv4/testdata/dnn
请注意:
要将testdata/dnn目录置于映像上,请在映像构建之前将以下内容放入local.conf中。参见i.MX Yocto项目用户指南(IMXLXYOCTOUG)中的“NXP eIQ机器学习”章节。

packageconfig_append_pn - openv_mx8 += " tests tests-imx"

二值模型之所以不位于映像中,是因为尺寸问题。在运行DNN演示之前,这些文件应该下载到设备:

$ cd /usr/share/opencv4/testdata/dnn/ 
$ python3 download_models_basic.py

请注意:如果需要所有可能的模型和配置文件(需要10gb SD卡大小),请使用download_models.py脚本。如果只需要以下DNN示例的基本模型,则使用download_models_basic.py脚本(需要1gb SD卡大小)。

复制所有可下载的依赖(模型、输入和权重)到: /usr/share/OpenCV/samples/bin

下载配置models.yml。这个文件包含一些DNN示例的预处理参数,它接受–zoo参数。复制模型文件到:
/usr/share/OpenCV/samples/bin
8.2 OpenCV DNN演示
OpenCV DNN模块实现了一个推理引擎,不提供任何用于神经网络训练的功能。
8.2.1图像分类演示
这个演示使用预先训练的SqueezeNet网络进行图像分类。Demo依赖来自opencv_extra-4.5.4.zip或来自:
/usr/share/opencv4/testdata/dnn

dog416.png
squeezenet_v1.1.caffemodel
squeezenet_v1.1.prototxt

其他演示的依赖关系:

• classification_classes_ILSVRC2012.txt from /usr/share/OpenCV/samples/data/dnn 
• models.yml from github

使用默认位置的映像输入运行c++示例:

$ ./example_dnn_classification --input=dog416.png --zoo=models.yml squeezenet

在这里插入图片描述
使用连接到端口3的实时摄像机运行c++示例:

$ ./example_dnn_classification --device=3 --zoo=models.yml squeezenet

请注意:
选择相机当前连接的端口。使用v4l2-ctl --list-devices命令进行检查。
8.2.2 YOLO对象检测示例
YOLO对象检测演示使用You Only Look Once (YOLO)检测器执行对象检测。它检测相机、视频或图像上的物体。在OpenCV Yolo DNNs页面找到关于这个演示的更多信息。Demo依赖来自opencv_extra-4.5.4.zip或来自: /usr/share/opencv4/testdata/dnn

• dog416.png 
• yolov3.weights 
• yolov3.cfg 

其他演示的依赖关系:

• models.yml from github 
• object_detection_classes_yolov3.txt from /usr/share/OpenCV/samples/data/dnn

使用默认位置的图像输入运行c++示例:

$ ./example_dnn_object_detection --width=1024 --height=1024 --scale=0.00392 --input=dog416.png --rgb --zoo=models.yml yolo

在这里插入图片描述
使用连接到端口3的实时摄像机运行c++示例:

$ ./example_dnn_object_detection --width=1024 --height=1024 --scale=0.00392 --device=3 --rgb -- zoo=models.yml yolo

请注意:
选择相机当前连接的端口。使用v4l2-ctl --list-devices命令进行检查。
由于只在CPU上运行这个例子,所以使用实时摄像机输入运行这个例子是非常慢的。
8.2.3 图像分割演示
图像分割是指根据颜色、纹理或其他一些标准将图像分成若干像素组。Demo依赖来自opencv_extra-4.5.4.zip或来自:/usr/share/opencv4/testdata/dnn

• dog416.png 
• fcn8s-heavy-pascal.caffemodel 
• fcn8s-heavy-pascal.prototxt

其他的演示依赖是从github上models.yml。运行c++示例,从默认位置输入图像:

$ ./example_dnn_segmentation --width=500 --height=500 --rgb --mean=1 --input=dog416.png --zoo=models.yml fcn8s

在这里插入图片描述
使用连接到端口3的实时摄像机运行c++示例:

$ ./example_dnn_segmentation --width=500 --height=500 --rgb --mean=1 --device=3 --zoo=models.yml fcn8s

请注意:
选择相机当前连接的端口。使用v4l2-ctl --list-devices命令进行检查。
由于只在CPU上运行这个例子,所以使用实时摄像机输入运行这个例子是非常慢的。
8.2.4 图像着色演示
本示例演示了使用DNN对灰度图像重新上色。演示只支持输入图像,不支持实时摄像机输入。Demo依赖来自opencv_extra-4.5.4.zip或来自:/usr/share/opencv4/testdata/dnn

• colorization_release_v2.caffemodel 
• colorization_deploy_v2.prototxt

其他的demo依赖于basketball1.png来自/usr/share/ opencv /examples/ data
运行c++示例,从默认位置输入图像:

$ ./example_dnn_colorization --model=colorization_release_v2.caffemodel -- proto=colorization_deploy_v2.prototxt --image=../data/basketball1.png

8.2.5人体姿态检测演示
这个应用程序演示了使用预训练的OpenPose DNN检测人体或手部姿势。演示只支持输入图像,不支持实时摄像机输入。Demo依赖来自opencv_extra-4.5.4.zip或来自: /usr/share/opencv4/testdata/dnn

• grace_hopper_227.png
• openpose_pose_coco.caffemodel 
• openpose_pose_coco.prototxt

使用默认位置的图像输入运行c++示例:

$ ./example_dnn_openpose --model=openpose_pose_coco.caffemodel --proto=openpose_pose_coco.prototxt -- image=grace_hopper_227.png --width=227 --height=227 --dataset=COCO

8.2.6对象检测
本演示使用预先训练的SqueezeDet网络进行对象检测。演示只支持输入图像,不支持实时摄像机输入。演示依赖项如下:
• SqueezeDet.caffemodel 模型权重文件
• SqueezeDet_deploy.prototxt 模型定义文件
• 输入图像 aeroplane.jpg
使用默认位置的图像输入运行c++示例:
$ ./example_dnn_objdetect_obj_detect SqueezeDet_deploy.prototxt SqueezeDet.caffemodel aeroplane.jpg
在aeroplane.jpg图像上运行模型会在控制台上产生以下文本结果:

Class: aeroplane 
Probability: 0.845181 Co-ordinates:

在这里插入图片描述
8.2.7 CNN图像分类示例
这个演示使用预先训练的SqueezeNet网络进行图像分类。演示只支持输入图像,不支持实时摄像机输入。演示依赖项如下:
• SqueezeNet.caffemodel 模型权重文件
• SqueezeNet_deploy.prototxt 模型定义文件
• 输入图片 space_shuttle.jpg 来自 /usr/share/opencv4/testdata/dnn
使用默认位置的图像输入运行c++示例:

$ ./example_dnn_objdetect_image_classification SqueezeNet_deploy.prototxt SqueezeNet.caffemodel space_shuttle.jpg

8.2.7 CNN图像分类示例
这个演示使用预先训练的SqueezeNet网络进行图像分类。演示只支持输入图像,不支持实时摄像机输入。演示依赖项如下:
• SqueezeNet.caffemodel 模型权重文件
• SqueezeNet_deploy.prototxt 模型定义文件
• 输入图片 space_shuttle.jpg 来自 /usr/share/opencv4/testdata/dnn
使用默认位置的图像输入运行c++示例:

$ ./example_dnn_objdetect_image_classification SqueezeNet_deploy.prototxt SqueezeNet.caffemodel space_shuttle.jpg

在这里插入图片描述
使用连接到端口3的实时摄像机运行c++示例:

$ ./example_dnn_text_detection --detModel=frozen_east_text_detection.pb --recModel=crnn_cs.onnx -- vp=../data/alphabet_94.txt --rgb=1 --device=3

请注意:
选择相机当前连接的端口。使用v4l2-ctl --list-devices命令进行检查。
8.3 OpenCV经典机器学习演示
在目标设备上部署OpenCV之后,Non-Neural Networks演示程序被安装/usr/share/OpenCV/samples/bin/

8.3.1 支持向量机介绍
这个例子演示了如何使用训练数据创建和训练SVM模型。一旦模型经过训练,就可以预测测试数据的标签。示例的完整描述可以在(tutorial_introduction_to_svm)中找到。为了显示结果,需要启用Qt5的图像。
运行demo后,在屏幕上显示图形结果:

$ ./example_tutorial_introduction_to_svm

结果:
代码打开一个图像并显示两个类的训练示例。一个类的点用白色圆圈表示,其他类用黑色圆圈表示。
训练支持向量机,用于对图像中的所有像素进行分类。这将导致图像分为蓝色区域和绿色区域。两个区域之间的边界是最优分离超平面。
最后,在训练样本周围用灰色环表示支持向量。
在这里插入图片描述
8.3.2非线性可分数据支持向量机
此示例处理非线性可分数据,并展示如何为该数据设置具有线性核的SVM参数。有关详细信息,请访问SVM_non_linearly_separable_data。
运行demo后,图形结果会显示在屏幕上(需要Qt5支持):

$ ./example_tutorial_non_linear_svms

结果:
• 代码打开一个图像并显示两个类的训练数据。一个类的点用浅绿色表示,另一个类用浅蓝色点表示。
• 训练支持向量机,用于对图像中的所有像素进行分类。这导致图像被分割成蓝绿色区域。两个区域之间的边界是分离超平面。由于训练数据是非线性可分的,这两类的一些例子是错误分类的;一些绿点在蓝色区域,一些蓝点在绿色区域。
• 最后,在训练样本周围用灰色环表示支持向量。
在这里插入图片描述
8.3.3 主成分分析(PCA)介绍
主成分分析(PCA)是一种提取数据集最重要特征的统计方法。本节介绍如何使用PCA来计算对象的方向。更多细节,请查看OpenCV教程Introduction_to_PCA。
运行demo后,图形结果会显示在屏幕上(需要Qt 5支持):

$ ./example_tutorial_introduction_to_pca ../data/pca_test1.jpg

结果:
• 打开一个图像(从…/data/pca_test1.jpg加载)。
• 找到检测到的感兴趣的对象的方向。
• 通过绘制检测到的感兴趣的物体、中心点和关于提取方向的x轴、y轴的轮廓来可视化结果。
在这里插入图片描述
8.3.4逻辑回归
在这个示例中,使用逻辑回归从图像中预测两个字符(0或1)。首先,将每个图像矩阵由原来的28x28大小重构为1x784大小。在20张图像上创建一个逻辑回归模型并进行训练。经过训练,该模型可以预测测试图像的标签。源代码位于logistic_regression链接上,可以通过输入以下命令来运行。
演示依赖项(准备火车数据文件):

$ wget https://raw.githubusercontent.com/opencv/opencv/4.5.4/samples/data/data01.xml

运行demo后,图形结果会显示在屏幕上(需要Qt 5支持):

$ ./example_cpp_logistic_regression

结果:
• 显示了训练和测试数据
• 显示原始标签和预测标签的对比。
控制台文本输出如下(训练后的模型准确率达到95%):

original vs predicted: 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1] 
accuracy: 95% s
aving the classifier to NewLR_Trained.xml 
loading a new classifier from NewLR_Trained.xml predicting the dataset using the loaded classifier...done! 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1] 
accuracy: 95%

在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值