C# 玩转 YOLOv8 目标检测:ONNX Runtime + DirectML 推理 DLL,图片、视频、RTSP、摄像头全打通
文章目录前言先上效果整体架构接口设计这次不用 JSON用结构体数组C# 集成实战1. P/Invoke 声明2. 图片检测五行代码3. 视频检测统一接口三种输入4. 批量处理与循环测速性能实测与调优建议测试环境性能数据调优建议常见问题与解决方案1. 模型加载失败2. GPU 加速未生效3. 视频流卡顿4. 内存泄漏总结 下载与使用资源下载前言上一篇聊OCR 推理 DLL这篇轮到另一个高频需求目标检测。YOLOv8 的官方生态是 PythonUltralytics但做 Windows 桌面软件的朋友都懂给客户交付一个带 Python 环境的检测工具部署就是噩梦。所以我的做法和 OCR 系列一脉相承C 把 YOLOv8 推理、NMS 后处理、视频解码全部封进一个 DLLC# 只面对一组干净的 C 接口。先列成果图片检测一行调用结果直接返回结构体数组不是 JSON零解析开销视频检测本地视频、RTSP 网络流、USB 摄像头同一个接口GPU 加速DirectML 后端NVIDIA / AMD / Intel 核显通吃失败自动回退 CPU程序永远不崩录像功能检测框实时画到帧上直接写出 MP4三段耗时预处理 / 推理 / 后处理分开统计性能瓶颈一目了然配套 WinForm 测试程序单图、批量文件夹、视频、摄像头四种模式 循环测速。先上效果软件界面长这样——左侧模型加载、推理参数、四种检测模式右侧预览区 结果列表用经典的 bus.jpg 实测一把yolov8n置信度 0.25NMS 0.45检测到5 个目标4 个 person 1 个 bus状态栏直接给出三段耗时检测到 5 个目标, 总耗时 87 ms (预处理 2.7 / 推理 77.5 / 后处理 0.5 ms)结果列表同步输出每个框的类别、置信度和坐标类别置信度位置 (x, y) w×hperson0.890(670, 380) 139x439person0.883(221, 407) 132x448person0.878(55, 397) 192x408bus0.543(21, 229) 806x685person0.436(0, 549) 57x210注意右边缘那个只露出半个人、置信度 0.436 的 person 也框出来了——NMS 和置信度阈值调得合适召回就有保障。耗时数据为测试机实测界面已勾选 GPU 加速不同机器、不同分辨率会有差异建议用自己的业务图跑界面上的循环测速功能取平均值。视频模式同样实测通过本地 MP4 逐帧检测 实时画框预览 录像写出一段带检测框的成品视频直接生成中途不需要任何额外工具。逐帧检测会根据视频帧率自动调整整体架构┌─────────────────────────────────────────────┐ │ C# 应用层WinForm / 控制台 / 服务 │ │ - 图片/视频/摄像头/RTSP 四种输入模式 │ │ - 检测框绘制、结果列表、CSV 导出、录像 │ │ - 批量处理、循环测速 │ └──────────────┬──────────────────────────────┘ │ P/Invoke一组 Yolo* C 接口 ┌──────────────▼──────────────────────────────┐ │ 原生 YOLO 推理 DLLCx64 Release │ │ - ONNX RuntimeYOLOv8 推理 │ │ - DirectMLGPU 加速失败自动回退 CPU │ │ - 预处理 / NMS 后处理 / 三段耗时统计 │ │ - 视频解码本地文件 / RTSP / 摄像头 │ │ - 带框录像写出 │ └──────────────┬──────────────────────────────┘ │ ┌──────────────▼──────────────────────────────┐ │ 模型yolov8n.onnxCOCO 80 类 │ │ 输入 [1,3,640,640] → 输出 [1,84,8400] │ └─────────────────────────────────────────────┘接口设计这次不用 JSON用结构体数组OCR 项目里结果是像素进、JSON 出。但目标检测的场景不同视频流 30 FPS每帧几十上百个框如果每帧都走一遍 JSON 序列化 反序列化纯属浪费。所以这个 DLL 换了个思路结果直接返回可 blit 的结构体数组P/Invoke 一层内存拷贝直达 C#零解析、零分配[StructLayout(LayoutKind.Sequential)]publicstructYoloBox{publicfloatX;publicfloatY;publicfloatWidth;publicfloatHeight;publicfloatConfidence;publicintClassId;}整个 API 分四组一目了然分组接口作用会话YoloCreate/YoloDestroy/YoloIsGpu/YoloGetLastError加载模型、释放、查询是否 GPU、取错误信息图片YoloDetectFile/YoloDetectBytes从文件路径 / 内存字节检测信息YoloGetClassCount/YoloGetLastImageWidth/Height/YoloGetLastTiming类别数、原图尺寸、三段耗时视频YoloVideoOpen/YoloVideoReadDetect(Raw)/YoloVideoSeekToMs/YoloVideoSave*/YoloVideoClose打开视频源、逐帧检测、跳帧、录像、关闭几个设计细节值得单独说1. GPU 失败自动回退 CPU。YoloCreate传useGpu1时尝试 DirectML驱动不支持、设备不可用都无所谓——引擎内部静默回落 CPU会话照常创建。YoloIsGpu可以随时查询当前实际在用什么跑。界面上直接显示[GPU 加速]或[CPU]用户心里有数。2. 错误信息统一出口。所有函数失败返回 -1 或 NULL具体原因调YoloGetLastError拿。它甚至支持传 NULL 句柄——专门用来取YoloCreate失败的原因。3. 三段耗时分开统计。YoloGetLastTiming返回预处理 / 推理 / 后处理各自的毫秒数。调优时一眼看出瓶颈在推理还是在预处理不用猜。C# 集成实战1. P/Invoke 声明internalstaticclassYoloNative{privateconststringDllNameOnnxRuntimeYOLODll.dll;[DllImport(DllName,CallingConventionCallingConvention.Cdecl)]publicstaticexternIntPtrYoloCreate([MarshalAs(UnmanagedType.LPUTF8Str)]stringmodelPath,intinputSize,intcpuThreads,intuseGpu);[DllImport(DllName,CallingConventionCallingConvention.Cdecl)]publicstaticexternintYoloDetectFile(IntPtrhandle,[MarshalAs(UnmanagedType.LPUTF8Str)]stringimagePath,floatconfThreshold,floatnmsThreshold,[Out]YoloBox[]outBoxes,intmaxBoxes);[DllImport(DllName,CallingConventionCallingConvention.Cdecl)]publicstaticexternvoidYoloGetLastTiming(IntPtrhandle,outfloatpreprocessMs,outfloatinferenceMs,outfloatpostprocessMs);[DllImport(DllName,CallingConventionCallingConvention.Cdecl)]publicstaticexternvoidYoloDestroy(IntPtrhandle);}注意路径参数用[MarshalAs(UnmanagedType.LPUTF8Str)]——UTF-8 编码传字符串中文路径不会乱码。这是 .NET Framework 4.7 才有的特性比老派的byte[]手写编码干净得多。2. 图片检测五行代码// 创建会话模型只加载一次IntPtrsessionYoloNative.YoloCreate(models/yolov8n.onnx,inputSize:0,// 0 自动读模型输入尺寸cpuThreads:4,// CPU 线程数useGpu:1);// 1 尝试 GPU失败回退 CPUif(sessionIntPtr.Zero){stringerrorYoloNative.YoloGetLastError(IntPtr.Zero);MessageBox.Show($模型加载失败{error});return;}// 准备结果数组YoloBox[]boxesnewYoloBox[100];// 预分配避免每帧 new// 执行检测intboxCountYoloNative.YoloDetectFile(session,imagePath:test.jpg,confThreshold:0.25f,nmsThreshold:0.45f,outBoxes:boxes,maxBoxes:boxes.Length);// 取耗时YoloNative.YoloGetLastTiming(session,outfloatpreprocessMs,outfloatinferenceMs,outfloatpostprocessMs);// 处理结果for(inti0;iboxCount;i){YoloBoxboxboxes[i];Console.WriteLine(${box.ClassId}:{box.Confidence:F3}$({box.X:F0},{box.Y:F0}){box.Width:F0}x{box.Height:F0});}// 释放会话程序退出时YoloNative.YoloDestroy(session);3. 视频检测统一接口三种输入视频接口设计成打开 → 循环读帧检测 → 关闭的模式本地文件、RTSP、USB 摄像头三种输入走同一套 API// 打开视频源参数二选一// 本地文件YoloNative.YoloVideoOpen(session, video.mp4, 0, 0, 0)// RTSP流YoloNative.YoloVideoOpen(session, rtsp://192.168.1.100:554/stream, 0, 0, 0)// 摄像头YoloNative.YoloVideoOpen(session, 0, width, height, fps) // 0默认摄像头IntPtrvideoHandleYoloNative.YoloVideoOpen(session,video.mp4,0,0,0);if(videoHandleIntPtr.Zero){stringerrorYoloNative.YoloGetLastError(session);MessageBox.Show($视频打开失败{error});return;}// 准备录像可选YoloNative.YoloVideoSaveStart(videoHandle,output_with_boxes.mp4);// 循环读帧检测while(true){intresultYoloNative.YoloVideoReadDetect(videoHandle,confThreshold:0.25f,nmsThreshold:0.45f,outBoxes:boxes,maxBoxes:boxes.Length,outWidth:outintframeWidth,outHeight:outintframeHeight);if(result0)// 0 表示结束或出错break;intboxCountresult;// 这里可以绘制检测框到 frameWidth×frameHeight 的图片上// 或者直接让引擎画框并录像YoloNative.YoloVideoSaveFrame(videoHandle);// 保存当前帧带框}// 关闭录像并释放视频句柄YoloNative.YoloVideoSaveEnd(videoHandle);YoloNative.YoloVideoClose(videoHandle);4. 批量处理与循环测速WinForm 测试程序提供了文件夹批量检测和循环测速功能方便评估模型在实际业务数据上的性能// 批量处理文件夹内所有图片string[]imageFilesDirectory.GetFiles(test_images,*.jpg);foreach(stringimagePathinimageFiles){intboxCountYoloNative.YoloDetectFile(session,imagePath,0.25f,0.45f,boxes,boxes.Length);// 保存结果到 CSV 或数据库}// 循环测速预热 正式测试YoloNative.YoloGetLastTiming(session,out_,out_,out_);// 预热一次inttestCount100;longtotalMs0;for(inti0;itestCount;i){StopwatchswStopwatch.StartNew();YoloNative.YoloDetectFile(session,test.jpg,0.25f,0.45f,boxes,boxes.Length);sw.Stop();totalMssw.ElapsedMilliseconds;}doubleavgMstotalMs/(double)testCount;Console.WriteLine($平均耗时{avgMs:F2}msFPS{1000.0/avgMs:F1});性能实测与调优建议测试环境CPUIntel i7-12700HGPUNVIDIA RTX 3060内存32GB系统Windows 10 22H2模型yolov8n.onnx (640×640)性能数据输入类型分辨率平均总耗时预处理推理后处理FPS单张图片1920×108087 ms2.7 ms77.5 ms0.5 ms11.5视频流1280×72042 ms1.8 ms38.2 ms0.4 ms23.8摄像头640×48028 ms1.2 ms25.1 ms0.3 ms35.7调优建议输入尺寸模型默认 640×640如果业务场景目标较大可尝试 320×320 提升速度召回率会下降。置信度阈值默认 0.25业务场景目标明确可提高到 0.5-0.7 减少误检。NMS 阈值默认 0.45密集目标场景可适当降低到 0.3-0.4。CPU 线程数默认 4根据 CPU 核心数调整一般设为物理核心数。批处理对图片批量检测DLL 内部支持批处理比单张循环快 30%-50%。常见问题与解决方案1. 模型加载失败错误信息Failed to load model可能原因模型路径错误、ONNX 文件损坏、DirectML 驱动问题解决方案检查模型路径是否包含中文或特殊字符使用 Netron 打开 ONNX 文件确认格式正确更新显卡驱动到最新版本2. GPU 加速未生效现象YoloIsGpu(session)返回 0可能原因DirectML 不支持当前显卡、驱动版本过旧、显存不足解决方案检查显卡是否支持 DirectMLWindows 10 1709 基本都支持更新显卡驱动降低模型输入尺寸减少显存占用3. 视频流卡顿现象RTSP 流检测帧率低可能原因网络带宽不足、解码器性能瓶颈、检测耗时过长解决方案降低视频流分辨率跳帧检测每 2-3 帧检测一次使用硬件解码需要编译时开启 FFmpeg 硬件解码支持4. 内存泄漏现象长时间运行后内存持续增长可能原因未正确释放会话或视频句柄解决方案确保每个YoloCreate都有对应的YoloDestroy确保每个YoloVideoOpen都有对应的YoloVideoClose使用using语句包装会话对象总结通过 C 封装 YOLOv8 推理为 DLLC# 通过 P/Invoke 调用我们实现了高性能结构体数组零解析开销纯绿色绿色拷贝不装 Python、不装 CUDA、不装任何运行时环境开箱可用 下载与使用资源下载本项目所有资源均已打包包含推理 DLLOnnxRuntimeYOLODll.dllx64 ReleaseC# 示例代码完整的 WinForm 测试程序源码预训练模型yolov8n.onnxCOCO 80 类测试图片与视频bus.jpg 等示例文件合规方面项目里专门维护了licenses目录下载地址 百度网盘

相关新闻

绝缘类型深度解析:从基础绝缘到系统安全设计实战指南

绝缘类型深度解析:从基础绝缘到系统安全设计实战指南

1. 绝缘材料:从“隔电”到“系统守护”的本质跃迁提起“绝缘”,很多人的第一反应可能就是“不导电”,是电工胶带、是电线外皮那层塑料。这个理解没错,但太浅了。在我十多年的电气工程和电子设备维修经历里,对绝缘的认知…

2026/7/29 9:26:16 阅读更多 →
DIY生态舱CO2监测:NDIR传感器选型、Arduino集成与智能控制

DIY生态舱CO2监测:NDIR传感器选型、Arduino集成与智能控制

1. 项目概述与核心价值 最近在折腾我的“DIY海盗船”项目,这个系列已经更新到第八话了。之前我们搞定了温湿度监控、光照调节、水泵控制这些基础环境模块,让这个模拟的小生态舱运行得挺稳当。但玩久了总觉得还差点意思——舱内植物生长状态时好时坏&…

2026/7/29 9:25:16 阅读更多 →
UE5输入系统进阶:自定义与监听实现按键重映射与复合操作

UE5输入系统进阶:自定义与监听实现按键重映射与复合操作

1. 项目概述:从“按按钮”到“玩转输入”在虚幻引擎5(UE5)里鼓捣过一阵子蓝图的朋友,估计都干过这么一件事:从角色蓝图的“事件图表”里,拖出一个“事件Tick”,然后连上一个“输入动作”事件&am…

2026/7/29 9:25:16 阅读更多 →

最新新闻

Postman变量管理全攻略:多环境切换与敏感信息安全实践

Postman变量管理全攻略:多环境切换与敏感信息安全实践

1. 项目概述:为什么我们需要管理Postman变量? 如果你经常用Postman做接口测试或调试API,肯定遇到过这样的场景:开发环境、测试环境、生产环境的接口地址前缀不一样,每次切换都要手动改一遍URL,麻烦不说&…

2026/7/29 9:35:19 阅读更多 →
重选分选核心机理:密度差与沉降速度差,决定选矿工艺路线

重选分选核心机理:密度差与沉降速度差,决定选矿工艺路线

重选是钨、锡、黄金、锰、钛、重晶石等金属及非金属矿物应用广泛的传统分选工艺。依靠纯物理分选方式,具备绿色低耗、运行成本低、物料适应性广等突出优势。 整套重选体系底层逻辑清晰:矿物密度差是分选的内在根本条件,颗粒沉降速度差是实现有…

2026/7/29 9:35:19 阅读更多 →
2026年实盘交易避坑指南:ETF仓位增强策略与合规券商甄别指南

2026年实盘交易避坑指南:ETF仓位增强策略与合规券商甄别指南

2026年实盘交易避坑指南:ETF仓位增强策略与合规券商甄别指南 引言:38万亿公募时代,实盘交易逻辑的彻底重构 2026年,中国资产管理行业迎来了历史性的里程碑。据最新监管数据显示,截至2026年二季度末,我国公募…

2026/7/29 9:35:19 阅读更多 →
从零DIY智能感应灯:嵌入式入门实践与状态机编程解析

从零DIY智能感应灯:嵌入式入门实践与状态机编程解析

1. 项目概述:从“灯”到“智能感知”的跨越 今天我们来聊聊一个听起来简单,但背后门道不少的DIY项目——感应灯。你可能在楼道、衣柜或者卫生间里都见过它,人一靠近就亮,离开就灭,省心又省电。但如果你以为这只是一个简…

2026/7/29 9:35:19 阅读更多 →
Claude 5系统提示词削减:AI编程助手上下文工程新范式

Claude 5系统提示词削减:AI编程助手上下文工程新范式

如果你最近在使用 Claude Code 或其他基于 Claude 模型的编程助手,可能会发现一个明显变化:提示词变短了,但回答质量反而更精准了。这不是错觉,而是 Anthropic 在 Claude 5 系列模型中实施的一项重要变革——大幅削减系统提示词&a…

2026/7/29 9:35:19 阅读更多 →
2026萌新联赛第二场--(河南农业大学)

2026萌新联赛第二场--(河南农业大学)

2026萌新联赛第二场(河南农业大学)补题总结 你的心有一道墙 但我发现一扇窗 偶尔透出一丝暖暖的微光 就算你有一道墙 我的爱会攀上窗台盛放 打开窗你会看到悲伤融化 这时候林俊杰就有疑问了 ? 本场预测难度划分为: easy&#xf…

2026/7/29 9:34:18 阅读更多 →

日新闻

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻