超简洁的「C# + ONNX Runtime」最小示例项目

在这里插入图片描述

前言

欢迎关注dotnet研习社,前面,我们介绍了ONNX Runtime 是什么,今天我们通过一个示例程序来学习,如何进行开发。

准备工作

环境准备

先用 pip 安装 PyTorch

pip install torch

如果你的电脑有 GPU,可装 torch 的 CUDA 版,比如:

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

(CUDA 版本根据你本地显卡和 CUDA 驱动匹配。)
在这里插入图片描述

模型生成

先要有一个 ONNX 模型,例如:

  • 一个最简单的 y = x * 2 线性模型。
  • 或者 Python 用 PyTorch 训练个最简单的模型导出 ONNX。

下面是 Python 生成最小模型示例

# -*- coding: utf-8 -*-
# save_dummy.onnx: 输入一个 float 数组,输出它们乘以 2
import torch
import torch.nn as nn

class DoubleModel(nn.Module):
    def forward(self, x):
        return x * 2
model = DoubleModel()
x = torch.randn(1, 1, 5)  # 假设输入长度5
torch.onnx.export(model, x, "double_model.onnx", input_names=["input"], output_names=["output"])

在终端执行:

python export_double_model.py

运行完后,你会得到一个 double_model.onnx

新建 C# Console 项目

这里用最简单的 ConsoleApp 演示,WinForms/WPF 只是多了 UI 部分,核心是一样的。

在项目里安装 NuGet 包

dotnet add package Microsoft.ML.OnnxRuntime

在这里插入图片描述

核心 C# 推理代码

Copy double_model.onnx文件到输出目录。

创建一个新文件 Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.ML.OnnxRuntime;
using Microsoft.ML.OnnxRuntime.Tensors;

namespace OnnxRuntimeDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 加载 ONNX 模型
            using var session = new InferenceSession("double_model.onnx");

            // 构造输入数据:1 x 1 x 5
            var inputData = new float[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f };
            var tensor = new DenseTensor<float>(new[] { 1, 1, 5 });

            for (int i = 0; i < inputData.Length; i++)
            {
                tensor[0, 0, i] = inputData[i];
            }

            // 创建输入
            var inputs = new List<NamedOnnxValue>
            {
                NamedOnnxValue.CreateFromTensor("input", tensor)
            };

            // 推理
            using IDisposableReadOnlyCollection<DisposableNamedOnnxValue> results = session.Run(inputs);

            // 输出结果
            var output = results.First().AsEnumerable<float>().ToArray();
            Console.WriteLine("输入: " + string.Join(",", inputData));
            Console.WriteLine("输出: " + string.Join(",", output));
        }
    }
}

完整示例文件
在这里插入图片描述

运行效果

在这里插入图片描述
说明 ONNX 模型加载成功,推理执行无误。

WinForms / WPF 怎么接?

在 WinForms 或 WPF 中也是一样:

  • 只要把这段推理逻辑放到 Button.Click 事件里,
  • 或者封装成 OnnxPredictor 类,
  • 用文本框输入数据、用图表/标签显示输出即可。

关键点总结

ONNX Runtime 是核心库Microsoft.ML.OnnxRuntime
输入用 DenseTensor:注意 shape 要和训练时一致
输入名字对得上:要跟 Python 导出的 input_names 一致
跨平台可用:Windows、Linux、ARM 都能跑

<think>嗯,用户想了解在C#中使用YOLO实现车流统计。首先,我需要确定YOLO是什么,以及它在车流统计中的作用。YOLO是一种目标检测模型,能够实时识别图像中的物体,比如车辆。车流统计通常包括检测车辆、跟踪它们的移动,然后统计数量或分析流量模式。 接下来,用户可能想知道如何在C#中集成YOLO。YOLO通常是基于Python的,但C#可以通过某些库调用YOLO模型。我需要考虑C#可用的库,比如使用ONNX运行时加载YOLO的ONNX模型,或者使用Emgu CV这样的包装库来调用Darknet模型。另外,用户可能需要知道整个流程的步骤,从模型准备到检测再到统计。 可能的步骤包括:1. 准备训练好的YOLO模型,可能需要转换为ONNX格式;2. 在C#项目中引用相关库;3. 加载模型并进行图像推理;4. 处理检测结果,应用跟踪算法如SORT;5. 统计车辆数量和行驶方向。 用户可能遇到的问题包括模型转换、性能优化、跟踪算法的实现等。需要提醒注意性能问题,比如使用GPU加速,以及处理视频流的实时性。另外,要提到可能的数据预处理和后处理步骤,比如非极大值抑制(NMS)。 可能还需要给出代码示例,比如使用ONNX运行时进行推理,或者Emgu CV的例子。同时,要推荐一些资源,比如预训练模型、开源项目参考,以及学习链接,帮助用户进一步探索。 需要确保回答结构清晰,分步骤说明,同时注意技术细节的正确性,比如正确的库名称和方法调用。还要注意用户可能对YOLO模型不太熟悉,可能需要简要介绍YOLO的基本概念,但用户问题重点在C#的实现,所以不需要深入算法细节。</think>在C#中使用YOLO实现车流统计可分为以下步骤: --- ### 一、技术选型 1. **YOLO模型选择** - 推荐YOLOv8(最新版本)或YOLOv5(社区支持丰富) - 模型格式:ONNX(便于C#集成)或直接使用Darknet模型 2. **开发框架** - ML.NET(微软官方机器学习库) - ONNX Runtime(高性能推理引擎) - Emgu CV(OpenCV的C#封装) --- ### 二、实现流程 #### 步骤1:模型准备 ```csharp // 下载预训练模型(如yolov8n.pt) // 转换为ONNX格式(Python环境执行): !yolo export model=yolov8n.pt format=onnx ``` #### 步骤2:创建C#项目 ```bash dotnet add package Microsoft.ML.OnnxRuntime dotnet add package Emgu.CV ``` #### 步骤3:模型加载与推理 ```csharp var session = new InferenceSession("yolov8n.onnx"); var inputs = new List<NamedOnnxValue> { NamedOnnxValue.CreateFromTensor("images", processedImageTensor) }; using var results = session.Run(inputs); ``` #### 步骤4:目标检测处理 ```csharp // 解析输出张量 var output = results.First().AsTensor<float>(); // 应用非极大值抑制(NMS) var boxes = ProcessOutput(output, confidenceThreshold: 0.5, iouThreshold: 0.5); ``` #### 步骤5:车流统计实现 1. **目标跟踪** - 使用SORT/DeepSORT算法 - 通过Emgu CV实现光流跟踪 2. **计数逻辑** ```csharp // 虚拟检测线法 if (CrossLine(prevPosition, currentPosition, countingLine)) { counter++; } ``` --- ### 三、性能优化 1. **GPU加速** ```csharp var sessionOptions = new SessionOptions(); sessionOptions.AppendExecutionProvider_CUDA(); ``` 2. **异步处理** ```csharp await Task.Run(() => ProcessFrame(frame)); ``` 3. **分辨率调整** ```csharp CvInvoke.Resize(frame, resizedFrame, new Size(640, 480)); ``` --- ### 四、示例代码结构 ```csharp public class VehicleCounter { private InferenceSession _session; private int _totalCount; public void Initialize() { _session = new InferenceSession("yolov8n.onnx"); } public void ProcessFrame(Mat frame) { // 预处理 -> 推理 -> NMS -> 跟踪 -> 计数 } } ``` --- ### 五、注意事项 1. **硬件要求** - 推荐使用NVIDIA GPU(CUDA加速) - 最低配置:4GB显存+8GB内存 2. **数据标注** - 自定义训练需标注车辆数据(推荐使用LabelImg工具) - 数据集建议包含不同光照/天气条件 3. **误差处理** - 添加阴影过滤 - 设置最小检测尺寸阈值 - 使用移动平均滤波平滑计数 --- ### 六、推荐资源 1. 官方文档: - YOLOv8:https://docs.ultralytics.com/ - ONNX Runtime:https://onnxruntime.ai/ 2. 开源参考: - TensorRT.NET(高性能推理) - OpenVINO™ Toolkit(Intel硬件优化) 3. 预训练模型: - COCO数据集模型(通用检测) - UA-DETRAC专用车辆检测模型 通过上述方法可实现基础车流统计,实际部署需根据场景调整检测参数和计数逻辑。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dotnet研习社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值