【机器视觉】yolo-world-opencvsharp-.net4.8 C# 窗体应用程序

47bc49fe5390f5be826993fad8765be4.png

这段代码是基于 OpenCvSharp, OpenVinoSharp 和 .NET Framework 4.8 的 Windows Forms 应用程序。其主要目的是加载和编译机器学习模型,对输入数据进行推理,并显示结果。

下面是该程序的主要功能和方法的详细总结:

  1. 初始化 OpenVINO 运行时核心(Core)和设备列表

  • 在 Form1_Load 方法中,程序创建了 Core 类的实例,并获取了可用设备列表,然后将这些设备添加到下拉选择框中。

选择模型和输入文件:

  • 使用 OpenFileDialog 来引导用户选择模型文件和输入文件(图片或视频)。btn_select_model_Click 和 btn_select_input_Click 方法负责处理文件选择对话框,并更新文本框以显示所选文件的路径。

加载并编译模型:

  • btn_load_model_Click 方法中,程序通过 read_model 方法加载用户选定的模型,然后调用 compile_model 方法将模型编译到指定设备上。编译完成后,创建了对模型的推理请求(InferRequest)。

执行推理:

  • btn_infer_Click 方法负责执行推理过程。它根据输入路径(图片或视频)调用 image_predict 方法来处理数据,并显示预测结果。

处理图片并推理:

  • image_predict 方法接受一个 Mat 图像,将其调整大小、归一化,并通过排列(Permutation)转换成模型所需的输入格式。之后,程序执行推理请求,并获取输出tensor。

后处理推理结果并显示:

  • postprocess 方法接受推理结果作为一个浮点数数组,根据设定的类别数和因子对结果进行预处理,检测出物体的矩形框,过滤和非极大值抑制(NMS)后,识别出类别和置信度,最终,将识别出的对象和对应信息绘制在图像上。

显示 FPS 和预测结果:

  • 推理后,程序计算并显示当前的帧率(FPS),并将检测框和标签绘制在结果图像上,并在界面中更新 pictureBox2 控件来展示图像。

该程序是由几个部分组成的一个界面应用,通过读取模型文件、处理图像和视频输入、执行模型推理,并在界面上展示结果的流程,体现了一种典型的实时物体检测和分类的机器学习应用。

// 引入OpenCvSharp相关的命名空间,用于图像处理和计算机视觉
using OpenCvSharp;
// 引入OpenCvSharp的Dnn(深度神经网络)命名空间,用于深度学习模型的加载和推理
using OpenCvSharp.Dnn;
// 引入OpenVinoSharp命名空间,用于模型优化和推理加速
using OpenVinoSharp;
// 引入OpenVinoSharp的Extensions下的model命名空间,包含模型加载和处理的扩展方法
using OpenVinoSharp.Extensions.model;
// 引入OpenVinoSharp的Extensions下的process命名空间,包含图像预处理的扩展方法
using OpenVinoSharp.Extensions.process;
// 引入OpenVinoSharp的Extensions下的result命名空间,包含推理结果处理的扩展方法
using OpenVinoSharp.Extensions.result;
// C#系统命名空间,提供基础类和基本函数
using System;
// 系统集合命名空间,提供用于创建集合的类
using System.Collections.Generic;
// 系统IO命名空间,用于处理文件输入输出
using System.IO;
// 系统网络命名空间,包含用于网络检测的类
using System.Net.NetworkInformation;
// 系统运行时互操作命名空间,包含访问和控制未经管理资源的类
using System.Runtime.InteropServices;
// 系统线程命名空间,用于多线程编程
using System.Threading;
// 系统Windows.Forms命名空间,包含创建Windows窗体应用程序的类
using System.Windows.Forms;// 定义命名空间yolo_world_opencvsharp_net4._8
namespace yolo_world_opencvsharp_net4._8
{// Form1的部分类实现,继承于Form类public partial class Form1 : Form{// 声明与OpenVINO有关的变量public Core core = null; // 核心对象,用于管理OpenVINO的核心功能public Model model = null; // 模型对象,代表加载的神经网络模型public CompiledModel compiled_model = null; // 编译后的模型对象public InferRequest request = null; // 推理请求对象,用于执行推理// 声明时间统计用的变量DateTime start = DateTime.Now; // 记录开始时间DateTime end = DateTime.Now; // 记录结束时间// 类别名称列表,存储类别名称public List<string> classes = null;// Form1的构造函数public Form1(){// 初始化Form组件InitializeComponent();}// Form1加载时的事件处理函数private void Form1_Load(object sender, EventArgs e){// 记录开始时间start = DateTime.Now;// 创建OpenVINO核心对象core = new Core();// 记录结束时间end = DateTime.Now;// 在文本框中输出初始化OpenVINO运行时核心的时间tb_msg.AppendText("Initialize OpenVINO Runtime Core: " + (end - start).TotalMilliseconds + "ms.\r\n");// 获取可用的设备列表List<string> devices = core.get_available_devices();// 遍历设备列表,将设备添加到下拉选择框中foreach (var item in devices){cb_device.Items.Add(item);}// 选定下拉框的第一个设备作为默认选择cb_device.SelectedIndex = 0;}// 选择模型按钮点击时的事件处理函数private void btn_select_model_Click(object sender, EventArgs e){// 创建文件选择对话框对象OpenFileDialog dlg = new OpenFileDialog();// 设置对话框标题dlg.Title = "选择推理模型文件";// 设置文件过滤器,只显示特定的模型文件格式dlg.Filter = "模型文件(*.pdmodel,*.onnx,*.xml)|*.pdmodel;*.onnx;*.xml";// 显示对话框,并判断用户是否点击了“确定”if (dlg.ShowDialog() == DialogResult.OK){// 将用户选择的文件路径显示在文本框中tb_model_path.Text = dlg.FileName;}}// 选择输入按钮点击时的事件处理函数private void btn_select_input_Click(object sender, EventArgs e){// 创建文件选择对话框对象OpenFileDialog dlg = new OpenFileDialog();// 设置对话框标题dlg.Title = "选择测试输入文件";// 设置文件过滤效果,只显示图片和视频文件dlg.Filter = "图片文件(*.png,*.jpg,*.jepg,*.mp4)|*.png;*.jpg;*.jepg;*.mp4";// 显示对话框,并判断用户是否点击了“确定”if (dlg.ShowDialog() == DialogResult.OK){// 将用户选择的文件路径显示在文本框中tb_input_path.Text = dlg.FileName;}}// 加载模型按钮点击时的事件处理函数private void btn_load_model_Click(object sender, EventArgs e){//省略前文已详述的代码,此处直接呈现未注释部分的译文:// 读取推理模型model = core.read_model(tb_model_path.Text);// 将模型加载到指定设备中compiled_model = core.compile_model(model, cb_device.SelectedItem.ToString());// 创建推理请求request = compiled_model.create_infer_request();}// 推理按钮点击时的事件处理函数private void btn_infer_Click(object sender, EventArgs e){//省略前文已详述的代码,此处直接呈现未注释部分的译文:// 如果输入路径的扩展名为.mp4,则处理视频,否则处理图像if (Path.GetExtension(tb_input_path.Text) == ".mp4"){// 创建视频捕获对象,并处理视频中的每一帧VideoCapture video = new VideoCapture(tb_input_path.Text);if (video.IsOpened()) {Mat frame = new Mat();video.Read(frame);// 循环读取视频帧并进行预测处理,直到视频帧为空while (!frame.Empty()){image_predict(frame);video.Read(frame);Thread.Sleep(10);}}}else { // 读取图像文件并进行预测处理Mat image = Cv2.ImRead(tb_input_path.Text); image_predict(image); }}// 图像预测函数void image_predict(Mat image) {// 省略前文的详细代码部分,此处直接呈现未注释部分的译文:// 将图像数据预处理并设置到推理请求的输入张量中,然后执行推理Tensor input_tensor = request.get_input_tensor();Shape input_shape = input_tensor.get_shape();// 省略图像预处理代码request.infer();// 获取输出张量,并处理预测结果Tensor output_tensor = request.get_output_tensor();Shape output_shape = output_tensor.get_shape();// 从输出张量中获取结果,并执行后处理计算float[] result_data = output_tensor.get_data<float>((int)output_tensor.get_size());}// 后处理结果函数DetResult postprocess(float[] result, int categ_nums, float factor) {// 省略前文的详细代码部分,以下是一些关键未注释的译文:// 通过输出结果创建Mat对象Mat result_data = new Mat(4 + categ_nums, 8400, MatType.CV_32F,result);result_data = result_data.T();// 存储结果数据的列表List<Rect> position_boxes = new List<Rect>();List<int> classIds = new List<int>();List<float> confidences = new List<float>();// 循环处理输出数据for (int i = 0; i < result_data.Rows; i++){// 省略输出数据的预处理代码// 如果置信度大于0.25,则存储结果数据if (maxScore > 0.25){// 省略计算检测框位置和尺寸的代码Rect box = new Rect();position_boxes.Add(box);classIds.Add(maxClassIdPoint.X);confidences.Add((float)maxScore);}}// 执行非最大抑制算法,过滤掉冗余的检测框int[] indexes = new int[position_boxes.Count];// 省略非最大抑制算法的代码// 根据索引,获取最终的检测结果DetResult re = new DetResult();return re;}}
}

本段代码是一个Windows窗体应用程序的部分实现,主要用于基于YOLO(You Only Look Once)算法的目标检测任务。应用程序使用OpenCvSharp和OpenVINO技术栈进行图像读取、模型推理和结果处理。代码涵盖了从初始化OpenVINO核心、模型加载、图像预处理到执行推理和结果显示的全过程。1. 初始化窗体组件并设置初始参数。2. 提供选择模型和测试输入文件的功能。3. 加载、编译模型以及创建推理请求。4. 实现对图像和视频的预测功能。5. 对推理结果进行后处理并在界面上显示检测框和类别信息。整个流程体现了使用机器学习模型进行图像识别和目标检测的完整过程。其中,重点应用了OpenCV库对图像进行处理和OpenVINO框架对模型进行优化和加速推理。这样的实现可以用于各种基于图像识别的应用场景,比如安全监控、交通管理等。

参考网址

1. https://docs.ultralytics.com/zh/integrations/onnx/ pt导出onnx

2313ead066f3df082b59de0c50849033.png

pt2onnx 会自动下载模型然后转格式

from ultralytics import YOLO# Load the YOLOv8 model
model = YOLO('yolov8n.pt')
# model = YOLO('yolov8l-worldv2.pt')
# Export the model to ONNX format
model.export(format='onnx')  # creates 'yolov8n.onnx'# Load the exported ONNX model
onnx_model = YOLO('yolov8n.onnx')
# onnx_model = YOLO('yolov8l-worldv2.onnx')
# Run inference
results = onnx_model('https://ultralytics.com/images/bus.jpg')

2. https://github.com/ultralytics/assets/releases 

3. https://github.com/ultralytics/ultralytics

4. https://github.com/AILab-CVC/YOLO-World/tree/master 

a0f19c7c238cd11f640fc089abc043e1.png

5. https://huggingface.co/spaces/stevengrove/YOLO-World

700a03b6699e1d74867abd33ce8c2b39.png

6. https://github.com/guojin-yan/OpenVINO-CSharp-API-Samples/tree/master

d128438b9f3da9dc27789e473e75587b.png

5952f7ca4fe33dc9e87a8acdf8256c36.png

2b0f7da915152d112900ab0de9236d34.png

  • 分类(Classify): 确定图像中的对象属于哪个类别。

  • 检测(Detect): 在图像中识别对象的位置并对其进行分类。

  • OBB(Oriented Bounding Box): 使用定向边界框来检测具有特定方向的对象。

  • 姿态(Pose): 估计图像中人或物体的姿态。

  • 分割(Segment): 将图像中的对象从背景中分离出来。

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

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

相关文章

基于Pytorch深度学习——卷积神经网络(卷积层/池化层/多输入多输出通道/填充和步幅/)

本文章来源于对李沐动手深度学习代码以及原理的理解&#xff0c;并且由于李沐老师的代码能力很强&#xff0c;以及视频中讲解代码的部分较少&#xff0c;所以这里将代码进行尽量逐行详细解释 并且由于pytorch的语法有些小伙伴可能并不熟悉&#xff0c;所以我们会采用逐行解释小…

【DPU系列之】如何通过带外口登录到DPU上的ARM服务器?(Bluefield2举例)

文章目录 1. 背景说明2. 详细操作步骤2.1 目标拓扑结构2.2 连接DPU带外口网线&#xff0c;并获取IP地址2.3 ssh登录到DPU 3. 进一步看看系统的一些信息3.1 CPU信息&#xff1a;8核A723.2 内存信息 16GB3.3 查看ibdev设备 3.4 使用小工具pcie2netdev查看信息3.5 查看PCIe设备信息…

python笔记:gensim进行LDA

理论部分&#xff1a;NLP 笔记&#xff1a;Latent Dirichlet Allocation &#xff08;介绍篇&#xff09;-CSDN博客 参考内容&#xff1a;DengYangyong/LDA_gensim: 用gensim训练LDA模型&#xff0c;进行新闻文本主题分析 (github.com) 1 导入库 import jieba,os,re from ge…

【云原生】Docker 的网络通信

Docker 的网络通信 1.Docker 容器网络通信的基本原理1.1 查看 Docker 容器网络1.2 宿主机与 Docker 容器建立网络通信的过程 2.使用命令查看 Docker 的网络配置信息3.Docker 的 4 种网络通信模式3.1 bridge 模式3.2 host 模式3.3 container 模式3.4 none 模式 4.容器间的通信4.…

Stream流操作

看到Stream流这个概念&#xff0c;我们很容易将其于IO流联系在一起&#xff0c;事实上&#xff0c;两者并没有什么关系&#xff0c;IO流是用于处理数据传输的&#xff0c;而Stream流则是用于操作集合的。 当然&#xff0c;为了方便我们区分&#xff0c;我们依旧在这里复习一下…

长期找 AI 专家,邀请参加线上聊天直播

诚邀 AI 专家参加线上聊天&#xff0c;成为嘉宾。 分享前沿观点、探讨科技和生活 除节假日外&#xff0c;每周举办在线聊天直播 根据话题和自愿形式结合&#xff0c;每期 2~3 位嘉宾 成为嘉宾&#xff0c;见下&#xff1a;

ADS软件(PathWave 先进设计系统软件)分享与安装

ADS软件的简介 ADS软件&#xff08;Advanced Design System&#xff09;主要用于射频&#xff08;RF&#xff09;、微波&#xff08;Microwave&#xff09;和毫米波&#xff08;Millimeter-wave&#xff09;电路的设计、仿真和分析。它提供了一套强大的工具和功能&#xff0c;…

Angular进阶-NVM管理Node.js实现不同版本Angular环境切换

一、NVM介绍 1. NVM简介 Node Version Manager&#xff08;NVM&#xff09;是一个用于管理多个Node.js版本的工具。它允许用户在同一台机器上安装和使用多个Node.js版本&#xff0c;非常适合需要同时进行多个项目的开发者。NVM是开源的&#xff0c;支持MacOS、Windows和Linux…

【解决】docker一键部署报错

项目场景见&#xff1a;【记录】Springboot项目集成docker实现一键部署-CSDN博客 问题&#xff1a; 1.docker images 有tag为none的镜像存在。 2.有同事反馈&#xff0c;第一次启动docker-compose up -d 项目无法正常启动。后续正常。 原因&#xff1a; 1.服务中指定了镜像m…

Jackson-jr 对比 Jackson

关于Jackson-jr 对比 Jackson 的内容&#xff0c;有人在做了一张下面的图。 简单点来说就 Jackson-jr 是Jackson 的轻量级应用&#xff0c;因为我们在很多时候都用不到 Jackson 的很多复杂功能。 对很多应用来说&#xff0c;我们可能只需要使用简单的 JSON 读写即可。 如我们…

【Linux网络】网络文件共享

目录 一、存储类型 二、FTP文件传输协议 2.1 FTP工作原理 2.2 FTP用户类型 2.3 FTP软件使用 2.3.1 服务端软件vsftpd 2.3.2 客户端软件ftp 2.4 FTP的应用 2.4.1 修改端口号 2.4.2 匿名用户的权限 2.4.3 传输速率 三、NFS 3.1 工作原理 3.2 NFS软件介绍 3.3 NFS配…

企业级数据治理学习总结

1. 水在前面 “数据治理”绝对是吹过的牛里面最高大上的题目了&#xff0c;本来想直接以《企业级数据治理》为题来水的&#xff0c;码字前又跑去图书馆借了几本书&#xff0c;翻了几页才发现自己连半桶水都提不起&#xff0c;撑死只能在小屁孩跟前吹吹牛。 好吧&#xff0c;实在…

怎么把jpg图片变成gif?参考这个方法一键制作

Jpg图片如何变成gif图片&#xff1f;Jpg、gif都是最常用的图片格式&#xff0c;想要将这两种格式的图片互相转化的时候要怎么操作呢&#xff1f;想要将jpg图片变成gif方法很简单&#xff0c;只需要使用gif图片制作&#xff08;https://www.gif5.net/&#xff09;工具-GIF5工具网…

华为手机ip地址怎么切换

随着移动互联网的普及&#xff0c;IP地址成为了我们手机上网的重要标识。然而&#xff0c;在某些情况下&#xff0c;我们可能需要切换手机的IP地址&#xff0c;以更好地保护个人隐私、访问特定地区的内容或服务&#xff0c;或者出于其他网络需求。华为手机作为市场上的热门品牌…

用队列实现栈——leetcode刷题

题目的要求是用两个队列实现栈&#xff0c;首先我们要考虑队列的特点&#xff1a;先入先出&#xff0c;栈的特点&#xff1a;后入先出&#xff0c;所以我们的目标就是如何让先入栈的成员后出栈&#xff0c;后入栈的成员先出栈。 因为有两个队列&#xff0c;于是我们可以这样想&…

vue3(实现上下无限来往滚动)

一、问题描述 一般在大屏项目中&#xff0c;很常见的效果&#xff0c;就是容器中的内容缓慢地向下移动&#xff0c;直到底部停止&#xff0c;然后快速滚动回顶部&#xff0c;然后接着缓慢滚动到底部。并且在特定的情况下&#xff0c;还需要进行一些小交互&#xff0c;那就还得让…

Leetcode——面试题02.04.分割链表

面试题 02.04. 分割链表 - 力扣&#xff08;LeetCode&#xff09; 对于该链表OJ&#xff0c;我们两种大的方向&#xff1a; 1.在原链表上修改&#xff1b;2.创建新链表&#xff0c;遍历原链表。 在原链上进行修改&#xff1a;如果该节点的val小于x则继续往后走&#xff0c;如…

Ubuntu服务器创建新用户及解决新用户登录Access denied问题

目录 Ubuntu服务器创建新用户及解决新用户登录Access denied问题创建账号步骤创建用户只创建用户添加用户到sudo组 允许账号远程连接重启ssh服务 删除账号要删除用户而不删除用户文件如果要删除并且删除用户的家目录和邮件 查询指令查看所有用户查询特定用户账户信息查看用户组…

【Micropython Pitaya Lite教程】key按键与EXTI中断

文章目录 前言一、按键的使用1.1 按键的简介1.2 读取按键的高低电平 二、EXIT外部中断2.1 EXIT外部中断简介2.2 外部中断基础知识2.3 设置外部中断2.4 示例代码 总结 前言 Micropython Pitaya Lite开发板提供了丰富的功能和灵活的扩展性&#xff0c;其中包括了按键&#xff08…

Python 全栈系列241 GFGo Lite迭代

说明 随着整个算网开发逐渐深入&#xff0c;各个组件、微服务的数量、深度在不断增加。由于算网是个人项目&#xff0c;我一直按照MVP(Minimum Viable Product )的原则在推进。由于最初的时候对架构、算法和业务的理解并没有那么深刻&#xff0c;所以MVP的内容还是在不断变化&…