0

0

c++怎么使用ONNX Runtime来运行一个AI模型_C++与ONNX Runtime集成运行AI模型实践

穿越時空

穿越時空

发布时间:2025-11-24 12:41:08

|

883人浏览过

|

来源于php中文网

原创

首先配置ONNX Runtime环境并加载模型,然后创建会话、准备输入张量、执行推理并获取输出。具体包括:下载对应平台库文件,配置头文件和链接库路径;使用Ort::Env和Ort::Session初始化会话;根据模型输入形状创建Ort::Value张量,注意数据布局为行优先及CHW格式;调用Run方法传入输入输出名称进行推理;最后从输出张量中提取结果数据并处理。整个流程需确保内存管理正确、模型输入输出匹配,并建议使用高opset版本导出经验证的ONNX模型。

c++怎么使用onnx runtime来运行一个ai模型_c++与onnx runtime集成运行ai模型实践

要在C++中使用ONNX Runtime运行AI模型,关键在于正确配置环境、加载模型并处理输入输出张量。整个过程不复杂,但需要注意内存管理与数据布局的细节。

安装ONNX Runtime库

ONNX Runtime官方提供了预编译的C++库,支持Windows、Linux和macOS。你可以从GitHub发布页下载对应平台的动态库或静态库。

以Windows为例,下载onnxruntime-win-x64-gpu(若使用GPU)或onnxruntime-win-x64(仅CPU),解压后获得include、lib和dll文件。

在项目中配置:

立即学习C++免费学习笔记(深入)”;

  • include目录加入编译器头文件搜索路径
  • lib目录加入链接器路径,并链接onnxruntime.lib
  • 确保运行时能找到onnxruntime.dll(放在exe同目录或系统PATH中)

加载模型并创建会话

使用ONNX Runtime C++ API的第一步是初始化环境和会话。

示例代码:

#include <onnxruntime/core/session/onnxruntime_cxx_api.h>
<p>Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test");
Ort::SessionOptions session_options;
session_options.SetIntraOpNumThreads(1);
session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL);</p><p>// Windows下使用wchar_t<em>,Linux用const char</em>
Ort::Session session(env, L"model.onnx", session_options);

这里创建了一个优化开启的会话,可根据实际需求调整线程数或关闭某些图优化。

绘蛙
绘蛙

电商场景的AI创作平台,无需高薪聘请商拍和文案团队,使用绘蛙即可低成本、批量创作优质的商拍图、种草文案

下载

准备输入张量

你需要根据模型输入定义创建对应的Ort::Value对象。

假设模型输入为[1, 3, 224, 224]的float类型图像数据:

const int input_shape[] = {1, 3, 224, 224};
auto memory_info = Ort::MemoryInfo::CreateCpu(OrtDeviceAllocator, OrtMemTypeDefault);
std::vector<float> input_tensor_values(1 * 3 * 224 * 224); // 填充你的数据
<p>Ort::Value input_tensor = Ort::Value::CreateTensor(
memory_info, input_tensor_values.data(),
input_tensor_values.size() <em> sizeof(float),
const_cast<int64_t</em>>(input_shape), 4, ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT
);

注意:数据必须按行优先(row-major)排列,如果是图像,通常需要将HWC转为CHW,并归一化。

执行推理并获取输出

调用Run方法执行推理:

const char* input_names[] = {"input"};     // 替换为模型实际输入名
const char* output_names[] = {"output"};   // 替换为实际输出名
<p>Ort::RunOptions run_options;
auto output_tensors = session.Run(run_options,
input_names, &input_tensor, 1,
output_names, 1
);</p><p>// 获取输出数据
Ort::Value& output_tensor = output_tensors[0];
float* float_output = output_tensor.GetTensorMutableData<float>();
int64_t num_outputs = output_tensor.GetTensorElementCount();</p><p>for (int i = 0; i < std::min(10LL, num_outputs); ++i) {
printf("Output[%d] = %f\n", i, float_output[i]);
}

输出张量的内容取决于模型结构,可能是分类概率、检测框或特征向量。

基本上就这些。只要模型输入输出维度和类型匹配,推理流程很稳定。建议先用Python导出ONNX模型时加上opset_version=12以上,并使用onnx.checker验证模型有效性,避免运行时报格式错误。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

595

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

108

2025.10.23

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

336

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

776

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

97

2025.08.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

4213

2026.01.21

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1496

2023.07.26

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.2万人学习

C 教程
C 教程

共75课时 | 5.4万人学习

C++教程
C++教程

共115课时 | 21.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号