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

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

3天内不再提示

OpenVINO2024 C++推理使用技巧

OpenCV学堂 来源:OpenCV学堂 2024-07-26 09:20 次阅读

前言

很多人都使用OpenVINO新版的C++ 或者PythonSDK,都觉得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的优化与整理,已经是非常贴近开发的使用习惯与推理方式。与OpenCV的Mat对象对接方式更是几乎无缝对接,非常的方便好用。

导入头文件

一行代码就获取C++ SDK支持

#include 

创建推理推理请求

总结起来有三种不同方式,针对单个固定输入与输出层的模型,只需要三行代码即可创建:

ov::Core ie;
ov::CompiledModel compiled_model = ie.compile_model(settings.getWeight_file(), "CPU");
infer_request = compiled_model.create_infer_request();
对于支持动态输入的模型,需要首先设置支持动态输入的维度,一般都是图像宽高,加载模型,创建推理请求的方式如下:
ov::Core ie;
auto model = ie.read_model(settings.getWeight_file());
autoinputs=model->inputs();


// change the input as dynamic shape support
for(auto input_one : inputs){
         auto input_shape = input_one.get_partial_shape();
         input_shape[0] = 1;
         input_shape[1] = 3;
         input_shape[2] = -1;
         input_shape[3] = -1;
}


ov::CompiledModel compiled_model = ie.compile_model(model, "CPU");
infer_request = compiled_model.create_infer_request();
如果有多个输入层的模型,想动态修改输入层与模型输入的格式,然后再创建推理请求,代码实现如下:
ov::Core ie;
std::cout<<"model file: "<
auto model = ie.read_model(settings.getWeight_file());
std::cout<<"read model file finished!"<


// setting input data format and layout
ov::PrePostProcessor ppp(model);
ov::InputInfo& inputInfo0 = ppp.input(0);
inputInfo0.tensor().set_element_type(ov::u8);
inputInfo0.tensor().set_layout({ "NCHW" });
inputInfo0.model().set_layout("NCHW");


ov::InputInfo& inputInfo1 = ppp.input(1);
inputInfo1.tensor().set_element_type(ov::u8);
inputInfo1.tensor().set_layout({ "NCHW" });
inputInfo1.model().set_layout("NCHW");
model = ppp.build();


ov::CompiledModel compiled_model = ie.compile_model(model, "CPU");
this->infer_request = compiled_model.create_infer_request();

导出IR格式模型

我发现OpenVINO已经支持脚本方式导出XML的IR格式文件,简单易用,推荐给大家。以下是导出YOLOv8格式IR文件脚本,亲测有效:

ov_model = ov.convert_model("D:/python/my_yolov8_train_demo/yolov8n.onnx",
                             input=[[1, 3, 640, 640]])
ov.save_model(ov_model, str("D:/bird_test/back1/yolov8_ov.xml"))

图像预处理

OpenVINO已经有自己的预处理方式,代码如下:

ov::PrePostProcessor ppp(model);
ov::InputInfo& input = ppp.input(tensor_name);
// we only need to know where is C dimension
input.model().set_layout("...C");
// specify scale and mean values, order of operations is important
input.preprocess().mean(116.78f).scale({ 57.21f, 57.45f, 57.73f });
// insert preprocessing operations to the 'model'
model = ppp.build();
同时你还可以使用OpenCV的blobfromImage函数来完成图像预处理:
// 预处理
cv::Mat blob_image;
resize(image, blob_image, cv::Size(input_w, input_h));
blob_image.convertTo(blob_image, CV_32F);
blob_image = blob_image / 255.0;

或者

cv::Mat blob = cv::blobFromImage(image, 1 / 255.0, cv::Size(640, 640), cv::Scalar(0, 0, 0), true, false);

预测推理

OpenVINO C++ SDK支持两种方式预测推理,分别是同步与异步模式,此外异步模式还支持Callback的方式实现后处理,这样对于实现推理流水线非常有用。代码片段如下: 同步推理,等待结果

this->infer_request.infer();

异步方式 + Callback

auto restart_once = true;
infer_request.set_callback([&, restart_once](std::exception_ptr exception_ptr) mutable {
    if (exception_ptr) {
        // procces exception or rethrow it.
        std::rethrow_exception(exception_ptr);
    } else {
        // Extract inference result
        ov::Tensor output_tensor = infer_request.get_output_tensor();
        // Restart inference if needed
        if (restart_once) {
            infer_request.start_async();
            restart_once = false;
        }
    }
});
// Start inference without blocking current thread
infer_request.start_async();
// Get inference status immediately
bool status = infer_request.wait_for(std::milliseconds{0});
// Wait for one milisecond
status = infer_request.wait_for(std::milliseconds{1});
// Wait for inference completion
infer_request.wait();

cv::Mat与ov::Tensor转换

从Mat创建Tensor对象,这个时候我就喜欢模型的输入格式是NHWC的方式,这样创建Tensor,设置输入数据只要一行代码即可,示例如下:

bgr.convertTo(bgr, CV_32FC3);
gray.convertTo(gray, CV_32F, 1.0/255);


ov::Tensor blob1(input_tensor_1.get_element_type(), input_tensor_1.get_shape(), (float *)bgr.data);
ov::Tensor blob2(input_tensor_2.get_element_type(), input_tensor_2.get_shape(), (float *)gray.data);
推理预测结果Tensor到OpenCV Mat对象,也很简单明了,如果输出数据是NHWC四维,可以直接用下面的代码:
const float* prob = (float*)output.data();
const ov::Shape outputDims = output.get_shape();
size_t numRows = outputDims[1];
size_t numCols = outputDims[2];

// 通道数为1 用这行

cv::Mat detOut(numRows, numCols, CV_32F, (float*)prob);

// 通道数为3 用这行

cv::Mat detOut(numRows, numCols, CV_32FC3, (float*)prob);

如果输出是1xHW的三维张量,直接用下面这样:

cv::Mat detOut(numRows, numCols, CV_32F, (float*)prob);

从此你就真的解锁了OpenVINO C++ 模型推理部署的各种细节了。

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

    关注

    1

    文章

    549

    浏览量

    24549
  • C++
    C++
    +关注

    关注

    21

    文章

    2084

    浏览量

    73264
  • 代码
    +关注

    关注

    30

    文章

    4656

    浏览量

    67699
  • SDK
    SDK
    +关注

    关注

    3

    文章

    1002

    浏览量

    45365
  • OpenVINO
    +关注

    关注

    0

    文章

    73

    浏览量

    133

原文标题:OpenVINO2024 C++ 推理使用技巧合集

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    在Ubuntu上搭建OpenVINO C++程序开发环境

    这种集成开发环境,为了在 Ubuntu 上也能拥有类似 Visual Studio 的开发体验,笔者探索出基于 Anaconda 和 VS Code,搭建 OpenVINO C++ 程序开发环境的方式。
    发表于 08-09 09:42 820次阅读
    在Ubuntu上搭建<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b>程序开发环境

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

    ,故今天我们将向大家展示使用 OpenVINO C++ API 部署 FastSAM 模型,并且对比预处理、推理、后处理等时间的消耗。
    的头像 发表于 11-17 09:53 706次阅读
    如何使用<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b> API部署FastSAM模型

    同步模式下OpenVINO2023 SDK的推理方式

    OpenVINO2023版本的SDK支持同步与异步推理模式相比之前OpenVINO2021版本更加的简洁,易用。同时支持创建多个Requst然后基于多个Requst实现流水线方式的推理
    的头像 发表于 11-21 10:03 734次阅读
    同步模式下<b class='flag-5'>OpenVINO</b>2023 SDK的<b class='flag-5'>推理</b>方式

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

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

    使用OpenVINO运行C++ API创建输入tensor并执行推理遇到的问题求解

    使用 OpenVINO™ 运行时 C++ API 创建输入 tensor 并执行推理: ov::Tensor input_tensor = ov::Tensor(input_type
    发表于 08-15 08:22

    在Raspberry Pi上从源代码构建OpenVINO 2021.3收到错误怎么解决?

    在 Raspberry Pi 上从源代码构建 OpenVINO™2021.3。 运行OpenVINO推理,并收到错误消息: ModuleNotFoundError:没有
    发表于 08-15 08:24

    如何在使用Inspector运行OpenVINO C++样本时避免内存泄露?

    运行OpenVINO™ 图像分类 Async C++示例带英特尔® Inspector用于检查内存问题。使用命令: $ pwd /home/centos
    发表于 08-15 06:18

    C++演示中的推理速度比Python演示中的推理速度更快是为什么?

    在同一主机机上采用相同型号的 Ran Object Detection C++ 演示 和 对象检测 Python 演示 。 C++ 演示中的推理速度比 Python 演示中的推理速度
    发表于 08-15 06:52

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

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

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

    深度学习模型部署有OpenVINO、ONNXRUNTIME、TensorRT三个主流框架,均支持Python与C++的SDK使用。对YOLOv5~YOLOv8的系列模型,均可以通过C++推理
    的头像 发表于 08-06 11:39 2351次阅读

    OpenVINOC# API详解与演示

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

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

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

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

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

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

    Python API 部署 RT-DETR 模型 | 开发者实战》和《基于 OpenVINO C++ API 部署 RT-DETR 模型 | 开发者实战》,在该文章中,我们基于 OpenVINO
    的头像 发表于 11-10 16:59 588次阅读
    基于<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C</b># API部署RT-DETR模型

    基于QT5+OpenCV+OpenVINO C++的应用打包过程

    我用QT C++写了一个YOLOv5模型推理演示应用。
    的头像 发表于 01-26 10:17 825次阅读
    基于QT5+OpenCV+<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b>的应用打包过程