如何用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();

        }
PaddlePaddle是一个开源的深度学习平台,提供了丰富的深度学习算法和工具。PaddlePaddle支持将模型转换为ONNX格式,ONNX是一个开放的神经网络交换格式,可以实现模型的跨平台部署和迁移。 Paddle文本识别是基于深度学习的技术,能够实现对文本的自动辨识和理解。通过使用PaddlePaddle进行文本识别,可以实现对文字的自动分类、检测、识别等功能。PaddlePaddle提供了丰富的文本识别模型,包括文本分类、文本生成、命名实体识别等。 在使用PaddlePaddle进行文本识别时,首先需要将文本数据进行预处理,包括分词、编码等操作。然后,可以使用PaddlePaddle提供的文本识别模型进行训练和推理。在训练过程中,可以使用PaddlePaddle提供的丰富的深度学习算法和工具,进行模型的优化和调优。在推理过程中,可以将训练好的模型导出为ONNX格式,以实现模型的跨平台部署和迁移。 通过将PaddlePaddle的文本识别模型导出为ONNX格式,可以将模型部署到其他平台,如TensorFlow、PyTorch等,实现模型的跨平台迁移。同时,ONNX还支持在移动端和嵌入式设备上进行部署,提供了更广阔的应用场景。 总之,Paddle文本识别结合ONNX格式具有很大的优势,能够实现文本识别模型的训练、推理和部署的全流程,并具备跨平台和跨设备的能力,为文本识别技术的应用提供了很大的便利性和灵活性。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值