当前位置: 首页 > news >正文

基于ONNXRuntime C#实现的高性能YOLO推理框架

基于ONNXRuntime C#实现的高性能YOLO推理框架

YoloSharpOnnx是一个高性能、内存复用、跨平台的 C# YOLO 推理库,基于 OpenCV 和 ONNX 运行时实现。

背景

刚开始做工业检测项目时,在网上找了一些现成的yOLO推理库,发现都不怎么好用,性能也一般,并且部署不是很方便,只支持少数几种硬件部署,另外项目需要使用批量检测的功能,网上的一些YOLO推理框架都没有批量推理的功能,于是干脆就自己动手封装一个YOLO推理框架,方便修改优化,可以随时根据需求调整功能或添加功能。

完成基本的目标检测功能后,后面一个月时间,陆陆续续把YOLO所有的功能都完善了,就把代码放到GitHub上面开源了

功能特色

  • 支持所有YOLO任务:目标检测、图片分类、实例分割、姿势估计、OBB
  • 支持多种部署方案:CPU, CUDA / TensorRT, OpenVINO, CoreML, DirectML
  • 可以批量检测图片,性能大幅优于单线程串行执行
  • 图像处理使用OpenCVSharp
  • 推理引擎:ONNX Runtime 是一个跨平台的机器学习模型加速器

示例Demo

Object Detection Image Classification 
bus_detectdet_000000270579 cls_000000063409cls_000000000009

 

Instance Segmentation
res_seg_zidane
res_seg_02

 

 

Pose Estimation
res_pose_01
res_pose_02
OBB Detection
res_obb_01
res_obb_02

 

 

使用示例

1 导出模型为onnx格式

from ultralytics import YOLO# Load a model
model = YOLO('path/to/best.pt')# Export the model to ONNX format
model.export(format='onnx')

2 YoloSharpOnnx初始化

安装Nuget 包YoloSharpOnnx, OnnxRuntime, OpenCvSharp4.runtime

CPU推理

dotnet add package YoloSharpOnnx
dotnet add package OpenCvSharp4.runtime.win
dotnet add package Microsoft.ML.OnnxRuntime
using YoloSharp yolo = new YoloSharp(new ExecutionProviderCPU("yolo11n.onnx"));

CoreML推理

dotnet add package YoloSharpOnnx
dotnet add package OpenCvSharp4.runtime.osx.10.15-x64
dotnet add package Microsoft.ML.OnnxRuntime
using YoloSharp yolo = new YoloSharp(new ExecutionProviderCoreML("yolo11n.onnx"));

CUDA/TensorRT推理

dotnet add package YoloSharpOnnx
dotnet add package OpenCvSharp4.runtime.win
dotnet add package Microsoft.ML.OnnxRuntime.Gpu.Windows
using YoloSharp yolo = new YoloSharp(new ExecutionProviderCUDA("yolo11n.onnx",0));
using YoloSharp yolo = new YoloSharp(new ExecutionProviderTensorRT("yolo11n.onnx",0));

DirectML推理

dotnet add package YoloSharpOnnx
dotnet add package OpenCvSharp4.runtime.win
dotnet add package Microsoft.ML.OnnxRuntime.DirectML
using YoloSharp yolo = new YoloSharp(new ExecutionProviderDirectML("yolo11n.onnx",0));

OpenVINO Inference

dotnet add package YoloSharpOnnx
dotnet add package OpenCvSharp4.runtime.win
dotnet add package Intel.ML.OnnxRuntime.OpenVino
using YoloSharp yolo = new YoloSharp(new ExecutionProviderOpenVINO("yolo11n.onnx", IntelDeviceType.NPU));

 

基本的API,加载模型并进行预测

using Mat image = Cv2.ImRead("bus.jpg");
using YoloSharp yolo = new YoloSharp(new ExecutionProviderCPU("yolo11n.onnx"));List<DetectionResult> res = yolo.RunDetect(image);yolo.DrawDetections(image,res);
Cv2.ImWrite("bus_res.jpg", image);string printString = res.Summary();
Console.WriteLine(printString);

性能测试API

using Mat image = Cv2.ImRead("bus.jpg");using YoloSharp yolo = new YoloSharp(new ExecutionProviderDirectML("yolo11n.onnx",1));
var res = yolo.RunDetectWithTime(item.FullName);Console.WriteLine($"{res.ToString()}, {res.SpeedResult.ToString()}");

配置参数

using Mat image = Cv2.ImRead("bus.jpg");
using YoloSharp yolo = new YoloSharp(new ExecutionProviderCPU("yolo11n.onnx"));
yolo.YoloConfiguration.IoU = 0.4f;
yolo.YoloConfiguration.Confidence = 0.3f;
yolo.YoloConfiguration.ResizeAlgorithm = InterpolationFlags.Linear;
yolo.YoloConfiguration.ImageExtsBatch = [".jpg", ".png"];
var res = yolo.RunDetect(image);

 

批量处理API

private static void TestBatchInfer()
{string modelPath = @"D:\code\model\best.onnx";string dir = @"D:\code\model\TestImages"DirectoryInfo directory = new DirectoryInfo(dir);var files = directory.GetFiles()System.Diagnostics.Stopwatch _stopwatch = new System.Diagnostics.Stopwatch();_stopwatch.Start();int num=files.Length;using (YoloSharp yolo = new YoloSharp(new ExecutionProviderDirectML(modelPath, 0))){var list = yolo.RunBatchDetect(dir,new ProcessCallback(), ReceiveProcess, 30)}_stopwatch.Stop()Console.WriteLine($"detect {num} images, time:{_stopwatch.Elapsed}");}
private static void ReceiveProcess(DetectionBatchResult e)
{string res = e.Results.Summary();
}
internal class ProcessCallback : IBatchProcessCallback
{public void ReceiveProcessResult(DetectionBatchResult e){string res = e.Results.Summary();}
}

 

批量处理Foreach API

private static async Task TestBatchForeachInfer()
{var files = Directory.GetFiles(dir);System.Diagnostics.Stopwatch _stopwatch = new System.Diagnostics.Stopwatch();_stopwatch.Start();int num = files.Length;using (YoloSharp yolo = new YoloSharp(new ExecutionProviderDirectML(modelPath, _deviceId))){yolo.YoloConfiguration.BatchPoolSize = 30;await foreach (var item in yolo.BatchDetectForeachAsync(files.ToList())){Console.WriteLine($"{item.ImagePath} {item.Results.Summary()}");}}_stopwatch.Stop();Console.WriteLine($"detect {num} images, time:{_stopwatch.Elapsed}");
}

 

性能测试

Yolo C# inference libraryVersionImage Processing libraryImage Resize AlgorithmSequence inferenceBatch inference
YoloSharp 6.1.0 SixLabors.ImageSharp 3.1.12 Triangle(Bilinear) support not support
YoloDotNet 4.2.0 SkiaSharp 3.119.1 Linear(Bilinear) support support
YoloSharpOnnx 1.3.3 OpenCvSharp4 4.13.0.20260318 Linear(Bilinear) support support

 

测试工具

YoloOnnxWinform

测试电脑

HardwareSummary
Windows Windows 10 OS Version 19045.6466
CPU AMD Ryzen 7 5800X 8-Core Processor 3.8GHz
RAM DDR4 3200 MHz 32GB
GPU AMD Radeom RX6800 16GB
Storage SSD 2TB

测试数据

Images: 300 images (image size: 2480x3494)

Yolo Model: Yolo11n.onnx InputShape float32[1,3,1280,1280]

Inference Provider: DirectML Inference Microsoft.ML.OnnxRuntime.DirectML 1.24.3

测试结果

Yolo C# inference libraryVersionImage Processing libraryImage Resize AlgorithmSequence inference (Time/Memory)Batch inference (Time/Memory)
YoloSharp 6.1.0 SixLabors.ImageSharp 3.1.12 Triangle(Bilinear) 18.707s, 1374M -
YoloDotNet 4.2.0 SkiaSharp 3.119.1 Linear(Bilinear) 17.665s, 169M 10.587s, 639M
YoloSharpOnnx 1.3.3 OpenCvSharp4 4.13.0.20260318 Linear(Bilinear) 13.693s, 169M 2.980s, 601M

 

后续需要完善的功能

RT-DETR、YoloE、Yolo-World、SAM等检测模型的API开发

 

http://www.zskr.cn/news/1395739.html

相关文章:

  • 无监督语音韵律解耦:Prosody2Vec模型原理与应用实践
  • 3分钟彻底改造macOS光标:用Mousecape打造你的个性化桌面体验
  • 从手动分析到算法自动化:ChanlunX缠论插件如何彻底改变你的技术分析体验
  • 扩散模型在阿尔茨海默病脑影像分析中的应用:从合成数据到个体化疾病热图
  • 基于 SkiaSharp 的 WPF AvaloniaUI 极简动图播放方案
  • 《从 Transformer 矩阵乘法说起:KV Cache 到底是在缓存什么?》
  • 当电子签遇上AI大模型:一场签约效率革命正在发生
  • 异步联邦学习与图神经网络驱动的微服务异常检测实践
  • 告别adb shell input!用Python+uiautomator2写Android自动化脚本,效率翻倍
  • Windows 10/11 上保姆级安装HYSPLIT教程:从下载依赖到配置环境变量,一次搞定大气轨迹分析
  • 26年上半年教育加盟培训机构口碑排行 - 资讯速览
  • Nmap实战精要:从安装避坑到漏洞测绘的渗透测试工作流
  • 2026最新!降AIGC工具测评:论文降重与改写的好帮手
  • STL时间序列分解实战:趋势、季节性与噪声的业务化解读
  • 告别死记硬背:手把手带你用Pytest+Allure重构蓝桥杯自动化测试项目(从Unittest迁移)
  • C# 面向对象:基础概念
  • 告别坐标点击!用Poco精准定位Android App UI控件(附完整代码示例)
  • 多模态大模型技术深度解析:从 CLIP 到 LLaVA 的视觉语言融合原理
  • 车机端实时诊断失效,订单履约中断频发,深度复盘Lovable微服务链路追踪断点及全链路可观测性重构路径
  • CTF逆向爆破实战:C++进程级暴力框架设计与优化
  • 2026年5月遵义地区黄金回收白银铂金回收甄选门店推荐TOP1 地址及联系方式 - 五金回收
  • 从零搭建Python自动化测试环境:手把手教你为蓝桥杯软件测试赛项配置Firefox+WebDriver
  • 告别‘文件被占用’:手把手教你用Process Explorer的搜索功能解决删除难题
  • 告别Steam平台限制:WorkshopDL让你在任何平台都能下载创意工坊模组
  • 上海交大MINT团队提出Evo - Depth:不增硬件负担,兼顾机器人VLA性能与部署效率
  • Qt5中comboBox控件更新列表内容
  • 2026年APP爬虫终极指南:从抓包到签名破解,干翻所有主流反爬
  • 专业的青少年心理咨询排名
  • 当AI成为公司的操作系统:一场两千年来最彻底的组织革命
  • 协调控制柜在微电网中的核心地位:数据枢纽、控制核心、安全屏障