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

ops/2024/9/24 8:06:00/

这段代码展示了一个使用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.ppmy.cn/ops/33073.html

相关文章

【算法】递归

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、汉诺塔二、合并两个升序链表三、反转链表四、两两交换链表的结点五、Pow(x, n)总结 引言 通过递归的…

Unity 性能优化之数据面板(Statistics)(一)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、unity 统计数据面板&#xff08;Statistics&#xff09;1.Audio属性2.Graphics属性 二、什么是Draw Call&#xff1f;三、Unity3D stats也可以通过代…

小程序开发中遇到主包过大无法真机调试怎么解决

主包过大可能跟图片&#xff0c;音频&#xff0c;视频的大小数量有关 解决办法&#xff1a;可以让UI设计师帮忙压缩一下图片&#xff0c;也可以使用一些其他压缩软件进行压缩处理。这里推荐我常用的一个种 TinyPNG – Compress WebP, PNG and JPEG images intelligently。也可…

WPF之XmlDataProvider使用

1&#xff0c;WPF XAML支持数据提供&#xff08;DataProvider&#xff09;&#xff0c;但其提供的数据只供查看不可进行修改&#xff0c;删除&#xff0c;添加等。 数据提供者都继承自System.Windows.DataSourceProvider类&#xff0c;目前&#xff0c;WPF只提供两个数据提供者…

Matlab各个版本介绍、区别分析及推荐

MATLAB&#xff0c;由美国MathWorks公司出品&#xff0c;是一款广泛应用的商业数学软件。自其诞生之初&#xff0c;MATLAB便以其强大的矩阵计算能力、灵活的编程环境以及广泛的应用领域&#xff0c;赢得了全球科研工作者和工程师的青睐。本文将详细介绍MATLAB的各个版本&#x…

二叉树的前序遍历

目录 一、前言 二、前序遍历 三、递归 四、迭代 一、前言 接下来两天时间&#xff0c;我将详细整理二叉树的三种遍历方式---前序遍历、中序遍历、后序遍历。每种遍历方式我将主要从递归、迭代两种方式进行整理&#xff0c;之后我会单独整理Morris&#xff08;莫里斯&a…

【Linux系统编程】第十三弹---项目自动化构建工具-make/Makefile

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、背景 2、编写makefile 2、make原理 3、理解makefile 4、优化makefile 总结 1、背景 ★ 会不会写makefile&#xff0c;从…

mysql 指定根目录 迁移根目录

mysql 指定根目录 迁移根目录 1、问题描述2、问题分析3、解决方法3.1、初始化mysql前就手动指定mysql根目录为一个大的分区(支持动态扩容)&#xff0c;事前就根本上解决mysql根目录空间不够问题3.1.0、方法思路3.1.1、卸载mariadb3.1.2、下载Mysql安装包3.1.3、安装Mysql 8.353…