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

news2024/12/28 4:40:29

这段代码展示了一个使用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);
                // 调整图片大小为640x640
                image = 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.coloradmin.cn/o/1642506.html

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

相关文章

Linux搭建sqlilabs靶场

提前准备&#xff1a; 文章中所使用到的Linux系统&#xff1a;Ubantu20.4sqlilabs靶场下载地址&#xff1a;GitHub - Audi-1/sqli-labs: SQLI labs to test error based, Blind boolean based, Time based. 一. 安装phpstudy phpstudy安装命令&#xff1a;wget -O install.sh h…

【链表-双向链表】

链表-双向链表 1.链表的分类1.1 分类依据1.2 常用类型 2.双向链表的2.1 双向链表的结构2.2 双向链表的操作2.2.1 **初始化**2.2.2 **尾插**2.2.3 **头插**2.2.4 **尾删**2.2.5 **头删**2.2.6 在pos位置之后插入数据2.2.7 删除pos节点2.2.8 查找2.2.9 销毁 1.链表的分类 1.1 分…

Java如何获取当前日期和时间?

Java如何获取当前日期和时间&#xff1f; 本文将为您介绍 Java 中关于日期和时间获取的方法&#xff0c;以及介绍 Java 8 中获取日期和时间的全新API。 1、 System.currentTimeMillis() 获取标准时间可以使用 System.currentTimeMillis() 方法来获取&#xff0c;此方法优势是…

Qt与MySQL连接

QT连接Mysql数据库&#xff08;详细成功版&#xff09;-CSD N博客 我的MySQL是64位的&#xff0c;所以我的Qt的套件也需要是64位的 遇到的问题&#xff1a; &#xff08;available drivers中已经有QMYSQL QMYSQL3&#xff0c;还是not loaded&#xff09; QSqlDatabase: QMYS…

专项技能训练五《云计算网络技术与应用》实训7-1:安装mininet

文章目录 mininet安装1. 按6-1教程安装opendaylight控制器。2. 按6-2教程安装RYU控制器。3. 按5-1教程安装openvswitch虚拟交换机并开启服务。4. 将老师所给mininet安装包试用winSCP传送至电脑端。5. 安装net-tools。6. 安装mininet7. 安装完成后&#xff0c;使用命令建立拓扑&…

Jenkins集成Kubernetes 部署springboot项目

文章目录 准备部署的yml文件Harbor私服配置测试使用效果Jenkins远程调用参考文章 准备部署的yml文件 apiVersion: apps/v1 kind: Deployment metadata:namespace: testname: pipelinelabels:app: pipeline spec:replicas: 2selector:matchLabels:app: pipelinetemplate:metada…

腾讯云IM即时通信引入(React Web端组件式)

开发环境要求 React ≥ v18.0 &#xff08;17.x 版本不支持&#xff09; TypeScript node&#xff08;12.13.0 ≤ node 版本 ≤ 17.0.0, 推荐使用 Node.js 官方 LTS 版本 16.17.0&#xff09; npm&#xff08;版本请与 node 版本匹配&#xff09; chat-uikit-react 集成 …

软件工程习题答案2024最新版

习题一答案 一、选择题 软件的主要特性是(A B C)。 A) **无形 **B) 高成本 C) **包括程序和文档 ** D) 可独立构成计算机系统 软件工程三要素是(B)。 A) 技术、方法和工具 B) 方法、工具和过程 C) 方法、对象和类 D) 过程、模型、方法 包含风险分析的软件工程模型是(A)…

算法设计与分析——期末1h

目录 第一章 算法的定义 算法的三要素 算法的基本性质 算法的时间复杂度数量级&#xff1a; 第二章 兔子繁殖问题&#xff08;递推法&#xff09; 猴子吃桃问题&#xff08;递推法&#xff09; 穿越沙漠问题&#xff08;递推法&#xff08;倒推&#xff09;&#xff09; 百钱百…

Linux基础之yum和vim

目录 一、软件包管理器yum 1.1 软件包的概念 1.2 软件包的查看 1.3 软件包的安装和删除 二、Linux编辑器之vim 2.1 vim的基本概念 2.2 正常模式&#xff08;命令模式&#xff09; 2.3 底行模式 2.4 输入模式 2.5 替换模式 2.6 视图模式 2.7 总结 一、软件包管理器yu…

基于springboot+vue+Mysql的幼儿园管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

【Flask 系统教程 5】视图进阶

类视图 在 Flask 中&#xff0c;除了使用函数视图外&#xff0c;你还可以使用类视图来处理请求。类视图提供了一种更为结构化和面向对象的方式来编写视图函数&#xff0c;使得代码组织更清晰&#xff0c;并且提供了更多的灵活性和可扩展性。 创建类视图 要创建一个类视图&am…

Reactor模型详解

目录 1.概述 2.Single Reactor 3.muduo库的Multiple Reactors模型如下 1.概述 维基百科对Reactor模型的解释 The reactor design pattern is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs.…

办公数据分析利器:Excel与Power Query透视功能

数据分析利器&#xff1a;Excel与Power Query透视功能 Excel透视表和Power Query透视功能是强大的数据分析工具&#xff0c;它们使用户能够从大量数据中提取有意义的信息和趋势&#xff0c;可用于汇总、分析和可视化大量数据。 本文通过示例演示Power Query透视功能的一个小技…

【与 Apollo 共创生态:展望自动驾驶全新未来】

1、引言 历经七年的不懈追求与创新&#xff0c;Apollo开放平台已陆续推出了13个版本&#xff0c;汇聚了来自全球170多个国家与地区的16万名开发者及220多家合作伙伴。随着Apollo开放平台的不断创新与发展&#xff0c;Apollo在2024年4月19日迎来了Apollo开放平台的七周年大会&a…

43 单例模式

目录 1.什么是单例模式 2.什么是设计模式 3.特点 4.饿汉和懒汉 5.峨汉实现单例 6.懒汉实现单例 7.懒汉实现单例&#xff08;线程安全&#xff09; 8.STL容器是否线程安全 9.智能指针是否线程安全 10.其他常见的锁 11.读者写者问题 1. 什么是单例模式 单例模式是一种经典的&a…

保研面试408复习 1——操作系统、计网、计组

文章目录 1、操作系统一、操作系统的特点和功能二、中断和系统调用的区别 2、计算机组成原理一、冯诺依曼的三个要点二、MIPS&#xff08;每秒百万条指令&#xff09;三、CPU执行时间和CPI 3、计算机网络一、各个层常用协议二、网络协议实验——数据链路层a.网络速率表示b.数据…

机器学习的两种典型任务

机器学习中的典型任务类型可以分为分类任务&#xff08;Classification&#xff09;和回归任务&#xff08;Regression&#xff09; 分类任务 回归任务 简单的理解&#xff0c;分类任务是对离散值进行预测&#xff0c;根据每个样本的值/特征预测该样本属于类 型A、类型B 还是类…

迎接AI时代:智能科技的社会责任与未来展望

AI智能体的社会角色、伦理挑战与可持续发展路径 引言&#xff1a; 在技术的浪潮中&#xff0c;AI智能体正逐步成为我们生活的一部分。它们在医疗、教育、交通等领域的应用&#xff0c;预示着一个全新的时代即将到来。本文将结合实际案例和数据分析&#xff0c;深入探讨AI智能体…

JavaWeb请求响应概述

目录 一、请求响应流程-简述 二、深入探究 三、DispatcherServlet 四、请求响应流程-详细分析 一、请求响应流程-简述 web应用部署在tomcat服务器中&#xff0c;前端与后端通过http协议进行数据的请求和响应。前端通过http协议向后端发送数据请求&#xff0c;就可以访问到部…