【机器视觉】C# .NET 8 部署yolov9 onnx对象检测

这段代码展示了一个使用YOLOv9进行对象检测的简单测试框架。代码主体以及其功能分为以下几个关键部分:

  1. 创建测试图片数组 _testImages,它包含了图片文件名和对应的标签。使用 buildTests 方法来从给定的文件名中加载图片并调整尺寸,准备测试数据集。

  2. 实现了 DisplayImageWithPredictions 方法,该方法接收一个 System.Drawing.Image 对象和一组YOLO预测结果,使用OpenCvSharp的功能将图像和预测结果可视化。它首先将图像转换为字节数组,然后用Mat对象来绘制对象框和相应的标签。

  3. CheckResult 方法是一个辅助测试的方法,该方法验证预测结果的数量和标签是否符合预期。

  4. Main 方法是程序的入口点,它首先构建测试图片,然后实例化一个 Yolov8 对象用于进行预测(这里可能是代码有误,实际上是YOLOv9模型),对每个测试图片进行预测,展示预测结果,并在控制台输出对象检测框的坐标。

  5. 使用了xUnit的 Assert 方法进行断言验证,这部分通常用于自动化测试确认程序的正确性。但这里注释掉了这部分代码,可能是因为在实际的使用过程中不需要对结果进行断言。

代码展示了如何将YOLO对象检测模型集成到C#应用程序中,并使用OpenCvSharp在窗口中显示检测到的对象。整个程序流程包括加载和处理测试图像、执行模型推理、展示和验证检测结果。不过请注意,代码中有一些小的不一致之处,如 Yolov8 的实例化(YOLOv9 onnx模型)和注释掉的一些测试断言。此外,代码中的一些Yolo类和方法可能来源于特定的库或框架,但没有在代码段中直接给出,因此需要在相应上下文中查找相关的实现。

26040cdb4c45ab46319511ef7687ef57.png

using System; // 使用System命名空间,包含基础类和基本输入输出
using System.Diagnostics; // 使用System.Diagnostics命名空间,提供调试输出和性能测试等功能
using System.Drawing; // 使用System.Drawing命名空间,支持图形界面绘制
using System.Drawing.Imaging; // 使用System.Drawing.Imaging,支持高级GDI+图形功能
using Xunit; // 使用Xunit命名空间,是单元测试的框架
using Yolov7net; // 使用Yolov7net命名空间,可能是YOLO的一个.NET实现(源代码中实际为Yolov8,可能存在误导)
using Yolov7net.Extentions; // 使用Yolov7net的扩展名空间,可能包含一些额外的方法
using OpenCvSharp; // 使用OpenCvSharp库,它是OpenCV的C#语言封装// 定义yolov9_det_opencvsharp命名空间
namespace yolov9_det_opencvsharp
{// 定义Program类internal class Program{// 声明测试用的图片数组public  static (Image image, string label)[] _testImages;// 定义buildTests方法,用以构建测试图片public static void  buildTests(){// 声明测试图片文件名及对应标签的数组var testFiles = new (string fileName, string label)[]{("demo.jpg", "dog"),("cat_224x224.jpg", "cat"),("1.jpeg",""),("2.png","")};// 基于提供的测试文件构建测试图片数组,包括图片和标签var array = new (Image image, string label)[testFiles.Length];// var array = new (Image image, string label)[testFiles.Length * 2];int i = 0;foreach (var tuple in testFiles){// 从Assets文件夹加载图片var image = Image.FromFile("Assets/" + tuple.fileName);//array[i++] = (image, tuple.label);// 调整图片大小为640x640image = Utils.ResizeImage(image, 640, 640);// 添加到数组中array[i++] = (image, tuple.label);}// 将数组赋值给类的静态成员变量_testImages = array;}// 定义DisplayImageWithPredictions方法,用于展示带预测框的图片public static void DisplayImageWithPredictions(Image image, List<YoloPrediction> predictions){// 将System.Drawing.Image转换为字节数组byte[] imageBytes;using (var ms = new MemoryStream()){image.Save(ms, ImageFormat.Bmp);imageBytes = ms.ToArray();}// 使用OpenCVSharp从字节数组创建Mat对象Mat mat = Mat.FromImageData(imageBytes, ImreadModes.Color);// 遍历预测结果,在图像上绘制矩形框和标签foreach (var prediction in predictions){// 绘制预测框Cv2.Rectangle(mat,new OpenCvSharp.Point(prediction.Rectangle.Left, prediction.Rectangle.Top),new OpenCvSharp.Point(prediction.Rectangle.Right, prediction.Rectangle.Bottom),Scalar.Red, 2);// 绘制标签和得分string labelText = $"{prediction.Label.Name} ({prediction.Score:P})";int baseLine;// 获取标签文本的尺寸var labelSize = Cv2.GetTextSize(labelText, HersheyFonts.HersheySimplex, 0.5, 1, out baseLine);// 在图形上添加文本Cv2.PutText(mat, labelText,new OpenCvSharp.Point(prediction.Rectangle.Left, prediction.Rectangle.Top + labelSize.Height + baseLine),HersheyFonts.HersheySimplex, 0.5, Scalar.Yellow, 1);}// 使用OpenCVSharp在新窗口显示带预测结果的图片using (new Window("Image Display", mat, WindowFlags.AutoSize)){Cv2.WaitKey(2000); // 显示图像2000毫秒,然后继续执行//Cv2.DestroyAllWindows(); // 关闭所有OpenCV窗口}}// 定义CheckResult方法,用于断言预测结果的对错public static  void CheckResult(List<YoloPrediction> predictions, string label){// 断言预测结果非空Assert.NotNull(predictions);// 断言只有一个预测结果Assert.Equal(1, predictions.Count);//Assert.Equal(label, predictions[0].Label.Name);// 打印第一个预测结果的矩形坐标Console.WriteLine(predictions[0].Rectangle);}// 定义程序的主入口点Main方法static void Main(string[] args){// 构建测试图片buildTests();// using var yolo = new Yolov7("./assets/yolov7-tiny.onnx", true); //yolov7 模型,不需要 nms 操作// 使用yolov9-c.onnx创建YOLO模型实例,并启用nms操作using var yolo = new Yolov8("./assets/yolov9-c.onnx", true);// 设置YOLO模型的默认类别标签yolo.SetupYoloDefaultLabels();// 遍历测试图片foreach (var tuple in _testImages){// 对每张图片进行预测List<YoloPrediction> ret = yolo.Predict(tuple.image);//CheckResult(ret, tuple.label);// 输出预测结果的矩形坐标Console.WriteLine(ret[0].Rectangle);// 显示带预测框的图片DisplayImageWithPredictions(tuple.image,ret);}// 等待用户输入,程序暂停Console.ReadLine();}}
}

这段代码定义了一个使用YOLOv9模型进行对象检测的控制台应用程序。它主要执行以下步骤:

  1. buildTests 函数初始化了一个测试图片数组 _testImages,包含图片文件名和对应的标签。

  2. DisplayImageWithPredictions 函数接收一个 Image 对象和一个 YoloPrediction 列表,用OpenCVSharp将图片显示出来,并在图片上绘制检测到的对象的边界框和预测标签。

  3. CheckResult 函数对预测结果进行断言以确保正确性,这通常在测试环境下使用。

  4. Main 方法是程序的入口点,它构建测试数据,初始化YOLO模型,运行模型进行预测,并使用 DisplayImageWithPredictions 方法来展示结果。

代码中使用了Yolov7net库。程序的主要作用是进行图像处理和对象识别,并输出识别结果到控制台和图形界面展示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/833750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux数据备份与恢复

目录 前言 1、数据备份和恢复中的两个关键性指标 2、linux系统的定时任务 1&#xff09;本地定时任务crontab 在实验测试过程中&#xff0c;遇到多次crontab任务不执行问题 &#xff0c;总结下来主要有几个方面原因&#xff1a; 2)分布式定时任务系统Jenkins 3、备份存储…

如何用二维码实现现代仓库管理?(附详细实现过程)

简道云团队曾参与过近300企业的仓库管理软件的部署&#xff0c;要想知道如何实现用二维码管理仓库&#xff0c;首先要对整体流程有清晰的框架&#xff01; 1、产品数据的录入2、设计电子库存卡3、库存盘点单4、库存盘点报表 总结一下就是——数卡单表&#xff0c;四步实现&…

补一 继承的使用

继承的关键词为extends 模型为 public class 子类 extends 父类

中国热门高端dating约会交友软件有哪些?国内权威Dating App红黑排行榜推荐

在dating 软件刷了无数个男人后终于脱单啦&#xff0c;跟大家分享一些我的个人感受 1、二狗 颜值⭐️⭐️⭐️ 真实性 ⭐️⭐️⭐️⭐️⭐️ 用户质量⭐️⭐️⭐️⭐️ ⭕️优点&#xff1a;整体用户质量较高&#xff0c;用户集中在金融、互联网和体制内行业。用户需进行学历、…

速来get!多微信聚合聊天功能大揭秘!

随着网络时代的发展&#xff0c;微信成为了职场中不可或缺的沟通工具&#xff0c;很多人都有着多个微信号&#xff0c;而要想高效管理这些账号&#xff0c;那就少不了工具的帮忙。 通过微信管理系统&#xff0c;可以轻松实现多个微信号聚合聊天&#xff0c;提高沟通效率。 1、…

抓取Google时被屏蔽怎么办?如何避免?

在当今数字化时代&#xff0c;数据采集和网络爬取已成为许多企业和个人必不可少的业务活动。对于爬取搜索引擎数据&#xff0c;特别是Google&#xff0c;使用代理IP是常见的手段。然而&#xff0c;使用代理抓取Google并不是一件轻松的事情&#xff0c;有许多常见的误区可能会导…

顶顶通呼叫中心中间件电话黑名单系统介绍

黑名单 有显示成功和失败导入数&#xff0c;可以禁用也可以启用&#xff0c;如果禁用状态就是不使用这一组黑名单&#xff0c;多个号码核验就是验证号码存不存在。黑名单只有管理员和操作员可以配置&#xff0c;租户是看不到黑名单的。但是黑名单跟租户是互通的。 可以单个号码…

【智能算法应用】基于麻雀搜索算法的二维最大熵图像阈值分割

目录 1.算法原理2.数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及实现 2.数学模型 最大熵法是由 Kapur 于 1985 年所提出的&#xff0c; 该方法的阈值选取标准取决于图像中最大化分 割的目标区域和背景区域…

STM32F1#1(入门了解)

一、STM32开发平台和工具 1.1 STM32芯片介绍 典型微控制器由CPU&#xff08;运算器、控制器&#xff09;、RAM、ROM和输入输出组成。 1.2 STM32核心板 STM32核心板配件&#xff1a; ①JTAG/SWD仿真-下载器 ②通信-下载模块 ③OLED显示屏 1&#xff09; 通信-下载模…

spring的高阶使用技巧1——ApplicationListener注册监听器的使用

Spring中的监听器&#xff0c;高阶开发工作者应该都耳熟能详。在 Spring 框架中&#xff0c;这个接口允许开发者注册监听器来监听应用程序中发布的事件。Spring的事件处理机制提供了一种观察者模式的实现&#xff0c;允许应用程序组件之间进行松耦合的通信。 更详细的介绍和使…

海外市场成 ISV 新掘金地?生成式 AI 如何加速业务创新实践?Zilliz 有话说

期望了解 Zilliz 最新动态&#xff1f;想要与 Zilliz 线下探讨 AI 时代向量数据库的全球化布局思考及典型实践&#xff1f; 机会来啦&#xff01;5 月 10 日&#xff0c;Zilliz 将闪现亚马逊云科技的两场活动现场&#xff08;苏州、西安&#xff09;&#xff0c;与大家共话行业…

Ubuntu将软件图标添加到应用列表

一.简介snap snap和yum&#xff0c;apt一样都是安装包工具&#xff0c;但是snap里的软件源是自动更新到最新版本&#xff0c;最好用 比如Ubuntu的软件商城就是使用的snap软件包 二. Ubuntu软件商城更新 1.ps -ef | grep snap-store 查询并kill snap-store的所有进程 2.sudo …

【仪酷LabVIEW AI工具包案例】使用LabVIEW AI工具包+YOLOv5结合Dobot机械臂实现智能垃圾分类

‍‍&#x1f3e1;博客主页&#xff1a; virobotics(仪酷智能)&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f384;所属专栏&#xff1a;『仪酷LabVIEW AI工具包案例』 &#x1f4d1;上期文章&#xff1a;『【YOLOv9】实战二&#xff1a;手把手教你使用TensorRT实现YOLOv…

C++之STL-priority_queue和仿函数的讲解

目录 一、priority_queue的介绍和使用 1.1 priority_queue的介绍 1.2 priority_queue的基本接口 二、仿函数的介绍 2.1 基本概念 2.2 适用场景 三、模拟实现priority_queue 3.1 向上调整算法 3.2 向下调整算法 3.3 整体框架 一、priority_queue的介绍和使用 1.1 prio…

基于卷积神经网络的一维信号降噪(简单版,MATLAB)

简单演示一下基于卷积神经网络的一维信号降噪&#xff0c;有个大致印象即可。 %% Plot the previous training CNN. set_plot_defaults(on) load(denoiser_sparse.mat); h1{1} double(conv1); h1{2} double(conv2); h1{3} reshape(double(conv3),[8,1,17]); figure(1) [r,c…

Java_异常

介绍 编译时异常&#xff1a; 除RuntimeException和他的子类&#xff0c;其他都是编译时异常。编译阶段需要进行处理&#xff0c;作用在于提醒程序眼 运行时异常&#xff1a; RuntimeException本身和其所有子类&#xff0c;都是运行时异常。编译阶段不报错&#xff0c;是程序…

Java17 --- SpringCloud之Nacos

目录 一、下载nacos并运行 1.1、创建9001微服务作为提供者 1.2、创建80微服务作为消费者 二、naocs配置中心规则与动态刷新 2.1、创建3377微服务 2.2、在nacos中创建配置文件 三、nacos数据模型之Namespace-Group-Datald 3.1、DatalD方案 3.2、Group方案 3.3、Name…

python软件开发遇到的坑-相对路径文件读写异常,不稳定

1. os.chdir()会影响那些使用相对路径读写文件的程序&#xff0c;使其变得不稳定&#xff0c;默认情况下&#xff0c;当前工作目录是主程序所在目录&#xff0c;使用os.chdir会将当前工作目录修改到其他路径。 资料&#xff1a; python相对路径写对了却报错是什么原因呢&#…

蜜蜂收卡系统 加油卡充值卡礼品卡自定义回收系统源码 前后端开源uniapp可打包app

本文来自&#xff1a;蜜蜂收卡系统 加油卡充值卡礼品卡自定义回收系统源码 前后端开源uniapp可打包app - 源码1688 卡券绿色循环计划—— 一项旨在构建卡券价值再利用生态的社会责任感项目。在当前数字化消费日益普及的背景下&#xff0c;大量礼品卡、优惠券因各种原因未能有效…