当前位置: 首页 > article >正文

openvino如何在c++中调用pytorch训练的模型

步骤1:将PyTorch模型转换为ONNX格式

转换代码示例(Python)

import torch
import torchvision

1. 加载训练好的PyTorch模型

model = torchvision.models.resnet18(pretrained=True)
model.eval()  # 设置为评估模式

2. 创建虚拟输入(尺寸需匹配模型输入)

dummy_input = torch.randn(1, 3, 224, 224)

3. 导出为ONNX格式

torch.onnx.export(model,dummy_input,"resnet18.onnx",export_params=True,opset_version=11,  # 推荐使用11+input_names=["input"],output_names=["output"]
)

步骤2:将ONNX转换为OpenVINO IR格式

使用OpenVINO的Model Optimizer转换模型:

mo --input_model resnet18.onnx \--output_dir ir_model \--model_name resnet18_ir \--data_type FP32  # 也可用FP16

生成文件:
resnet18_ir.xml:网络拓扑结构
resnet18_ir.bin:权重数据

步骤3:C++集成推理代码

环境配置
安装OpenVINO Runtime
CMake配置示例:

find_package(OpenVINO REQUIRED)
add_executable(inference_app main.cpp)
target_link_libraries(inference_app PRIVATE openvino::runtime)

C++推理代码

#include <openvino/openvino.hpp>
#include <vector>int main() {// 1. 初始化OpenVINO核心ov::Core core;// 2. 加载模型auto model = core.read_model("ir_model/resnet18_ir.xml");// 3. 编译模型(指定设备)ov::CompiledModel compiled_model = core.compile_model(model, "CPU");  // 也可用"GPU", "MYRIAD"// 4. 创建推理请求ov::InferRequest infer_request = compiled_model.create_infer_request();// 5. 准备输入数据auto input_tensor = infer_request.get_input_tensor();float* input_data = input_tensor.data<float>();// 填充数据(示例:随机值)std::fill_n(input_data, input_tensor.get_size(), 0.5f); // 6. 执行推理infer_request.infer();// 7. 获取输出结果auto output_tensor = infer_request.get_output_tensor();const float* output_data = output_tensor.data<const float>();// 处理输出(例如:打印前10个结果)for (int i = 0; i < 10; ++i) {std::cout << "Output[" << i << "] = " << output_data[i] << std::endl;}return 0;
}

关键注意事项

输入预处理:
需在C++中复现PyTorch的预处理逻辑(归一化/缩放)
示例:若PyTorch使用mean=[0.485,0.456,0.406], std=[0.229,0.224,0.225],需在填充input_data前进行归一化
动态shape支持:
若需动态输入尺寸,导出ONNX时指定动态维度:
torch.onnx.export(…, dynamic_axes={“input”: {0: “batch_size”, 2: “height”, 3: “width”}})

性能优化:
使用ov::preprocess::PrePostProcessor进行图内预处理
启用异步推理:infer_request.start_async()
多设备支持:core.compile_model(model, “MULTI:CPU,GPU”)
错误排查工具:
验证ONNX:onnx.checker.check_model(onnx.load(“resnet18.onnx”))
查看IR结构:使用Netron打开.xml文件

完整流程图示

graph LR
A[PyTorch模型 .pt] -->|torch.onnx.export| B[ONNX模型]
B -->|Model Optimizer| C[OpenVINO IR XML/BIN]
C --> D[C++加载IR]
D --> E[预处理数据]
E --> F[执行推理]
F --> G[解析输出]

通过以上步骤,即可高效部署PyTorch模型到C++生产环境。建议参考OpenVINO官方文档获取最新API细节和性能调优指南。

http://www.lryc.cn/news/2402295.html

相关文章:

  • Redisson简明教程—你家的锁芯该换了
  • 48V带极性反接保护-差共模浪涌防护方案
  • Python----目标检测(使用YOLO 模型进行线程安全推理和流媒体源)
  • jvm学习第1day jvm简介,栈溢出、堆溢出
  • 用广告维持的免费 AI 图像生成工具(个人项目分享)
  • 分析Web3下数据保护的创新模式
  • ​减少交通拥堵、提高效率、改善交通安全的智慧交通开源了。
  • 协议融合驱动效能跃升:Modbus转Ethernet IP的挤出吹塑机应用
  • Hive的TextFile格式优化方法
  • bug 记录 - 使用 el-dialog 的 before-close 的坑
  • Next.js 中间件鉴权绕过漏洞 CVE-2025-29927
  • 基于YOLO-NAS-Pose的无人机象群姿态估计:群体行为分析的突破
  • 8天Python从入门到精通【itheima】-71~72(数据容器“序列”+案例练习)
  • 中达瑞和SHIS高光谱相机在黑色水彩笔墨迹鉴定中的应用
  • dvwa10——XSS(DOM)
  • dvwa14——JavaScript
  • 外网访问内网服务器常用的三种简单操作步骤方法,本地搭建网址轻松让公网连接
  • 机器学习实验八--基于pca的人脸识别
  • UDP包大小与丢包率的关系:原理分析与优化实践
  • ubuntu 端口复用
  • Registry和docker有什么关系?
  • C++11实现TCP网络通讯服务端处理逻辑简化版
  • python3.9带 C++绑定的基础镜像
  • Elasticsearch中的语义搜索(Semantic Search)介绍
  • LabVIEW的AMC架构解析
  • MySQL 索引:为使用 B+树作为索引数据结构,而非 B树、哈希表或二叉树?
  • ubuntu屏幕复制
  • Flutter嵌入式开发实战 ——从树莓派到智能家居控制面板,打造工业级交互终端
  • Spring WebFlux 整合AI大模型实现流式输出
  • 验证电机理论与性能:电机试验平板提升测试效率