步驟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細節和性能調優指南。