English | 简体中文
本项目展示如何使用 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模型部署。
支持以下模型变体:
| 变体 | 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。
参考Windows编译文档。
本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测试机器:Intel PTL 12XE(搭载 Intel Core Ultra 处理器,含 CPU / NPU) 测试数据集:中文测试集 999 张,英文测试集 1000 张
以下数据为各模型在原始 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% |
以下数据为 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 运行。