c++ 使用onnx推理

本文介绍了如何在C++中使用ONNX进行图像分类推理,输入为处理过的MAT图像,输出为一维向量。此外,还展示了将输入从MAT转换为一维向量的技巧,特别地,处理了输入为176448的热图,输出为25200*7矩阵的情况,强调了设置输入输出维度的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设你已经安装好onnx,并且成功配置。这章说的是加载onnx并推理的过程,输入的input已经是处理过后的。
下面举几个例子

图像分类推理

最常见的形式就是图像分类网络,输入是个图片mat(3x224x224),输出是个一维(1x7)向量。

int yolov5_onnx_model(Mat blob)
{
   
   
#ifdef _WIN32
const wchar_t* model_path = L"E://c++//mmpose//resnet18.onnx";
#else
const char* model_path = "E://c++//mmpose//resnet18.onnx";
#endif

	//environment (设置为VERBOSE(ORT_LOGGING_LEVEL_VERBOSE)时,方便控制台输出时看到是使用了cpu还是gpu执行)
	Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "OnnxModel");
	Ort::SessionOptions session_options;
	// 使用1个线程执行op,若想提升速度,增加线程数
	session_options.SetIntraOpNumThreads(1);
	//CUDA加速开启(由于onnxruntime的版本太高,无cuda_provider_factory.h的头文件,加速可以使用onnxruntime V1.8的版本)
		//OrtSessionOptionsAppendExecutionProvider_CUDA(session_options, 0);
		// ORT_ENABLE_ALL: 启用所有可能的优化
	session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL);

	//load  model and creat session


	//printf("Using Onnxruntime C++ API\n");
	Ort::Session session(env, model_path, session_options);
	// print model input layer (node names, types, shape etc.)
	Ort::AllocatorWithDefaultOptions allocator;


	//model info
	// 获得模型又多少个输入和输出,一般是指对应网络层的数目
	// 一般输入只有图像的话input_nodes为1
	size_t num_input_nodes = session.GetInputCount();
	// 如果是多输出网络,就会是对应输出的数目
	size_t num_output_nodes = session.GetOutputCount();
	//printf("Number of inputs = %zu\n", num_input_nodes);
	//printf("Number of output = %zu\n", num_output_nodes);
	//获取输入name
	const char* input_name = session.GetInputName(0, allocator);
	//std::cout << "input_name:" << input_name << std::endl;
	//获取输出name
	const char* output_name = session.GetOutputName(0, allocator);
	//std::cout << "output_name: " << output_name << std::endl;
	// 自动获取维度数量
	auto input_dims = session.GetInputTypeInfo(0).GetTensorTypeAndShapeInfo()
### C++使用 YOLO 模型进行 ONNX 推理的实现 要在 C++ 中通过 ONNX Runtime 使用 YOLO 进行推理,通常需要完成以下几个核心部分: #### 1. 安装 ONNX Runtime 库 确保已安装并配置好 ONNX Runtime 的开发环境。可以通过官方文档获取支持的操作系统和编译方法。 #### 2. 加载模型文件 加载预训练好的 `.onnx` 文件作为输入模型。以下是具体的代码示例[^1]: ```cpp #include <iostream> #include <vector> #include "onnxruntime_cxx_api.h" int main() { Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "YOLO_ONNX"); Ort::SessionOptions session_options; // 设置线程数和其他选项 (可选) session_options.SetIntraOpNumThreads(4); session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL); const char* model_path = "path/to/yolov8.onnx"; Ort::Session session(env, model_path, session_options); std::vector<const char*> input_names = {"input_name"}; std::vector<const char*> output_names = {"output_name"}; // 获取输入张量形状 size_t num_input_nodes = session.GetInputCount(); Ort::AllocatorWithDefaultOptions allocator; for (size_t i = 0; i < num_input_nodes; ++i) { auto input_node_dims = session.GetInputTypeInfo(i).GetTensorTypeAndShapeInfo().GetShape(); std::cout << "Input Node Dimensions: "; for(auto dim : input_node_dims){ std::cout << dim << " "; } std::cout << "\n"; } return 0; } ``` 上述代码展示了如何初始化 `Ort::Env` 和 `Ort::Session` 对象,并读取模型的输入节点名称及其维度信息。 #### 3. 准备输入数据 为了执行推理操作,需准备符合模型预期格式的数据。例如,假设模型期望的是 `(batch_size, channels, height, width)` 形状的浮点数组,则应按此标准调整图像数据。 ```cpp // 假设输入尺寸为 640x640 RGB 图像 const int batch_size = 1; const int channels = 3; const int height = 640; const int width = 640; std::vector<float> input_tensor_values(batch_size * channels * height * width, 0.0f); // 将图像像素填充至 input_tensor_values 数组中... ``` #### 4. 执行推理过程 准备好输入后,调用 `Run()` 方法来运行推理流程: ```cpp auto memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault); // 创建 Tensor 对象表示输入数据 Ort::Value input_tensor = Ort::Value::CreateTensor<float>( memory_info, input_tensor_values.data(), input_tensor_values.size(), input_node_dims.data(), input_node_dims.size() ); // 输出容器定义 std::vector<Ort::Value> output_tensors; session.Run( Ort::RunOptions{nullptr}, input_names.data(), &input_tensor, 1, output_names.data(), 1, output_tensors ); // 处理解析后的输出结果 float* floatarr = output_tensors[0].GetTensorMutableData<float>(); for(int i=0;i<10;i++) { std::cout<<floatarr[i]<<" "; } ``` 以上代码片段实现了从创建输入张量到解析输出的过程。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值