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

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

3天内不再提示

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

OpenCV学堂 来源:OpenCV学堂 2023-11-21 10:03 次阅读

同步模式推理流程

OpenVINO2023版本的SDK支持同步与异步推理模式相比之前OpenVINO2021版本更加的简洁,易用。同时支持创建多个Requst然后基于多个Requst实现流水线方式的推理从而提升CPU推理的吞吐率。同步模式下OpenVINO2023 SDK的推理方式如下:

5c5a9dfe-880c-11ee-939d-92fbcf53809c.png

推理的流程如下:

while(true) {
  // capture frame
  // populate CURRENT InferRequest
  // Infer CURRENT InferRequest
  //this call is synchronous
  // display CURRENT result
}
以YOLOv5s的模型为例,在OpenVINO C++上同步推理的代码实现如下:
// 创建IE插件, 查询支持硬件设备
ov::Core core;
std::string model_onnx = "D:/python/yolov5-7.0/yolov5s.onnx";
auto model = core.read_model(model_onnx);
ov::CompiledModel cmodel = core.compile_model(model, "CPU");




// create infer request
auto request = cmodel.create_infer_request();
cv::Mat frame;
while (true) {
  bool ret = cap.read(frame);
  if (frame.empty()) {
    break;
  }
  image_detect(frame, request);
  char c = cv::waitKey(1);
  if (c == 27) { // ESC
    break;
  }
}
其中image_detect方法包含模型的图像前处理、同步推理、后处理。其中同步推理:
// 前处理
// 开启同步
request.infer();
// 后处理
运行结果如下:

异步模式推理流程

当使用OpenVINO2023提供的Request对象的回调功能以后,我们可以把模型的后处理直接放到回调中去,这样异步推理方式就变成只有图像前处理+模型推两个步骤了,然后通过创建两个Request基于流水线方式,实现异步流水线模式推理方式,这个时候推理流程如下:

5c7663c2-880c-11ee-939d-92fbcf53809c.png

推理的流程如下:

while(true) {
  // capture frame
  // populate NEXT InferRequest
  // start NEXT InferRequest
  // this call is async and returns immediately
  // wait for the CURRENT InferRequest
  // display CURRENT result
  // swap CURRENT and NEXT InferRequests
}
首先需要创建两个Request,然后分别设置它们的Callback部分代码,主要是在Callback中完成后处理操作。这部分的代码如下:
 1//创建IE插件,查询支持硬件设备
 2ov::Corecore;
 3std::stringmodel_onnx="D:/python/yolov5-7.0/yolov5s.onnx";
 4automodel=core.read_model(model_onnx);
 5ov::CompiledModelcmodel=core.compile_model(model,"AUTO");
 6
 7//createinferrequest
 8autorequest=cmodel.create_infer_request();
 9autonext_request=cmodel.create_infer_request();
10std::exception_ptrexception_var;
11request.set_callback([&](std::exception_ptrex){
12if(ex){
13exception_var=ex;
14return;
15}
16det_boxes.clear();
17det_ids.clear();
18ov::Tensoroutput=request.get_output_tensor();
19constfloat*prob=(float*)output.data();
20constov::ShapeoutputDims=output.get_shape();
21size_tnumRows=outputDims[1];
22size_tnumCols=outputDims[2];
23
24//后处理,1x25200x85
25std::vectorboxes;
26std::vectorclassIds;
27std::vectorconfidences;
28cv::Matdet_output(numRows,numCols,CV_32F,(float*)prob);
29for(inti=0;i< det_output.rows; i++) {
30        float confidence = det_output.at(i,4);
31if(confidence< 0.45) {
32            continue;
33        }
34        cv::Mat classes_scores = det_output.row(i).colRange(5, numCols);
35        cv::Point classIdPoint;
36        double score;
37        minMaxLoc(classes_scores, 0, &score, 0, &classIdPoint);
38
39        // 置信度 0~1之间
40        if (score >0.25)
41{
42floatcx=det_output.at(i,0);
43floatcy=det_output.at(i,1);
44floatow=det_output.at(i,2);
45floatoh=det_output.at(i,3);
46intx=static_cast((cx-0.5*ow)*x_factor);
47inty=static_cast((cy-0.5*oh)*y_factor);
48intwidth=static_cast(ow*x_factor);
49intheight=static_cast(oh*y_factor);
50cv::Rectbox;
51box.x=x;
52box.y=y;
53box.width=width;
54box.height=height;
55
56boxes.push_back(box);
57classIds.push_back(classIdPoint.x);
58confidences.push_back(score);
59}
60}
61
62//NMS
63std::vectorindexes;
64cv::NMSBoxes(boxes,confidences,0.25,0.45,indexes);
65for(size_ti=0;i< indexes.size(); i++) {
66        int index = indexes[i];
67        det_ids.emplace_back(classIds[index]);
68        det_boxes.emplace_back(boxes[index]);
69    }
70});
依据上述的推理流程,最终调用执行的代码如下:
 1cv::Matframe,next_frame;
 2//dofirstframe
 3cap.read(frame);
 4async_image_detect(frame,request);
 5std::millisecondstout{50};
 6intcnt=0;
 7while(true){
 8boolret=cap.read(next_frame);
 9if(next_frame.empty()){
10break;
11}
12
13int64start=cv::getTickCount();
14//继续异步
15if(cnt%2==0){
16async_image_detect(next_frame,next_request);
17request.wait_for(tout);
18}
19if(cnt%2==1){
20async_image_detect(next_frame,request);
21next_request.wait_for(tout);
22}
23for(size_tt=0;t< det_boxes.size(); t++) {
24        int idx = det_ids[t];
25        cv::rectangle(frame, det_boxes[t], colors_table[idx % 6], 2, 8, 0);
26        putText(frame, classNames[idx].c_str(), det_boxes[t].tl(), cv::FONT_HERSHEY_PLAIN, 1.0, cv::Scalar(255, 0, 0), 1, 8);
27    }
28
29    // 计算FPS render it
30    float t = (cv::getTickCount() - start) / static_cast(cv::getTickFrequency());
31putText(frame,cv::format("FPS:%.2f",1.0/t),cv::Point(20,40),cv::FONT_HERSHEY_PLAIN,2.0,cv::Scalar(255,0,0),2,8);
32cv::imshow("OpenVINO2023-YOLOv57.0异步推理",frame);
33charc=cv::waitKey(1);
34if(c==27){//ESC
35break;
36}
37next_frame.copyTo(frame);
38cnt++;
39}
40cv::waitKey(0);
41cv::destroyAllWindows();
42return0;
其中async_image_detect方法中实现了YOLOv5模型推理的图像前处理与启动异步推理模式
preprocess(frame)
// 开启异步
request.start_async();

审核编辑:汤梓红

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

    关注

    0

    文章

    120

    浏览量

    25738
  • C++
    C++
    +关注

    关注

    22

    文章

    2108

    浏览量

    73650
  • 代码
    +关注

    关注

    30

    文章

    4788

    浏览量

    68610
  • SDK
    SDK
    +关注

    关注

    3

    文章

    1036

    浏览量

    45939
  • OpenVINO
    +关注

    关注

    0

    文章

    93

    浏览量

    201

原文标题:OpenVINO2023异步回调流水线提升推理吞吐率

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

收藏 人收藏

    评论

    相关推荐

    OpenVINO2022版本Python API演示

    OpenVINO2022 版本的SDK在使用比之前版本简单,而且功能比较丰富,特别是支持动态输入设置,一次可以推理多张图像;
    的头像 发表于 07-22 09:18 2275次阅读
    <b class='flag-5'>OpenVINO</b>2022版本Python API演示

    无法在AMD Ryzen CPU上运行OpenVINO trade怎么解决?

    在 AMD Ryzen CPU 上运行OpenVINO推理。 收到错误消息: libva error: vaGetDriverNameByIndex() failed with unknown libva error, driver_name (null)
    发表于 08-15 06:46

    如何在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

    无法在OpenVINO trade Docker中运行OpenCV怎么解决?

    运行命令:docker run -ditu root:root --name=openvino -h \"openvino\" --privileged \\ --device
    发表于 08-15 08:29

    如何在OpenVINO trade工具包中推断两个图像?

    无法在OpenVINO™工具包中对两个输入图像运行推理
    发表于 08-15 08:24

    OpenVINO2022系统应用指南

    推理层面支持同步与异步方式,异步方式支持通过回调实现后处理,实现视频流水线支持,下面是一系列的基于异步+流水线方式
    的头像 发表于 04-12 14:23 755次阅读

    在英特尔开发者套件上用OpenVINO™ 2023.0加速YOLOv8-Pose姿态估计模型

    benchmark_app 是 OpenVINO 工具套件自带的 AI 模型推理计算性能测试工具,可以指定在不同的计算设备上,在同步或异步模式
    的头像 发表于 06-15 17:41 1028次阅读
    在英特尔开发者套件上用<b class='flag-5'>OpenVINO</b>™ 2023.0加速YOLOv8-Pose姿态估计模型

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

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

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

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

    OpenVINO场景文字检测与文字识别教程

    OpenVINO是英特尔推出的深度学习模型部署框架,当前最新版本是OpenVINO2023版本。OpenVINO2023自带各种常见视觉任务支持的预训练模型库Model Zoo,其中支持场景文字检测
    的头像 发表于 09-24 15:31 1601次阅读
    <b class='flag-5'>OpenVINO</b>场景文字检测与文字识别教程

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

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

    如何快速下载OpenVINO Notebooks中的AI大模型

    OpenVINO Notebooks是Jupyter Notebook形式的OpenVINO范例程序大集合,方便开发者快速学习并掌握OpenVINO推理程序,并通过Copy&Paste
    的头像 发表于 12-12 14:40 1132次阅读
    如何快速下载<b class='flag-5'>OpenVINO</b> Notebooks中的AI大模型

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都觉得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的优化与整理,已经是非常贴近开发的使用习惯与
    的头像 发表于 07-26 09:20 904次阅读