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

学习C#调用Microsoft.ML.OnnxRuntime+OpenCvSharp+YOLO26进行目标检测的基本用法

使用ultralytics库将YOLO26模型文件yolo26m.pt转换为onnx格式的模型文件,然后调用Microsoft.ML.OnnxRuntime获取模型信息,如下图所示:

yolo26m.onnx模型的输入形状与yolo5相同,但输出形状变成了[1,300,6],第一维还是代表一次处理的图片数量,第二维为预测框的总数量,也即每张图片的预测结果数量,第三维为每个预测框的特征向量长度,由于YOLO26采用端到端无NMS推理,直接输出最终检测结果,因此第三维的长度急剧减少,主要包括x1, y1, x2, y2, confidence, class_id等6个值,前4个值为预测框的左上角和右下角坐标,confidence为置信度分数,class_id为COCO类别的索引值。
基于之前调用Microsoft.ML.OnnxRuntime+OpenCvSharp+YOLO5的源码,调整模型预测结果的后处理函数及坐标变换函数逻辑如下:

public(intx,inty,intw,inth)ScaleCoordinatesOfYolo26(floatxl,floatyl,floatxr,floatyr,intoriginalWidth,intoriginalHeight,intinputSize=640){// 计算缩放比例floatscale=Math.Min((float)inputSize/originalWidth,(float)inputSize/originalHeight);// 计算填充尺寸intpadX=(int)((inputSize-originalWidth*scale)/2);intpadY=(int)((inputSize-originalHeight*scale)/2);// 映射回原始图像坐标intscaledX=(int)((xl-padX)/scale);intscaledY=(int)((yl-padY)/scale);intscaledW=(int)((xr-xl)/scale);intscaledH=(int)((yr-yl)/scale);return(scaledX,scaledY,scaledW,scaledH);}publicList<DetectionResult>ProcessDetectionsOfYolo26(DenseTensor<float>output,intoriginalWidth,intoriginalHeight,floatconfidenceThreshold=0.8f){vardetections=newList<DetectionResult>();// 解析输出张量 (1, 300, 6) - 假设80个类别intnumDetections=output.Dimensions[1];for(inti=0;i<numDetections;i++){// 提取对象置信度floatobjectConfidence=output[0,i,4];// 获取最高概率类别intclassId=Convert.ToInt32(output[0,i,5]);if(objectConfidence>confidenceThreshold){// 提取边界框坐标floatpXl=output[0,i,0];floatpYl=output[0,i,1];floatpXr=output[0,i,2];floatpYr=output[0,i,3];// 映射回原始图像坐标var(x,y,w,h)=ScaleCoordinatesOfYolo26(pXl,pYl,pXr,pYr,originalWidth,originalHeight);// 创建边界框RectboundingBox=newRect(x,y,w,h);detections.Add(newDetectionResult{ClassId=classId,Label=CocoLabels[classId],Confidence=objectConfidence,BoundingBox=boundingBox,OriginalCoordinates=(x,y,w,h)});}}returndetections;}

最后是程序运行效果,如下图所示:

参考文献:
[1]https://docs.ultralytics.com/zh/models/yolo26/

http://www.jsqmd.com/news/557145/

相关文章:

  • PCB打样总是延误?试试捷配PCB制作,又快又稳
  • 保姆级教程:用Ganache+Remix+web3.js在本地测试网部署你的第一个智能合约(附完整代码)
  • Flux2 Klein动漫转写实:零基础ComfyUI工作流部署与使用
  • TAICHI-flet完全使用指南:从环境搭建到高级优化的全方位解决方案
  • Axure RP 11本地化完全指南:3步打造专属语言界面
  • 关于 nginx 的一些技术知识
  • Xilinx Video IP(六)——AXI4-Lite与AXIS接口在Video Test Pattern Generator中的实战解析
  • Path of Building终极指南:打造流放之路最强角色构建的完整教程
  • [Java]为什么所有线程都要复制一份工作内存,这不会占用很多内存空间吗,不能对主内存进行备份吗?
  • S2-Pro模型精调实战:使用自定义数据提升垂直领域表现
  • 企业级CV应用开发终极指南:Azure云平台部署computervision-recipes全流程解析
  • 生信分析必备:用TBtools打造高颜值热图的5个隐藏技巧
  • PySceneDetect技术选型指南与实战优化:从原理到场景化落地
  • GLM-TTS快速开始:无需代码基础,浏览器打开就能玩转AI语音
  • 5大场景深度解析:NTFS-3G如何成为跨平台文件访问的瑞士军刀
  • nomic-embed-text-v2-moe完整指南:支持Apache License 2.0商用合规说明
  • 万物识别-中文镜像步骤详解:从镜像pull到浏览器验证的12个关键节点
  • SDMatte镜像多实例部署:K8s StatefulSet+共享存储模型目录
  • Seelen-UI插件系统全解析:打造个性化Windows桌面体验
  • 华三模拟器实战:多路由器DHCP地址池配置与客户端自动获取
  • 突破限制:跨平台VMware macOS虚拟机部署全指南——非苹果硬件的macOS体验方案
  • 3分钟构建AI视频生成系统:从零到一的自动化视频创作指南
  • opencode配置本地模型
  • 古建筑三维重建必备:OpenHeritage3D激光雷达数据下载全攻略(附文化遗产项目案例)
  • 如何在5分钟内用WPS-Zotero插件实现高效文献管理
  • Qwen2.5-7B-Instruct航空航天应用:技术文档+测试大纲+风险评估生成
  • 基于carsim Simulink联合仿真和预瞄PID算法的轨迹跟踪模型】车辆路径跟踪包括主车...
  • Jenkins文件上传路径优化:利用SSH Servers实现多环境自动部署(实战案例)
  • 终极OBS Studio直播软件指南:5步打造专业级智能直播系统
  • 阿里开源MGeo地址匹配:零基础3步搭建,开箱即用