0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用OpenVINO C# API部署YOLO-World实现实时开放词汇对象检测

英特尔物联网 来源:CSharp与边缘模型部署 2024-08-30 16:27 次阅读

以下文章来源于CSharp与边缘模型部署 ,作者椒颜PiPi虾

作者:颜国进

英特尔边缘计算创新大使

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前言

1OpenVINO C# API

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

wKgaombRhkWATb94AAJXBZDBmVM540.png

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

2YOLO-World

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

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

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

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

2模型获取

YOLO-World模型可以通过[YOLO-World GitHub](https://github.com/AILab-CVC/YOLO-World.git)获取,小编尝试了一下,步骤比较复杂,且配置起来比较麻烦,因此如果是初学者,不建议使用,下面介绍一个比较简单的导出方式:通过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')

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

wKgZombRhnKANB7EAAIOYk6m67c735.png

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

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

3项目配置

1源码下载与项目配置

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

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

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

wKgaombRhn-ALBbsAAIkZTWJ2Do025.png

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

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

关于在不同平台上搭建 OpenVINO C# API 开发环境请参考以下文章:

《在Windows上搭建OpenVINOC#开发环境》:

https://github.com/guojin-yan/OpenVINO-CSharp-API/blob/csharp3.1/docs/inatall/Install_OpenVINO_CSharp_Windows_cn.md

《在Linux上搭建OpenVINOC#开发环境》

https://github.com/guojin-yan/OpenVINO-CSharp-API/blob/csharp3.1/docs/inatall/Install_OpenVINO_CSharp_Linux_cn.md

《在MacOS上搭建OpenVINOC#开发环境》

https://github.com/guojin-yan/OpenVINO-CSharp-API/blob/csharp3.1/docs/inatall/Install_OpenVINO_CSharp_MacOS_cn.md

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

OpenCvSharp4
OpenCvSharp4.Extensions
OpenCvSharp4.runtime.win

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

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



 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

2定义模型预测方法

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

初始化 OpenVINO Runtime Core

读取本地模型(将图片数据预处理方式编译到模型)

将模型编译到指定设备

创建推理通道

处理图像输入数据

设置推理输入数据

模型推理

获取推理结果

处理结果数据

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

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

using OpenCvSharp;
using OpenVinoSharp;
using OpenVinoSharp.Extensions.process;

1) 初始化 OpenVINO Runtime Core

Core core = new Core();

2) 读取本地模型

Model model = core.read_model(tb_model_path.Text);

3) 将模型编译到指定设备

CompiledModel compiled_model = core.compile_model(model, cb_device.SelectedItem.ToString());

4) 创建推理通道

InferRequest request = compiled_model.create_infer_request();

5) 处理图像输入数据

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);

6) 设置推理输入数据

Tensor input_tensor = request.get_input_tensor();
input_tensor.set_data(input_data);

7) 模型推理

request.infer();

8) 获取推理结果

Tensor output_boxes = request.get_tensor("boxes");
float[] boxes = output_boxes.get_data((int)output_boxes.get_size());
Tensor output_scores = request.get_tensor("scores");
float[] scores = output_scores.get_data((int)output_scores.get_size());
Tensor output_labels = request.get_tensor("labels");
int[] labels = output_labels.get_data((int)output_labels.get_size());

9) 处理结果数据

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 list
  List position_boxes = new List();
  List classIds = new List();
  List confidences = new List();
  // Preprocessing output results
  for (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 data
        Cv2.MinMaxLoc(classesScores, out minScore, out maxScore,
            out minClassIdPoint, out maxClassIdPoint);
        // Confidence level between 0 ~ 1
        // Obtain identification box information
        if (maxScore > 0.25)
    {
      float cx = result_data.At(i, 0);
      float cy = result_data.At(i, 1);
      float ow = result_data.At(i, 2);
      float oh = result_data.At(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 suppression
  int[] 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名称,同时还可以修改推理设备、数据处理所需的参数等,接着就可以依次点击加载模型、模型推理按钮,进行模型推理。最后模型推理结果如图所示。

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

wKgZombRhruAbGuNAAEeESJ_pis145.png

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

wKgZombRhtiAf03wAAEU16zcf10952.png

最后,我们提供了一个行人检测视频案例,点击此处查看视频。

5总结

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 英特尔
    +关注

    关注

    61

    文章

    10007

    浏览量

    172236
  • API
    API
    +关注

    关注

    2

    文章

    1510

    浏览量

    62339
  • 目标检测
    +关注

    关注

    0

    文章

    211

    浏览量

    15655
  • OpenVINO
    +关注

    关注

    0

    文章

    95

    浏览量

    222

原文标题:使用OpenVINO™ C# API部署YOLO-World实现实时开放词汇对象检测丨开发者实战

文章出处:【微信号:英特尔物联网,微信公众号:英特尔物联网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于C#OpenVINO™在英特尔独立显卡上部署PP-TinyPose模型

    作者:英特尔物联网行业创新大使 杨雪锋 OpenVINO 2022.2版开始支持英特尔独立显卡,还能通过“累计吞吐量”同时启动集成显卡 + 独立显卡助力全速 AI 推理。本文基于 C#
    的头像 发表于 11-18 18:27 2588次阅读

    如何使用OpenVINO C++ API部署FastSAM模型

    的位置和边界。本文将介绍如何使用 OpenVINO C++ API 部署 FastSAM 模型,以实现快速高效的语义分割。在前文中我们发表了
    的头像 发表于 11-17 09:53 975次阅读
    如何使用<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C</b>++ <b class='flag-5'>API</b><b class='flag-5'>部署</b>FastSAM模型

    【EASY EAI Nano】RV1126实时读取摄像头并进行yolo检测显示

    实现了三个并行模块,分别是 摄像头读取,使用opencv转换到适合大小 yolo检测 托管到Qt进行现实 检测的DEMO从每帧10次
    发表于 01-14 18:53

    助力AIoT应用:在米尔FPGA开发板上实现Tiny YOLO V4

    Only Look Once)是一种实时物体检测模型,它通过一次性扫描整个图像,实现高效的对象识别。而其简化版 Tiny YOLO V4
    发表于 12-06 17:18

    解析OpenVINO™ + SSD 实时对象检测

    前面我们了解OpenVINO 如何部署图像分类网络ResNet,本文我们将会学习OpenVINO对象检测网络的
    的头像 发表于 05-18 09:35 2011次阅读
    解析<b class='flag-5'>OpenVINO</b>™ + SSD <b class='flag-5'>实时</b><b class='flag-5'>对象</b><b class='flag-5'>检测</b>

    C#实现ActiveX控件开发与部署

    C#实现ActiveX控件开发与部署(肇庆理士电源技术有限公司鸟瞰图)-该文档为C#实现ActiveX控件开发与
    发表于 09-27 17:36 6次下载
    <b class='flag-5'>C#</b><b class='flag-5'>实现</b>ActiveX控件开发与<b class='flag-5'>部署</b>

    OpenVINOC# API详解与演示

    OpenVINO C# API 支持 NuGet 程序包安装方式,这与 OpenVINO C++ 库的安装过程相比,更加简单。如果使用 Vi
    的头像 发表于 10-13 16:39 834次阅读
    <b class='flag-5'>OpenVINO</b>™  <b class='flag-5'>C#</b> <b class='flag-5'>API</b>详解与演示

    基于OpenVINO Python API部署RT-DETR模型

    RT-DETR 是在 DETR 模型基础上进行改进的,一种基于 DETR 架构的实时端到端检测器,它通过使用一系列新的技术和算法,实现了更高效的训练和推理,我们将在 Python、C+
    的头像 发表于 10-20 11:15 1046次阅读
    基于<b class='flag-5'>OpenVINO</b> Python <b class='flag-5'>API</b><b class='flag-5'>部署</b>RT-DETR模型

    如何使用OpenVINO Python API部署FastSAM模型

    的位置和边界。本文将介绍如何使用 OpenVINO Python API 部署 FastSAM 模型,以实现快速高效的语义分割。
    的头像 发表于 10-27 11:04 816次阅读

    基于OpenVINO C++ API部署RT-DETR模型

    RT-DETR 是在 DETR 模型基础上进行改进的,一种基于 DETR 架构的实时端到端检测器,它通过使用一系列新的技术和算法,实现了更高效的训练和推理,在前文我们发表了《基于 OpenVI
    的头像 发表于 11-03 14:30 919次阅读
    基于<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C</b>++ <b class='flag-5'>API</b><b class='flag-5'>部署</b>RT-DETR模型

    基于OpenVINO C# API部署RT-DETR模型

    C# 环境下使用该模型应用到工业检测中,因此在本文中,我们将向大家展示使用 OpenVINO Csharp API 部署 RT-DETR
    的头像 发表于 11-10 16:59 801次阅读
    基于<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C#</b> <b class='flag-5'>API</b><b class='flag-5'>部署</b>RT-DETR模型

    OpenVINO™ Java API应用RT-DETR做目标检测器实战

    本文将从零开始详细介绍环境搭建的完整步骤,我们基于英特尔开发套件AIxBoard为硬件基础实现了Java在Ubuntu 22.04系统上成功使用OpenVINO™ Java API,并且成功运行了RT-DETR
    的头像 发表于 03-18 15:04 863次阅读
    <b class='flag-5'>OpenVINO</b>™ Java <b class='flag-5'>API</b>应用RT-DETR做目标<b class='flag-5'>检测</b>器实战

    OpenVINOC# API部署YOLOv9目标检测和实例分割模型

    YOLOv9模型是YOLO系列实时目标检测算法中的最新版本,代表着该系列在准确性、速度和效率方面的又一次重大飞跃。
    的头像 发表于 04-03 17:35 967次阅读
    <b class='flag-5'>OpenVINO</b>™ <b class='flag-5'>C#</b> <b class='flag-5'>API</b><b class='flag-5'>部署</b>YOLOv9目标<b class='flag-5'>检测</b>和实例分割模型

    OpenVINO C# API在intel平台部署YOLOv10目标检测模型

    的模型设计策略,从效率和精度两个角度对YOLOs的各个组成部分进行了全面优化,大大降低了计算开销,增强了性能。在本文中,我们将结合OpenVINO C# API使用最新发布的OpenVINO
    的头像 发表于 06-21 09:23 1127次阅读
    用<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C#</b> <b class='flag-5'>API</b>在intel平台<b class='flag-5'>部署</b>YOLOv10目标<b class='flag-5'>检测</b>模型

    开放词汇检测新晋SOTA:地瓜机器人开源DOSOD实时检测算法

    超越YOLO-World!DOSOD 实现速度与精度的完美平衡
    的头像 发表于 01-08 15:27 357次阅读
    <b class='flag-5'>开放</b><b class='flag-5'>词汇</b><b class='flag-5'>检测</b>新晋SOTA:地瓜机器人开源DOSOD<b class='flag-5'>实时</b><b class='flag-5'>检测</b>算法