如何用C#调用onnx模型

C#调用python导出的onnx模型

写在前面

本文通过python导出回归预测模型为onnx格式,然后通过c#进行调用,本篇重点是c#调用的方式,关于python如何导出Onnx模型详见钥匙君另一篇文章:python成功导出Onnx模型

开炮!开炮!

1.导入拓展包

拓展包没那么复杂,直接上Nutget,前面两项打钩的
在这里插入图片描述

2.导入onnx模型

将导出的onnx模型放置于Debug文件夹下做准备
在这里插入图片描述
导入onnx模型,这里就是根目录下第一步放置的,这里定义一个输入

            string modelFilePath = @".\xgb_S_Onnx.onnx";
            // 定义模型的输入
            float[] inputData = new float[] { 2, 54, 1, 1, 1 };
            //List<float> inputData = new List<float>();

3.导入onnx关键代码解读

定义SessionOptions,这里使用cpu进行运算时调用

            SessionOptions options = new SessionOptions();
            options.LogSeverityLevel = OrtLoggingLevel.ORT_LOGGING_LEVEL_INFO;
            options.AppendExecutionProvider_CPU(0);

这里的inputMeta将包括Key为“flaot_input",这也是在python中定义好的,如果不清楚可以去看一下上一篇文章:python成功导出Onnx模型

将 input_tensor 放入一个输入参数的容器,并指定名称,这里主要是因为c#在读取外部data的一些规定,NamedOnnxValue可以理解为在c#的onnxruntime读取数值都是以这种类型进行传递的

            var inputMeta = _onnxSession.InputMetadata;
            var container = new List<NamedOnnxValue>(); 

对于inputMeta中的每一个Key,这里只有一个key就是“flaot_input",name也在循环中被赋予“flaot_input"

container.Add是不是很熟悉,有点类似于字典,添加了(name, tensor)也就是添加了
“flaot_input",{{2,54,1,1,1}}

此时的tensor就是{{2,54,1,1,1}},inputMeta[name].Dimensions是2,因为输入是1x5的,所以Dimensions其中1个是1,1个是5,表示输入的维度是[1,5]

            foreach (var name in inputMeta.Keys)
            {
                var tensor = new DenseTensor<float>(inputData, inputMeta[name].Dimensions);
               
                container.Add(NamedOnnxValue.CreateFromTensor<float>(name, tensor));
            }

运行 Inference 并获取结果

这里注意resultsArray的类型是onnx_tensor不能直接转为float[],因此这里需要调用函数进行处理,将resultsArray的数组提取出来,通过AsEnumerable()结合ToArray()方法来实现,这个shuchu就是我们预测得到的一个1x112的数组

            IDisposableReadOnlyCollection<DisposableNamedOnnxValue> results = _onnxSession.Run(container);
            //将resultsArray变为数组
            var resultsArray = results.ToArray();

            float[] shuchu = resultsArray[0].AsEnumerable<float>().ToArray();
            //Console.WriteLine(shuchu.Length);
          

4.完整代码

 public MainWindow()
        {
            InitializeComponent();
            
            string modelFilePath = @".\xgb_S_Onnx.onnx";
            
            float[] inputData = new float[] { 2, 54, 1, 1, 1 };
            
            SessionOptions options = new SessionOptions();
            options.LogSeverityLevel = OrtLoggingLevel.ORT_LOGGING_LEVEL_INFO;
            options.AppendExecutionProvider_CPU(0);

            InferenceSession _onnxSession = new InferenceSession(modelFilePath, options);
            var inputMeta = _onnxSession.InputMetadata;

             var container = new List<NamedOnnxValue>();
            foreach (var name in inputMeta.Keys)
            {
                var tensor = new DenseTensor<float>(inputData, inputMeta[name].Dimensions);
               
                container.Add(NamedOnnxValue.CreateFromTensor<float>(name, tensor));
            }
           
            IDisposableReadOnlyCollection<DisposableNamedOnnxValue> results = _onnxSession.Run(container);
          
            var resultsArray = results.ToArray();
            
            float[] shuchu = resultsArray[0].AsEnumerable<float>().ToArray();

        }
  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C#调用ONNX模型,可以使用ONNX Runtime来实现。下面是一个简单的示例代码,展示了如何加载ONNX模型并使用它进行预测: ```csharp using System; using System.Linq; using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; class Program { static void Main() { // 加载ONNX模型 var session = new InferenceSession("path/to/your/model.onnx"); // 准备输入数据 var inputMeta = session.InputMetadata; var inputName = inputMeta.Keys.First(); var shape = inputMeta[inputName].Dimensions.ToArray(); var inputTensor = new DenseTensor<float>(shape); // 设置输入数据 // 注意:这里需要根据模型的输入要求,将数据填充到inputTensor中 // 这里只是个示例,实际需要根据模型的输入要求来处理数据 float[] inputData = new float[shape.Length]; // 填充inputData数组 inputTensor.CopyFrom(inputData); // 准备输出数据 var outputMeta = session.OutputMetadata; var outputName = outputMeta.Keys.First(); var outputShape = outputMeta[outputName].Dimensions.ToArray(); var outputTensor = new DenseTensor<float>(outputShape); // 运行预测 session.Run(new[] { inputName }, new[] { inputTensor }, new[] { outputName }, new[] { outputTensor }); // 处理输出结果 var outputData = outputTensor.ToArray(); // 输出结果 foreach (var value in outputData) { Console.WriteLine(value); } } } ``` 请确保已经安装了ONNX Runtime NuGet包,并将路径 "path/to/your/model.onnx" 替换为你自己的ONNX模型文件路径。在代码中,你需要根据模型的输入要求,将数据填充到inputTensor中,并根据模型的输出要求来处理输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值