跳转到主内容
极星编程网:以代码为星,赴技术山海!

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

首先配置ONNX Runtime环境并加载模型,然后创建会话、准备输入张量、执行推理并获取输出。具体包括:下载对应平台库文件,配置头文件和链接库路径;使用Ort::Env和Ort::Session初始化会话;根据模型输入形状创建Ort::Value张量,注意数据布局为行优先及CHW格式;调用Run方法传入输入输出名称进行推理;最后从输出张量中提取结果数据并处理。整个流程需确保内存管理正确、模型输入输出匹配,并建议使用高opset版本导出经验证的ONNX模型。 要在C++中使用ONNX Runtime运行AI模型,关键在于正确配置环境、加载模型并处理输入输出张量。整个过程不复杂,但需要注意内存管理与数据布局的细节。 安装ONNX Runtime库 ONNX Runtime官方提供了预编译的C++库,支持Windows、Linux和 mac OS。你可以从 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

Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test"); Ort::SessionOptions session_options; session_options.SetIntraOpNumThreads(1); session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL);

// Windows下使用wchar_t,Linux用const char Ort::Session session(env, L"model.onnx", session_options);

这里创建了一个优化开启的会话,可根据实际需求调整线程数或关闭某些图优化。 ChatGPT (Windows) ChatGPT Windows 版本优化了系统兼容性与响应速度,提供多任务处理和对话记录管理功能,适用于办公辅助、创意写作、学习辅导和日常问答。它能帮助用户快速生成文稿、整理资料和高效获取信息,为个人和团队提供稳定、流畅的生产力体验。 下载 准备输入张量 你需要根据模型输入定义创建对应的 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 input_tensor_values(1 * 3 * 224 * 224); // 填充你的数据

Ort::Value input_tensor = Ort::Value::CreateTensor( memory_info, input_tensor_values.data(), input_tensor_values.size() sizeof(float), const_cast>(input_shape), 4, ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT );

注意:数据必须按行优先(row-major)排列,如果是图像,通常需要将HWC转为CHW,并归一化。 执行推理并获取输出 调用 Run 方法执行推理:
const char* input_names[] = {"input"}; // 替换为模型实际输入名 const char* output_names[] = {"output"}; // 替换为实际输出名

Ort::RunOptions run_options; auto output_tensors = session.Run(run_options, input_names, &input_tensor, 1, output_names, 1 );

// 获取输出数据 Ort::Value& output_tensor = output_tensors[0]; float* float_output = output_tensor.GetTensorMutableData(); int64_t num_outputs = output_tensor.GetTensorElementCount();

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 验证模型有效性,避免运行时报格式错误。

相关文章