cv_resnet18_ocr-detection ONNX导出教程:跨平台部署就这么简单
1. 为什么需要ONNX导出
在OCR文字检测的实际应用中,我们经常需要将模型部署到不同的平台和设备上。ONNX(Open Neural Network Exchange)作为一种开放的模型格式,能够帮助我们实现这一目标。
使用ONNX格式的主要优势包括:
- 跨平台兼容性:可在Windows、Linux、macOS等系统运行
- 多语言支持:支持Python、C++、Java等多种编程语言调用
- 硬件加速:兼容多种推理引擎(ONNX Runtime、TensorRT等)
- 模型优化:支持图优化和量化压缩
2. 准备工作
2.1 环境要求
在开始导出前,请确保已满足以下条件:
- 已部署cv_resnet18_ocr-detection WebUI服务
- Python 3.8或更高版本
- 安装必要的依赖库:
pip install torch onnx onnxruntime
2.2 启动WebUI服务
如果尚未启动服务,请执行以下命令:
cd /root/cv_resnet18_ocr-detection bash start_app.sh服务启动后,在浏览器中访问http://服务器IP:7860。
3. ONNX导出步骤详解
3.1 进入导出界面
在WebUI中,点击顶部的"ONNX导出"标签页,您将看到如下界面:
3.2 设置输入尺寸
模型支持灵活的输入尺寸配置:
- 输入高度:默认800,范围320-1536
- 输入宽度:默认800,范围320-1536
不同尺寸的适用场景:
| 输入尺寸 | 适用场景 | 推理速度 | 内存占用 |
|---|---|---|---|
| 640×640 | 移动端/嵌入式设备 | 最快 | 最低 |
| 800×800 | 通用场景 | 中等 | 中等 |
| 1024×1024 | 高精度需求 | 较慢 | 较高 |
3.3 执行导出
点击"导出ONNX"按钮,系统将:
- 加载PyTorch模型
- 创建虚拟输入进行模型追踪
- 执行
torch.onnx.export转换 - 保存ONNX模型文件
导出过程通常需要10-30秒,完成后会显示文件路径和大小。
3.4 下载模型
点击"下载ONNX模型"按钮,将导出的.onnx文件保存到本地。文件名格式为model_[高度]x[宽度].onnx,例如model_800x800.onnx。
4. ONNX模型使用示例
4.1 Python推理示例
import onnxruntime as ort import cv2 import numpy as np # 初始化ONNX Runtime session = ort.InferenceSession("model_800x800.onnx") # 图像预处理 def preprocess(image_path): image = cv2.imread(image_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) image = cv2.resize(image, (800, 800)) # 必须与导出尺寸一致 image = image.transpose(2, 0, 1) # HWC to CHW image = np.expand_dims(image, axis=0) # 添加batch维度 image = image.astype(np.float32) / 255.0 return image # 执行推理 input_image = preprocess("test.jpg") outputs = session.run(None, {"input": input_image}) # 解析输出 boxes = outputs[0] # 文本框坐标 scores = outputs[1] # 置信度分数 texts = outputs[2] # 识别文本内容 print(f"检测到{len(boxes)}个文本框")4.2 C++推理示例
#include <onnxruntime_cxx_api.h> int main() { // 初始化ONNX Runtime Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "OCRDetection"); Ort::SessionOptions session_options; Ort::Session session(env, "model_800x800.onnx", session_options); // 准备输入数据 std::array<int64_t, 4> input_shape = {1, 3, 800, 800}; std::vector<float> input_data(1*3*800*800); // 填充预处理后的图像数据 // 执行推理 Ort::MemoryInfo memory_info = Ort::MemoryInfo::CreateCpu( OrtAllocatorType::OrtArenaAllocator, OrtMemType::OrtMemTypeDefault); Ort::Value input_tensor = Ort::Value::CreateTensor<float>( memory_info, input_data.data(), input_data.size(), input_shape.data(), input_shape.size()); auto outputs = session.Run(Ort::RunOptions{nullptr}, {"input"}, &input_tensor, 1, {"boxes", "scores", "texts"}, 3); // 解析输出 float* boxes = outputs[0].GetTensorMutableData<float>(); float* scores = outputs[1].GetTensorMutableData<float>(); // ...处理输出结果 return 0; }5. 高级应用技巧
5.1 模型量化压缩
ONNX模型支持量化以减少大小并提升推理速度:
from onnxruntime.quantization import quantize_dynamic, QuantType # 动态量化 quantize_dynamic( "model_800x800.onnx", "model_800x800_quant.onnx", weight_type=QuantType.QUInt8 )量化后模型大小可减少约75%,推理速度提升2-3倍。
5.2 多平台部署建议
不同平台的优化策略:
- Windows/Linux:使用ONNX Runtime直接推理
- Android/iOS:转换为TensorFlow Lite或Core ML格式
- 嵌入式设备:使用TVM或TensorRT进一步优化
5.3 性能优化技巧
- 输入尺寸优化:根据实际场景选择最小足够尺寸
- 批量推理:修改模型支持批量输入提升吞吐量
- IO绑定:使用ONNX Runtime的IO绑定功能减少数据拷贝
6. 常见问题解答
6.1 导出失败怎么办?
可能原因及解决方案:
内存不足:
- 减小输入尺寸
- 关闭其他占用内存的程序
依赖库版本冲突:
pip install --upgrade torch onnx模型路径错误:
- 确认WebUI服务正常运行
- 检查模型文件权限
6.2 导出的ONNX模型无法推理
排查步骤:
- 确认输入尺寸与导出时设置一致
- 检查预处理是否与训练时相同(归一化、通道顺序等)
- 使用ONNX Runtime验证模型:
import onnx model = onnx.load("model.onnx") onnx.checker.check_model(model)
6.3 如何提高推理速度?
优化建议:
使用GPU加速:
session = ort.InferenceSession("model.onnx", providers=['CUDAExecutionProvider'])启用ONNX Runtime优化:
sess_options = ort.SessionOptions() sess_options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL使用TensorRT后端:
session = ort.InferenceSession("model.onnx", providers=['TensorrtExecutionProvider'])
7. 总结
通过本教程,您已经学会了如何将cv_resnet18_ocr-detection模型导出为ONNX格式,并掌握了在不同平台部署的基本方法。关键要点回顾:
- ONNX导出实现了模型的跨平台兼容性
- 输入尺寸选择需要平衡精度和性能
- 多种编程语言均可调用ONNX模型
- 量化等技术可以进一步优化模型
下一步建议:
- 尝试在不同设备上部署您的ONNX模型
- 探索模型量化带来的性能提升
- 考虑使用TensorRT等工具进行深度优化
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。