[C#]winform部署yolov9的onnx模型

news2024/9/22 14:27:39

C# WinForms 部署 YOLOv9 ONNX 模型简介

在当今的计算机视觉领域,目标检测是不可或缺的一项技术。YOLO(You Only Look Once)系列模型以其高效和准确的特点受到了广泛关注。随着YOLOv9的发布,其性能进一步提升,为实际应用提供了更强大的支持。

为了在C# WinForms应用程序中部署YOLOv9模型,我们首先需要将其转换为ONNX(Open Neural Network Exchange)格式。ONNX是一个开放的模型表示,使得不同深度学习框架之间可以相互转换和共享模型。这使得YOLOv9模型可以在C#环境中得到高效利用。

在部署过程中,我们可以使用ONNX Runtime这一跨平台的库来加载和运行ONNX模型。ONNX Runtime提供了对多种硬件平台的支持,包括CPU、GPU等,从而实现了模型的快速推理。

在WinForms应用中,我们可以通过调用ONNX Runtime的API来实现对图像的实时目标检测。用户可以通过界面上传图像,应用程序则利用YOLOv9模型进行目标检测,并在图像上标注出目标物体的位置和类别。

此外,为了提升用户体验,我们还可以对检测过程进行优化,如采用多线程技术实现异步检测,避免界面卡顿;同时,也可以提供检测结果的可视化展示,让用户直观地了解检测效果。

通过C# WinForms部署YOLOv9的ONNX模型,我们可以为用户提供一个功能强大的目标检测工具。这不仅展示了YOLO系列模型在实际应用中的价值,也体现了C# WinForms在构建用户界面和集成深度学习模型方面的优势。

【效果展示】


【实现部分代码】

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenCvSharp;

namespace FIRC
{
    public partial class Form1 : Form
    {
        Mat src = new Mat();
        Yolov9Manager ym = new Yolov9Manager();
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "图文件(*.*)|*.jpg;*.png;*.jpeg;*.bmp";
            openFileDialog.RestoreDirectory = true;
            openFileDialog.Multiselect = false;
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
              
                src = Cv2.ImRead(openFileDialog.FileName);
                pictureBox1.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(src);


            }


        }

        private void button2_Click(object sender, EventArgs e)
        {
            if(pictureBox1.Image==null)
            {
                return;
            }
            Stopwatch sw = new Stopwatch();
            sw.Start();
            var result = ym.Inference(src);
            sw.Stop();
            this.Text = "耗时" + sw.Elapsed.TotalSeconds + "秒";
            var resultMat = ym.DrawImage(src,result);
            pictureBox2.Image= OpenCvSharp.Extensions.BitmapConverter.ToBitmap(resultMat); //Mat转Bitmap
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            ym.LoadWeights(Application.StartupPath+ "\\weights\\yolov9-c.onnx", Application.StartupPath + "\\weights\\labels.txt");

        }

        private void btn_video_Click(object sender, EventArgs e)
        {
            var detector = new Yolov9Manager();
            detector.LoadWeights(Application.StartupPath + "\\weights\\yolov9-c.onnx", Application.StartupPath + "\\weights\\labels.txt");
            VideoCapture capture = new VideoCapture(0);
            if (!capture.IsOpened())
            {
                Console.WriteLine("video not open!");
                return;
            }
            Mat frame = new Mat();
            var sw = new Stopwatch();
            int fps = 0;
            while (true)
            {

                capture.Read(frame);
                if (frame.Empty())
                {
                    Console.WriteLine("data is empty!");
                    break;
                }
                sw.Start();
                var result = detector.Inference(frame);
                var resultImg = detector.DrawImage(frame,result);
                sw.Stop();
                fps = Convert.ToInt32(1 / sw.Elapsed.TotalSeconds);
                sw.Reset();
                Cv2.PutText(resultImg, "FPS=" + fps, new OpenCvSharp.Point(30, 30), HersheyFonts.HersheyComplex, 1.0, new Scalar(255, 0, 0), 3);
                //显示结果
                Cv2.ImShow("Result", resultImg);
                int key = Cv2.WaitKey(10);
                if (key == 27)
                    break;
            }

            capture.Release();
  
        }
    }
}


【视频演示】

C#winform部署yolov9的onnx模型_哔哩哔哩_bilibili测试环境:vs2019netframework4.7.2onnxruntime==1.16.2opencvsharp==4.8.0, 视频播放量 26、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 未来自主研究中心, 作者简介 未来自主研究中心,相关视频:C++使用纯opencv部署yolov9的onnx模型,将yolov8封装成一个类几行代码完成语义分割任务,YOLOv9来啦!性能逆天~,YOLOv9杀疯了!最新的实时目标检测模型!代码已开源!,一款小工具,让你直连谷歌翻译!,C#实现全网yolov7目前最快winform目标检测,使用C#部署openvino-yolov5s模型,使用C++部署yolov8的onnx和bytetrack实现目标追踪,用opencv和onnxruntime去部署yolov5-7-8,使用C#调用libotrch-yolov5模型实现全网最快winform目标检测icon-default.png?t=N7T8https://www.bilibili.com/video/BV18F4m1L7pK/?vd_source=989ae2b903ea1b5acebbe2c4c4a635ee
【源码下载】

https://download.csdn.net/download/FL1623863129/88905860
【测试环境】

vs2019 netframework4.7.2 onnxruntime==1.16.2 opencvsharp==4.8.0

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

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

相关文章

香橙派企业信用问题-劝一个是一个,别买!!!

1. 背景 香橙派推广旗下AI PRO 开发板,在B站做直播,一场直播两个直播间,分别抽取一名观众,宣传是场场送AI PRO开发板!!! 2. 收到奖品与宣传不符合 3.咨询群主:态度很傲慢&#xff0c…

图像处理基础——频域、时域

下图是低通滤波器的频率响应曲线。 低通滤波器频响曲线 横轴是频率(Hz),纵轴是声音大小(dB)。(请忽略图中的频率刻度,没有对应人声的频率范围) 所谓的低音效果,其实就是对人声中的低音部分保留或增强,对应…

2.并发编程

文章迁移自语雀。原文地址:https://www.yuque.com/changhe-xqeca/zn1cvu/dvunld 昨晚上感觉程程是个温柔的姑娘 1.同步的实现: 是利用锁的机制来实现同步的。 锁机制有如下两种特性: 互斥性:即在同一时间只允许一个线程持有某个对象锁&a…

云端技术驾驭DAY15——ClusterIP服务、Ingress服务、Dashboard插件、k8s角色的认证与授权

往期回顾: 云端技术驾驭DAY01——云计算底层技术奥秘、云服务器磁盘技术、虚拟化管理、公有云概述 云端技术驾驭DAY02——华为云管理、云主机管理、跳板机配置、制作私有镜像模板 云端技术驾驭DAY03——云主机网站部署、web集群部署、Elasticsearch安装 云端技术驾驭…

C++用临时对象构造新对象

C用临时对象构造新对象 //用临时对象构造同类型的新对象&#xff0c;该临时对象不产生&#xff1b; // 直接用生成临时对象的方法构造新对象&#xff0c;这是编译器对代码的优化&#xff0c;效率更高 #include<iostream> using namespace std; class MyClass { public:…

软件测试--性能测试工具JMeter

软件测试--性能测试工具JMeter 主流性能测试工具1.主流性能测试工具Loadrunner和Jmeter对比 —— 相同点2.主流性能测试工具Loadrunner和Jmeter对比 —— 不同点JMeter基本使用JMeter环境搭建1.安装JDK:2.安装Jmeter:3.注意点:JMeter功能概要1. JMeter文件目录介绍1.1 bin目…

win11环境下使用hane WIN NFS Server搭建nfs服务

如题&#xff0c;服务端使用hane win nfs server&#xff0c;客户端也是使用wins系统。 S1&#xff0c;安装nfs服务器端&#xff0c;wins系列除了server系列可以使用nfs服务端&#xff0c;其余必须使用额外的组件来实现NFS文件系统的功能。 Networking Software for Windows …

后端开发技术面试指南

工作10多年&#xff0c;每年都会帮组里面试一些新同学校招社招的都有&#xff0c;下面我就从一个面试官的视角来给大家拆解一下如何淡然应对后端开发技术面试。 1.一面多为电话面试 (1)问七问八 ①简历要注重内容&#xff0c;形式上不丑没有错别字即可。之前收到过一个工作5…

机器学习 | 四大常用机器学习Python库介绍

今天这篇我们介绍下Python中常用的机器学习库(机器学习、深度学习啥的&#xff0c;小编还是建议使用Python进行建模编写哈)&#xff0c;也算是本公号机器学习的第一篇推文&#xff0c;主要内容如下&#xff1a; 机器学习常用四大Python库 关于机器学习的我想说的话 所有完整代…

Linux系统Docker部署RStudio Server

文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE&#xff0c;并通过 Web 浏览器进行访问…

公网IP怎么获取?

公网IP是网络中设备的唯一标识符&#xff0c;用于在Internet上进行通信和定位。对于普通用户来说&#xff0c;了解如何获取自己的公网IP是很有必要的&#xff0c;本文将介绍几种获取公网IP的方法。 方法一&#xff1a;通过路由器查询 大多数家庭和办公室使用的路由器都会有一个…

Java集合-ArraysLIst集合

集合是“由若干个确定的元素锁构成的整体”&#xff0c;在程序中&#xff0c;一般代表保存若干个元素(数据)的某种容器类。在Java中&#xff0c;如果一个Java对象可以在内部持有(保存)若干其他Java对象&#xff0c;并对外提供访问接口&#xff0c;我们把这种Java对象的容器称为…

计算机视觉基础知识(一)--数学基础

向量 线性变换 矩阵 充满数字的表格 矩阵加减法 要满足两个矩阵的行数与列数一致;加法交换律:ABBA 矩阵乘法 要满足A的列数等于B的行数; 单位矩阵 是一个nxn矩阵;从左到右对角线上的元素值为1;其余元素为0;A为nxn矩阵,I为单位矩阵,;单位矩阵在乘法中的作用相当于数字1; 逆矩…

【windows】环境下部署 java 项目

文章目录 前言一、工具&#xff1a;winsw二、使用步骤1.winsw文件2.修改后的winsw文件3.修改testJava.xml文件 三、运行1.注册服务2.注销服务 总结 前言 有时我们部署的环境是 Windows&#xff0c;需要借用 winsw 将 java 发布成服务形式。 提示&#xff1a;以下是本篇文章正文…

go linux监测文件变化

go linux监测文件变化 文件改变内容有两种方式&#xff0c;效果一样&#xff0c;但执行方式有区别: 直接打开文件改&#xff0c;现在很多编辑器都是这样操作的先删除原来的&#xff0c;再新创建写入一个替代原来的。比如vi/vim.这种方式会打断linux inotify原有的监测(就好比…

解决maven远程仓库找不到问题

首先可以修改maven镜像&#xff0c;改成国内镜像 在上步行不通的情况下 可以进行下面的设置 首先jar包下载下来&#xff0c;打开maven的设置 将下面代码改成自己的实际&#xff0c;插入到3中 mvn install:install-file -Dfile{$jar包地址} -DgroupId{$jar包的groupid} -Dar…

web3时事粥报

比特币正成为更具有吸引力的通胀对冲工具 在通胀的宏观经济浪潮中&#xff0c;比特币正逐渐崭露头角&#xff0c;成为那些渴望多元化投资组合的投资者眼中的璀璨明星。Kooner 预测&#xff0c;2024年&#xff0c;各种宏观经济挑战可能进一步提升比特币、黄金和白银等资产的避险…

基于机器学习的曲面拟合方法

随着科技的不断发展&#xff0c;机器学习成为了最近最热门的技术之一&#xff0c;也被广泛应用于各个领域。其中&#xff0c;基于机器学习的曲面拟合方法也备受研究者们的关注。曲面拟合是三维模型处理中的重要技术&#xff0c;其目的是用一组数据点拟合出平滑的曲面&#xff0…

文生视频基础1:sora技术报告学习

sora技术报告学习 背景学后理解训练流程技术拆解编码解码扩散模型训练用数据 28号直播交流会后的一些想法自身的一点点想法 参考 原文地址&#xff1a;Video generation models as world simulators 背景 此项目的背景是基于Datawhale的关于sora技术文档的拆解和相关技术讲解…

安卓tcp ip通讯

废话不多说直接上代码 //权限 引入<uses-permission android:name"android.permission.ACCESS_NETWORK_STATE" /><!--允许应用程序改变网络状态--><uses-permission android:name"android.permission.CHANGE_NETWORK_STATE"/><!--允…