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,推理速度很快。

!LabVIEW调用示意图

输入输出参数配置成Adapt to Type,字符串用C String指针。遇到过的一个诡异bug是当返回文本包含中文时,需要在C++层用UTF-8编码,LabVIEW端用"指针转字符串"时选择UTF-8解码。

实测性能对比:

设备CPU模式GPU模式
i5-1240032ms-
RTX3060-11ms
Jetson Orin89ms22ms

项目开源在Github(伪地址:github.com/fake/ocr-labview),包含完整的VS2022工程和LabVIEW 2023范例。需要自己下载官方中英文模型,修改onnx文件路径即可开箱即用。

最后吐槽下ONNXRuntime的C++ API文档,比Python版难用不止一个量级。建议先用Python验证模型,再移植到C++能省一半头发。

更多推荐