【OpenVINO™】在 C# 中使用OpenVINO™ 部署 YOLO-World 模型实现实时开放词汇对象检测

YOLO-World是一个融合了实时目标检测与增强现实(AR)技术的创新平台,旨在将现实世界与数字世界无缝对接。该平台以YOLO(You Only Look Once)算法为核心,实现了对视频中物体的快速准确识别,并通过AR技术将虚拟元素与真实场景相结合,为用户带来沉浸式的交互体验。在本文中,我们将结合OpenVINO™ C# API 使用最新发布的OpenVINO™ 2024.0部署 YOLO-World实现实时开放词汇对象检测:

OpenVINO™ C# API项目链接:

https://github.com/guojin-yan/OpenVINO-CSharp-API.git

使用 OpenVINO™ C# API 部署 YOLO-World全部源码:

https://github.com/guojin-yan/OpenVINO-CSharp-API-Samples/tree/master/model_samples/yolo-world/yolo-world-opencvsharp-net4.8

文章目录

    • 1. 前言
      • 1.1 OpenVINO™ C# API
      • 1.2 YOLO-World
    • 2. 模型获取
    • 3. 项目配置
      • 3.1 源码下载与项目配置
      • 3.2 定义模型预测方法
    • 4. 项目运行与演示
    • 5. 总结

1. 前言

1.1 OpenVINO™ C# API

英特尔发行版 OpenVINO™ 工具套件基于 oneAPI 而开发,可以加快高性能计算机视觉和深度学习视觉应用开发速度工具套件,适用于从边缘到云的各种英特尔平台上,帮助用户更快地将更准确的真实世界结果部署到生产系统中。通过简化的开发工作流程,OpenVINO™ 可赋能开发者在现实世界中部署高性能应用程序和算法。

2024年3月7日,英特尔发布了开源 OpenVINO™ 2024.0 工具包,用于在各种硬件上优化和部署人工智能推理。OpenVINO™ 是英特尔出色的开源 AI 工具包,不仅可以在 x86_64 CPU 上加速 AI 推断,还可以在 ARM CPU 和其他架构、英特尔集成显卡和独立显卡等硬件上加速 AI 推断,包括最近推出的 NPU 插件,用于利用新酷睿超 “Meteor Lake “系统芯片中的英特尔神经处理单元。 OpenVINO™ 2024.0 更注重生成式人工智能(GenAI),为 TensorFlow 句子编码模型提供了更好的开箱即用体验,支持专家混合(MoE)。同时还提高了 LLM 的 INT4 权重压缩质量,增强了 LLM 在英特尔 CPU 上的性能,简化了 Hugging Face 模型的优化和转换,并改进了其他 Hugging Face 集成。

OpenVINO™ C# API 是一个 OpenVINO™ 的 .Net wrapper,应用最新的 OpenVINO™ 库开发,通过 OpenVINO™ C API 实现 .Net 对 OpenVINO™ Runtime 调用,使用习惯与 OpenVINO™ C++ API 一致。OpenVINO™ C# API 由于是基于 OpenVINO™ 开发,所支持的平台与 OpenVINO™ 完全一致,具体信息可以参考 OpenVINO™。通过使用 OpenVINO™ C# API,可以在 .NET、.NET Framework等框架下使用 C# 语言实现深度学习模型在指定平台推理加速。

1.2 YOLO-World

YOLO-World是一种创新的实时开放词汇对象检测技术,由腾讯AI实验室开发。它旨在解决传统目标检测方法在开放场景中受预定义类别限制的问题,通过视觉语言建模和大规模数据集预训练,增强了YOLO系列检测器对开放词汇的检测能力。

该技术的核心思想在于,利用一个可重参数化的视觉语言路径聚合网络(RepVL-PAN)来连接文本和图像特征,并引入基于区域的文本对比损失进行预训练。这种设计使得YOLO-World能够在没有见过具体样本的情况下,检测出广泛的物体类别。同时,它还能在保持高性能的同时,降低计算要求,从而适用于实时应用。

通过这种方式,YOLO-World能够增强对开放词汇的检测能力,使其能够在没有预先定义类别的情况下识别出广泛的物体。这种能力使得YOLO-World在实时应用中,如自动驾驶、视频监控、工业质检等领域具有广泛的应用前景。同时,YOLO-World还通过优化模型架构和训练策略,实现了高性能和实时性的平衡。它能够在保持高准确率的同时,降低计算要求,从而满足实际应用中对于实时性的需求。

总的来说,YOLO-World是一种高效、实时且灵活的开放词汇目标检测器,具有广泛的应用前景和巨大的潜力。它不仅能够解决传统目标检测方法在开放场景中的局限性,还能够为各行业提供实时、准确的物体检测解决方案。

2. 模型获取

YOLO-World模型可以通过YOLO-World GitHub获取,小编尝试了一下,步骤比较复杂,且配置起来比较麻烦,因此如果是初学者,不建议使用,下面介绍一个比较简单的导出方式:通过Ultralytics 导出。

Ultralytics 提供了一系列用于计算机视觉任务的工具,包括目标检测、图像分类、语义分割和人脸识别等。这些工具基于流行的深度学习框架如PyTorch,并通过简化复杂任务的实现过程,使用户能够更轻松地进行模型训练和性能评估。

  • 首先安装Ultralytics 环境:

Ultralytics 可以通过pip安装,在环境中输入以下指令即可:

pip install ultralytics 
  • 然后通过Python导出模型:

模型导出代码如下所示:

from ultralytics import YOLO
# Initialize a YOLO-World model
model = YOLO('yolov8s-worldv2.pt')
# Define custom classes
model.set_classes(["person", "bus"])
# Export the model
model.export(format='onnx')

模型导出后结构如下图所示:

与其他模型不同的时,YOLO-World模型在推理时需要指定目标对象名称,因此其输入包括一个目标对象名称的节点,但是目前ONNX模型不支持字符输入。因此在模型导出时,根据自己的模型需求,对需要进行识别的对象名称,进行定义;接着在导出模型时,会将定义的类别字符转换为权重,直接加载到模型中。

这样在模型推理时,就无需再进行文本权重转换,提升模型推理的速度;但这样也会导致导出的模型无法再修改类别,如果需要更改类别,就需要重新导出模型。

3. 项目配置

3.1 源码下载与项目配置

首先使用Git克隆项目源码。输入以下指令:

git clone https://github.com/guojin-yan/OpenVINO-CSharp-API-Samples.git

代码下载完成后,使VS 2022打开解决方案Samples.sln文件,找到yolo-world-opencvsharp-net4.8项目,如下图所示:

接下来安装依赖项。首先是安装OpenVINO™ C# API项目依赖,通过NuGet安装一下包即可:

OpenVINO.CSharp.API
OpenVINO.runtime.win
OpenVINO.CSharp.API.Extensions
OpenVINO.CSharp.API.Extensions.OpenCvSharp

关于在不同平台上搭建 OpenVINO™ C# API 开发环境请参考以下文章: 《在Windows上搭建OpenVINO™C#开发环境》 、《在Linux上搭建OpenVINO™C#开发环境》、《在MacOS上搭建OpenVINO™C#开发环境》

接下来安装使用到的图像处理库 OpenCvSharp,通过NuGet安装一下包即可:

OpenCvSharp4
OpenCvSharp4.Extensions
OpenCvSharp4.runtime.win

关于在其他平台上搭建 OpenCvSharp 开发环境请参考以下文章:《【OpenCV】在Linux上使用OpenCvSharp》 、《【OpenCV】在MacOS上使用OpenCvSharp》

添加完成项目依赖后,项目的配置文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<packages><package id="Microsoft.Bcl.AsyncInterfaces" version="5.0.0" targetFramework="net48" /><package id="OpenCvSharp4" version="4.9.0.20240103" targetFramework="net48" /><package id="OpenCvSharp4.Extensions" version="4.9.0.20240103" targetFramework="net48" /><package id="OpenCvSharp4.runtime.win" version="4.9.0.20240103" targetFramework="net48" /><package id="OpenVINO.CSharp.API" version="2024.0.0.1" targetFramework="net48" /><package id="OpenVINO.CSharp.API.Extensions" version="1.0.1" targetFramework="net48" /><package id="OpenVINO.CSharp.API.Extensions.OpenCvSharp" version="1.0.4" targetFramework="net48" /><package id="OpenVINO.runtime.win" version="2024.0.0.2" targetFramework="net48" /><package id="SharpCompress" version="0.35.0" targetFramework="net48" /><package id="System.Buffers" version="4.5.1" targetFramework="net48" /><package id="System.Drawing.Common" version="7.0.0" targetFramework="net48" /><package id="System.Memory" version="4.5.5" targetFramework="net48" /><package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" /><package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net48" /><package id="System.Text.Encoding.CodePages" version="8.0.0" targetFramework="net48" /><package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net48" /><package id="System.ValueTuple" version="4.5.0" targetFramework="net48" /><package id="ZstdSharp.Port" version="0.7.4" targetFramework="net48" />
</packages>

3.2 定义模型预测方法

使用 OpenVINO™ C# API 部署模型主要包括以下几个步骤:

  • 初始化 OpenVINO Runtime Core
  • 读取本地模型(将图片数据预处理方式编译到模型)
  • 将模型编译到指定设备
  • 创建推理通道
  • 处理图像输入数据
  • 设置推理输入数据
  • 模型推理
  • 获取推理结果
  • 处理结果数据

下面根据模型部署流程,详细介绍一下该模型的部署代码:

该项目主要使用到OpenCvSharpOpenVINO™ C# API这两个工具包,因此需要添加以下命名空间:

using OpenCvSharp;
using OpenVinoSharp;
using OpenVinoSharp.Extensions.process;
  • 初始化 OpenVINO Runtime Core

    Core core = new Core();
    
  • 读取本地模型(将图片数据预处理方式编译到模型)

    Model model = core.read_model(tb_model_path.Text);
    
  • 将模型编译到指定设备

    CompiledModel compiled_model = core.compile_model(model, cb_device.SelectedItem.ToString());
    
  • 创建推理通道

    InferRequest request = compiled_model.create_infer_request();
    
  • 处理图像输入数据

    Mat image = Cv2.ImRead(tb_input_path.Text);
    Mat mat = new Mat();
    Cv2.CvtColor(image, mat, ColorConversionCodes.BGR2RGB);
    mat = OpenVinoSharp.Extensions.process.Resize.letterbox_img(mat, (int)input_shape[2], out factor);
    mat = Normalize.run(mat, true);
    float[] input_data = Permute.run(mat);
    
  • 设置推理输入数据

    Tensor input_tensor = request.get_input_tensor();
    input_tensor.set_data(input_data);
    
  • 模型推理

     request.infer();
    
  • 获取推理结果

    Tensor output_boxes = request.get_tensor("boxes");
    float[] boxes = output_boxes.get_data<float>((int)output_boxes.get_size());
    Tensor output_scores = request.get_tensor("scores");
    float[] scores = output_scores.get_data<float>((int)output_scores.get_size());
    Tensor output_labels = request.get_tensor("labels");
    int[] labels = output_labels.get_data<int>((int)output_labels.get_size());
    
  • 处理结果数据

    DetResult postprocess(float[] result, int categ_nums, float factor) 
    {Mat result_data = new Mat(4 + categ_nums, 8400, MatType.CV_32F,result);result_data = result_data.T();// Storage results listList<Rect> position_boxes = new List<Rect>();List<int> classIds = new List<int>();List<float> confidences = new List<float>();// Preprocessing output resultsfor (int i = 0; i < result_data.Rows; i++){Mat classesScores = new Mat(result_data, new Rect(4, i, categ_nums, 1));Point maxClassIdPoint, minClassIdPoint;double maxScore, minScore;// Obtain the maximum value and its position in a set of dataCv2.MinMaxLoc(classesScores, out minScore, out maxScore,out minClassIdPoint, out maxClassIdPoint);// Confidence level between 0 ~ 1// Obtain identification box informationif (maxScore > 0.25){float cx = result_data.At<float>(i, 0);float cy = result_data.At<float>(i, 1);float ow = result_data.At<float>(i, 2);float oh = result_data.At<float>(i, 3);int x = (int)((cx - 0.5 * ow) * factor);int y = (int)((cy - 0.5 * oh) * factor);int width = (int)(ow * factor);int height = (int)(oh * factor);Rect box = new Rect();box.X = x;box.Y = y;box.Width = width;box.Height = height;position_boxes.Add(box);classIds.Add(maxClassIdPoint.X);confidences.Add((float)maxScore);}}// NMS non maximum suppressionint[] indexes = new int[position_boxes.Count];float score = float.Parse(tb_score.Text);float nms = float.Parse(tb_nms.Text);CvDnn.NMSBoxes(position_boxes, confidences, score, nms, out indexes);DetResult re = new DetResult();// for (int i = 0; i < indexes.Length; i++){int index = indexes[i];re.add(classIds[index], confidences[index], position_boxes[index]);}return re;
    }
    

以上就是使用 OpenVINO™ C# API 部署YOLO-World模型的关键代码,具体代码可以下载项目源码进行查看。

4. 项目运行与演示

配置好项目后,点击运行,本次我们提供给大家的是使用.NET Framework4.8开发的窗体应用程序,如下图所示,主要还包含五个部分,分别为推理设置区域、控制按钮、推理信息输出区域、原图展示区域、推理结果展示区域。在使用时,用户可以根据自己需求,选择导出的模型以及待推理数据,支持图片数据以及视频数据,接着输入自己导出的lables名称,同时还可以修改推理设备、数据处理所需的参数等,接着就可以依次点击加载模型、模型推理按钮,进行模型推理。最后模型推理结果如图所示。

该模型在导出时,只定义了busperson类别,因此在模型推理后,可以识别出图片中的busperson元素。

接着又测试了导出时只定义person类别的模型,如下图所示,最后识别出来的结果只有person

最后,我们提供了一个行人检测视频案例,视频链接如下所示:

https://mp.weixin.qq.com/s/7dlLtUE2NTIHHyKvOskGhg

5. 总结

在该项目中,我们结合之前开发的 OpenVINO™ C# API 项目部署YOLOv9模型,成功实现了对象目标检测与实例分割,并且根据不同开发者的使用习惯,同时提供了OpenCvSharp以及Emgu.CV两种版本,供各位开发者使用。最后如果各位开发者在使用中有任何问题,欢迎大家与我联系。

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

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

相关文章

助贷客户管理系统:助力助贷公司轻松实现30%增长目标!

为了解决传统助贷公司在业务过程中遇到的痛点&#xff0c;盛鑫优创科技特别设计了一款定制化的解决方案——"鑫鹿助贷客户管理系统"&#xff0c;以满足助贷行业的独特需求&#xff1a; 传统助贷公司的老板们在做业务的的过程中都有这些痛点&#xff1a; 1、没有一个…

探索5个独特AI工具:它们是否值得独立存在?

在这个“地下AI”系列的最新一集中&#xff0c;我们深入挖掘了一些鲜为人知的AI工具。这些工具并非出自OpenAI、微软或谷歌等科技巨头之手&#xff0c;而是独立创造者和小型团队的智慧结晶。我们的目标是发现利用最新AI技术的独特工具。但这次有个新玩法&#xff1a;我们玩一个…

ABAP 数据写入Excel 并保存 千分位

参考老白 https://www.cnblogs.com/liaojunbo/archive/2011/09/06/2168552.html 但是缺zcl_excel 。需要从 dotabap要引入abap2xlsx 英文版进入后 尝试了一下 1&#xff09;列的宽度自适应么有找到在哪里&#xff1f; 列宽设置 lo_worksheet->set_column_width( ip_co…

生信技能45 - 基于docker容器运行生信软件

1. 获取docker镜像 以运行xhmm CNV分析软件为例。 # 搜索仓库镜像 sudo docker search xhmm# 拉取镜像 sudo docker pull ksarathbabu/xhmm_v1.0# 启动镜像,非后台 sudo docker run -it ksarathbabu/xhmm_v1.0 /bin/bash # -i: 交互式操作。 # -t: 终端。 # ksarathbabu/xhmm…

软件测试经理工作日常随记【2】-接口自动化

软件测试主管工作日常随记【2】-接口自动化 1.接口自动化 jmeter-反电诈项目 这个我做过的一个非常有意义的项目&#xff0c;和腾讯合作的&#xff0c;主要为用户拦截并提示所有可能涉及到的诈骗类型&#xff0c;并以裂变的形式扩展用户&#xff0c;这个项目前期后端先完成&…

VMware虚拟网卡网络适配器出现黄色感叹号

问题发生&#xff1a;VMware在使用Ubuntu的过程中突然卡死&#xff0c;强制关闭开启后就发生了网络无法连接 找到电脑的设备管理发现VMware的适配器出现黄色感叹号 解决方法&#xff1a; 下载软件ccleaner 扫描问题&#xff0c;懒得去找就修复了所有的问题 最后发现适配器…

连锁收银系统批量调整商品价格教程

1、进入系统后台&#xff0c;系统后台登录网址&#xff1a; 2、点击商品>商品调价 3、将按模板整理好的商品价格数据导入即可。 Tips&#xff1a;每次导入的商品数量不要超过6000 条。

python 12实验

1.导入数据。 2.清洗数据&#xff0c;将缺失值或“NAN”替换为“无”&#xff0c;并将文本数据转换为数值型数据。 3.使用聚类算法&#xff08;如KMeans&#xff09;对数据进行聚类&#xff0c;并计算样本到簇中心的平均距离以确定最佳的簇数量。 4.对数据进行PCA降维&#xff…

Python进阶之-jinja2详解

✨前言&#xff1a; &#x1f31f;什么是jinja2&#xff1f; Jinja2 是一个强大的 Python 模版引擎&#xff0c;主要用于生成HTML或其他文本文件。这个库非常适合开发动态网站和Web应用的视图层&#xff0c;因为它支持逻辑操作如循环和条件判断&#xff0c;还可以继承和重用模…

linux——主从同步

1. 保证主节点开始二进制日志&#xff0c;从节点配置中继日志 2. 从节点的开启一个 I/O 线程读取主节点二进制日志的内容 3. 从节点读取主节点的二进制日志之后&#xff0c;会将去读的内容写入从节点的中继日志 4. 从节点开启 SQL 线程&#xff0c;读取中继日志的内容&a…

图搜索算法 - 广度优先搜索法(BFS)

相关文章&#xff1a; 图搜索算法 - 深度优先搜索法&#xff08;DFS&#xff09; 广度优先搜索法&#xff08;BFS&#xff09; 2.从一个顶点出发&#xff0c;把它所有关联的顶点依次访问&#xff0c;然后到下一个顶点&#xff08;刚才访问的关联顶点&#xff09;。然后以这个顶…

Advanced RAG 06:生成结果的相关性低? 快用 Query Rewriting 优化技术

编者按&#xff1a;在现实生活中&#xff0c;普通用户很难编写合适的提示词&#xff08;prompt&#xff09;来指示 LLM 完成期望任务。用户提出的 queries 往往存在词汇不准确、缺乏语义信息等问题&#xff0c;导致 LLM 难以理解并生成相关的模型响应。因此&#xff0c;如何优化…

前端 | iframe框架标签应用(二)| 外部页面导入

文章目录 &#x1f4da;实现效果&#x1f4da;模块实现解析&#x1f407;html&#x1f407;css&#x1f407;javascript &#x1f4da;实现效果 点击右上角喇叭&#xff0c;弹出iframe页面框&#xff0c;链接bilibili白噪音视频页面&#xff1b;点击关闭按钮&#xff0c;关闭弹…

sqlmodel实现唯一性校验3,检查多列同时重复

之前的方案虽然能够解决重复性问题&#xff0c;但是没有覆盖到多列同时重复的情况。 比如&#xff0c;我们可以认为用户名是可以重复的。但是用户名和年龄不能同时重复&#xff0c;那么这种情况该怎么解决呢&#xff1f; 之前的代码如下&#xff1a; from sqlalchemy import…

数据集标签数量不均衡如何设计loss均衡数量

数据集标签数量不均衡如何设计loss均衡数量 1. 思路出发点&#xff1a; 对于哪些数量分布比值较少的标签提供更多的loss注意力比重&#xff0c;如何提高训练注意力比重&#xff0c;也就是说&#xff0c;让模型的梯度更多的倾向于有利于数据标签分布较少的数据训练&#xff0c…

【快捷部署】023_HBase(2.3.6)

&#x1f4e3;【快捷部署系列】023期信息 编号选型版本操作系统部署形式部署模式复检时间023HBase2.3.6Ubuntu 20.04tar包单机2024-05-07 注意&#xff1a;本脚本非全自动化脚本&#xff0c;有2次人工干预&#xff0c;第一次是确认内网IP&#xff0c;如正确直接回车即可&#…

了解TMS运输管理系统,实现物流高效运转

TMS运输管理系统&#xff08;Transportation Management System&#xff09;是一种集成物流和信息技术的解决方案&#xff0c;通过优化运输流程、实时跟踪货物信息和自动化管理操作&#xff0c;提高物流效率&#xff0c;降低运营成本&#xff0c;实现高效运输。 TMS运输管理系…

吴恩达2022机器学习专项课程C2(高级学习算法)W1(神经网络):2.4 神经网络层

目录 神经网络第一层&#xff08;隐藏层&#xff09;计算过程1.输入向量2.神经元的计算2.标识不同神经元3.层输出&#xff08;激活&#xff09;向量4.神经网络分层5.标识不同层 神经网络第二层&#xff08;输出层&#xff09;计算过程1.输入向量2.层输出&#xff08;激活&#…

Vue CLI配置代理、2.0、3.0

一、vue cli2.0 代理配置 proxy: {/api:{target: "http://localhost:8067",pathRewrite: {/api: }}, } 一、vue cli3.0 代理配置 proxy: {/api: {target: http://localhost:8067,pathRewrite: {/api: }} }

Redis 之 布隆过滤器 与 布谷鸟过滤器

大家都知道,在计算机中IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景: 我们业务后端涉及数据库,当请求消息查询某些信息时,可能先检查缓存中是否有相关信息,有的话返回,如果没有的话可能就要去数据库里面查询,这时候有一个…