赞
踩
目录
Openvino是由Intel开发的专门用于优化和部署人工智能推理的半开源的工具包,主要用于对深度推理做优化。
Openvino内部集成了Opencv、TensorFlow模块,除此之外它还具有强大的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文件格式作为神经网络数据处理格式,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底层是使用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]);
初始化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官方提供了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'
运行结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。