前言
今天突然有人和我说想要实现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