当前位置:   article > 正文

在英特尔开发套件上使用OpenVINOSharp部署YOLOv8模型

openvinosharp
  1. 文章作者:颜国进  英特尔边缘计算创新大使

技术指导:武卓,李翊玮

本案例适用于x86以上英特尔平台

OpenVINO工具套件可以加快深度学习视觉应用开发速度,帮助用户在从边缘到云的各种英特尔平台上,更加方便快捷的将AI模型部署到生产系统中。

C#是由C和C++衍生出来的一种安全的、稳定的、简单的、优雅的面向对象编程语言,它综合了VB简单的可视化操作和C++的高运行效率,成为支持成为.NET开发的首选语言。然而,OpenVINO™未提供C#语言接口,这对在C#中使用 OpenVINO™带来了些许不便,在之前的工作中,我们打造了开源,商用免费的OpenVINOSharp工具包,旨在推动 OpenVINO™在C#领域的应用,目前已经成功在Window平台实现使用

在本文中,我们将介绍如何在英特尔开发套件上基于Linux系统实现OpenVINOSharp。

本文中所使用的范例代码已开源到OpenVINOSharp仓库中,GitHub网址为:

https://github.com/guojin-yan/OpenVINOSharp/blob/openvinosharp3.0/tutorial_examples/AlxBoard_deploy_yolov8/Program.cs

1.1 英特尔开发套件介绍

图 1 英特尔开发套件介绍

1.1.1  产品定位

英特尔® 开发者套件 AIxBoard(爱克斯板)是英特尔开发套件官方序列中的一员,专为入门级人工智能应用和边缘智能设备而设计。英特尔开发套件能完美胜人工智能学习、开发、实训、应用等不同应用场景。该套件预装了英特尔OpenVINO™工具套件、模型仓库和演示

套件主要接口与Jetson Nano载板兼容,GPIO与树莓派兼容,能够最大限度地复用成熟的生态资源。这使得套件能够作为边缘计算引擎,为人工智能产品验证和开发提供强大支持;同时,也可以作为域控核心,为机器人产品开发提供技术支撑。

使用英特尔开发套件,您将能够在短时间内构建出一个出色的人工智能应用应用程序。无论是用于科研、教育还是商业领域,英特尔开发套件都能为您提供良好的支持。借助 OpenVINO™ 工具套件,CPU、iGPU 都具备强劲的 AI 推理能力,支持在图像分类、目标检测、分割和语音处理等应用中并行运行多个神经网络。

1.1.2  产品参数

主控

英特尔赛扬N5105 2.0-2.9GHz (formerly Jasper Lake)

内存

板载LPDDR4x 2933MHz, 4GB/6GB/8GB

存储

板载 64GB eMMC存储

存储扩展

1个M.2 Key-M 2242扩展槽, 支持SATA&NVME协议

BIOS

AMI UEFI BIOS

系统支持

Ubuntu20.04 LTS

Winodws 10/11

1.1.3  AI推理单元

借助OpenVINO™ 工具套件,能够实现CPU+iGPU异构计算推理,iGPU(集成显卡)算力约为0.6TOPS

CPU

INT8/FP16/FP32

iGPU

INT8/FP16 0.6TOPS

GNA

高斯及神经加速器

1.2  配置 .NET 环境

.NET 是一个免费的跨平台开源开发人员平台 ,用于构建多种应用程序。下面将演示 如何在 Ubuntu 20.04 上安装 .NET环境,支持 .NET Core 2.0-3.1 系列 以及.NET 5-8 系列 ,如果您使用的是其他Linux系统,你可以参考在 Linux 发行版上安装 .NET - .NET | Microsoft Learn

1.2.1 添加 Microsoft 包存储库

使用 APT 进行安装可通过几个命令来完成。 安装 .NET 之前,请运行以下命令,将 Microsoft 包签名密钥添加到受信任密钥列表,并添加包存储库。

打开终端并运行以下命令:

  1. wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
  2. sudo dpkg -i packages-microsoft-prod.deb
  3. rm packages-microsoft-prod.deb

下图为输入上面命令后控制台的输出:

图 2  1.2.1  添加 Microsoft 包存储库输出

1.2.2  安装 SDK

.NET SDK 使你可以通过 .NET 开发应用。 如果安装 .NET SDK,则无需安装相应的运行时。 若要安装 .NET SDK,请运行以下命令:

  1. sudo apt-get update
  2. sudo apt-get install -y dotnet-sdk-3.1

下图为安装后控制台的输出:

图 3 安装 SDK 输出

1.2.3  测试安装

通过命令行可以检查 SDK 版本以及Runtime时版本。

  1. dotnet --list-sdks
  2. dotnet --list-runtimes

下图为输入测试命令后控制台的输出:

图 4 SDK 版本以及Runtime版本

1.2.4  测试控制台项目

在linux环境下,我们可以通过dotnet命令来创建和编译项目,项目创建命令为:

dotnet new <project_type> -o <project name>

此处我们创建一个简单测试控制台项目:

  1. dotnet new console -o test_net6.0
  2. cd test_net6.0
  3. dotnet run

下图为输入测试命令后控制台的输出以及项目文件夹文件情况,C#项目会自动创建一个Program.cs程序文件,里面包含了程序运行入口主函数,同时还会创建一个*.csproj文件,负责指定项目编译中的一些配置。

图 5 控制台项目

​以上就是.NET环境的配置步骤,如果你的环境与本文不匹配,可以通过.NET 文档 | Microsoft Learn 获取更多安装步骤。

1.3 安装 OpenVINO™ Runtime

OpenVINO™ 有两种安装选项:

  • OpenVINO™ Runtime,包含用于在处理器设备上运行模型部署推理的核心库
  • OpenVINO™ Development Tools是一组用于处理OpenVINO™和OpenVINO™模型的工具,包括模型优化器、OpenVINO™ Runtime、模型下载器等。

在此处我们只需要安装OpenVINO™ Runtime即可。

1.3.1  下载 OpenVINO™ Runtime

访问Download the Intel Distribution of OpenVINO Toolkit页面,按照下面流程选择相应的安装选项,在下载页面,由于我们的设备使用的是Ubuntu20.04,因此下载时按照指定的编译版本下载即可。

图 6 OpenVINO Runtime 下载

1.3.2  解压安装包

我们所下载的 OpenVINO™ Runtime 本质是一个C++依赖包,因此我们把它放到我们的系统目录下,这样在编译时会根据设置的系统变量获取依赖项。首先在系统文件夹下创建一个文件夹:

sudo mkdir -p /opt/intel

然后解压缩我们下载的安装文件,并将其移动到指定文件夹下:

  1. tar -xvzf l_openvino_toolkit_ubuntu20_2023.0.1.11005.fa1c41994f3_x86_64.tgz
  2. sudo mv l_openvino_toolkit_ubuntu20_2023.0.1.11005.fa1c41994f3_x86_64 /opt/intel/openvino_2022.3.0

1.3.3  安装依赖

接下来我们需要安装 OpenVINO™ Runtime 所有的依赖项,通过命令行输入以下命令即可:

  1. cd /opt/intel/openvino_2022.3.0/
  2. sudo -E ./install_dependencies/install_openvino_dependencies.sh

图 7 安装OpenVINO™ Runtime依赖项

1.3.4 配置环境变量

安装完成后,我们需要配置环境变量,以保证在调用时系统可以获取对应的文件,通过命令行输入以下命令即可:

source /opt/intel/openvino_2022.3.0/setupvars.sh

以上就是 OpenVINO™ Runtime 环境的配置步骤,如果你的环境与本文不匹配,可以通过Install OpenVINO™ Runtime — OpenVINO™ documentation — Version(2023.0)获取更多安装步骤。

1.4  配置 AlxBoard_deploy_yolov8 项目

项目中所使用的代码已经放在GitHub仓库AlxBoard_deploy_yolov8大家可以根据情况自行下载和使用,下面我将会从头开始一步步构建AlxBoard_deploy_yolov8项目。

1.4.1 创建 AlxBoard_deploy_yolov8 项目

在该项目中,我们需要使用OpenCvSharp,该依赖目前在Ubutun平台最高可以支持.NET Core 3.1,因此我们此处创建一个.NET Core 3.1的项目,使用Terminal输入以下指令创建并打开项目文件:

  1. dotnet new console --framework "netcoreapp3.1" -o AlxBoard_deploy_yolov8
  2. cd AlxBoard_deploy_yolov8

图 8 1.4.1              创建 AlxBoard_deploy_yolov8 项目

创建完项目后,将AlxBoard_deploy_yolov8代码内容替换到创建的项目中的Program.cs文件中.

1.4.2 添加 OpenVINOSharp 依赖

由于OpenVINOSharp 当前正处于开发阶段,还未创建Linux版本的NuGet Package,因此需要通过下载项目源码以项目引用的方式使用。

  • 下载源码

通过Git下载项目源码,新建一个Terminal,并输入以下命令克隆远程仓库,将该项目放置在AlxBoard_deploy_yolov8同级目录下。

  1. git clone https://github.com/guojin-yan/OpenVINOSharp.git
  2. cd OpenVINOSharp

本文的项目目录为:

  1. Program
  2. --|-AlxBoard_deploy_yolov8
  3. --|-OpenVINOSharp
  • 修改OpenVINO™ 依赖

由于项目源码的OpenVINO™ 依赖与本文设置不同,因此需要修改OpenVINO™ 依赖项的路径,主要通过修改OpenVINOSharp/src/OpenVINOSharp/native_methods/ov_base.cs文件即可,修改内容如下:

  1. private const string dll_extern = "./openvino2023.0/openvino_c.dll";
  2. ---修改为--->
  3. private const string dll_extern = "libopenvino_c.so";
  • 添加项目依赖

在Terminal输入以下命令,即可将OpenVINOSharp添加到AlxBoard_deploy_yolov8项目引用中。

dotnet add reference ./../OpenVINOSharp/src/OpenVINOSharp/OpenVINOSharp.csproj
  • 添加环境变量

该项目需要调用OpenVINO™动态链接库,因此需要在当前环境下增加OpenVINO™动态链接库路径:

1.4.3 添加OpenCvSharp

  • 安装NuGet Package

OpenCvSharp可以通过NuGet Package安装,只需要在Terminal输入以下命令:

  1. dotnet add package OpenCvSharp4_.runtime.ubuntu.20.04-x64
  2. dotnet add package OpenCvSharp4
  • 添加环境变量

将以下路径添加到环境变量中:

export LD_LIBRARY_PATH=/home/ygj/Program/OpenVINOSharp/tutorial_examples/AlxBoard_deploy_yolov8/bin/Debug/netcoreapp3.1/runtimes/ubuntu.20.04-x64/native

/bin/Debug/netcoreapp3.1/runtimes/ubuntu.20.04-x64/native是AlxBoard_deploy_yolov8编译后生成的路径,该路径下存放了libOpenCvSharpExtern.so文件,该文件主要是封装的OpenCV中的各种接口。也可以将该文件拷贝到项目运行路径下。

  • 检测libOpenCvSharpExtern依赖

由于libOpenCvSharpExtern.so是在其他环境下编译好的动态链接库,本机电脑可能会缺少相应的依赖,因此可以通过ldd命令检测。

ldd libOpenCvSharpExtern.so

图 9 检测libOpenCvSharpExtern依赖

如果输出内容中没有no found的,说明不缺少依赖,如果存在,则需要安装缺少的依赖项才可以正常使用。

添加完项目依赖以及NuGet Package后,项目的配置文件内容为:

  1. <Project Sdk="Microsoft.NET.Sdk">
  2.   <ItemGroup>
  3.     <ProjectReference Include="..\OpenVINOSharp\src\OpenVINOSharp\OpenVINOSharp.csproj" />
  4.   </ItemGroup>
  5.   <ItemGroup>
  6.     <PackageReference Include="OpenCvSharp4" Version="4.8.0.20230708" />
  7.     <PackageReference Include="OpenCvSharp4_.runtime.ubuntu.20.04-x64" Version="4.8.0.20230708" />
  8.   </ItemGroup>
  9.   <PropertyGroup>
  10.     <OutputType>Exe</OutputType>
  11.     <TargetFramework>netcoreapp3.1</TargetFramework>
  12.   </PropertyGroup>
  13. </Project>

1.5 运行AlxBoard_deploy_yolov8 项目

该项目测试所使用的模型与文件都可以在OpenVINOSharp中找到,因此下面我们通过OpenVINOSharp 仓库下的模型与文件进行测试。

通过dotnet运行,只需要运行以下命令即可。

dotnet run <args>

<args>参数设指的是模型预测类型、模型路径、图片文件路径参数,预测类型输入包括: 'det'、'seg'、'pose'、'cls' 四种类型;默认推理设备设置为'AUTO',对于'det'、'seg'预测,可以设置<path_to_lable>参数,如果设置该参数,会将结果绘制到图片上,如果未设置,会通过控制台打印出来。

1.5.1 编译运行 Yolov8-det 模型

编译运行命令为:

dotnet run det /home/ygj/Program/OpenVINOSharp/model/yolov8/yolov8s.xml /home/ygj/Program/OpenVINOSharp/dataset/image/demo_2.jpg GPU.0 /home/ygj/Program/OpenVINOSharp/dataset/lable/COCO_lable.txt

模型推理输出结果为

  1. ---- OpenVINO INFO----
  2. Description : OpenVINO Runtime
  3. Build number: 2023.0.1-11005-fa1c41994f3-releases/2023/0
  4. Set inference device GPU.0.
  5. [INFO] Loading model files: /home/ygj/Program/OpenVINOSharp/model/yolov8/yolov8s.xml
  6. [INFO] model name: torch_jit
  7. [INFO]   inputs:
  8. [INFO]     input name: images
  9. [INFO]     input type: f32
  10. [INFO]     input shape: Shape : [1, 3, 640, 640]
  11. [INFO]   outputs:
  12. [INFO]     output name: output0
  13. [INFO]     output type: f32
  14. [INFO]     output shape: Shape : [1, 84, 8400]
  15. [INFO] Read image files: /home/ygj/Program/OpenVINOSharp/dataset/image/demo_2.jpg
  16. Detection result :
  17. 1: 0 0.89   (x:744 y:43 width:388 height:667)
  18. 2: 0 0.88   (x:149 y:202 width:954 height:507)
  19. 3: 27 0.72   (x:435 y:433 width:98 height:284)

图 10 Yolov8-det 模型预测输出

1.5.2 编译运行 Yolov8-cls 模型

编译运行命令为:

dotnet run cls /home/ygj/Program/OpenVINOSharp/model/yolov8/yolov8s-cls.xml /home/ygj/Program/OpenVINOSharp/dataset/image/demo_7.jpg GPU.0

模型推理输出结果为

  1. ---- OpenVINO INFO----
  2. Description : OpenVINO Runtime
  3. Build number: 2023.0.1-11005-fa1c41994f3-releases/2023/0
  4. Set inference device GPU.0.
  5. [INFO] Loading model files: /home/ygj/Program/OpenVINOSharp/model/yolov8/yolov8s-cls.xml
  6. [INFO] model name: torch_jit
  7. [INFO]   inputs:
  8. [INFO]     input name: images
  9. [INFO]     input type: f32
  10. [INFO]     input shape: Shape : [1, 3, 224, 224]
  11. [INFO]   outputs:
  12. [INFO]     output name: output0
  13. [INFO]     output type: f32
  14. [INFO]     output shape: Shape : [1, 1000]
  15. [INFO] Read image files: /home/ygj/Program/OpenVINOSharp/dataset/image/demo_7.jpg
  16. Classification Top 10 result :
  17. classid probability
  18. ------- -----------
  19. 294     0.992173
  20. 269     0.002861
  21. 296     0.002111
  22. 295     0.000714
  23. 270     0.000546
  24. 276     0.000432
  25. 106     0.000159
  26. 362     0.000147
  27. 260     0.000078
  28. 272     0.000070

1.5.3 编译运行 Yolov8-pose 模型

编译运行命令为:

dotnet run pose /home/ygj/Program/OpenVINOSharp/model/yolov8/yolov8s-pose.xml /home/ygj/Program/OpenVINOSharp/dataset/image/demo_9.jpg GPU.0

模型推理输出结果为

  1. ---- OpenVINO INFO----
  2. Description : OpenVINO Runtime
  3. Build number: 2023.0.1-11005-fa1c41994f3-releases/2023/0
  4. Set inference device GPU.0.
  5. [INFO] Loading model files: /home/ygj/Program/OpenVINOSharp/model/yolov8/yolov8s-pose.xml
  6. [INFO] model name: torch_jit
  7. [INFO]   inputs:
  8. [INFO]     input name: images
  9. [INFO]     input type: f32
  10. [INFO]     input shape: Shape : [1, 3, 640, 640]
  11. [INFO]   outputs:
  12. [INFO]     output name: output0
  13. [INFO]     output type: f32
  14. [INFO]     output shape: Shape : [1, 56, 8400]
  15. [INFO] Read image files: /home/ygj/Program/OpenVINOSharp/dataset/image/demo_9.jpg
  16. Classification result :
  17. 1: 1   0.94   (x:104 y:22 width:152 height:365) Nose: (188 ,60 ,0.93) Left Eye: (192 ,53 ,0.83) Right Eye: (180 ,54 ,0.90) Left Ear: (196 ,53 ,0.50) Right Ear: (167 ,56 ,0.76) Left Shoulder: (212 ,92 ,0.93) Right Shoulder: (151 ,93 ,0.94) Left Elbow: (230 ,146 ,0.90) Right Elbow: (138 ,142 ,0.93) Left Wrist: (244 ,199 ,0.89) Right Wrist: (118 ,187 ,0.92) Left Hip: (202 ,192 ,0.97) Right Hip: (168 ,193 ,0.97) Left Knee: (184 ,272 ,0.96) Right Knee: (184 ,276 ,0.97) Left Ankle: (174 ,357 ,0.87) Right Ankle: (197 ,354 ,0.88)

图 11 Yolov8-pose 模型预测输出

1.5.4 编译运行 Yolov8-seg 模型

编译运行命令为:

dotnet run seg /home/ygj/Program/OpenVINOSharp/model/yolov8/yolov8s-seg.xml /home/ygj/Program/OpenVINOSharp/dataset/image/demo_2.jpg GPU.0 /home/ygj/Program/OpenVINOSharp/dataset/lable/COCO_lable.txt

模型推理输出结果为:

  1. ---- OpenVINO INFO----
  2. Description : OpenVINO Runtime
  3. Build number: 2023.0.1-11005-fa1c41994f3-releases/2023/0
  4. Set inference device GPU.0.
  5. [INFO] Loading model files: /home/ygj/Program/OpenVINOSharp/model/yolov8/yolov8s-seg.xml
  6. 47
  7. [INFO] model name: torch_jit
  8. [INFO] inputs:
  9. [INFO] input name: images
  10. [INFO] input type: f32
  11. [INFO] input shape: Shape : [1, 3, 640, 640]
  12. [INFO] outputs:
  13. [INFO] output name: output0
  14. [INFO] output type: f32
  15. [INFO] output shape: Shape : [1, 116, 8400]
  16. [INFO] Read image files: /home/ygj/Program/OpenVINOSharp/dataset/image/demo_2.jpg
  17. Segmentation result :
  18. 1: 0 0.90 (x:745 y:42 width:403 height:671)
  19. 2: 0 0.86 (x:121 y:196 width:1009 height:516)
  20. 3: 27 0.69 (x:434 y:436 width:90 height:280)

图 12  Yolov8-seg 模型预测输出

​​​1.6 运行时间

英特尔开发套件开发板板载了N5105 CPU以及UHD集成显卡,此处对CPU、iGPU的推理性能做了一个简单测试,主要检测了模型推理时间,并使用英特尔幻影峡谷进行了同步测试,测试结果如表所示。

Device

CPU: N5105

UHD集显

CPU: i7-1165G7

Iris Xe集显

Yolov8-det

586.3ms

83.1ms

127.1ms

19.5ms

Yolov8-seg

795.6ms

112.5ms

140.1ms

25.0ms

Yolov8-pose

609.8ms

95.1ms

117.2ms

23.3ms

Yolov8-cls

33.1ms

9.2ms

6.1ms

2.7ms

可以看出,英特尔赛扬N5105 CPU在模型推理性能是十分强大的:针对Yolov8模型,平均处理速度可以达到10FPs。

1.7 总结

在该项目中,我们基于Ubutn 20.04 系统,成功实现了在C#环境下调用OpenVINO™部署深度学习模型,验证了在Linux环境下OpenVINOSharp项目的的可行性,这对后面在Linux环境下开发OpenVINOSharp具有很重要的意义。

欢迎关注OpenVINOSharp代码仓:https://github.com/guojin-yan/OpenVinoSharp

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/865019
推荐阅读
相关标签
  

闽ICP备14008679号