衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenVINO2024 C++推理使用技巧

OpenCV學(xué)堂 ? 來源:OpenCV學(xué)堂 ? 2024-07-26 09:20 ? 次閱讀

前言

很多人都使用OpenVINO新版的C++ 或者PythonSDK,都覺得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的優(yōu)化與整理,已經(jīng)是非常貼近開發(fā)的使用習(xí)慣與推理方式。與OpenCV的Mat對(duì)象對(duì)接方式更是幾乎無縫對(duì)接,非常的方便好用。

導(dǎo)入頭文件

一行代碼就獲取C++ SDK支持

#include 

創(chuàng)建推理推理請(qǐng)求

總結(jié)起來有三種不同方式,針對(duì)單個(gè)固定輸入與輸出層的模型,只需要三行代碼即可創(chuàng)建:

ov::Core ie;
ov::CompiledModel compiled_model = ie.compile_model(settings.getWeight_file(), "CPU");
infer_request = compiled_model.create_infer_request();
對(duì)于支持動(dòng)態(tài)輸入的模型,需要首先設(shè)置支持動(dòng)態(tài)輸入的維度,一般都是圖像寬高,加載模型,創(chuàng)建推理請(qǐng)求的方式如下:
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();
如果有多個(gè)輸入層的模型,想動(dòng)態(tài)修改輸入層與模型輸入的格式,然后再創(chuàng)建推理請(qǐng)求,代碼實(shí)現(xiàn)如下:
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();

導(dǎo)出IR格式模型

我發(fā)現(xiàn)OpenVINO已經(jīng)支持腳本方式導(dǎo)出XML的IR格式文件,簡(jiǎn)單易用,推薦給大家。以下是導(dǎo)出YOLOv8格式IR文件腳本,親測(cè)有效:

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

圖像預(yù)處理

OpenVINO已經(jīng)有自己的預(yù)處理方式,代碼如下:

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();
同時(shí)你還可以使用OpenCV的blobfromImage函數(shù)來完成圖像預(yù)處理:
// 預(yù)處理
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);

預(yù)測(cè)推理

OpenVINO C++ SDK支持兩種方式預(yù)測(cè)推理,分別是同步與異步模式,此外異步模式還支持Callback的方式實(shí)現(xiàn)后處理,這樣對(duì)于實(shí)現(xiàn)推理流水線非常有用。代碼片段如下: 同步推理,等待結(jié)果

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轉(zhuǎn)換

從Mat創(chuàng)建Tensor對(duì)象,這個(gè)時(shí)候我就喜歡模型的輸入格式是NHWC的方式,這樣創(chuàng)建Tensor,設(shè)置輸入數(shù)據(jù)只要一行代碼即可,示例如下:

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);
推理預(yù)測(cè)結(jié)果Tensor到OpenCV Mat對(duì)象,也很簡(jiǎn)單明了,如果輸出數(shù)據(jù)是NHWC四維,可以直接用下面的代碼:
const float* prob = (float*)output.data();
const ov::Shape outputDims = output.get_shape();
size_t numRows = outputDims[1];
size_t numCols = outputDims[2];

// 通道數(shù)為1 用這行

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

// 通道數(shù)為3 用這行

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

如果輸出是1xHW的三維張量,直接用下面這樣:

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

從此你就真的解鎖了OpenVINO C++ 模型推理部署的各種細(xì)節(jié)了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 文件
    +關(guān)注

    關(guān)注

    1

    文章

    570

    瀏覽量

    24820
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2114

    瀏覽量

    73854
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4825

    瀏覽量

    69040
  • SDK
    SDK
    +關(guān)注

    關(guān)注

    3

    文章

    1045

    瀏覽量

    46267
  • OpenVINO
    +關(guān)注

    關(guān)注

    0

    文章

    95

    瀏覽量

    225

原文標(biāo)題:OpenVINO2024 C++ 推理使用技巧合集

文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    在Ubuntu上搭建OpenVINO C++程序開發(fā)環(huán)境

    這種集成開發(fā)環(huán)境,為了在 Ubuntu 上也能擁有類似 Visual Studio 的開發(fā)體驗(yàn),筆者探索出基于 Anaconda 和 VS Code,搭建 OpenVINO C++ 程序開發(fā)環(huán)境的方式。
    發(fā)表于 08-09 09:42 ?1098次閱讀
    在Ubuntu上搭建<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b>程序開發(fā)環(huán)境

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

    ,故今天我們將向大家展示使用 OpenVINO C++ API 部署 FastSAM 模型,并且對(duì)比預(yù)處理、推理、后處理等時(shí)間的消耗。
    的頭像 發(fā)表于 11-17 09:53 ?991次閱讀
    如何使用<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b> API部署FastSAM模型

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

    OpenVINO2023版本的SDK支持同步與異步推理模式相比之前OpenVINO2021版本更加的簡(jiǎn)潔,易用。同時(shí)支持創(chuàng)建多個(gè)Requst然后基于多個(gè)Requst實(shí)現(xiàn)流水線方式的推理
    的頭像 發(fā)表于 11-21 10:03 ?938次閱讀
    同步模式下<b class='flag-5'>OpenVINO</b>2023 SDK的<b class='flag-5'>推理</b>方式

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

    無法確定如何在OpenVINO?工具包中使用帶推理引擎的 blob。
    發(fā)表于 08-15 07:17

    使用OpenVINO運(yùn)行C++ API創(chuàng)建輸入tensor并執(zhí)行推理遇到的問題求解

    使用 OpenVINO? 運(yùn)行時(shí) C++ API 創(chuàng)建輸入 tensor 并執(zhí)行推理: ov::Tensor input_tensor = ov::Tensor(input_type
    發(fā)表于 08-15 08:22

    如何在使用Inspector運(yùn)行OpenVINO C++樣本時(shí)避免內(nèi)存泄露?

    運(yùn)行OpenVINO? 圖像分類 Async C++示例帶英特爾? Inspector用于檢查內(nèi)存問題。使用命令: $ pwd /home/centos
    發(fā)表于 08-15 06:18

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

    在同一主機(jī)機(jī)上采用相同型號(hào)的 Ran Object Detection C++ 演示 和 對(duì)象檢測(cè) Python 演示 。 C++ 演示中的推理速度比 Python 演示中的推理速度
    發(fā)表于 08-15 06:52

    OpenVINO? C++ API編寫YOLOv8-Seg實(shí)例分割模型推理程序

    本文章將介紹使用 OpenVINO 2023.0 C++ API 開發(fā)YOLOv8-Seg 實(shí)例分割(Instance Segmentation)模型的 AI 推理程序。本文 C++
    的頭像 發(fā)表于 06-25 16:09 ?1704次閱讀
    用<b class='flag-5'>OpenVINO</b>? <b class='flag-5'>C++</b> API編寫YOLOv8-Seg實(shí)例分割模型<b class='flag-5'>推理</b>程序

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

    深度學(xué)習(xí)模型部署有OpenVINO、ONNXRUNTIME、TensorRT三個(gè)主流框架,均支持Python與C++的SDK使用。對(duì)YOLOv5~YOLOv8的系列模型,均可以通過C++推理
    的頭像 發(fā)表于 08-06 11:39 ?2815次閱讀

    OpenVINO? C# API詳解與演示

    OpenVINO C# API 支持 NuGet 程序包安裝方式,這與 OpenVINO C++ 庫(kù)的安裝過程相比,更加簡(jiǎn)單。如果使用 Visual Studio 開發(fā) AI 項(xiàng)目,則
    的頭像 發(fā)表于 10-13 16:39 ?840次閱讀
    <b class='flag-5'>OpenVINO</b>?  <b class='flag-5'>C</b># API詳解與演示

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

    RT-DETR 是在 DETR 模型基礎(chǔ)上進(jìn)行改進(jìn)的,一種基于 DETR 架構(gòu)的實(shí)時(shí)端到端檢測(cè)器,它通過使用一系列新的技術(shù)和算法,實(shí)現(xiàn)了更高效的訓(xùn)練和推理,我們將在 Python、C++、C# 三個(gè)
    的頭像 發(fā)表于 10-20 11:15 ?1054次閱讀
    基于<b class='flag-5'>OpenVINO</b> Python API部署RT-DETR模型

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

    應(yīng)用中,我們?yōu)榱伺c當(dāng)前軟件平臺(tái)集成更多會(huì)采用 C++ 平臺(tái),因此在本文中,我們將基于 OpenVINO C++ API 向大家展示了不包含后處理的 RT-DETR 模型的部署流程,并向大家展示如何導(dǎo)出不包含后處理的 RT-DET
    的頭像 發(fā)表于 11-03 14:30 ?927次閱讀
    基于<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b> API部署RT-DETR模型

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

    Python API 部署 RT-DETR 模型 | 開發(fā)者實(shí)戰(zhàn)》和《基于 OpenVINO C++ API 部署 RT-DETR 模型 | 開發(fā)者實(shí)戰(zhàn)》,在該文章中,我們基于 OpenVINO
    的頭像 發(fā)表于 11-10 16:59 ?805次閱讀
    基于<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C</b># API部署RT-DETR模型

    基于QT5+OpenCV+OpenVINO C++的應(yīng)用打包過程

    我用QT C++寫了一個(gè)YOLOv5模型推理演示應(yīng)用。
    的頭像 發(fā)表于 01-26 10:17 ?1457次閱讀
    基于QT5+OpenCV+<b class='flag-5'>OpenVINO</b> <b class='flag-5'>C++</b>的應(yīng)用打包過程

    使用OpenVINO Model Server在哪吒開發(fā)板上部署模型

    OpenVINO Model Server(OVMS)是一個(gè)高性能的模型部署系統(tǒng),使用C++實(shí)現(xiàn),并在Intel架構(gòu)上的部署進(jìn)行了優(yōu)化,使用OpenVINO 進(jìn)行推理,
    的頭像 發(fā)表于 11-01 14:19 ?353次閱讀
    使用<b class='flag-5'>OpenVINO</b> Model Server在哪吒開發(fā)板上部署模型
    马德里百家乐官网的玩法技巧和规则| 全讯网信息| 百家乐官网是真的吗| 澳门百家乐赢钱秘| 吴忠市| 海港城百家乐官网的玩法技巧和规则 | 网络百家乐| 云顶国际网| 在线百家乐| 察雅县| 百家乐最新投注法| 安丘市| 百家乐官网筹码14克粘土| 凯旋门娱乐城开户| 百家乐娱乐城主页| 百家乐官网网上公式| 明陞百家乐娱乐城| 百家乐官网破解| 亿酷棋牌世界下载| 捷豹百家乐官网的玩法技巧和规则| 娱乐城注册送18| 百家乐最常见的路子| 百家乐官网电脑上怎么赌| 威尼斯人娱乐城安全吗| 百家乐官网套利| 百家乐官网10法则| 千亿娱百家乐的玩法技巧和规则 | 百家乐作弊工具| 临沂市| 百家乐在线赌场| 皇冠百家乐官网皇冠网| 老虎百家乐的玩法技巧和规则| 百家乐官网单机版的| 宾利娱乐城| 旧金山百家乐的玩法技巧和规则| 永利百家乐官网赌场娱乐网规则| 信丰县| 百家乐路单破解软件| 网上百家乐官网分析软件| 中华德州扑克论坛| 蓝盾百家乐网址|