【机器视觉】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);
                // 调整图片大小为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.mfbz.cn/a/592688.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【每日力扣】141. 环形链表与142. 环形链表 II

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 141. 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟…

利用策略模式+模板方法实现项目中运维功能

前段时间项目中有个需求&#xff1a;实现某业务的运维功能&#xff0c;主要是对10张数据库表的增删改查&#xff0c;没有复杂的业务逻辑&#xff0c;只是满足运维人员的基本需要&#xff0c;方便他们快速分析定位问题。这里简单记录分享下实现方案&#xff0c;仅供参考。 一、…

学习Rust的第27天:Rust中的pwd

过去几天我们一直在重新创建 GNU 核心实用程序的基本功能&#xff0c;而今天&#xff0c;我们将做一些有点太简单的事情&#xff0c; pwd 这个实用程序是用于打印Linux终端中的工作目录。 Understanding the utility 了解实用程序 Running the pwd command, we get an output l…

SpringBoot使用AOP注解记录操作日志

一、前言 日志&#xff1a;指系统所指定对象的某些操作和其操作结果按时间有序的集合。 操作日志&#xff1a;主要是对某个对象进行新增操作或者修改操作后记录下这个新增或者修改&#xff0c;操作日志要求可读性比较强。比如张三在某个时间下了订单买了某个商品&#xff01; …

linux实验(数据库备份)

以下所有操作皆以机房电脑上的虚拟机为基础环境 下载链接&#xff1a;Linux课程机房虚拟机# 切换到root用户 su - root安装数据库mysql 5.7 rpm -ivh https://mirrors4.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-x86_64/mysql-community-common-5.7.29-1.el7.x…

Llama改进之——SwiGLU激活函数

引言 今天介绍LLAMA模型引入的关于激活函数的改进——SwiGLU1&#xff0c;该激活函数取得了不错的效果&#xff0c;得到了广泛地应用。 SwiGLU是GLU的一种变体&#xff0c;其中包含了GLU和Swish激活函数。 GLU GLU(Gated Linear Units,门控线性单元)2引入了两个不同的线性层…

Linux(openEuler、CentOS8)常用的IP修改方式(文本配置工具nmtui+配置文件+nmcli命令)

----本实验环境为openEuler系统<以server方式安装>&#xff08;CentOS类似&#xff0c;可参考本文&#xff09;---- 一、知识点 &#xff08;一&#xff09;文本配置工具nmtui(openEuler已预装) nmtui&#xff08;NetworkManager Text User Interface&#xff09;是一…

ZooKeeper以及DolphinScheduler的用法

目录 一、ZooKeeper的介绍 数据模型 ​编辑 操作使用 ①登录客户端 ​编辑 ②可以查看下面节点有哪些 ③创建新的节点&#xff0c;并指定数据 ④查看节点内的数据 ⑤、删除节点及数据 特殊点&#xff1a; 运行机制&#xff1a; 二、DolphinScheduler的介绍 架构&#…

计算机毕业设计Python+Spark知识图谱高考志愿推荐系统 高考数据分析 高考可视化 高考大数据 大数据毕业设计

毕业设计&#xff08;论文&#xff09;任务书 毕业设计&#xff08;论文&#xff09;题目&#xff1a; 基于大数据的高考志愿推荐系统 设计&#xff08;论文&#xff09;的主要内容与要求&#xff1a; 主要内容&#xff1a; 高…

贝叶斯回归

1. 贝叶斯推断的定义 简单来说&#xff0c;贝叶斯推断 (Bayesian inference) 就是结合“经验 (先验)”和“实践 (样本)”&#xff0c;得出“结论 (后 验)”。 2. 什么是先验&#xff1f; 贝叶斯推断把模型参数看作随机变量。在得到样本之前&#xff0c;根据主观经验和既有知…

巧记英语单词

页面 在输入框中填写英语单词的谐音 这样的话就进行了一次英语单词的记忆练习。 页面代码 <% layout(/layouts/default.html, {title: 英语单词管理, libs: [dataGrid]}){ %> <div class"main-content"><div class"box box-main">&l…

anaconda、cuda、tensorflow、pycharm环境安装

anaconda、cuda、tensorflow、pycharm环境安装 anaconda安装 anaconda官方下载地址 本文使用的是基于python3.9的anaconda 接下来跟着步骤安装&#xff1a; 检验conda是否成功安装 安装CUDA和cuDNN 提醒&#xff0c;CUDA和cuDNN两者必须版本对应&#xff0c;否者将会出错…

my-room-in-3d中的电脑,电视,桌面光带发光原理

1. my-room-in-3d中的电脑&#xff0c;电视&#xff0c;桌面光带发光原理 最近在github中&#xff0c;看到了这样的一个项目&#xff1b; 项目地址 我看到的时候&#xff0c;蛮好奇他这个光带时怎么做的。 最后发现&#xff0c;他是通过&#xff0c;加载一个 lightMap.jpg这个…

大型语言模型的新挑战:AMR语义表示的神秘力量

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 引言&#xff1a;AMR在大型语言模型中的作用 在自然语言处理&#xff08;NLP&#xff09;的领域中&#xff0c;抽象意义表示&…

查找算法与排序算法

查找算法 二分查找 (要求熟练) // C// 二分查找法&#xff08;递归实现&#xff09; int binarySearch(int *nums, int target, int left, int right) // left代表左边界&#xff0c;right代表右边界 {if (left > right) return -1; // 如果左边大于右边&#xff0c;那么…

esp8266与uno使用软串口通信

esp8266的d6和d5分别与uno的5和6管脚连接&#xff1a; uno程序&#xff1a; //uno #include <SoftwareSerial.h> SoftwareSerial s(5,6);//(RX,TX)void setup(){s.begin(9600);Serial.begin(9600); }void loop(){int data50;if (s.available() > 0) {char c s.read(…

【错题集-编程题】比那名居的桃子(滑动窗口 / 前缀和)

牛客对应题目链接&#xff1a;比那名居的桃子 (nowcoder.com) 一、分析题目 1、滑动窗口 由题意得&#xff0c;我们是要枚举所有大小为 k 的子数组&#xff0c;并且求出这段⼦数组中快乐值和羞耻度之和。因此&#xff0c;可以利用滑动窗口的思想&#xff0c;用两个变量维护大小…

【区块链】共识算法简介

共识算法简介 区块链三要素&#xff1a; 去中心化共识算法智能合约 共识算法作为区块链三大核心技术之一&#xff0c;其重要性不言而喻。今天就来简单介绍共识算法的基本知识。 最简单的解释&#xff0c;共识算法就是要让所有节点达成共识&#xff0c;保证少数服从多数&#x…

从零开始学AI绘画,万字Stable Diffusion终极教程(六)

【第6期】知识补充 欢迎来到SD的终极教程&#xff0c;这是我们的第六节课&#xff0c;也是最后一节课 这套课程分为六节课&#xff0c;会系统性的介绍sd的全部功能&#xff0c;让你打下坚实牢靠的基础 1.SD入门 2.关键词 3.Lora模型 4.图生图 5.controlnet 6.知识补充 …

初识C语言——第九天

ASCII定义 在 C 语言中&#xff0c;每个字符都对应一个 ASCII 码。ASCII 码是一个字符集&#xff0c;它定义了许多常用的字符对应的数字编码。这些编码可以表示为整数&#xff0c;也可以表示为字符类型。在 C 语言中&#xff0c;字符类型被定义为一个整数类型&#xff0c;它占…
最新文章