使用c++和onnxruntime部署一个onnx模型的完整工程代码
时间: 2023-07-30 16:07:20 浏览: 239
yolov8(detect、seg、obb等)通过opencv或onnxruntime在cpp上部署
这里是一个使用C++和OnnxRuntime部署Onnx模型的完整工程代码,供你参考:
```c++
#include <iostream>
#include <vector>
#include <string>
#include <chrono>
#include <onnxruntime_cxx_api.h>
// 定义模型输入和输出的名称和形状
const char* INPUT_NAME = "input";
const char* OUTPUT_NAME = "output";
const std::vector<int64_t> INPUT_SHAPE = { 1, 3, 224, 224 };
const std::vector<int64_t> OUTPUT_SHAPE = { 1, 1000 };
int main(int argc, char* argv[])
{
if (argc != 2) {
std::cout << "Usage: " << argv[0] << " <model_path>" << std::endl;
return 1;
}
// 创建Ort::Env和Ort::SessionOptions对象
Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test");
Ort::SessionOptions session_options;
session_options.SetIntraOpNumThreads(1);
session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL);
try {
// 创建Ort::Session对象
Ort::Session session(env, argv[1], session_options);
// 获取模型的输入和输出信息
Ort::AllocatorWithDefaultOptions allocator;
size_t num_input_nodes = session.GetInputCount();
size_t num_output_nodes = session.GetOutputCount();
std::cout << "Number of input nodes: " << num_input_nodes << std::endl;
std::cout << "Number of output nodes: " << num_output_nodes << std::endl;
// 创建模型输入数据
std::vector<float> input_data(INPUT_SHAPE[1] * INPUT_SHAPE[2] * INPUT_SHAPE[3], 1.0f);
// 创建Ort::Value对象,用于存储输入和输出数据
Ort::Value input_tensor = Ort::Value::CreateTensor<float>(allocator, input_data.data(), input_data.size(), INPUT_SHAPE.data(), INPUT_SHAPE.size());
Ort::Value output_tensor = Ort::Value::CreateTensor<float>(allocator, OUTPUT_SHAPE.data(), OUTPUT_SHAPE.size());
// 运行模型
auto start = std::chrono::high_resolution_clock::now();
session.Run(Ort::RunOptions{ nullptr }, { INPUT_NAME }, { &input_tensor }, 1, { OUTPUT_NAME }, { &output_tensor }, 1);
auto end = std::chrono::high_resolution_clock::now();
std::cout << "Inference time: " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms" << std::endl;
// 获取输出数据
std::vector<float> output_data(OUTPUT_SHAPE[1]);
output_tensor.CopyTo<float>(output_data.data(), OUTPUT_SHAPE[1]);
// 输出前5个结果
std::cout << "Top 5 results:" << std::endl;
for (int i = 0; i < 5; i++) {
int max_index = std::distance(output_data.begin(), std::max_element(output_data.begin(), output_data.end()));
std::cout << max_index << ": " << output_data[max_index] << std::endl;
output_data[max_index] = -1.0f;
}
}
catch (const std::exception& ex) {
std::cerr << ex.what() << std::endl;
return 1;
}
return 0;
}
```
在使用该代码之前,你需要先安装OnnxRuntime库,并在代码中添加库的头文件和链接器选项。该代码读取命令行中的模型路径,并使用OnnxRuntime加载模型、运行推理并输出结果。
阅读全文