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

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

3天内不再提示

在C++中使用OpenVINO工具包部署YOLOv5-Seg模型

新机器视觉 来源:小白学视觉 2023-12-21 10:17 次阅读

来源:小白学视觉

YOLOv5兼具速度和精度,工程化做的特别好,Git clone到本地即可在自己的数据集上实现目标检测任务的训练和推理,在产业界中应用广泛。开源社区对YOLOv5支持实例分割的呼声高涨,YOLOv5在v7.0中正式官宣支持实例分割。

本文主要介绍在C++中使用OpenVINO工具包部署YOLOv5-Seg模型,主要步骤有:

配置OpenVINO C++开发环境

下载并转换YOLOv5-Seg预训练模型

使用OpenVINO Runtime C++ API编写推理程序

下面,本文将依次详述

1.1 配置OpenVINO C++开发环境

配置OpenVINO C++开发环境的详细步骤,请参考《在Windows中基于Visual Studio配置OpenVINO C++开发环境》。

1.2 下载并转换YOLOv5预训练模型

下载并转换YOLOv5-seg预训练模型的详细步骤,请参考:https://mp.weixin.qq.com/s/K3wP5YLAU4p5jsdiMYjuMg,本文所使用的OpenVINO是2022.3 LTS版。

首先,运行命令获得 yolov5s-seg ONNX 格式模型:yolov5s-seg.onnx:


python export.py --weights yolov5s-seg.pt --include onnx

然后运行命令获得yolov5s-seg IR格式模型:yolov5s-seg.xml和yolov5s-seg.bin,如下图所示


mo -m yolov5s-seg.onnx --compress_to_fp16

242196be-9f94-11ee-8b88-92fbcf53809c.png

图 1-1 yolov5-seg ONNX格式和IR格式模型

1.3 使用OpenVINO Runtime C++ API编写推理程序

一个端到端的AI推理程序,主要包含五个典型的处理流程:

采集图像&图像解码

图像数据预处理

AI推理计算

对推理结果进行后处理

将处理后的结果集成到业务流程

24363650-9f94-11ee-8b88-92fbcf53809c.png

图 1-2 端到端的AI推理程序处理流程

1.3.1 采集图像&图像解码

OpenCV提供imread()函数将图像文件载入内存,


Mat cv::imread (const String &filename, int flags=IMREAD_COLOR)

若是从视频流(例如,视频文件、网络摄像头、3D摄像头(Realsense)等)中,一帧一帧读取图像数据到内存,则使用cv::VideoCapture类,对应范例代码请参考OpenCV官方范例代码:https://github.com/opencv/opencv/tree/4.x/samples/cpp。

243a3584-9f94-11ee-8b88-92fbcf53809c.png

图 1-3 从视频流读取图像帧范例

1.3.2 YOLOv5-Seg模型的图像预处理

YOLOv5-Seg模型构架是在YOLOv5模型构架基础上,增加了一个叫“Proto”的小型卷积神经网络,用于输出检测对象掩码(Mask),如下图所示:

2455333e-9f94-11ee-8b88-92fbcf53809c.png

图 1-4 YOLOv5-Seg模型输出的代码定义

详细参看:https://github.com/ultralytics/yolov5/blob/master/models/yolo.py#L92

由此可知,YOLOv5-Seg模型对数据预处理的要求跟YOLOv5模型一模一样,YOLOv5-Seg模型的预处理代码可以复用YOLOv5模型的C++预处理代码。

另外,从代码可以看出YOLOv5-Seg模型的输出有两个张量,一个张量输出检测结果,一个张量输出proto,其形状可以用Netron打开yolov5-seg.onnx查知,如下图所示。

2459b864-9f94-11ee-8b88-92fbcf53809c.png

图 1-5 YOLOv5-Seg模型的输入和输出

“output0”是检测输出,第一个维度表示batch size,第二个维度表示25200条输出,第三个维度表示有117个字段,其中前85个字段(0~84)表示:cx、cy、w、h、confidence和80个类别分数,后32个字段与”output1”做矩阵乘法,可以获得尺寸为160x160的检测目标的掩码(mask)。

1.3.3 执行AI推理计算

基于OpenVINO Runtime C++ API实现AI推理计算主要有两种方式:一种是同步推理方式,一种是异步推理方式,本文主要介绍同步推理方式。

主要步骤有:

初始化Core类:ov::Core core;

编译模型:core.compile_model()

创建推理请求infer_request:compiled_model.create_infer_request()

读取图像数据并做预处理:letterbox()

将预处理后的blob数据传入模型输入节点:infer_request.set_input_tensor()

调用infer()方法执行推理计算:infer_request.infer()

获得推理结果:infer_request.get_output_tensor()

基于OpenVINO Runtime C++API的同步推理代码如下所示:


 // -------- Step 1. Initialize OpenVINO Runtime Core --------
    ov::Core core;
    // -------- Step 2. Compile the Model --------
    auto compiled_model = core.compile_model(model_file, "GPU.1"); //GPU.1 is dGPU A770
    // -------- Step 3. Create an Inference Request --------
    ov::InferRequest infer_request = compiled_model.create_infer_request();
    // -------- Step 4. Read a picture file and do the preprocess --------
    cv::Mat img = cv::imread(image_file); //Load a picture into memory
    std::vector paddings(3);       //scale, half_h, half_w
    cv::Mat resized_img = letterbox(img, paddings); //resize to (640,640) by letterbox
    // BGR->RGB, u8(0-255)->f32(0.0-1.0), HWC->NCHW
    cv::Mat blob = cv::blobFromImage(resized_img, 1 / 255.0, cv::Size(640, 640), cv::Scalar(0, 0, 0), true);
    // -------- Step 5. Feed the blob into the input node of YOLOv5 -------
    // Get input port for model with one input
    auto input_port = compiled_model.input();
    // Create tensor from external memory
    ov::Tensor input_tensor(input_port.get_element_type(), input_port.get_shape(), blob.ptr(0));
    // Set input tensor for model with one input
    infer_request.set_input_tensor(input_tensor);
    // -------- Step 6. Start inference --------
    infer_request.infer();
    // -------- Step 7. Get the inference result --------
    auto detect = infer_request.get_output_tensor(0);
    auto detect_shape = detect.get_shape();
    std::cout << "The shape of Detection tensor:"<< detect_shape << std::endl;
    auto proto = infer_request.get_output_tensor(1);
    auto proto_shape = proto.get_shape();
std::cout << "The shape of Proto tensor:" << proto_shape << std::endl;

1.3.4 推理结果进行后处理

后处理工作主要是从”detect ”输出张量中拆解出检测框的位置和类别信息,并用cv::NMSBoxes()过滤掉多于的检测框;从”detect ”输出张量的后32个字段与”proto”输出张量做矩阵乘法,获得每个检测目标的形状为160x160的掩码输出,最后将160x160的掩码映射回原始图像完成所有后处理工作。

1.4 总结

配置OpenVINO C++开发环境后,可以直接编译运行yolov5seg_openvino_dGPU.cpp,结果如下图所示。使用OpenVINO Runtime C++ API函数开发YOLOv5推理程序,简单方便,并可以任意部署在英特尔CPU、集成显卡和独立显卡上。

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

    关注

    3

    文章

    3515

    浏览量

    88275
  • 开源
    +关注

    关注

    3

    文章

    3208

    浏览量

    42277
  • C++
    C++
    +关注

    关注

    21

    文章

    2094

    浏览量

    73442
  • 开发环境
    +关注

    关注

    1

    文章

    218

    浏览量

    16563
  • OpenVINO
    +关注

    关注

    0

    文章

    83

    浏览量

    162

原文标题:1.4 总结

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    YOLOv5】LabVIEW+TensorRT的yolov5部署实战(含源码)

    今天主要和大家分享LabVIEW中使用纯TensoRT工具包快速部署并实现yolov5的物体识别
    的头像 发表于 08-21 22:20 1248次阅读
    【<b class='flag-5'>YOLOv5</b>】LabVIEW+TensorRT的<b class='flag-5'>yolov5</b><b class='flag-5'>部署</b>实战(含源码)

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

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

    介绍英特尔®分布式OpenVINO工具包

    性能。 英特尔®OpenlandOpen™管理软件包包括英特尔®深度学习部署工具包(英特尔®DLDT)。适用于Linux *的OpenVINO工具包的英特尔®分发版:
    发表于 07-26 06:45

    如何在OpenVINO工具包中使用带推理引擎的blob?

    无法确定如何在OpenVINO工具包中使用带推理引擎的 blob。
    发表于 08-15 07:17

    使用 OpenVINO工具包进行停车场监控

    使用 OpenVINO工具包进行停车场监控
    的头像 发表于 01-03 09:45 673次阅读
    使用 <b class='flag-5'>OpenVINO</b>™ <b class='flag-5'>工具包</b>进行停车场监控

    使用 OpenVINO工具包监控机器操作员

    使用 OpenVINO工具包监控机器操作员
    的头像 发表于 01-03 09:45 685次阅读
    使用 <b class='flag-5'>OpenVINO</b>™ <b class='flag-5'>工具包</b>监控机器操作员

    C++中使OpenVINO工具包部署YOLOv5模型

    下载并转换YOLOv5预训练模型的详细步骤,请参考:《基于OpenVINO™2022.2和蝰蛇峡谷优化并部署YOLOv5
    的头像 发表于 02-15 16:53 4431次阅读

    AI爱克斯开发板上用OpenVINO™加速YOLOv8目标检测模型

    AI 爱克斯开发板上用 OpenVINO 加速 YOLOv8 分类模型》介绍了 AI 爱克斯开发板上使用
    的头像 发表于 05-12 09:08 1219次阅读
    <b class='flag-5'>在</b>AI爱克斯开发板上用<b class='flag-5'>OpenVINO</b>™加速<b class='flag-5'>YOLOv</b>8目标检测<b class='flag-5'>模型</b>

    AI爱克斯开发板上用OpenVINO™加速YOLOv8-seg实例分割模型

    AI 爱克斯开发板上用 OpenVINO 加速 YOLOv8 目标检测模型》介绍了 AI 爱克斯开发板上使用
    的头像 发表于 06-05 11:52 928次阅读
    <b class='flag-5'>在</b>AI爱克斯开发板上用<b class='flag-5'>OpenVINO</b>™加速<b class='flag-5'>YOLOv8-seg</b>实例分割<b class='flag-5'>模型</b>

    OpenVINOC++ API编写YOLOv8-Seg实例分割模型推理程序

    本文章将介绍使用 OpenVINO 2023.0 C++ API 开发YOLOv8-Seg 实例分割(Instance Segmentation)模型的 AI 推理程序。本文
    的头像 发表于 06-25 16:09 1468次阅读
    用<b class='flag-5'>OpenVINO</b>™ <b class='flag-5'>C++</b> API编写<b class='flag-5'>YOLOv8-Seg</b>实例分割<b class='flag-5'>模型</b>推理程序

    AI爱克斯开发板上用OpenVINO™加速YOLOv8-seg实例分割模型

    AI 爱克斯开发板上用 OpenVINO 加速 YOLOv8 目标检测模型》介绍了 AI 爱克斯开发板上使用
    的头像 发表于 06-30 10:43 835次阅读
    <b class='flag-5'>在</b>AI爱克斯开发板上用<b class='flag-5'>OpenVINO</b>™加速<b class='flag-5'>YOLOv8-seg</b>实例分割<b class='flag-5'>模型</b>

    三种主流模型部署框架YOLOv8推理演示

    深度学习模型部署OpenVINO、ONNXRUNTIME、TensorRT三个主流框架,均支持Python与C++的SDK使用。对YOLOv5
    的头像 发表于 08-06 11:39 2560次阅读

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

    应用中,我们为了与当前软件平台集成更多会采用 C++ 平台,因此本文中,我们将基于 OpenVINO C++ API 向大家展示了不包含后处理的 RT-DETR
    的头像 发表于 11-03 14:30 737次阅读
    基于<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b> API<b class='flag-5'>部署</b>RT-DETR<b class='flag-5'>模型</b>

    NNCF压缩与量化YOLOv8模型OpenVINO部署测试

    OpenVINO2023版本衍生出了一个新支持工具包NNCF(Neural Network Compression Framework – 神经网络压缩框架),通过对OpenVINO IR格式
    的头像 发表于 11-20 10:46 1411次阅读
    NNCF压缩与量化<b class='flag-5'>YOLOv</b>8<b class='flag-5'>模型</b>与<b class='flag-5'>OpenVINO</b><b class='flag-5'>部署</b>测试

    OpenVINO C# APIintel平台部署YOLOv10目标检测模型

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