一、简介

OpenVINO™是英特尔推出的一个用于优化和部署AI推理的开源工具包。常用于 Inter 的集成显卡网络推理使用。

官网地址:https://docs.openvino.ai

二、下载

下载地址:https://docs.openvino.ai/latest/openvino_docs_install_guides_installing_openvino_linux.html

针对不同平台,在如图红框处选择不同的文档参考,按照官网文档一步步执行就行。

三、使用

注意:笔者当前使用的版本为 openvino_2021。

假设你已经有了模型的 xml 文件和对应的 bin 文件了,基本代码流程如下:

#include <stdio.h>
#include <string>
#include "inference_engine.hpp"#define LOGD(fmt, ...) printf("[%s][%s][%d]: " fmt "\n", __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)using namespace InferenceEngine;int main(int argc, char *argv[]) {// 1.查看版本号信息const Version* version = GetInferenceEngineVersion();LOGD("version description: %s, buildNumber: %s, major.minor: %d.%d",version->description, version->buildNumber, version->apiVersion.major, version->apiVersion.minor);// 2.创建推理引擎Core ie;std::vector<std::string> devices = ie.GetAvailableDevices(); // 查看可使用的Devices,包含 CPU、GPU 等for (std::string device : devices) {LOGD("GetAvailableDevices: %s", device.c_str());}// 3.读取模型文件const std::string input_model_xml = "model.xml";CNNNetwork network = ie.ReadNetwork(input_model_xml);// 4.配置输入输出信息InputsDataMap& inputs = network.getInputsInfo();for (auto& input : inputs) {auto& input_name = input.first; //input是一个键值对类型InputInfo::Ptr& input_info = input.second;input_info->setLayout(Layout::NCHW); // 设置排列方式input_info->setPrecision(Precision::FP32); // 设置精度为float32input_info->getPreProcess().setResizeAlgorithm(ResizeAlgorithm::RESIZE_BILINEAR);input_info->getPreProcess().setColorFormat(ColorFormat::RAW); // 设置图片格式}OutputsDataMap& outputs = network.getOutputsInfo();for (auto& output : outputs) {auto& output_name = output.first; //output也是一个键值对类型DataPtr& output_info = output.second;output_info->setPrecision(Precision::FP32);auto& dims = output_info->getDims();LOGD("output shape name: %s, dims: [%d, %d, %d, %d]", output_name.c_str(), dims[0], dims[1], dims[2], dims[3]);}// 5.根据设备(CPU、GPU 等)加载网络std::string device_name = "CPU"; // 可用的device通过ie.GetAvailableDevices查询ExecutableNetwork executable_network = ie.LoadNetwork(network, device_name);// 6.创建推理请求InferRequest infer_request = executable_network.CreateInferRequest();/* 如上6步,在多次执行网络推理过程中,可以缓存起来只创建一次,节约耗时*/// 7.设置输入数据InputsDataMap& inputs = network.getInputsInfo();for (auto& input : inputs) {auto& input_name = input.first; //input是一个键值对类型Blob::Ptr blob = infer_request.GetBlob(name);unsigned char* data = static_cast<unsigned char*>(blob->buffer());// TODO: 通过memcpy等方式给data赋值// readFile(input_path, data);}// 8.网络推理infer_request.Infer();// 9.获取输出OutputsDataMap& outputs = network.getOutputsInfo();for (auto& output : outputs) {auto& output_name = output.first; //output也是一个键值对类型const Blob::Ptr output_blob = infer_request.GetBlob(name);LOGD("size: %d, byte_size: %d", output_blob->size(), output_blob->byteSize());const float* output_data = static_cast<PrecisionTrait<Precision::FP32>::value_type*>(output_blob->buffer());// writeFile(path, (void *)output_data, output_blob->byteSize());}
}

其余更复杂的使用场景,可以参考下载的SDK中的示例,路径是 .\openvino_2021\inference_engine\samples\cpp。

四、ReadNetwork说明

1.通过文件路径读取模型

通常我们的模型文件就是本地的一个文件,通过路径加载即可,对应的接口为:

/*** @brief Reads models from IR and ONNX formats* @param modelPath path to model* @param binPath path to data file* For IR format (*.bin):*  * if path is empty, will try to read bin file with the same name as xml and*  * if bin file with the same name was not found, will load IR without weights.* For ONNX format (*.onnx or *.prototxt):*  * binPath parameter is not used.* @return CNNNetwork*/
CNNNetwork ReadNetwork(const std::string& modelPath, const std::string& binPath = {}) const;

如果bin文件路径和xml文件路径一致且文件名相同,该参数可以省略,如:CNNNetwork network = ie.ReadNetwork("model.xml")

2.通过内存地址读取模型

假设我们的模型已经在内存中了,可以通过如下接口创建:

/*** @brief Reads models from IR and ONNX formats* @param model string with model in IR or ONNX format* @param weights shared pointer to constant blob with weights* Reading ONNX models doesn't support loading weights from data blobs.* If you are using an ONNX model with external data files, please use the* `InferenceEngine::Core::ReadNetwork(const std::string& model, const Blob::CPtr& weights) const`* function overload which takes a filesystem path to the model.* For ONNX case the second parameter should contain empty blob.* @note Created InferenceEngine::CNNNetwork object shares the weights with `weights` object.* So, do not create `weights` on temporary data which can be later freed, since the network* constant datas become to point to invalid memory.* @return CNNNetwork*/
CNNNetwork ReadNetwork(const std::string& model, const Blob::CPtr& weights) const;

使用示例:

extern unsigned char __res_model_xml [];
extern unsigned int __res_model_xml_size;
extern unsigned char __res_model_bin [];
extern unsigned int __res_model_bin_size;std::string model(__res_model_xml, __res_model_xml + __res_model_xml_size);
CNNNetwork network = ie.ReadNetwork(model,InferenceEngine::make_shared_blob<uint8_t>({InferenceEngine::Precision::U8,{__res_model_bin_size}, InferenceEngine::C}, __res_model_bin));

英特尔OpenVINO使用入门(C++集成方式)相关推荐

  1. 英特尔OpenVINO(TM)工具包为创新智能视觉提供更多可能

    北京2018年7月27日电 /美通社/ -- 为支持现代数字企业在万物智能互联的新时代里快速处理海量视觉数据,并提升业务洞察及效率,英特尔在以"智能端到端,英特尔变革物联网"为主题 ...

  2. 英特尔OpenVINO工具包助力边缘人工智能创新

    有数据显示,到2021年,边缘到云行业支出预计将达到110亿美元.在这一涵盖智能制造.智慧城市等领域的巨大物联网机遇中,智能设备.传感器和互联事物捕捉的视频将会占据60亿美元的份额. 面对巨大的市场需 ...

  3. 英特尔® OpenVINO™中级认证正式开启!

    极市&英特尔® OpenVINO™联合中级认证正式开启! OpenVINO™ 工具套件是由英特尔®公司提供,赋能开发者快速开发高性能计算机视觉和深度学习视觉应用的工具包.它不但可以帮助开发者在 ...

  4. 英特尔OpenVINO工具套件高级课程实验操作记录与学习总结

    英特尔OpenVINO工具套件高级课程&实验操作记录与学习总结 实验机器环境部分信息: dc2-user@10-0-255-63:~$ lsb_release -a No LSB module ...

  5. 英特尔OpenVINO工具套件快速构建一款AI应用之课程体验

    首先和大家说明一下,这是一个体验课程笔记 本文记录.博主学习该课程前两个章节内容的笔记心得 声明:本文禁止转载.感谢理解与支持 文末有课程链接 这个课程.博主会一边学习.一边撰写更多笔记类教程 对 模 ...

  6. TF/pytorch/caffe-CV/NLP/音频-全生态CPU部署实战演示-英特尔openVINO工具套件课程总结(下)

    TF-pytorch-caffe~CV/NLP/音频-全生态CPU部署实战演示-英特尔openVINO工具套件课程总结(下) 在上中两篇中我们充分理解了openvino的基本原理以及其硬件基础,在这篇 ...

  7. 英特尔正考虑与台湾集成电路设计公司祥硕科技签订芯片组设计订单

    [TechWeb]5月31日消息,据国外媒体报道,据业内消息人士称,英特尔正考虑与台湾集成电路设计公司祥硕科技(ASMedia Technology)签订芯片组设计订单,作为抵御AMD竞争的一部分. ...

  8. 免费领取英特尔OpenVINO高级认证证书

    一.活动要求 <英特尔® OpenVINO™工具套件高级课程>一共 10 小节,共计 142 分钟, 本次福利活动要求同学们学完全部课程内容(包括实验部分,并下载课程中需要的 Intelo ...

  9. 学习笔记(01):英特尔® OpenVINO™工具套件初级课程-如何加速视频处理进程?

    立即学习:https://edu.csdn.net/course/play/27685/385715?utm_source=blogtoedu 1Frame = 1920*1080 pxels RGB ...

最新文章

  1. WinAPI: 输入光标相关的函数[3]
  2. 李佳琦一晚卖了100亿,有位“硬汉”在背后默默发力
  3. Java基础/利用fastjson序列化对象为JSON
  4. Java基于Socket文件传输示例
  5. 使用VS2003创建WEB程序的时候出现AutoMation服务器不能创建对象错误
  6. 关于c++中运算符重载
  7. 辗转相除最小公倍数的递归求法
  8. 数组输出黑科技----fwrite()
  9. mysql截取字符串最后两位_Mysql字符串截取函数SUBSTRING的用法说明
  10. python 相对路径报错_小白学 Python(18):基础文件操作
  11. 使用app-inspector时报错connect ECONNREFUSED 127.0.0.1:8001的解决方案
  12. lgg7刷机包下载_LGG7One刷机包
  13. 没有U盘纯硬盘安装linux之Ubuntu22.04
  14. pycharm安装jpype报错及解决方法
  15. android 退出登录 一般的实现方法,Android应用退出登录的实现方法
  16. 集合点 java协议_LR插入集合点rendezvous
  17. 奶瓶(beini) 又一蹭网神器 1.2.2增强版带600万密码字典
  18. 2022中式烹调师(高级)考试题库及答案
  19. 微信小程序怎么开通(自己申请开通微信小程序的方法)
  20. APACHE官网下载历史版本TOMCAT(以8.5.6版本为例)

热门文章

  1. ubuntu下安装飞鸽传书
  2. spring家族 img圖
  3. 金庸武功之““兰花拂穴手””--elk5.5安装
  4. 【我的Android进阶之旅】Android 混淆文件资源分类整理之二:将混淆文件拆分成更小粒度的混淆文件
  5. GeneXus学习记录——环境搭建
  6. platEMO里多目标进化算法对应的参考文献
  7. 阿里云ACP云计算错题集121-140
  8. 进军餐饮行业,店铺该如何选址?
  9. ELK入门(十八)——Kibana APM server安装部署
  10. 核燃料干式储存容器市场现状及未来发展趋势