基于 Paddle Inference 3.0 的高性能 OCR 服务实现

38 天前
 sssxyd

基于 Paddle Inference 3.0 的高性能 OCR 服务实现

一个面向 Windows 桌面应用内嵌、RPA 和自动化脚本的低延迟 OCR 解决方案

1. 项目背景与解决的问题

在开发 Windows 桌面项目时,我遇到了需要频繁识别界面中"小卡片"区域的需求。这些区域通常包括电商平台的订单块、工具类应用的信息条、列表行等界面元素。考虑到目标用户主要使用集成显卡的办公电脑,我对比测试了以下几种方案:

1.1 现有方案的问题分析

第三方云 OCR 接口的局限性:

官方 PaddleOCR Python 版本的性能瓶颈:

1.2 性能目标

在桌面场景中,超过 300ms 的延迟会明显影响用户交互体验。因此,我们需要构建一套本地化、低延迟、高并发的 OCR 解决方案。

2. 技术路线

2.1 概述

2.2 服务化设计( Named Pipe IPC )

2.3 请求处理流程

  1. 请求接收:IPC 监听器接收客户端消息
  2. 数据解析:解析图片路径或 Base64 数据,构建 OCRRequest 对象
  3. 队列调度:将请求放入线程安全的任务队列
  4. Worker 处理:空闲 Worker 从队列取出任务执行推理
  5. 结果返回:Worker 将 JSON 结果通过 promise.set_value() 返回
  6. IPC 响应:主处理线程获取结果并写回命名管道

2.4 并发控制策略

  1. 线程安全保障:

    • 使用线程安全队列管理请求调度
    • 每个 Worker 独立运行,避免竞态条件
    • 支持优雅的服务启动和关闭
  2. 负载均衡:

    • 空闲 Worker 自动获取新任务
    • 支持动态调整 Worker 数量
    • 实现任务公平调度,避免饥饿现象
  3. 客户端支持:

    • 同步调用:客户端阻塞等待结果返回
    • 异步模式:支持 Future 模式的非阻塞处理
    • 批量处理:支持多个请求并发提交

2.5 关键性能优化点

模块 默认/常规设定 本项目裁剪/调参 目的
检测 max_side_len 640 / 960 512 减少缩放 & 卷积开销(适配卡片尺寸)
det_db_thresh / box_thresh 0.3 / 0.5 0.2 / 0.4 保留更多小框,后面再用置信度过滤
det_db_unclip_ratio 2.0 1.8 减少框扩张,规整文本更贴边
rec_img_h / rec_img_w 32 / 224 28 / 192 降低特征图分辨率,保持可辨性前提下降算力
rec_batch_num 6~12 16 批内吞吐提升(小卡片平均词块多)
cls 阶段 默认启用 可配置关闭 卡片内文字方向稳定时直接跳过加速
CPU Threads Paddle 默认较高 det/rec 限制为 2 + 主线程 避免多 Worker 时线程爆炸

3 与 Python 方案对比

python 版本测试代码请访问 Github 页面

维度 Python PaddleOCR 本项目 C++ 版
单张小卡片耗时(集成显卡办公机) ~650ms 100~150ms
并发扩展 线程受 GIL 影响 多 Worker 几乎线性( CPU/GPU 上限前)
部署 需要 Python 运行时 单一 exe + 模型目录
启动时间 较慢(解释器+加载) 快速(直接加载预测器)
IPC 集成 需再封装 命名管道原生支持

4. 快速使用

4.1 命令行调用

4.2 客户端集成

5. 致谢

1412 次点击
所在节点    分享创造
4 条回复
bigtan
38 天前
我最近也做了一个类似的识别,我用的是通义的[读光系列]( https://modelscope.cn/search?page=1&search=%E8%AF%BB%E5%85%89&type=model)。

感觉这个比较贴近开源生态,有 onnx 格式的预训练模型,用[onnxruntime]( https://github.com/microsoft/onnxruntime)可以在 c++,Python ,rust 等等语言中集成,调用 GPU 也方便,推荐楼主也可以试试。
soap0X
37 天前
@bigtan @bigtan onnx 别的非 python 语言试过吗?之前用 java 他那个 onnx 返回数据解析麻烦的很就放弃了
bigtan
37 天前
https://github.com/pykeio/ort 我用的 rust 绑定,这个项目
sssxyd
37 天前
@bigtan nice!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1152319

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX