yolov7模型部署——环境搭建(python 导出onnx模型,c# OnnxRunTime-GPU版调用) 踩坑记录

yyy_WW 阅读:49 2023-04-14 09:26:49 评论:0

1. 环境搭建

首先需要安装以下环境:

- Python 3.7

- PyTorch 1.7.1

- onnx 1.8.1

- onnxruntime-gpu 1.7.0

其中,onnxruntime-gpu 1.7.0 需要根据自己的 CUDA 版本进行选择,可以在官网上查看对应版本。

2. 导出 onnx 模型

使用 PyTorch 导出 onnx 模型的代码如下:

python 
import torch 
import torchvision 
 
# 加载模型 
model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True) 
model.eval() 
 
# 输入数据 
x = torch.randn(1, 3, 224, 224) 
 
# 导出 onnx 模型 
torch.onnx.export(model, x, "model.onnx", opset_version=11) 

其中,opset_version 表示使用的 onnx 版本,需要根据自己的 onnx 版本进行选择。

3. C# 调用 onnx 模型

使用 onnxruntime-gpu 1.7.0 调用 onnx 模型的代码如下:

csharp 
using System; 
using System.Linq; 
using Microsoft.ML.OnnxRuntime; 
using Microsoft.ML.OnnxRuntime.Tensors; 
 
class Program 
{ 
    static void Main(string[] args) 
    { 
        // 加载模型 
        var session = new InferenceSession("model.onnx"); 
 
        // 输入数据 
        var tensor = new DenseTensor
  
   (new[] { 1, 3, 224, 224 }, Enumerable.Range(0, 1 * 3 * 224 * 224).Select(x => (float)x).ToArray()); 
 
        // 运行模型 
        var inputs = new[] { "input" }; 
        var outputs = new[] { "output1", "output2" }; 
        var results = session.Run(inputs.ToDictionary(x => x, x => tensor), outputs); 
 
        // 输出结果 
        var output1 = results.First(x => x.Key == "output1").Value; 
        var output2 = results.First(x => x.Key == "output2").Value; 
        Console.WriteLine($"output1: {string.Join(", ", output1.Cast
   
    ())}"); 
        Console.WriteLine($"output2: {string.Join(", ", output2.Cast
    
     ())}"); 
    } 
} 

    
   
  

需要注意的是,onnxruntime-gpu 1.7.0 需要安装 CUDA 和 cuDNN,否则会报错。同时,需要将 onnxruntime.dll 和 onnxruntime_gpu.dll 复制到项目的输出目录中。

4. 踩坑记录

在实际使用中,可能会遇到以下问题:

- 导出的 onnx 模型无法正常运行:可能是因为 PyTorch 和 onnx 的版本不兼容,需要根据提示升级或降级版本。

- C# 调用 onnx 模型报错:可能是因为缺少 CUDA 或 cuDNN,需要安装对应版本。同时,需要将 onnxruntime.dll 和 onnxruntime_gpu.dll 复制到项目的输出目录中。

- C# 调用 onnx 模型输出结果不正确:可能是因为输入数据的格式不正确,需要根据模型的输入格式进行调整。同时,需要注意模型的输出格式,可能需要进行转换。


标签:C#
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号