在将pt文件转C++支持格式一直疯狂报错
之前没用过C++干这个,请协助提出两个方法,附保姆级详细流程
方法一转onnx 然后用onnx runtime方法调用
方法二转emgine 后是tensorrt调用
请给出详细方法并注解
不要照搬ai 通义千问 文心一言 gpt等都已试过。
另外,在部署过程中遇到的一些问题可能仍需要指导。
python环境下 的模型训练等已经解决。
在将pt文件转C++支持格式一直疯狂报错
之前没用过C++干这个,请协助提出两个方法,附保姆级详细流程
方法一转onnx 然后用onnx runtime方法调用
方法二转emgine 后是tensorrt调用
请给出详细方法并注解
不要照搬ai 通义千问 文心一言 gpt等都已试过。
另外,在部署过程中遇到的一些问题可能仍需要指导。
python环境下 的模型训练等已经解决。
🌈🌈🌈参考通义千问和郭老师的小迷弟雅思莫了-编写提供🌈🌈🌈
您可以参考如下,如果回答的不正确,及时评论区回复我,我会根据你错误描述追加回复,直到您满意为止。
方法一:使用ONNX Runtime调用
首先,将PyTorch模型转化为ONNX模型,以下是Python代码示例:
import torch
import torchvision
# 加载模型 yolov5权重转换为torch模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
# 转换为评估模式
model.eval()
# 设置模型输入
x = torch.randn(1, 3, 640, 640)
# 导出模型
torch.onnx.export(model, # model being run
x, # model input
"yolov5.onnx", # output
export_params=True, # store the trained parameter weights inside the model file
opset_version=10, # the ONNX version to export the model to
do_constant_folding=True, # whether to execute constant folding for optimization
)
接着,在C++中调用ONNX模型:
1.首先需要安装ONNX Runtime,具体方法请参考官方文档。
2.在C++中调用ONNX模型,以下是C++代码示例:
#include <onnxruntime/core/session/onnxruntime_cxx_api.h>
// 初始化环境
Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "YoloTest");
// 初始化session选项
Ort::SessionOptions session_options;
session_options.SetIntraOpNumThreads(1);
// 加载模型
const std::string model_path = "yolov5.onnx";
Ort::Session onnx_session(env, model_path.c_str(), session_options);
在这段代码中,我们首先创建了一个Ort::Env环境,然后用这个环境和模型文件构建了一个Ort::Session,这个Session接下来将被用来进行模型的推理。
以上只是调用流程的简略示例,实际的C++程序中还需要添加一些额外的代码去处理模型的输入和输出。
方法二:使用TensorRT调用
首先,将PyTorch模型转换为ONNX模型,步骤和方法一一样。
然后,使用onnx2trt命令行工具将ONNX模型转换为TensorRT引擎文件:
onnx2trt yolov5.onnx -o yolov5.engine
最后,在C++中调用TensorRT模型,以下是C++代码示例:
#include <NvInfer.h>
// 加载模型
nvinfer1::IRuntime* runtime = nvinfer1::createInferRuntime(gLogger);
std::ifstream engineFile("yolov5.engine", std::ios::binary);
engineFile.seekg(0, engineFile.end);
long int fsize = engineFile.tellg();
engineFile.seekg(0, engineFile.beg);
std::vector<char> engineData(fsize);
engineFile.read(engineData.data(), fsize);
engineFile.close();
runtime->deserializeCudaEngine(engineData.data(), fsize, nullptr);
以上只是TensorRT模型调用的基本流程,还需要添加额外的代码进行模型的输入输出处理以及推理部分。具体实现会更复杂一些,建议详细阅读TensorRT的开发者指南。