当前位置: 首页 > news >正文

[C#]使用纯opencvsharp部署yolov11-onnx图像分类模型

【官方框架地址】

https://github.com/ultralytics/ultralytics.git
【算法介绍】

使用纯OpenCvSharp部署YOLOv11-ONNX图像分类模型是一项复杂的任务,但可以通过以下步骤实现:

  1. 准备环境:首先,确保开发环境已安装OpenCvSharp和必要的.NET框架,如VS2019和.NET Framework 4.7.2。同时,需要YOLOv11的ONNX模型文件、配置文件(描述模型架构)和类别名称文件。
  2. 加载模型:使用OpenCvSharp的DNN模块加载YOLOv11的ONNX模型。这通常涉及将模型文件路径传递给DNN模块的相关函数。
  3. 预处理图像:对输入图像进行预处理,如调整大小、归一化等,以满足模型的输入要求。
  4. 推理与后处理:将预处理后的图像输入到模型中,获取分类结果。对结果进行后处理,包括解析输出、应用非极大值抑制(如果需要)等,以获得最终的分类结果。
  5. 显示结果:将分类结果显示在界面上,可以通过OpenCvSharp的图像显示功能实现。

值得注意的是,YOLOv11是一个复杂的模型,其输出可能包含多个层的信息,因此需要仔细解析模型输出,并根据YOLOv11的具体实现进行后处理。此外,由于OpenCvSharp的DNN模块对ONNX的支持可能有限,某些YOLOv11的特性可能无法在OpenCvSharp中直接实现。在这种情况下,可能需要寻找替代方案,如使用其他深度学习库来加载和运行模型,并通过C#接口与这些库进行交互。

总之,使用纯OpenCvSharp部署YOLOv11-ONNX图像分类模型需要深入理解YOLOv11的模型架构、OpenCvSharp的DNN模块以及ONNX格式。

【效果展示】

【实现部分代码】

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();
        Yolov11ClsManager ym = new Yolov11ClsManager();
        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\\yolo11n-cls.onnx", Application.StartupPath + "\\weights\\labels.txt");

        }

        private void btn_video_Click(object sender, EventArgs e)
        {
            var detector = new Yolov11ClsManager();
            detector.LoadWeights(Application.StartupPath + "\\weights\\yolo11n-cls.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#使用纯opencvsharp部署yolov11-onnx图像分类模型_哔哩哔哩_bilibili【测试环境】vs2019net framework4.7.2opencvsharp4.8.0更多信息和源码下载参考博文:https://blog.csdn.net/FL1623863129/article/details/142728931, 视频播放量 0、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 未来自主研究中心, 作者简介 未来自主研究中心,相关视频:icon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1EB1iYXEoi/
【源码下载】

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

vs2019

net framework4.7.2

opencvsharp4.8.0

相关文章:

  • 基于深度学习的乳腺癌分类识别与诊断系统
  • macos 中使用macport安装,配置,切换多版本php,使用port 安装php扩展方法总结
  • cherry-markdown开源markdown组件详细使用教程
  • 一、Python(介绍、环境搭建)
  • Excel基础:电子表格Excel的使用技巧合集
  • 文件包含漏洞
  • 基于 STM32F407 的 SPI Flash下载算法
  • requests 中data=xxx、json=xxx、params=xxx 分别什么时候用
  • Linux·进程概念(下)
  • 【PostgreSQL】入门篇——介绍表的创建、主键、外键、唯一约束和检查约束的概念及其应用
  • vue2接入高德地图实现折线绘制、起始点标记和轨迹打点的完整功能(提供Gitee源码)
  • VPN简述
  • 国内旅游:现状与未来趋势分析
  • 商城系统难点
  • hdfs伪分布式集群搭建
  • Golang | Leetcode Golang题解之第455题分发饼干
  • 鸿蒙harmonyos next flutter通信之EventChannel获取ohos系统时间
  • 掌握RocketMQ4.X消息中间件(一)-RocketMQ基本概念与系统架构
  • MySQL 日志 - Binlog
  • 精益驱动的敏捷开发
  • 湛江霞山通报渔船火灾:起火船舶共8艘,无人员伤亡或被困
  • 金俊峰已跨区任上海金山区委副书记
  • 射箭世界杯上海站摘得两银,中国队新周期冲击韩国缩小差距
  • 著名文物鉴赏家吴荣光逝世,享年78岁
  • 习近平将出席中国—拉美和加勒比国家共同体论坛第四届部长级会议开幕式并发表重要讲话
  • 游戏论|暴君无道,吊民伐罪——《苏丹的游戏》中的政治