开发者实战 | 在 MacOS 上使用 OpenVINO™ C# API 高效部署 AI 模型

02/08 17:00
阅读数 12

点击蓝字

关注我们,让开发变得更有趣

作者:颜国进

英特尔边缘计算创新大使




OpenVINO™ C# API 是一个 OpenVINO™ 的 .Net wrapper,应用最新的 OpenVINO™ 库开发,通过 OpenVINO™ C API 实现 .Net 对 OpenVINO™ Runtime 调用,使用习惯与 OpenVINO™ C++ API 一致。OpenVINO™ C# API 由于是基于 OpenVINO™ 开发,所支持的平台与 OpenVINO™ 完全一致,具体信息可以参考 OpenVINO™。通过使用 OpenVINO™ C# API,可以在 .NET、.NET Framework 等框架下使用 C# 语言实现深度学习模型在指定平台推理加速。


在本文中,将向大家展示如何在 MacOS 上使用 OpenVINO CSharp API 高效部署 AI 模型。


项目链接:

//GitHub:
https://github.com/guojin-yan/OpenVINO-CSharp-API

//Gitee:
https://gitee.com/guojin-yan/OpenVINO-CSharp-API


01

配置开发环境


1.1

安装 .NET 运行环境


[.NET] 是由 Microsoft 创建的一个免费的、跨平台的、开源开发人员平台,可以使用 C#、F# 或 Visual Basic 语言编写代码,用于构建许多不同类型的应用程序,可以在任何兼容的操作系统上(Windows、Linux、Mac OS 等)运行。

.NET:

https://learn.microsoft.com/zh-cn/dotnet/


Microsoft 官方提供了 .NET 环境的详细安装流程,大家可以参考以下文章进行安装:[在 macOS 上安装 .NET]。

在 macOS 上安装 .NET:

https://learn.microsoft.com/zh-cn/dotnet/core/install/macos


首先访问网站 [下载 .NET],具体下载选择如下所示:

下载 .NET:

https://dotnet.microsoft.com/zh-cn/download



文件下载完后,通过双击安装文件进行环境的安装:



打开安装文件后,如下图所示,此处无需设置其他配置,只需要按照默认步骤进行安装即可。



1.2

配置 C# 开发环境


在 Linux 环境下我们可以使用以下组合进行 C# 代码开发:

● 代码构建工具:dotnet

● 代码编辑工具:Visual Studio Code


在上文中我们安装 .NET 时已经同时安装了 dotnet 工具。Visual Studio Code 是一款功能强大的代码编辑器,并且支持更多第三方插件,同时支持 C# 代码开发,Visual Studio Code 安装比较简单,只需从 VS Code 官网下载安装文件,按照默认选项完成安装。

VS Code 官网:

https://code.visualstudio.com/


然后配置 C# 编辑环境,在扩展商店中搜索 C#,安装 C# 扩展,如下图所示。



02

创建并配置测试项目


2.1

创建 C# 项目


首先我们使用终端窗口命令创建一个 C# 项目项目,输入以下指令,创建一个 .NET 6.0 依赖的项目,输出如下图所示:

dotnet new console --framework net6.0 -o test_openvino_csharp --use-program-main

左滑查看更多



2.2

添加项目依赖


接下来就是添加项目所需的外部依赖项,首先可以通过 VS Code 打开上文创建的项目,接下来就可以使用 VS Code 的终端添加所需的依赖。此处主要需要添加两个依赖:


1) OpenVINO.CSharp.API


OpenVINO.CSharp.API 是本文所演示项目主要使用的依赖库,目前该项目已经发布了 Nuget Package,完全支持 dotnet add package 安装,该项目主要包含以下三个程序集:


1

OpenVINO.CSharp.API:

OpenVINO™ 核心程序集,封装了 OpenVINO™ 的 .Net wrapper 接口,包含了 OpenVINO™ 主要模型推理类。


2

OpenVINO.CSharp.API.Extensions:

OpenVINO.CSharp.API 项目中的扩展程序集,主要包含了一些扩展程序集,方便用户使用。


3

OpenVINO.runtime.macos-arm64:

OpenVINO™ 在 Mac OS 平台运行所需的所有动态依赖库。



此处通过 dotnet add package 安装即可,在终端中输入以下指令即可,输出如下图所示:


dotnet add package OpenVINO.CSharp.APIdotnet add package OpenVINO.CSharp.API.Extensionsdotnet add package OpenVINO.runtime.macos-arm64

左滑查看更多



如果开发者在使用时不确定自己所需的 Nuget Package 程序集名称,可以去 [Nuget Package] 官方网站进行查询,如下图所示:

Nuget Package:

https://www.nuget.org/



2)OpenCvSharp4


OpenCvSharp4 是 OpenCV 的 .Net wrapper,可以实现在 C# 中使用 OpenCV,在该项目中由于我们需要进行图像处理,所以此处选择安装 OpenCvSharp4。


● OpenCvSharp4

● OpenCvSharp4.Extensions

● OpenCvSharp4.runtime.osx_arm64


关于在 MacOS 上搭建 OpenCvSharp 开发环境请参考以下文章:【OpenCV】在MacOS上使用OpenCvSharp;或者直接在终端中输入以下指令:


dotnet add package OpenCvSharp4dotnet add package OpenCvSharp4.Extensionsdotnet add package OpenCvSharp4.runtime.osx_arm64 --prerelease

左滑查看更多


最终安装完所需的依赖后,项目配置文件为:


<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>   <OutputType>Exe</OutputType>   <TargetFramework>net6.0</TargetFramework>   <ImplicitUsings>enable</ImplicitUsings>   <Nullable>enable</Nullable> </PropertyGroup>
<ItemGroup>   <PackageReference Include="OpenCvSharp4" Version="4.9.0.20240103" />   <PackageReference Include="OpenCvSharp4.Extensions" Version="4.9.0.20240103" />   <PackageReference Include="OpenCvSharp4.runtime.osx_arm64" Version="4.8.1-rc" />   <PackageReference Include="OpenVINO.CSharp.API" Version="2023.2.0.4" />   <PackageReference Include="OpenVINO.CSharp.API.Extensions" Version="1.0.1" />   <PackageReference Include="OpenVINO.runtime.macos-arm64" Version="2023.2.0.1" /> </ItemGroup>
</Project>

左滑查看更多


03

添加项目运行代码


接下来编写模型部署代码,OpenVINO CSharp API 部署模型流程与 OpenVINO C++ API 部署流程一致,并且由于该项目开发时参考了 C++ API 名称,因此代码与在 C++ 中使用基本一致。此处以 Yolov8 分类模型为例,其部署代码如下所示:


using System;using System.Collections.Generic;using System.Linq;using System.Runtime.InteropServices;using OpenCvSharp;using OpenCvSharp.Dnn;using OpenVinoSharp;using OpenVinoSharp.Extensions;using OpenVinoSharp.Extensions.utility;namespace test_openvino_csharp;class Program{   static void Main(string[] args){       DateTime start = DateTime.Now;       // -------- Step 1. Initialize OpenVINO Runtime Core --------       Core core = new Core();       DateTime end = DateTime.Now;       Slog.INFO("1. Initialize OpenVINO Runtime Core success, time spend: " + (end-start).TotalMilliseconds + "ms.");       // -------- Step 2. Read inference model --------       start = DateTime.Now;       Model model = core.read_model("/Users/ygj/Program/temp/test_openvino_csharp/yolov8s-cls.xml");       end = DateTime.Now;       Slog.INFO("2. Read inference model success, time spend: " + (end - start).TotalMilliseconds + "ms.");       OvExtensions.printf_model_info(model);       // -------- Step 3. Loading a model to the device --------       start = DateTime.Now;       CompiledModel compiled_model = core.compile_model(model, "CPU");       end = DateTime.Now;       Slog.INFO("3. Loading a model to the device success, time spend:" + (end - start).TotalMilliseconds + "ms.");       // -------- Step 4. Create an infer request --------       start = DateTime.Now;       InferRequest infer_request = compiled_model.create_infer_request();       end = DateTime.Now;       Slog.INFO("4. Create an infer request success, time spend:" + (end - start).TotalMilliseconds + "ms.");       // -------- Step 5. Process input images --------       start = DateTime.Now;       Mat image = new Mat("/Users/ygj/Program/temp/test_openvino_csharp/image.jpg"); // Read image by opencvsharp       int max_image_length = image.Cols > image.Rows ? image.Cols : image.Rows;       Mat max_image = Mat.Zeros(new OpenCvSharp.Size(max_image_length, max_image_length), MatType.CV_8UC3);       Rect roi = new Rect(0, 0, image.Cols, image.Rows);       image.CopyTo(new Mat(max_image, roi));       float factor = (float)(max_image_length / 640.0);       end = DateTime.Now;       Slog.INFO("5. Process input images success, time spend:" + (end - start).TotalMilliseconds + "ms.");       // -------- Step 6. Set up input data --------       start = DateTime.Now;       Tensor input_tensor = infer_request.get_input_tensor();       Shape input_shape = input_tensor.get_shape();       Mat input_mat = CvDnn.BlobFromImage(max_image, 1.0 / 255.0, new OpenCvSharp.Size(input_shape[2], input_shape[3]), 0, true, false);       float[] input_data = new float[input_shape[1] * input_shape[2] * input_shape[3]];       Marshal.Copy(input_mat.Ptr(0), input_data, 0, input_data.Length);       input_tensor.set_data<float>(input_data);       end = DateTime.Now;       Slog.INFO("6. Set up input data success, time spend:" + (end - start).TotalMilliseconds + "ms.");       // -------- Step 7. Do inference synchronously --------       infer_request.infer();       start = DateTime.Now;       infer_request.infer();       end = DateTime.Now;       Slog.INFO("7. Do inference synchronously success, time spend:" + (end - start).TotalMilliseconds + "ms.");       // -------- Step 8. Get infer result data --------       start = DateTime.Now;       Tensor output_tensor = infer_request.get_output_tensor();       int output_length = (int)output_tensor.get_size();       float[] output_data = output_tensor.get_data<float>(output_length);       end = DateTime.Now;       Slog.INFO("8. Get infer result data success, time spend:" + (end - start).TotalMilliseconds + "ms.");       // -------- Step 9. Process reault --------          List<float> results = new List<float>(output_data);       // 使用 LINQ 查询语法获取最大值及其索引       var max_pair = (from r in results select new { number = r, index = results.IndexOf(r) })                              .OrderByDescending(x => x.number).FirstOrDefault();       Slog.INFO("result: Class ID:" + max_pair.index + ", Score:" + max_pair.number);  }}

左滑查看更多


04

运行测试项目


配置完项目依赖以及项目运行代码后,就可以运行项目了,在 VS Code 终端输入以下指令:


dotnet builddotnet run --no-build

左滑查看更多


输入指令后,程序输出如下所示:


[ INFO ] 1. Initialize OpenVINO Runtime Core success, time spend: 226.196ms.[ INFO ] 2. Read inference model success, time spend: 21.717ms.[ INFO ] Inference Model[ INFO ]   Model name: torch_jit[ INFO ]   Input:[ INFO ]     name: images[ INFO ]     type: float[ INFO ]     shape: Shape : {1,3,224,224}[ INFO ]   Output:[ INFO ]     name: output0[ INFO ]     type: float[ INFO ]     shape: Shape : {1,1000}[ INFO ] 3. Loading a model to the device success, time spend:153.319ms.[ INFO ] 4. Create an infer request success, time spend:2.103ms.[ INFO ] 5. Process input images success, time spend:38.503ms.[ INFO ] 6. Set up input data success, time spend:4.367ms.[ INFO ] 7. Do inference synchronously success, time spend:9.081ms.[ INFO ] 8. Get infer result data success, time spend:0.338ms.[ INFO ] result: Class ID:386, Score:0.49138233

左滑查看更多



05

总结


该项目中,我们在 MacOS 14.2.1 系统、M2 芯片的 Macbook Air 电脑上,成功使用 OpenVINO™ CSharp API 部署了 Yolov8 图片分类深度学习模型,并详细演示了 OpenVINO™ CSharp API 在苹果电脑上使用与配置流程,为使用 MacOS 系统的开发者提供了很好的范例与参考。

OpenVINO™

--END--



               
               
               
你也许想了解(点击蓝字查看)⬇️
➡️  隆重推出 OpenVINO 2023.3 ™ 最新长期支持版本
➡️  OpenVINO™ 2023.2 发布:让生成式 AI 在实际场景中更易用
➡️  开发者实战 | 基于 OpenVINO™ 和 LangChain 构建 RAG 问答系统
➡️  开发者实战 | 如何利用低比特量化技术进一步提升大模型推理性能
➡️ 开发者实战 | 介绍OpenVINO™ 2023.1:在边缘端赋能生成式AI
➡️ 基于 ChatGLM2 和 OpenVINO™ 打造中文聊天助手
➡️ 基于 Llama2 和 OpenVINO™ 打造聊天机器人
➡️ OpenVINO™ DevCon 2023重磅回归!英特尔以创新产品激发开发者无限潜能
➡️ 5周年更新 | OpenVINO™  2023.0,让AI部署和加速更容易
➡️ OpenVINO™5周年重头戏!2023.0版本持续升级AI部署和加速性能
➡️ OpenVINO™2023.0实战 | 在 LabVIEW 中部署 YOLOv8 目标检测模型
➡️ 开发者实战系列资源包来啦!
➡️  以AI作画,祝她节日快乐;简单三步,OpenVINO™ 助你轻松体验AIGC


              
              
              

扫描下方二维码立即体验 

OpenVINO™ 工具套件 2023.3


点击 阅读原文 立即体验OpenVINO 2023.3
文章这么精彩,你有没有“在看”?

本文分享自微信公众号 - OpenVINO 中文社区(openvinodev)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部