使用 C# 和 ONNX Runtime 加载和运行 ONNX 模型

这篇具有很好参考价值的文章主要介绍了使用 C# 和 ONNX Runtime 加载和运行 ONNX 模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

今天突然有人和我说想要实现windows环境下c#调用tensorflow模型,我想着ONNX不是可以搞嘛,然后我翻了一下以前做的,没翻到,就查询了下资料,鼓捣出来了

下面将介绍如何使用 C# 和 ONNX Runtime 库加载并运行 ONNX 模型。ONNX是啥我就不说了,留个链接。


废话不说,show me code!

一、准备工作

首先,确保您已经安装了 .NET Core SDK。然后,创建一个新的控制台应用程序项目:

dotnet new console -n OnnxInferenceExample  
cd OnnxInferenceExample 

接下来,添加以下 NuGet 包到您的项目中:

  • Microsoft.ML.OnnxRuntime
  • Microsoft.ML.OnnxRuntime.Managed
  • System.Drawing.Common (用于图像处理)

可以通过以下命令安装这些包:

dotnet add package Microsoft.ML.OnnxRuntime  
dotnet add package Microsoft.ML.OnnxRuntime.Managed  
dotnet add package System.Drawing.Common  

二、实现 ONNX 模型封装

为了方便地加载和运行 ONNX 模型,我们将创建一个 OnnxModelWrapper 类。这个类将负责加载模型、准备输入数据和运行推理。以下是 OnnxModelWrapper 类的完整实现,包括构造函数和 RunInference 方法。

using Microsoft.ML.OnnxRuntime;  
using Microsoft.ML.OnnxRuntime.Tensors;  
using System.Collections.Generic;  
using System.Linq;  
  
namespace OnnxModelLibrary  
{  
    public class OnnxModelWrapper  
    {  
        private string _modelPath;  
        private InferenceSession _session;  
        private readonly string _inputName;  
  
        public OnnxModelWrapper(string modelPath)  
        {  
            _modelPath = modelPath;  
            _session = new InferenceSession(_modelPath);  
            // 获取模型的输入节点名称  
            _inputName = _session.InputMetadata.Keys.First();  
        }  
  
        public float[] RunInference(float[] inputData, int inputSize)  
        {  
            // 将输入数据调整为 (1, 28, 28) 形状的张量  
            var reshapedInputData = new DenseTensor<float>(new[] { 1, 28, 28 });  
            for (int i = 0; i < 28; i++)  
            {  
                for (int j = 0; j < 28; j++)  
                {  
                    reshapedInputData[0, i, j] = inputData[i * 28 + j];  
                }  
            }  
  
            // 创建输入 NamedOnnxValue  
            var inputs = new List<NamedOnnxValue> { NamedOnnxValue.CreateFromTensor(_inputName, reshapedInputData) };  
  
            // 运行模型推理  
            using var results = _session.Run(inputs);  
  
            // 获取输出数据  
            float[] outputData = results.ToArray()[0].AsEnumerable<float>().ToArray();  
  
            return outputData;  
        }  
    }  
}  

这个类包含一个构造函数,用于加载 ONNX 模型并获取输入节点的名称。此外,它还包含一个 RunInference 方法,该方法接受一维浮点数组作为输入(例如,图像的像素值)并返回模型的输出数据。

三、运行模型推理

为了运行模型推理,我们需要实现一个 RunInference 方法。这个方法接受一个一维浮点数组(例如,来自图像的像素值)和输入数据的大小。它返回一个浮点数组,包含模型的输出数据。

首先,我们需要将输入数据调整为适当的形状。在本例中,我们将把一维数组调整为一个形状为 (1, 28, 28) 的张量。

然后,我们需要创建一个 NamedOnnxValue 对象,用于存储输入数据。NamedOnnxValue 类表示 ONNX Runtime 中的输入或输出值,它包含一个名字(在本例中是输入节点的名字)和一个张量。

接下来,我们运行模型推理并获取输出数据。可以通过调用 InferenceSession.Run 方法并传递输入 NamedOnnxValue 列表来实现。这个方法返回一个包含输出数据的 IDisposableReadOnlyCollection 对象。我们可以将其转换为一个浮点数组,以便进一步处理。

public float[] RunInference(float[] inputData, int inputSize)  
{  
    // 将输入数据调整为 (1, 28, 28) 形状的张量  
    var reshapedInputData = new DenseTensor<float>(new[] { 1, 28, 28 });  
    for (int i = 0; i < 28; i++)  
    {  
        for (int j = 0; j < 28; j++)  
        {  
            reshapedInputData[0, i, j] = inputData[i * 28 + j];  
        }  
    }  
  
    // 创建输入 NamedOnnxValue  
    var inputs = new List<NamedOnnxValue> { NamedOnnxValue.CreateFromTensor(_inputName, reshapedInputData) };  
  
    // 运行模型推理  
    using var results = _session.Run(inputs);  
  
    // 获取输出数据  
    float[] outputData = results.ToArray()[0].AsEnumerable<float>().ToArray();  
  
    return outputData;  
}  

四、使用 OnnxModelWrapper 类

现在我们已经实现了 OnnxModelWrapper 类,我们可以在控制台应用程序中使用它。首先,我们需要加载一张图像并将其转换为一个二维浮点数组。我们可以使用 System.Drawing.Common 库来实现这一点。

using SixLabors.ImageSharp;  
using SixLabors.ImageSharp.PixelFormats;  
using SixLabors.ImageSharp.Processing;  
  
public static float[,] LoadImageTo2DArray(string imagePath)
{
    // 加载图像    
    using var image = Image.Load<Rgb24>(imagePath);

    // 转换为灰度图像  
    using var grayscaleImage = image.Clone(ctx => ctx.Grayscale());

    // 调整图像大小(如果需要)    
    if (grayscaleImage.Width != 28 || grayscaleImage.Height != 28)
    {
        grayscaleImage.Mutate(x => x.Resize(new ResizeOptions
        {
            Size = new Size(28, 28),
            Sampler = new NearestNeighborResampler()
        }));
    }

    // 将图像转换为二维数组    
    float[,] imageData = new float[28, 28];
    for (int y = 0; y < grayscaleImage.Height; y++)
    {
        for (int x = 0; x < grayscaleImage.Width; x++)
        {
            // 将像素值转换为浮点数并归一化到 [0, 1] 范围    
            imageData[y, x] = (float)grayscaleImage[x, y].R / 255;
        }
    }

    return imageData;
}

接下来,在 Main 方法中,我们可以使用以下步骤来加载 ONNX 模型、加载图像、运行推理并输出预测结果:

  1. 创建一个 OnnxModelWrapper 对象,传入 ONNX 模型的文件路径。
  2. 调用 LoadImageTo2DArray 方法,将图像文件路径作为参数传入,以获取二维浮点数组。
  3. 将二维浮点数组转换为一维浮点数组,以便传递给 RunInference 方法。
  4. 调用 RunInference 方法,并传入一维浮点数组和输入数据的大小。
  5. 处理输出数据(例如,找到具有最高概率的类别)。
  6. 输出预测结果。
static void Main(string[] args)  
{  
    var onnxModelPath = "my_mnist_model.onnx";  
    var modelWrapper = new OnnxModelWrapper(onnxModelPath);  
    string imagePath = "59992.png";  
    float[,] image = LoadImageTo2DArray(imagePath);  
  
    float[] inputData = new float[28 * 28]; // 你的输入数据  
    for (int i = 0; i < 28; i++)  
    {  
        for (int j = 0; j < 28; j++)  
        {  
            inputData[i * 28 + j] = image[i, j];  
        }  
    }  
    int inputSize = 28 * 28; // 输入数据的大小  
    float[] outputData = modelWrapper.RunInference(inputData, inputSize);  
  
    // 处理输出数据(例如,找到具有最高概率的类别)  
    int predictedClass = -1;  
    float maxProbability = float.MinValue;  
    for (int i = 0; i < outputData.Length; i++)  
    {  
        if (outputData[i] > maxProbability)  
        {  
            maxProbability = outputData[i];  
            predictedClass = i;  
        }  
    }  
  
    // 输出预测结果  
    Console.WriteLine($"Predicted class: {predictedClass}, probability: {maxProbability}");  
  
    Console.ReadKey();  
}  

至此,我们已经创建了一个可以加载 ONNX 模型并使用 C# 运行推理的控制台应用程序。这个应用程序可以轻松地适应不同的模型和数据输入格式,因此可以作为一个通用的 ONNX 模型推理示例。


总结

在本篇博客中,我们展示了如何使用 C# 和 ONNX Runtime 库加载和运行 ONNX 模型。我们创建了一个 OnnxModelWrapper 类来封装 ONNX Runtime 的功能,并在控制台应用程序中使用它来加载图像、运行推理并输出预测结果。

这个示例可以轻松地扩展到其他类型的模型和输入数据。通过使用 ONNX Runtime 和 C#,您可以在 Windows 环境下轻松地集成机器学习模型,从而为您的应用程序带来强大的 AI 功能。

参考资源

ONNX Runtime 官方文档
ONNX 官方 GitHub 仓库
.NET Core SDK
SixLabors.ImageSharp 库文章来源地址https://www.toymoban.com/news/detail-643643.html

到了这里,关于使用 C# 和 ONNX Runtime 加载和运行 ONNX 模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++使用onnxruntime/opencv对onnx模型进行推理(附代码)

    结果: current image classification : French bulldog, possible : 16.17 对两张图片同时进行推理 current image classification : French bulldog, possible : 16.17 current image class ification : hare, possible : 8.47 https://download.csdn.net/download/qq_44747572/87810859 https://blog.csdn.net/qq_44747572/article/details/131631153

    2024年02月05日
    浏览(51)
  • TRT4-trt-integrate - 3 使用onnxruntime进行onnx的模型推理过程

    onnx是microsoft开发的一个中间格式,而onnxruntime简称ort是microsoft为onnx开发的推理引擎。 允许使用onnx作为输入进行直接推理得到结果。 建立一个InferenceSession,塞进去的是onnx的路径,实际运算的后端选用的是CPU 也可以选用cuda等等 之后就是预处理 session.run就是运行的inference过程

    2024年02月15日
    浏览(43)
  • YOLO V5 ONNX模型在C# 中部署

    关于Yolo5训练自定义数据集,请参考此教程:YOLO5训练自定义数据集 完整项目(VS2022) 链接:https://pan.baidu.com/s/17jQUx-Dp0YYC4YWzYLs0AA?pwd=yzj9 提取码:yzj9 一 YOLO 导出ONNX模型 在export.py 中修改参数(如下图),运行导出ONNX 二 Yolov5Net.Scorer.dll文件设置及编译 C# ONNX模型推理dll库:

    2024年02月06日
    浏览(43)
  • C#使用DirectX SDK 加载.x三维模型

    最近因为项目要做显示一个三维模型,所以研究了下如何在Winform中加载并显示三维模型。在Windows平台巨硬公司提供了DirectX SDK用于渲染图形,参考了几篇文章做了个demo记录下,以便日后温习只用。这个SDK涉及到了计算机图形学的一些基础知识,需要掌握一点基础,推荐可以

    2024年02月07日
    浏览(49)
  • 详细介绍 Yolov5 转 ONNX模型 + 使用ONNX Runtime 的 Python 部署(包含官方文档的介绍)

    对ONNX的介绍强烈建议看,本文做了很多参考:模型部署入门教程(一):模型部署简介 模型部署入门教程(三):PyTorch 转 ONNX 详解 以及Pytorch的官方介绍:(OPTIONAL) EXPORTING A MODEL FROM PYTORCH TO ONNX AND RUNNING IT USING ONNX RUNTIME C++的部署:详细介绍 Yolov5 转 ONNX模型 + 使用 ONNX Runti

    2024年02月01日
    浏览(51)
  • VS c++ onnxruntime 环境配置、onnx教程、部署推理模型、sklearn pkl模型转onnx、问题汇总

    目录 一、初步认识ONNX 二、pkl转ONNX+可视化模型 三、ONNX Runtime运行时 3.1 相关介绍(了解此运行时): 3.2 VS、c++部署onnxruntime 3.3 头文件引用的一些问题 四、问题汇总: 1. 类没有成员 2. 版本兼容问题 3. 3.“GetInputName“: 不是 “Ort::Session“ 的成员 官网: ONNX Runtime | Home GitHub

    2024年04月09日
    浏览(44)
  • [C#]winform部署官方yolov8-obb旋转框检测的onnx模型

    【官方框架地址】 https://github.com/ultralytics/ultralytics 【算法介绍】 Yolov8-obb(You Only Look Once version 8 with Oriented Bounding Boxes)是一种先进的对象检测算法,它在传统的Yolov3和Yolov4基础上进行了优化,加入了OBB(Oriented Bounding Box)旋转框检测,能够更精确地检测并定位出目标物体的

    2024年01月20日
    浏览(86)
  • Android+OnnxRuntime+Opencv+Onnx模型操作图片擦除多余内容

    今年来AI的发展非常迅速,在工业、医疗等等行业逐渐出现相应的解决方案,AI也逐渐成为各行业基础设施建设重要的一环,未来发展的大趋势,不过这也需要一个漫长的过程,需要很多技术型人才加入其中,除了工业设施的基础建设,在娱乐方向也有很多有趣的能力,不如图

    2024年04月13日
    浏览(43)
  • ONNX格式模型 学习笔记 (onnxRuntime部署)---用java调用yolov8模型来举例

    ONNX(Open Neural Network Exchange)是一个开源项目,旨在建立一个开放的标准,使深度学习模型 可以在不同的软件平台和工具之间轻松移动和重用 。 ONNX模型可以用于各种应用场景,例如机器翻译、图像识别、语音识别、自然语言处理等。 由于ONNX模型的互操作性,开发人员 可以

    2024年01月22日
    浏览(47)
  • 【环境搭建:onnx模型部署】onnxruntime-gpu安装与测试(python)

    onnx 模型在 CPU 上进行推理,在conda环境中直接使用pip安装即可 想要 onnx 模型在 GPU 上加速推理,需要安装 onnxruntime-gpu 。有两种思路: 依赖于 本地主机 上已安装的 cuda 和 cudnn 版本 不依赖于 本地主机 上已安装的 cuda 和 cudnn 版本 要注意:onnxruntime-gpu, cuda, cudnn三者的版本要对

    2024年02月07日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包