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

本文主要是介绍【机器视觉】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): 将图像中的对象从背景中分离出来。

这篇关于【机器视觉】yolo-world-opencvsharp-.net4.8 C# 窗体应用程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960372

相关文章

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

c# checked和unchecked关键字的使用

《c#checked和unchecked关键字的使用》C#中的checked关键字用于启用整数运算的溢出检查,可以捕获并抛出System.OverflowException异常,而unchecked... 目录在 C# 中,checked 关键字用于启用整数运算的溢出检查。默认情况下,C# 的整数运算不会自

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

C#中图片如何自适应pictureBox大小

《C#中图片如何自适应pictureBox大小》文章描述了如何在C#中实现图片自适应pictureBox大小,并展示修改前后的效果,修改步骤包括两步,作者分享了个人经验,希望对大家有所帮助... 目录C#图片自适应pictureBox大小编程修改步骤总结C#图片自适应pictureBox大小上图中“z轴

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单