什么是OpenVino?以及如何使用OpenVino运行yolo

news2024/11/24 2:17:21

目录

Openvino简介

如何使用它?

构建源代码

Openvino IR模型

第一个Openvino示例

C语言示例

C++示例

使用OpenVino跑Yolo模型


Openvino简介

Openvino是由Intel开发的专门用于优化和部署人工智能推理的半开源的工具包,主要用于对深度推理做优化

Openvino内部集成了OpencvTensorFlow模块,除此之外它还具有强大的Plugin开发框架,允许开发者在Openvino之上对推理过程做优化。

Openvino整体框架为:Openvino前端→ Plugin中间层→ Backend后端

 Openvino的优点在于它屏蔽了后端接口,提供了统一操作的前端API,开发者可以无需关心后端的实现,例如后端可以是TensorFlow、Keras、ARM-NN,通过Plugin提供给前端接口调用,也就意味着一套代码在Openvino之上可以运行在多个推理引擎之上,Openvino像是类似聚合一样的开发包。

如何使用它?

构建源代码

1. 首先你需要在github上下载到它的源代码

git clone https://github.com/openvinotoolkit/openvino

2. 下载完成之后进入到openvino的目录,然后拉取openvino的子模块源代码

cd openvino
git submodule update --init --recursive

NOTE:如果你的网络不好,可以使用gitee方式拉取

chmod +x scripts/submodule_update_with_gitee.sh
./scripts/submodule_update_with_gitee.sh

3. 使用Openvino自带的脚本安装依赖

chmod +x install_build_dependencies.sh
sudo ./install_build_dependencies.sh

4. 从源码构建Openvino

首先创建一个build目录并进入

mkdir build && cd build

通过Cmake构建Openvino

cmake -DCMAKE_BUILD_TYPE=Release ..
make --jobs=$(nproc --all)

Openvino项目比较大,构建过程可能需要一定时间。

5. 环境配置

编译完成之后执行make install命令进行脚本自动化配置

安装完成之后会存放到/usr/local/runtime目录下

make install

Openvino IR模型

Openvino使用IR文件格式作为神经网络数据处理格式,IR文件格式是Openvino官方自己定义的,IR模型由两个文件组成:

XML文件

描述网络拓扑结构

BIN文件

包含网络权重数据,以IR文件格式存储

Openvino提供了工具来将任意模型格式转化为IR文件格式:mo.py

你可以在Openvino的源代码目录里找到:

tools/mo/openvino/tools/mo/mo.py

使用示例

tools/mo/openvino/tools/mo/mo.py --input_model your_model.pb --output_dir output_dir

执行之后会在输出目录下生成两个文件:xml、bin文件,需要值得注意的是Openvino不支持动态输入维度,你可以通过模型check工具来查看你的模型是否是动态输入

如果维度里显示?,代表是动态输入,大小是可变的,Openvino不支持动态输入,有两种方法可以修改,第一种是通过mo.py或IR文件格式指定,第二种是在代码里指定。

在使用mo.py时指定它的维度:

--input: 指定输入端口名称

--input_shape: 指定维度

tools/mo/openvino/tools/mo/mo.py --input_model your_model.pb --input Input:0 --input_shape [1,1]--output_dir output_dir

如果你的模型已经转化为IR文件格式则可以直接在xml里修改:

<layers>
                <layer id="0" name="Input" type="Parameter" version="opset1">
                        <data shape="?,1" element_type="f32" /> #修改这里将?改成1
                        <output>
                                <port id="0" precision="FP32" names="Input:0">
                                        <dim>-1</dim>
                                        <dim>1</dim>
                                </port>
                        </output>
                </layer>
</layers>

除此之外在xml里你还可以修改输入维度的类型,这些配置在compile模型时会Openvino会根据xml描述来分配不同的类型存储以及运算。

Openvino本身已经支持PB、ONNX格式,你可以不用转换成IR文件格式在Openvino里直接使用,在Compile阶段Openvino会自动将其转换成IR文件格式。

第一个Openvino示例

Openvino底层是使用C语言实现的,所以它可以提供给多个语言的使用。

C语言示例

首先包含Openvino基础头文件

#include <openvino/c/openvino.h>

初始化ov

ov_core_t* core = NULL;
ov_core_create(&core);
if(core == NULL) {
        printf("can't create core object\n");
        return -1;
}

读取模型到内存

ov_model_t* model = NULL; 
ov_core_read_model(core, "test.xml", NULL, &model);
if (model == NULL) {
          printf("can't read a model.\n");
          return -1;
}

编译模型,这一步需要指定要使用的Plugin

ov_compiled_model_t* compiled_model = NULL;
ov_core_compile_model(core, model, "CPU", 0, &compiled_model);
if (compiled_model == NULL) {
        printf("can't compile model.\n");
        return -1;
}

创建推理引擎

ov_infer_request_t* infer_request = NULL;
ov_compiled_model_create_infer_request(compiled_model, &infer_request);
if(infer_request == NULL) {
       printf("can't create infer request.\n");
       return -1;
}

获取输入Input

ov_tensor_t* input_tensor1 = NULL;
ov_infer_request_get_tensor(infer_request, "Input:0", &input_tensor1);
if (input_tensor1 == NULL) {
         printf("can't get tensor.\n");
         return -1;
}

获取输入tensor

void* data = NULL;
ov_tensor_data(input_tensor1, &data);
if (data == NULL) {
         printf("can't i642i32.\n");
         return -1;
}
float* data1 = (float*)data;

输入数据

data1[0] = 20.f;

开始推理

ov_infer_request_infer(infer_request);

获取推理结果并打印

ov_tensor_t* output_tensor = NULL;
void* data_out = NULL;
ov_infer_request_get_output_tensor(infer_request, &output_tensor);
if(output_tensor == NULL) {
          printf("can't get output tensor.\n");
          return -1;
}
ov_tensor_data(output_tensor, &data_out);
if(data_out == NULL) {
            printf("can't out i642i32.\n");
            return -1;
 }
float* out_data = (float*)data_out;
printf("%f\n", out_data[0]);

C++示例

初始化OpenVINO运行时核心

ov::Core core;

读取模型

std::shared_ptr<ov::Model> model = core.read_model("./Face.xml");

加载模型到内存并指定Plugin

ov::CompiledModel compiled_model = core.compile_model(model, "cpu");

获取模型的输入端口

auto input_port = compiled_model.input();

创建推理引擎

ov::InferRequest infer_request = compiled_model.create_infer_request();

输入数据

ov::Tensor input_tensor1 = infer_request.get_input_tensor(0);
auto data1 = input_tensor1.data<float>();
data1[0] = 60.f

开始推理

infer_request.infer();

获取输出并打印

auto output_tensor = infer_request.get_output_tensor(0);
const float *result = output_tensor_p8.data<const float>();
cout << result[0] << endl;

使用OpenVino跑Yolo模型

Openvino官方提供了YoloV7模型的示例,可以直接在Github上下载

git clone https://github.com/OpenVINO-dev-contest/YOLOv7_OpenVINO_cpp-python.git

除此之外你需要一个YoloV7的模型,你可以在这里下载到:YoloV7

下载一个你需要的模型,然后在将Yolo源码拉下来

git clone https://github.com/WongKinYiu/yolov7.git

OpenVino支持onnx模型,使用yolov7自带的导出py代码,将pt文件导出成onnx

python export.py --weights yolov7.pt

会在当前目录下生成一个yolov7.onnx的文件

然后进入到YOLOv7_OpenVINO_cpp-python目录下编译CPP代码

cd YOLOv7_OpenVINO_cpp-python
cd cpp
mkdir build
cmake ..
make

yolov7.onnxCopy到build目录下然后执行:

yolov7 yolov7.onnx ../data/horses.jpg 'CPU'

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/462201.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源,点云处理及三维重建软件(Point Cloud Viewer, PCV)的设计与实现

GitHub地址&#xff1a;point-cloud-viewer GitCode地址&#xff1a;point-cloud-viewer 文章目录 使用教程以及相关工具库Step 1 搭建环境Step 2 使用Cmake构建工程Step3 使用VS 编写code并编译执行 点云处理及三维重建软件(PCV)的设计与实现一&#xff0c; 软件总体设计1.1 软…

C++ LinuxWebServer 2万7千字的面经长文(下)

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! Linux Web Server项目虽然是现在C++求职者的人手一个的项目,但是想要吃透这个项目,还是需要一定的基础的,以项目为导向,进行基础的学习。 涵盖了计算机网络(网络编程…

springboot网上商城项目(一)

springboot网上商城项目&#xff08;一&#xff09; &#xff08;一&#xff09;项目分析1.项目分析2.开发顺序3.前端资源测试 &#xff08;二&#xff09;用户注册1.创建数据库2.实体类编写3.注册&#xff08;持久层&#xff09;4.注册&#xff08;业务层&#xff09;5.注册&a…

类ChatGPT的部署与微调(下):从ChatGLM-6b到ChatDoctor、可商用

前言 随着『GPT4多模态/Microsoft 365 Copilot/Github Copilot X/ChatGPT插件』的推出&#xff0c;绝大部分公司的技术 产品 服务&#xff0c;以及绝大部分人的工作都将被革新一遍 类似iPhone的诞生 大家面向iOS编程 有了App Store现在有了ChatGPT插件/GPT应用商店&#xff…

国产CMS61850那些事-服务端

前面两篇文章国产CMS61850那些事-总述_LinuxZQ的博客-CSDN博客&#xff0c;cms61850那些事-实现_LinuxZQ的博客-CSDN博客分别对国产61850做了一些简单介绍和相关实现。本文接着给大家提供一款服务端demo&#xff0c;可以用来进行抓包等相关学习。 与之前分享的mms 61850一样&am…

如此这般,好吗?

让我们回顾一下 Linux 社区最新的愿景——推动去中心化的应用来解决发行版的碎片化。继上周的文章&#xff1a;“Snap、Flatpak 这种通吃所有发行版的打包方式真的有用吗&#xff1f;” 之后&#xff0c;一系列新观点浮出水面&#xff0c;其中可能包含关于这样应用是否有用的重…

Vmware安装Ubuntu出现 unable to find a medium containing a live file system

一、前言 由于未知的原因&#xff0c;使用Vmware安装Ubuntu的时候&#xff0c;总是遇到奇怪的问题。&#xff08;忘记截图了…&#xff09; 大致是&#xff1a; unable to find a medium containing a live file system找了几个帖子&#xff0c;参考1、参考2&#xff0c;但都…

GPT模型成功的背后用到了哪些以数据为中心的人工智能(Data-centric AI)技术?

人工智能&#xff08;Artificial Intelligence, AI&#xff09;最近取得了巨大的进展&#xff0c;特别是大语言模型&#xff08;Large Language Models, LLMs&#xff09;&#xff0c;比如最近火爆全网的ChatGPT和GPT-4。GPT模型在各项自然语言处理任务上有着惊人的效果。至于具…

JAVA Future类详解及Thread线程是如何运行Future类的

一、Future基本介绍 Future(java.util.concurrent Interface Future<V>)表示异步计算的结果。Future接口提供了检查计算是否完成、检查计算是否被取消、等待计算完成并获取计算结果等方法。 在并发编程中&#xff0c;我们经常用到非阻塞的模型&#xff0c;但继承thread类…

基于 SpringBoot+Vue+Java 的留守儿童系统的研究与实现(附源码,教程)

文章目录 1.研究背景2. 技术栈3.系统分析4系统设计5系统的详细设计与实现5.1系统功能模块5.2管理员功能模块 1.研究背景 以往的留守儿童爱心的管理&#xff0c;一般都是纸质文件来管理留守儿童爱心信息&#xff0c;传统的管理方式已经无法满足现代人们的需求&#xff1b;使用留…

[激光原理与应用-69]:激光器-器件 - 三极管

第1章 什么是三级管 三极管&#xff0c;全称应为半导体三极管&#xff0c;也称双极型晶体管、晶体三极管&#xff0c;是一种控制电流的半导体器件。其作用是把微弱电流信号放大成幅度值较大的电流信号&#xff0c;也用作无触点开关。电流信号经过电阻后&#xff0c;就变成了电压…

ARM嵌入式编译器编译优化选项 -O

Arm嵌入式编译器可以执行一些优化来减少代码量并提高应用程序的性能。不同的优化级别有不同的优化目标&#xff0c;不仅如此&#xff0c;针对某个目标进行优化会对其他目标产生影响。比如想减小生成的代码量&#xff0c;势必会影响到该代码的性能。所以优化级别总是这些不同目标…

Python中 re.findAll()、re.sub()、set()的使用

1. re.findall() re.findall()&#xff1a;函数返回包含所有匹配项的列表。返回string中所有与pattern相匹配的全部字串&#xff0c;返回形式为list / 数组。 由函数原型代码可知&#xff0c;findall() 函数存在三个参数&#xff1a; 1. pattern&#xff1a;正则表达式中的 ‘模…

RK3568平台开发系列讲解(驱动基础篇)IO 模型的分类

🚀返回专栏总目录 文章目录 一、阻塞 IO二、非阻塞 IO三、IO 多路复用四、信号驱动五、异步 IO沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将针对IO模型进行分类。 假设有这样一个场景,从磁盘中循环读取 100M 的数据并处理,磁盘读取 100M 需要花费 20 秒的…

HR真的会嫌弃跳槽频繁的测试人员吗?

我们都知道&#xff1a;“跳槽≠涨薪”&#xff0c;但是对于测试人来说&#xff0c;跳槽绝哔能和升职加薪画上等号啊。 所以&#xff0c;有很多测试人在一家公司常常待不到1年&#xff0c;就另觅新东家&#xff0c;来借此达成升职加薪的目的。 有人提出质疑&#xff1a;为什么测…

【老王读SpringMVC-2】url 与 controller method 的映射关系注册

上文提到&#xff0c;如果我们自己要实现 spring mvc 框架的话&#xff0c;大致需要实现如下功能&#xff1a; 0、将 url 与 Controller method 的对应关系进行注册1、通过请求的 url 找到 Controller method (即 url 与 Controller method 的映射)2、将请求参数进行绑定&…

【python中的迭代器了解一下?】

基本说明 在 Python 中&#xff0c;迭代器是一种用于遍历可迭代对象&#xff08;如列表、元组、字符串等&#xff09;的方式。迭代器提供了一种简洁而有效的方法来遍历序列&#xff0c;而不需要创建临时变量或使用循环语句。 在 Python 中&#xff0c;迭代器是一个实现了 __i…

没有U盘电脑如何使用本地硬盘安装Ubuntu20.04(双系统)

环境: DELL7080台式机 Ubuntu20.04 两块硬盘 问题描述: 没有U盘电脑如何使用本地硬盘安装Ubuntu20.04(双系统) 解决方案: 一、下载镜像文件 1.上线自行下载安装镜像文件 二、分区 1.win10下磁盘管理压缩2个分区一个10G左右制作安装盘,一个几百G安装系统使用 10…

【Android入门到项目实战-- 7.1】—— 如何使用通知?

目录 一、创建通知的步骤 1、创建一个NotificationManager实例 2、使用一个Builder构造器来创建Notification对象 3、设置标题、文字、时间和图标等信息 4、显示通知 二、通知实例演示 三、实现通知的点击效果 1、PendingIntent 什么是PendingIntent&#xff1f; 如何使…

后台-husky提交代码规范使用

husky是一个git hook工具&#xff0c;可以帮助我们触发git提交的各个阶段&#xff1a;pre-commit、commit-msg、pre-push 1.如何使用husky呢&#xff1f; npx husky-init && npm installWindows安装不成功试试npx husky-init && npm install 2.git commit规范…