lengshizai 2024-03-13 07:29 采纳率: 31.7%
浏览 27
已结题

收集C++调用python模型yolov5/8保姆级协助

在将pt文件转C++支持格式一直疯狂报错
之前没用过C++干这个,请协助提出两个方法,附保姆级详细流程
方法一转onnx 然后用onnx runtime方法调用
方法二转emgine 后是tensorrt调用

请给出详细方法并注解
不要照搬ai 通义千问 文心一言 gpt等都已试过。
另外,在部署过程中遇到的一些问题可能仍需要指导。
python环境下 的模型训练等已经解决。

  • 写回答

13条回答 默认 最新

  • 叫兽-郭老师 Java领域新星创作者 2024-03-13 07:32
    关注

    🌈🌈🌈参考通义千问和郭老师的小迷弟雅思莫了-编写提供🌈🌈🌈
    您可以参考如下,如果回答的不正确,及时评论区回复我,我会根据你错误描述追加回复,直到您满意为止。

    方法一:使用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的开发者指南。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(12条)

报告相同问题?

问题事件

  • 系统已结题 3月21日
  • 已采纳回答 3月13日
  • 创建了问题 3月13日

悬赏问题

  • ¥15 软件工程用例图的建立(相关搜索:软件工程用例图|画图)
  • ¥15 如何在arcgis中导出拓扑关系表
  • ¥15 处理数据集文本挖掘代码
  • ¥15 matlab2017
  • ¥15 在vxWorks下TCP/IP编程,总是connect()报错,连接服务器失败: errno = 0x41
  • ¥15 AnolisOs7.9如何安装 Qt_5.14.2的运行库
  • ¥20 求:怎么实现qt与pcie通信
  • ¥50 前后端数据顺序不一致问题,如何解决?(相关搜索:数据结构)
  • ¥15 基于蒙特卡罗法的中介效应点估计代码
  • ¥15 罗技G293和UE5.3