【模型部署】人脸检测模型DBFace C++ ONNXRuntime推理部署(2)

news/2024/12/4 20:12:09/

系列文章目录

【模型部署】人脸检测模型DBFace C++ ONNXRuntime推理部署(0)
【模型部署】人脸检测模型DBFace C++ ONNXRuntime推理部署(1)
【模型部署】人脸检测模型DBFace C++ ONNXRuntime推理部署(2)


文章目录

  • 系列文章目录
  • 1 C++推理流程
  • 2 关键API介绍
  • 3 DBFace推理C++代码展示
  • 4 推理结果及比较
  • 参考资料

在实际应用中,由于语言的特性,通常选择C++环境进行部署,从而更快地得到推理结果。上一篇博客中已经介绍了ONNX模型转换以及Python环境下的ONNXRuntime推理,而本篇博客将分享C++环境下的ONNXRuntime推理部署流程和关键API,并以DBFace模型为例进行展示。

1 C++推理流程

C++环境下的推理并不像Python那样简单易操作,它需要先定义好相关的环境变量,并通过相应的API从ONNX模型得到节点信息,从而分配内存并创建输入输出Tensor,最后进行推理运算,基本流程及所用的API如下图所示。
在这里插入图片描述

2 关键API介绍

首先创建环境变量并设置好Session选项,所有的API都封装在Ort这个类中。Ort::Env只是用来设置日志级别以及日志输出文件,而关键的设置在Ort::SessionOptions & Ort::Session
在这里插入图片描述
设置运行的线程数和计算图优化级别,以及模型的路径。
在这里插入图片描述

Ort::Env ort_env(ORT_LOGGING_LEVEL_WARNING,default");
Ort::SessionOptions session_options;
session_options.SetIntraOpNumThreads(1);
session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL);
Ort::Session session(ort_env, pathWch, session_options);

然后通过以下API得到输入输出节点信息。
在这里插入图片描述

Ort::AllocatorWithDefaultOptions allocator;
const char* input_name = session.GetInputName(0, allocator);
auto input_info = session.GetInputTypeInfo(0).GetTensorTypeAndShapeInfo();
auto input_node_dims = input_info.GetShape();

根据得到的输入输出节点信息,创建Tensor并分配内存。
在这里插入图片描述

auto memory_info = Ort::MemoryInfo::CreateCpu(OrtAllocatorType::OrtArenaAllocator, OrtMemType::OrtMemTypeDefault);
Ort::Value input_tensor;
input_tensor = Ort::Value::CreateTensor<float>(memory_info, in_x.data,target_size,input_dims.data(),input_dims.size())

注意其中in_x.data的类型为std::vector<float>

最后用此前创建的session和Tensor变量进行推理,得到结果。
在这里插入图片描述

auto output_tensors = session.Run(Ort::RunOptions{ nullptr }, input_node_names.data(), input_tensors.data(), input_node_names.size(), output_node_names.data(), output_node_names.size());
float* out_i = output_tensors[i].GetTensorMutableData<float>();

3 DBFace推理C++代码展示

数据结构定义,类封装,路径初始化
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
定义并配置相关环境变量
在这里插入图片描述
输入输出节点信息获取
在这里插入图片描述

读取图像,创建输入Tensor

在这里插入图片描述
Ort推理,结果后处理
在这里插入图片描述

4 推理结果及比较

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

参考资料

  1. ONNX官方算子支持查询文档
  2. Pytorch对ONNX的算子支持查询文档
  3. ONNX对python的api文档
  4. ONNXRuntime官方网站及文档
  5. torch.onnx教程
  6. ONNXRuntime对C/C++和移动端部署的官方例程
  7. ONNXRuntime C++/Java/Python项目实操资料

http://www.ppmy.cn/news/7958.html

相关文章

手写 mini 版 Webpack

目录 1. mini 版 Webpack 打包流程 2. 创建 minipack.js 2.1 需要用到的插件库 2.1.1 babylon —— 解析 JavaScript 语法&#xff0c;生产 AST 语法树 2.1.2 babel-traverse —— 对 AST 进行遍历、转换的工具 2.1.3 transformFromAst —— 将 ES6、ES7 等高级的语法&am…

EIZO船舶触摸屏维修T1502-B

EIZO船舶触摸屏使用注意事项&#xff1a; 1 由于显示器电子零件的性能需要约30分钟才能稳定,因此在电源开启之后,应调整显示器30分钟以上。 2为了降低因长期使用而出现的发光度变化以及保持稳定的发光度,建议您以较低亮度使用显示器。 3 当显示器长期显示一个图像的情况下再…

Eth05- Eth以太网发送函数代码解析

1 以太网帧的格式 了解发送函数之前先了解一下以太网帧的格式,以太网帧的格式如下所示: PREAMBLE–以太网帧以 7 字节前导码开头,指示帧的开始,并允许发送方和接收方建立位同步。最初,引入PRE(前导码)是为了允许由于信号延迟而损失几个位。但今天的高速以太网不需要前…

hevc 预测单元语法

预测单元PU规定了编码单元的所有预测模式&#xff0c;一切与预测有关的信息都定义在预测单元部分&#xff0c;比如&#xff0c;帧内预测的方向&#xff0c;帧间预测的分割方式&#xff0c;运动矢量预测。以及帧间预测参考图像索引号都属于预测单元的范畴。一个2Nx2N 的编码单元…

DaoCloud 结合 Karmada 打造新一代企业级多云平台

上周 Cloud Native Days China 南京站 Meetup 顺利举行&#xff0c;「DaoCloud 道客」大容器团队技术负责人-张潇在会上以《DaoCloud 结合 Karmada 打造新一代企业级多云平台》为主题&#xff0c;与 Karmada 社区及其合作伙伴一起&#xff0c;共同交流云原生多云多集群生产实践…

T-SQL程序练习04

目录 一、写一个存储过程 &#x1d439;&#x1d456;&#x1d44f;&#x1d45c;&#x1d45b;&#x1d44e;&#x1d450;&#x1d450; 1. 具体要求 2. T-SQL程序代码 3. 结果显示 二、建立存储过程 &#x1d446;&#x1d44e;&#x1d45b;&#x1d43a;&#x1d462;…

Maven是怎么样构建Spring Boot项目的?

准备好项目运行所需的环境后&#xff0c;就可以使用IDEA开发工具搭建一个Spring Boot入门程序了。我们既可以使用Maven方式构建项目&#xff0c;也可以使用Spring Initializr快捷方式构建项目。这里先介绍如何使用Maven方式构建Spring Boot项目&#xff0c;具体步骤如下。 1.初…

Linux模块代码、编译、加载、卸载一条龙

最近要写一个Linux的内核模块&#xff0c;记录一下内核模块的代码编写、编译、加载和卸载的基本流程&#xff0c;以作备忘&#xff0c;也希望能帮到有需要的同学。 模块代码 //代码来自https://yangkuncn.cn/kernel_INIT_WORK.html //init_works.c #include <linux/kernel…