labview paddle ocr识别onnxruntime推理,封装dll, labvie...
labview paddle ocr识别onnxruntime推理,封装dll, labview调用dll,源码和库函数,支持gpu和cpu,推理速度很快。
LabVIEW搞机器视觉有时候会遇到需要OCR的场景,传统方案要么速度感人,要么准确率捉急。最近发现百度飞桨的PaddleOCR模型效果不错,结合ONNXRuntime推理引擎,实测在i5-12400上单张图识别只要30ms,配个显卡还能更快。下面分享从模型转换到LabVIEW调用的完整流程。
先上硬菜,模型转换脚本:
from paddleocr import PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
ocr.save_model("pd_model", skip_fuse=True) # 导出静态图
!pip install paddle2onnx
!paddle2onnx --model_dir pd_model/inference \
--model_filename inference.pdmodel \
--params_filename inference.pdiparams \
--save_file paddle_ocr.onnx \
--opset_version 12
这里有个坑要注意:PaddleOCR默认输出是动态shape,得手动修改onnx输入输出为固定尺寸。推荐用Netron可视化模型结构,把Input的shape从batch,3,-1,-1改成具体数值,比如1,3,48,320。
DLL封装部分用C++搞效率最高,关键代码截取:
// ONNXRuntime初始化
Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "PaddleOCR");
Ort::SessionOptions session_options;
session_options.SetIntraOpNumThreads(4); // CPU线程数
session_options.AppendExecutionProvider_CUDA(0); // 启用GPU加速
// 图像预处理
cv::Mat normalized;
cv::dnn::blobFromImage(input_img, normalized, 1/255.0,
cv::Size(320, 48), cv::Scalar(0.5,0.5,0.5), true);
// 推理执行
auto memory_info = Ort::MemoryInfo::CreateCpu(OrtDeviceAllocator, OrtMemTypeCPU);
Ort::RunOptions run_options;
session.Run(run_options, input_names.data(), &input_tensor, 1,
output_names.data(), &output_tensor, 1);
预处理部分用OpenCV的blobFromImage比手动写循环快3倍不止,记得做归一化和均值方差调整。GPU模式下显存占用大概1.2G,实测RTX3060能跑到15ms每帧。
LabVIEW调用DLL的配置要注意参数类型匹配,推荐用CLFN节点:

labview paddle ocr识别onnxruntime推理,封装dll, labview调用dll,源码和库函数,支持gpu和cpu,推理速度很快。
输入输出参数配置成Adapt to Type,字符串用C String指针。遇到过的一个诡异bug是当返回文本包含中文时,需要在C++层用UTF-8编码,LabVIEW端用"指针转字符串"时选择UTF-8解码。
实测性能对比:
| 设备 | CPU模式 | GPU模式 |
|---|---|---|
| i5-12400 | 32ms | - |
| RTX3060 | - | 11ms |
| Jetson Orin | 89ms | 22ms |
项目开源在Github(伪地址:github.com/fake/ocr-labview),包含完整的VS2022工程和LabVIEW 2023范例。需要自己下载官方中英文模型,修改onnx文件路径即可开箱即用。
最后吐槽下ONNXRuntime的C++ API文档,比Python版难用不止一个量级。建议先用Python验证模型,再移植到C++能省一半头发。

更多推荐
所有评论(0)