【机器视觉】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

相关文章

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

【机器学习】高斯网络的基本概念和应用领域

引言 高斯网络(Gaussian Network)通常指的是一个概率图模型,其中所有的随机变量(或节点)都遵循高斯分布 文章目录 引言一、高斯网络(Gaussian Network)1.1 高斯过程(Gaussian Process)1.2 高斯混合模型(Gaussian Mixture Model)1.3 应用1.4 总结 二、高斯网络的应用2.1 机器学习2.2 统计学2.3

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t