Skip to content

Latest commit

 

History

35 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

English | 简体中文

PaddleOCR_OpenVINO_CPP

本项目展示如何使用 OpenVINO C++ API 部署 Paddle PP-OCRv4 / PP-OCRv5 / PP-OCRv6 模型,支持 Windows 平台的 CPU、GPU 和 NPU 推理。

本章节介绍PaddleOCR 模型的C++部署方法。C++在性能计算上优于Python,因此,在大多数CPU、GPU部署场景,多采用C++的部署方式,本节将介绍如何在Windows (CPU\GPU\NPU)环境下配置C++环境并完成PaddleOCR模型部署。

1. 开始运行

1.1 准备模型

支持以下模型变体:

变体 det 模型名 rec 模型名
PP-OCRv4 mobile PP-OCRv4_mobile_det PP-OCRv4_mobile_rec
PP-OCRv4 server PP-OCRv4_server_det PP-OCRv4_server_rec
PP-OCRv5 mobile PP-OCRv5_mobile_det PP-OCRv5_mobile_rec
PP-OCRv5 server PP-OCRv5_server_det PP-OCRv5_server_rec
PP-OCRv6 tiny PP-OCRv6_tiny_det PP-OCRv6_tiny_rec
PP-OCRv6 small(默认) PP-OCRv6_small_det PP-OCRv6_small_rec
PP-OCRv6 medium PP-OCRv6_medium_det PP-OCRv6_medium_rec

预转换的 OpenVINO IR 模型下载(ModelScope):

版本 ModelScope 地址
PP-OCRv4 https://modelscope.cn/models/FionaGu1019/PP-OCRv4_ov
PP-OCRv5 https://modelscope.cn/models/FionaGu1019/PP-OCRv5_ov
PP-OCRv6 https://modelscope.cn/models/FionaGu1019/PP-OCRv6_ov

每个模型目录的文件结构如下(det 和 rec 相同格式):

model/
|-- PP-OCRv5_server_det_ov          # 示例:v5 server det
|   |--inference.xml                # 动态 shape 拓扑(CPU/GPU 使用)
|   |--inference.bin                # ★ 模型权重,CPU 与 NPU 共用
|   |--inference_960.xml            # NPU 静态 shape 拓扑(960px)
|   |--inference.yml                # 预处理/后处理参数(自动读取)
|
|-- PP-OCRv5_server_rec_ov          # 示例:v5 server rec
|   |--inference.xml                # 动态 shape 拓扑(CPU/GPU 使用)
|   |--inference.bin                # ★ 模型权重,CPU 与 NPU 共用
|   |--inference_320.xml            # NPU 静态桶(宽度 320)
|   |--inference_480.xml
|   |--inference_640.xml
|   |--inference_800.xml
|   |--inference_1280.xml
|   |--inference.yml                # 内嵌字符字典(自动读取,无需手动指定)

★ .bin 共用设计inference.bin 被 CPU/GPU(动态 shape)和 NPU(静态 shape)共用。 静态拓扑 .xml 与动态 .xml 使用相同的权重文件,无冗余 .bin,减少约 200 MB 存储占用。

字符字典:程序启动时自动从 model_dir/inference.yml 中读取内嵌字典,无需额外指定字典文件。若需手动覆盖,使用 --rec_char_dict_path

1.2 编译PaddleOCR C++预测demo

参考Windows编译文档

1.3 运行demo

本demo只支持使用检测+识别功能。

运行方式:

ppocr.exe ocr [--param1] [--param2] [...]

具体命令如下(以 PP-OCRv4 mobile NPU 为例):

ppocr.exe ocr --input=image_dir \
  --text_detection_model_name=PP-OCRv4_mobile_det \
  --text_detection_model_dir=D:/models/PP-OCRv4_mobile_det_ov \
  --text_recognition_model_name=PP-OCRv4_mobile_rec \
  --text_recognition_model_dir=D:/models/PP-OCRv4_mobile_rec_ov \
  --save_path=save_dir \
  --device=npu \
  --text_recognition_batch_size=1

切换为 PP-OCRv5 server 在 CPU 上运行:

ppocr.exe ocr --input=image_dir \
  --text_detection_model_name=PP-OCRv5_server_det \
  --text_detection_model_dir=D:/models/PP-OCRv5_server_det_ov \
  --text_recognition_model_name=PP-OCRv5_server_rec \
  --text_recognition_model_dir=D:/models/PP-OCRv5_server_rec_ov \
  --save_path=save_dir \
  --device=cpu

使用 PP-OCRv6 tiny 在 NPU 上运行:

ppocr.exe ocr --input=image_dir \
  --text_detection_model_name=PP-OCRv6_tiny_det \
  --text_detection_model_dir=D:/models/PP-OCRv6_tiny_det_ov \
  --text_recognition_model_name=PP-OCRv6_tiny_rec \
  --text_recognition_model_dir=D:/models/PP-OCRv6_tiny_rec_ov \
  --save_path=save_dir \
  --device=npu \
  --text_recognition_batch_size=1

更多支持的可调节参数解释如下:

  • 通用参数
参数名称 类型 默认参数 是否必需 意义
device str CPU 推理设备,支持 CPU / GPU / NPU(亦可用 gpu:0 等设备标识)
input str '' 待识别的图像文件或图片目录路径(必填)
save_path str ./output 识别结果与可视化图片保存目录
cpu_threads int 8 CPU 推理线程数,机器核数充足时设大可提升性能
thread_num int 1 运行时使用的线程数(通用控制)
precision str fp32 推理精度(常见值:fp32 / fp16 / int8)
vis_font_dir str '' 可视化时使用的字体目录(用于生成中文/特殊字符可读图片)
paddlex_config str '' PaddleX 配置文件路径(可选)
lang str '' 指定识别语言(可选,多语言需对应字典与模型)
ocr_version str '' OCR 模型版本标识(可选)
--help, -h flag - 打印帮助并退出
  • 检测模型相关
参数名称 类型 默认参数 是否必需 意义
text_detection_model_name string PP-OCRv6_small_det 检测模型的 inference 名称(选择要使用的检测模型)
text_detection_model_dir string '' 检测模型 inference 文件所在目录(必须指向包含 .xml/.bin 的目录或相应文件)
max_side_len int 960 若输入图像最长边大于该值,等比缩放使最长边等于该值以限制输入大小
text_det_thresh float 0.3 DB 二值化阈值,用于过滤概率图(影响分割/二值化结果)
det_db_box_thresh float 0.5 DB 后处理过滤 box 的阈值,增大可减少误检,减小可减少漏检
det_db_unclip_ratio float 1.6 DB 后处理扩展文本框的比例,值越小框越贴近文本
det_db_score_mode string slow 评分模式:slow(多边形评分,准确)/ fast(矩形评分,速度快)
visualize bool true 是否输出可视化图片到 save_path(true/false)
  • 文字识别模型相关
参数名称 类型 默认参数 是否必需 意义
text_recognition_model_name string PP-OCRv6_small_rec 识别模型的 inference 名称(选择要使用的识别模型)
text_recognition_model_dir / rec_model_dir string '' 识别模型 inference 文件所在目录(必须指向包含 .xml/.bin 的目录或相应文件)
rec_char_dict_path string (自动从 inference.yml 读取) 字符字典 .txt 文件路径;默认自动从 model_dir/inference.yml 读取内嵌字典,切换模型时无需手动修改;手动覆盖时填写绝对路径
text_recognition_batch_size / rec_batch_num int 6 识别模型的 batch size(并行识别文本数量,影响吞吐与显存/内存)
rec_img_h int 48 识别模型输入图像高度(取决于模型训练尺寸)
rec_img_w int 240 识别模型输入图像宽度(取决于模型训练尺寸)
text_rec_score_thresh float 0 识别结果置信度阈值(低于则可过滤)
text_rec_input_shape string '' 可指定识别模型的输入形状(若模型支持可变尺寸)
  • PaddleOCR也支持多语言的预测,更多支持的语言和模型可以参考识别文档中的多语言字典与模型部分,如果希望进行多语言预测,只需将修改rec_char_dict_path(字典文件路径)以及rec_model_dir(inference模型路径)字段即可。

最终屏幕上会输出图像平均处理时间如下。

  • ocr
Models init time: 7745.79 ms
[==================================================] 100.0% 2000/2000
Models average inference time:: 251.7 ms

2. 精度与性能评测结果

测试机器:Intel PTL 12XE(搭载 Intel Core Ultra 处理器,含 CPU / NPU) 测试数据集:中文测试集 999 张,英文测试集 1000 张

2.1 基线精度(原始 PaddleOCR 框架)

以下数据为各模型在原始 PaddleOCR Python 框架下的精度基线,用于与 OpenVINO C++ 部署结果对比。

测试数据集:中文测试集 999 张,英文测试集 1000 张

指标 v4-mobile v4-server v5-mobile v5-server v6-tiny v6-small v6-medium
模型大小 15.3 MB 195 MB 21.1 MB 165 MB 6.38 MB 30.1 MB 132 MB
中文 CER ↓ 3.98% 4.30% 8.02% 5.11% 6.46% 5.38% 5.72%
英文 CER ↓ 12.57% 15.06% 1.49% 1.63% 1.53% 0.64% 0.59%
英文 WER ↓ 50.40% 45.57% 7.27% 8.19% 8.64% 3.21% 2.88%

2.2 OpenVINO C++ 精度与性能

以下数据为 OpenVINO C++ 部署在 Intel PTL 12XE(Intel Core Ultra,含 CPU / NPU)上的实测结果。 CPU 使用动态 shape 模型,NPU 使用静态 shape 模型(det: 960px,rec: 多宽度桶)。

指标 v4-mobile CPU v4-mobile NPU v4-server CPU v4-server NPU v5-mobile CPU v5-mobile NPU v5-server CPU v5-server NPU
中文 CER ↓ 4.03% 3.54% 4.31% 4.23% 8.03% 7.68% 5.07% 3.49%
英文 CER ↓ 12.96% 11.53% 15.10% 14.24% 1.52% 1.49% 1.63% 1.42%
英文 WER ↓ 52.70% 48.21% 46.29% 40.34% 7.45% 7.34% 7.85% 7.46%
首次初始化耗时 [s] ↓ 0.28 12.13 0.30 23.92 0.30 12.20 0.35 27.23
二次初始化耗时 [s] ↓ 0.28 0.20 0.27 0.29 0.29 0.21 0.35 0.32
平均推理耗时 [s] ↓ 0.35 0.11 2.12 0.35 0.34 0.13 1.50 0.32
指标 v6-tiny CPU v6-tiny NPU v6-small CPU v6-small NPU v6-medium CPU v6-medium NPU
中文 CER ↓ 6.58% 8.85% 5.39% 6.53% 5.73%
英文 CER ↓ 1.80% 1.57% 0.66% 0.80% 0.61%
英文 WER ↓ 8.72% 9.28% 3.31% 3.36% 3.02%
首次初始化耗时 [s] ↓ 0.41 4.27 0.32 15.03 0.53 28.11
二次初始化耗时 [s] ↓ 0.21 0.15 0.23 0.40 0.40 0.30
平均推理耗时 [s] ↓ 0.10 0.10 0.13 0.23 1.41

v6-medium NPU:模型可完成 NPU 编译(首次 ~28s),但当前 OpenVINO 版本下检测热图精度不足,推理结果为空,建议使用 CPU。

关键结论:

  • NPU 推理速度大幅领先:v4/v5 系列 NPU 比 CPU 快 3~10×;v6-tiny NPU 与 CPU 速度相当(均 0.10s)但功耗更低。
  • server 模型 CPU 推理较慢:v4-server(2.12s)和 v5-server(1.50s)在 CPU 上明显慢于 mobile/tiny,NPU 可将其拉回至 0.35s / 0.32s。
  • NPU 首次初始化较慢:v4/v5 系列需 12~27s 编译,v6-tiny 仅需 4.27s。二次启动命中缓存后降至 0.15~0.40s。
  • v6-small 综合最优:英文 CER 0.64%(CPU),WER 3.21%,在精度与速度之间取得最佳平衡,且 NPU 支持完整。
  • v6-medium 暂不支持 NPU:架构较复杂,当前 OpenVINO NPU 编译器存在精度问题,推荐用 CPU 运行。

About

This sample shows how to use the OpenVINO C++ API to deploy Paddle PP-OCRv4 v5 v6 model

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages