OCR(光学字符识别,Optical Character Recognition)是一种将图像中的文字转换为可编辑文本的技术。它广泛应用于文档数字化、信息提取和数据处理等领域。OCR 可以识别印刷文本、手写文本,甚至某些类型的字体和符号。
通用 OCR 产线用于解决文字识别任务,提取图片中的文字信息以文本形式输出,本产线支持PP-OCRv3、PP-OCRv4、PP-OCRv5模型的使用,其中默认模型为 PaddleOCR3.0 发布的 PP-OCRv5_server 模型,其在多个场景中较 PP-OCRv4_server 提升 13 个百分点。

通用OCR产线中包含以下5个模块。每个模块均可独立进行训练和推理,并包含多个模型。有关详细信息,请点击相应模块以查看文档。
在本产线中,您可以根据下方的基准测试数据选择使用的模型。
推理耗时仅包含模型推理耗时,不包含前后处理耗时。
| 模型 | 模型下载链接 | Top-1 Acc(%) | GPU推理耗时(ms) [常规模式 / 高性能模式] |
CPU推理耗时(ms) [常规模式 / 高性能模式] |
模型存储大小(MB) | 介绍 |
|---|---|---|---|---|---|---|
| PP-LCNet_x1_0_doc_ori | 推理模型/训练模型 | 99.06 | 2.62 / 0.59 | 3.24 / 1.19 | 7 | 基于PP-LCNet_x1_0的文档图像分类模型,含有四个类别,即0度,90度,180度,270度 |
| 模型 | 模型下载链接 | CER | GPU推理耗时(ms) [常规模式 / 高性能模式] |
CPU推理耗时(ms) [常规模式 / 高性能模式] |
模型存储大小(MB) | 介绍 |
|---|---|---|---|---|---|---|
| UVDoc | 推理模型/训练模型 | 0.179 | 19.05 / 19.05 | - / 869.82 | 30.3 | 高精度文本图像矫正模型 |
| 模型 | 模型下载链接 | Top-1 Acc(%) | GPU推理耗时(ms) | CPU推理耗时 (ms) | 模型存储大小(MB) | 介绍 |
|---|---|---|---|---|---|---|
| PP-LCNet_x0_25_textline_ori | 推理模型/训练模型 | 98.85 | 2.16 / 0.41 | 2.37 / 0.73 | 0.96 | 基于PP-LCNet_x0_25的文本行分类模型,含有两个类别,即0度,180度 |
| PP-LCNet_x1_0_textline_ori | 推理模型/训练模型 | 99.42 | - / - | 2.98 / 2.98 | 6.5 | 基于PP-LCNet_x1_0的文本行分类模型,含有两个类别,即0度,180度 |
| 模型 | 模型下载链接 | 检测Hmean(%) | GPU推理耗时(ms) [常规模式 / 高性能模式] |
CPU推理耗时(ms) [常规模式 / 高性能模式] |
模型存储大小(MB) | 介绍 |
|---|---|---|---|---|---|---|
| PP-OCRv5_server_det | 推理模型/训练模型 | 83.8 | 89.55 / 70.19 | 383.15 / 383.15 | 84.3 | PP-OCRv5 的服务端文本检测模型,精度更高,适合在性能较好的服务器上部署 |
| PP-OCRv5_mobile_det | 推理模型/训练模型 | 79.0 | 10.67 / 6.36 | 57.77 / 28.15 | 4.7 | PP-OCRv5 的移动端文本检测模型,效率更高,适合在端侧设备部署 |
| PP-OCRv4_server_det | 推理模型/训练模型 | 69.2 | 127.82 / 98.87 | 585.95 / 489.77 | 109 | PP-OCRv4 的服务端文本检测模型,精度更高,适合在性能较好的服务器上部署 |
| PP-OCRv4_mobile_det | 推理模型/训练模型 | 63.8 | 9.87 / 4.17 | 56.60 / 20.79 | 4.7 | PP-OCRv4 的移动端文本检测模型,效率更高,适合在端侧设备部署 |
| 模型 | 模型下载链接 | 识别 Avg Accuracy(%) | GPU推理耗时(ms) [常规模式 / 高性能模式] |
CPU推理耗时(ms) [常规模式 / 高性能模式] |
模型存储大小(MB) | 介绍 |
|---|---|---|---|---|---|---|
| PP-OCRv5_server_rec | 推理模型/训练模型 | 86.38 | 8.46 / 2.36 | 31.21 / 31.21 | 81 | PP-OCRv5_rec 是新一代文本识别模型。该模型致力于以单一模型高效、精准地支持简体中文、繁体中文、英文、日文四种主要语言,以及手写、竖版、拼音、生僻字等复杂文本场景的识别。在保持识别效果的同时,兼顾推理速度和模型鲁棒性,为各种场景下的文档理解提供高效、精准的技术支撑。 |
| PP-OCRv5_mobile_rec | 推理模型/训练模型 | 81.29 | 5.43 / 1.46 | 21.20 / 5.32 | 16 | |
| PP-OCRv4_server_rec_doc | 推理模型/训练模型 | 86.58 | 8.69 / 2.78 | 37.93 / 37.93 | 182 | PP-OCRv4_server_rec_doc是在PP-OCRv4_server_rec的基础上,在更多中文文档数据和PP-OCR训练数据的混合数据训练而成,增加了部分繁体字、日文、特殊字符的识别能力,可支持识别的字符为1.5万+,除文档相关的文字识别能力提升外,也同时提升了通用文字的识别能力 |
| PP-OCRv4_mobile_rec | 推理模型/训练模型 | 78.74 | 5.26 / 1.12 | 17.48 / 3.61 | 10.5 | PP-OCRv4的轻量级识别模型,推理效率高,可以部署在包含端侧设备的多种硬件设备中 |
| PP-OCRv4_server_rec | 推理模型/训练模型 | 85.19 | 8.75 / 2.49 | 36.93 / 36.93 | 173 | PP-OCRv4的服务器端模型,推理精度高,可以部署在多种不同的服务器上 |
| en_PP-OCRv4_mobile_rec | 推理模型/训练模型 | 70.39 | 4.81 / 1.23 | 17.20 / 4.18 | 7.5 | 基于PP-OCRv4识别模型训练得到的超轻量英文识别模型,支持英文、数字识别 |
| 模型 | 模型下载链接 | 中文识别 Avg Accuracy(%) | 英文识别 Avg Accuracy(%) | 繁体中文识别 Avg Accuracy(%) | 日文识别 Avg Accuracy(%) | GPU推理耗时(ms) [常规模式 / 高性能模式] |
CPU推理耗时(ms) [常规模式 / 高性能模式] |
模型存储大小(MB) | 介绍 |
|---|---|---|---|---|---|---|---|---|---|
| PP-OCRv5_server_rec | 推理模型/训练模型 | 86.38 | 64.70 | 93.29 | 60.35 | 8.46 / 2.36 | 31.21 / 31.21 | 81 | PP-OCRv5_rec 是新一代文本识别模型。该模型致力于以单一模型高效、精准地支持简体中文、繁体中文、英文、日文四种主要语言,以及手写、竖版、拼音、生僻字等复杂文本场景的识别。在保持识别效果的同时,兼顾推理速度和模型鲁棒性,为各种场景下的文档理解提供高效、精准的技术支撑。 |
| PP-OCRv5_mobile_rec | 推理模型/训练模型 | 81.29 | 66.00 | 83.55 | 54.65 | 5.43 / 1.46 | 21.20 / 5.32 | 16 |
| 模型 | 模型下载链接 | 识别 Avg Accuracy(%) | GPU推理耗时(ms) [常规模式 / 高性能模式] |
CPU推理耗时(ms) [常规模式 / 高性能模式] |
模型存储大小(MB) | 介绍 |
|---|---|---|---|---|---|---|
| PP-OCRv4_server_rec_doc | 推理模型/训练模型 | 86.58 | 8.69 / 2.78 | 37.93 / 37.93 | 182 | PP-OCRv4_server_rec_doc是在PP-OCRv4_server_rec的基础上,在更多中文文档数据和PP-OCR训练数据的混合数据训练而成,增加了部分繁体字、日文、特殊字符的识别能力,可支持识别的字符为1.5万+,除文档相关的文字识别能力提升外,也同时提升了通用文字的识别能力 |
| PP-OCRv4_mobile_rec | 推理模型/训练模型 | 78.74 | 5.26 / 1.12 | 17.48 / 3.61 | 10.5 | PP-OCRv4的轻量级识别模型,推理效率高,可以部署在包含端侧设备的多种硬件设备中 |
| PP-OCRv4_server_rec | 推理模型/训练模型 | 85.19 | 8.75 / 2.49 | 36.93 / 36.93 | 173 | PP-OCRv4的服务器端模型,推理精度高,可以部署在多种不同的服务器上 |
| PP-OCRv3_mobile_rec | 推理模型/训练模型 | 72.96 | 3.89 / 1.16 | 8.72 / 3.56 | 10.3 | PP-OCRv3的轻量级识别模型,推理效率高,可以部署在包含端侧设备的多种硬件设备中 |
| 模型 | 模型下载链接 | 识别 Avg Accuracy(%) | GPU推理耗时(ms) [常规模式 / 高性能模式] |
CPU推理耗时(ms) [常规模式 / 高性能模式] |
模型存储大小(MB) | 介绍 |
|---|---|---|---|---|---|---|
| ch_SVTRv2_rec | 推理模型/训练模型 | 68.81 | 10.38 / 8.31 | 66.52 / 30.83 | 80.5 | SVTRv2 是一种由复旦大学视觉与学习实验室(FVL)的OpenOCR团队研发的服务端文本识别模型,其在PaddleOCR算法模型挑战赛 - 赛题一:OCR端到端识别任务中荣获一等奖,A榜端到端识别精度相比PP-OCRv4提升6%。 |
| 模型 | 模型下载链接 | 识别 Avg Accuracy(%) | GPU推理耗时(ms) [常规模式 / 高性能模式] |
CPU推理耗时(ms) [常规模式 / 高性能模式] |
模型存储大小(MB) | 介绍 |
|---|---|---|---|---|---|---|
| ch_RepSVTR_rec | 推理模型/训练模型 | 65.07 | 6.29 / 1.57 | 20.64 / 5.40 | 48.8 | RepSVTR 文本识别模型是一种基于SVTRv2 的移动端文本识别模型,其在PaddleOCR算法模型挑战赛 - 赛题一:OCR端到端识别任务中荣获一等奖,B榜端到端识别精度相比PP-OCRv4提升2.5%,推理速度持平。 |
| 模型 | 模型下载链接 | 识别 Avg Accuracy(%) | GPU推理耗时(ms) [常规模式 / 高性能模式] |
CPU推理耗时(ms) [常规模式 / 高性能模式] |
模型存储大小(MB) | 介绍 |
|---|---|---|---|---|---|---|
| en_PP-OCRv5_mobile_rec | 推理模型/训练模型 | 85.25 | - | - | 7.5 | 基于PP-OCRv5识别模型训练得到的超轻量级英文识别模型,进一步提升英文文本的识别准确率,优化空格漏识别的问题,并提高对手写英文文本的识别效果。 |
| en_PP-OCRv4_mobile_rec | 推理模型/训练模型 | 70.39 | 4.81 / 1.23 | 17.20 / 4.18 | 7.5 | 基于PP-OCRv4识别模型训练得到的超轻量英文识别模型,支持英文、数字识别 |
| en_PP-OCRv3_mobile_rec | 推理模型/训练模型 | 70.69 | 3.56 / 0.78 | 8.44 / 5.78 | 17.3 | 基于PP-OCRv3识别模型训练得到的超轻量英文识别模型,支持英文、数字识别 |
| 模型 | 模型下载链接 | 识别 Avg Accuracy(%) | GPU推理耗时(ms) [常规模式 / 高性能模式] |
CPU推理耗时(ms) [常规模式 / 高性能模式] |
模型存储大小(MB) | 介绍 |
|---|---|---|---|---|---|---|
| korean_PP-OCRv5_mobile_rec | 推理模型/训练模型 | 88.0 | 5.43 / 1.46 | 21.20 / 5.32 | 14 | 基于PP-OCRv5识别模型训练得到的超轻量韩文识别模型,支持韩文、英文和数字识别 |
| latin_PP-OCRv5_mobile_rec | 推理模型/训练模型 | 84.7 | 5.43 / 1.46 | 21.20 / 5.32 | 14 | 基于PP-OCRv5识别模型训练得到的拉丁文识别模型,支持大部分拉丁字母语言、数字识别 |
| eslav_PP-OCRv5_mobile_rec | 推理模型/训练模型 | 81.6 | 5.43 / 1.46 | 21.20 / 5.32 | 14 | 基于PP-OCRv5识别模型训练得到的东斯拉夫语言识别模型, 支持东斯拉夫语言、英文和数字识别 |
| th_PP-OCRv5_mobile_rec | 推理模型/训练模型 | 82.68 | - | - | 7.5 | 基于PP-OCRv5识别模型训练得到的泰语识别模型, 支持泰语、英文和数字识别 |
| el_PP-OCRv5_mobile_rec | 推理模型/训练模型 | 89.28 | - | - | 7.5 | 基于PP-OCRv5识别模型训练得到的希腊语识别模型, 支持希腊语、英文和数字识别 |
| arabic_PP-OCRv5_mobile_rec | 推理模型/训练模型 | 81.27 | - | - | 7.6 | 基于PP-OCRv5识别模型训练得到的超轻量阿拉伯字母识别模型,支持阿拉伯字母、数字识别 |
| cyrillic_PP-OCRv5_mobile_rec | 推理模型/训练模型 | 80.27 | - | - | 7.7 | 基于PP-OCRv5识别模型训练得到的超轻量斯拉夫字母识别模型,支持斯拉夫字母、数字识别 |
| devanagari_PP-OCRv5_mobile_rec | 推理模型/训练模型 | 84.96 | - | - | 7.5 | 基于PP-OCRv5识别模型训练得到的超轻量天城文识别模型,支持印地文、梵文等字母以及数字识别 |
| te_PP-OCRv5_mobile_rec | 推理模型/训练模型 | 87.65 | - | - | 7.5 | 基于PP-OCRv5识别模型训练得到的超轻量泰卢固文识别模型,支持泰卢固文、数字识别 |
| ta_PP-OCRv5_mobile_rec | 推理模型/训练模型 | 94.2 | - | - | 7.5 | 基于PP-OCRv5识别模型训练得到的超轻量泰米尔文识别模型,支持泰米尔文、数字识别 |
| korean_PP-OCRv3_mobile_rec | 推理模型/训练模型 | 60.21 | 3.73 / 0.98 | 8.76 / 2.91 | 9.6 | 基于PP-OCRv3识别模型训练得到的超轻量韩文识别模型,支持韩文、数字识别 |
| japan_PP-OCRv3_mobile_rec | 推理模型/训练模型 | 45.69 | 3.86 / 1.01 | 8.62 / 2.92 | 9.8 | 基于PP-OCRv3识别模型训练得到的超轻量日文识别模型,支持日文、数字识别 |
| chinese_cht_PP-OCRv3_mobile_rec | 推理模型/训练模型 | 82.06 | 3.90 / 1.16 | 9.24 / 3.18 | 10.8 | 基于PP-OCRv3识别模型训练得到的超轻量繁体中文识别模型,支持繁体中文、数字识别 |
| te_PP-OCRv3_mobile_rec | 推理模型/训练模型 | 95.88 | 3.59 / 0.81 | 8.28 / 6.21 | 8.7 | 基于PP-OCRv3识别模型训练得到的超轻量泰卢固文识别模型,支持泰卢固文、数字识别 |
| ka_PP-OCRv3_mobile_rec | 推理模型/训练模型 | 96.96 | 3.49 / 0.89 | 8.63 / 2.77 | 17.4 | 基于PP-OCRv3识别模型训练得到的超轻量卡纳达文识别模型,支持卡纳达文、数字识别 |
| ta_PP-OCRv3_mobile_rec | 推理模型/训练模型 | 76.83 | 3.49 / 0.86 | 8.35 / 3.41 | 8.7 | 基于PP-OCRv3识别模型训练得到的超轻量泰米尔文识别模型,支持泰米尔文、数字识别 |
| latin_PP-OCRv3_mobile_rec | 推理模型/训练模型 | 76.93 | 3.53 / 0.78 | 8.50 / 6.83 | 8.7 | 基于PP-OCRv3识别模型训练得到的超轻量拉丁文识别模型,支持拉丁文、数字识别 |
| arabic_PP-OCRv3_mobile_rec | 推理模型/训练模型 | 73.55 | 3.60 / 0.83 | 8.44 / 4.69 | 17.3 | 基于PP-OCRv3识别模型训练得到的超轻量阿拉伯字母识别模型,支持阿拉伯字母、数字识别 |
| cyrillic_PP-OCRv3_mobile_rec | 推理模型/训练模型 | 94.28 | 3.56 / 0.79 | 8.22 / 2.76 | 8.7 | 基于PP-OCRv3识别模型训练得到的超轻量斯拉夫字母识别模型,支持斯拉夫字母、数字识别 |
| devanagari_PP-OCRv3_mobile_rec | 推理模型/训练模型 | 96.44 | 3.60 / 0.78 | 6.95 / 2.87 | 8.7 | 基于PP-OCRv3识别模型训练得到的超轻量梵文字母识别模型,支持梵文字母、数字识别 |
| 模式 | GPU配置 | CPU配置 | 加速技术组合 |
|---|---|---|---|
| 常规模式 | FP32精度 / 无TRT加速 | FP32精度 / 8线程 | PaddleInference |
| 高性能模式 | 选择先验精度类型和加速策略的最优组合 | FP32精度 / 8线程 | 选择先验最优后端(Paddle/OpenVINO/TRT等) |
如果您更注重模型的精度,请选择精度较高的模型;如果您更在意模型的推理速度,请选择推理速度较快的模型;如果您关注模型的存储大小,请选择存储体积较小的模型。
在本地使用通用OCR产线前,请确保您已经按照安装教程完成了wheel包安装。安装完成后,可以在本地使用命令行体验或 Python 集成。
请注意,如果在执行过程中遇到程序失去响应、程序异常退出、内存资源耗尽、推理速度极慢等问题,请尝试参考文档调整配置,例如关闭不需要使用的功能或使用更轻量的模型。
一行命令即可快速体验OCR产线效果。运行以下代码前,请您下载示例图片到本地:
# 默认使用 PP-OCRv5 模型
paddleocr ocr -i https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/general_ocr_002.png \
--use_doc_orientation_classify False \
--use_doc_unwarping False \
--use_textline_orientation False \
--save_path ./output \
--device gpu:0
# 通过 --ocr_version 指定 PP-OCR 其他版本
paddleocr ocr -i ./general_ocr_002.png --ocr_version PP-OCRv4
| 参数 | 参数说明 | 参数类型 | 默认值 |
|---|---|---|---|
input |
含义:待预测数据,必填。 说明:如图像文件或者PDF文件的本地路径: /root/data/img.jpg;如URL链接,如图像文件或PDF文件的网络URL:示例; | 如本地目录,该目录下需包含待预测图像,如本地路径:str |
save_pathstrdoc_orientation_classify_model_namestrdoc_orientation_classify_model_dirstrdoc_unwarping_model_namestrdoc_unwarping_model_dirstrtext_detection_model_namestrtext_detection_model_dirstrtextline_orientation_model_namestrtextline_orientation_model_dirstrtextline_orientation_batch_size1。int1text_recognition_model_namestrtext_recognition_model_dirstrtext_recognition_batch_size1。int1use_doc_orientation_classifyTrue。boolTrueuse_doc_unwarpingTrue。boolTrueuse_textline_orientationTrue。boolTruetext_det_limit_side_len0 的任意整数。64。
int64text_det_limit_typemin 和 max,min 表示保证图像最短边不小于det_limit_side_len,max 表示保证图像最长边不大于 limit_side_len。min。
strmintext_det_thresh0的任意浮点数。0.3)。
float0.3text_det_box_thresh0 的任意浮点数。0.6)。
float0.6text_det_unclip_ratio0 的任意浮点数。2.0)。
float2.0text_det_input_shapeinttext_rec_score_thresh0的任意浮点数。0.0,即不设阈值)。
float0.0return_word_boxFalse。boolFalsetext_rec_input_shapetuplelangstrocr_versionocr_version都支持所有的lang,请查看附录中的对应关系表。
strdevicecpu 表示使用 CPU 进行推理;gpu:0 表示使用第 1 块 GPU 进行推理;npu:0 表示使用第 1 块 NPU 进行推理;xpu:0 表示使用第 1 块 XPU 进行推理;mlu:0 表示使用第 1 块 MLU 进行推理;dcu:0 表示使用第 1 块 DCU 进行推理;metax_gpu:0 表示使用第 1 块沐曦 GPU 进行推理;iluvatar_gpu:0 表示使用第 1 块天数 GPU 进行推理;strenable_hpiFalse。boolFalseuse_tensorrtboolFalseprecisionfp32。strfp32enable_mkldnnboolTruemkldnn_cache_capacity10。int10cpu_threads8。int8paddlex_configstr| 参数 | 参数说明 | 参数类型 | 默认值 | det_model_dir |
说明:已废弃,请参考text_detection_model_dir,且与新的参数不能同时指定。 |
str |
|---|---|---|---|
det_limit_side_len |
说明:已废弃,请参考text_det_limit_side_len,且与新的参数不能同时指定。 |
int |
|
det_limit_type |
说明:已废弃,请参考text_det_limit_type,且与新的参数不能同时指定。
|
str |
|
det_db_thresh |
说明:已废弃,请参考text_det_thresh,且与新的参数不能同时指定。
|
float |
|
det_db_box_thresh |
说明:已废弃,请参考text_det_box_thresh,且与新的参数不能同时指定。
|
float |
|
det_db_unclip_ratio |
说明:已废弃,请参考text_det_unclip_ratio,且与新的参数不能同时指定。
|
float |
|
rec_model_dir |
说明:已废弃,请参考text_recognition_model_dir,且与新的参数不能同时指定。 |
str |
|
rec_batch_num |
说明:已废弃,请参考text_recognition_batch_size,且与新的参数不能同时指定。 |
int |
|
use_angle_cls |
说明:已废弃,请参考use_textline_orientation,且与新的参数不能同时指定。 |
bool |
|
cls_model_dir |
说明:已废弃,请参考textline_orientation_model_dir,且与新的参数不能同时指定。 |
str |
|
cls_batch_num |
说明:已废弃,请参考textline_orientation_batch_size,且与新的参数不能同时指定。 |
int |
### 2.2 Python脚本方式集成
命令行方式是为了快速体验查看效果,一般来说,在项目中,往往需要通过代码集成,您可以通过几行代码即可完成产线的快速推理,推理代码如下:
```python
from paddleocr import PaddleOCR
ocr = PaddleOCR(
use_doc_orientation_classify=False, # 通过 use_doc_orientation_classify 参数指定不使用文档方向分类模型
use_doc_unwarping=False, # 通过 use_doc_unwarping 参数指定不使用文本图像矫正模型
use_textline_orientation=False, # 通过 use_textline_orientation 参数指定不使用文本行方向分类模型
)
# ocr = PaddleOCR(lang="en") # 通过 lang 参数来使用英文模型
# ocr = PaddleOCR(ocr_version="PP-OCRv4") # 通过 ocr_version 参数来使用 PP-OCR 其他版本
# ocr = PaddleOCR(device="gpu") # 通过 device 参数使得在模型推理时使用 GPU
# ocr = PaddleOCR(
# text_detection_model_name="PP-OCRv5_server_det",
# text_recognition_model_name="PP-OCRv5_server_rec",
# use_doc_orientation_classify=False,
# use_doc_unwarping=False,
# use_textline_orientation=False,
# ) # 更换 PP-OCRv5_server 模型
result = ocr.predict("./general_ocr_002.png")
for res in result:
res.print()
res.save_to_img("output")
res.save_to_json("output")
```
在上述 Python 脚本中,执行了如下几个步骤:
PaddleOCR() 实例化 OCR 产线对象,具体参数说明如下:| 参数 | 参数说明 | 参数类型 | 默认值 |
|---|---|---|---|
doc_orientation_classify_model_name |
含义:文档方向分类模型的名称。
说明:如果设置为 None,将会使用产线默认模型。 | str|None |
None |
doc_orientation_classify_model_dir |
含义:文档方向分类模型的目录路径。
说明:如果设置为 None,将会下载官方模型。 | str|None |
None |
doc_unwarping_model_nameNone,将会使用产线默认模型。str|NoneNonedoc_unwarping_model_dirNone,将会下载官方模型。str|NoneNonetext_detection_model_nameNone,将会使用产线默认模型。str|NoneNonetext_detection_model_dirNone,将会下载官方模型。str|NoneNonetextline_orientation_model_nameNone,将会使用产线默认模型。str|NoneNonetextline_orientation_model_dirNone,将会下载官方模型。str|NoneNonetextline_orientation_batch_sizeNone,将默认设置batch size为1。int|NoneNonetext_recognition_model_nameNone,将会使用产线默认模型。str|NoneNonetext_recognition_model_dirNone,将会下载官方模型。str|NoneNonetext_recognition_batch_sizeNone,将默认设置batch size为1。int|NoneNoneuse_doc_orientation_classifyNone,将使用产线初始化的该参数值,默认初始化为True。bool|NoneNoneuse_doc_unwarpingNone,将使用产线初始化的该参数值,默认初始化为True。bool|NoneNoneuse_textline_orientationNone,将使用产线初始化的该参数值,默认初始化为True。bool|NoneNonetext_det_limit_side_len0 的任意整数;None,将使用产线初始化的该参数值,默认初始化为 64。int|NoneNonetext_det_limit_typemin 和 max,min 表示保证图像最短边不小于 det_limit_side_len,max 表示保证图像最长边不大于 limit_side_len;None,将使用产线初始化的该参数值,默认初始化为 min。str|NoneNonetext_det_thresh0的任意浮点数;
None,将使用产线初始化的该参数值(默认为0.3)。float|NoneNonetext_det_box_thresh0的任意浮点数;
None,将使用产线初始化的该参数值(默认为0.6)。
float|NoneNonetext_det_unclip_ratio0的任意浮点数;
None,将使用产线初始化的该参数值(默认为2.0)。
float|NoneNonetext_det_input_shapetuple|NoneNonetext_rec_score_thresh0的任意浮点数;
None,将使用产线初始化的该参数值(默认为0.0,即不设阈值)。
float|NoneNonetext_rec_input_shapetuple|NoneNonelangstr|NoneNoneocr_versionocr_version都支持所有的lang,请查看附录中的对应关系表。
str|NoneNonedevicecpu 表示使用 CPU 进行推理;gpu:0 表示使用第 1 块 GPU 进行推理;npu:0 表示使用第 1 块 NPU 进行推理;xpu:0 表示使用第 1 块 XPU 进行推理;mlu:0 表示使用第 1 块 MLU 进行推理;dcu:0 表示使用第 1 块 DCU 进行推理;metax_gpu:0 表示使用第 1 块沐曦 GPU 进行推理;iluvatar_gpu:0 表示使用第 1 块天数 GPU 进行推理;None,将默认使用产线初始化的该参数值,初始化时,会优先使用本地的 GPU 0号设备,如果没有,则使用 CPU 设备。
str|NoneNoneenable_hpiboolFalseuse_tensorrtboolFalseprecisionstr"fp32"enable_mkldnnboolTruemkldnn_cache_capacityint10cpu_threadsint8paddlex_configstr|NoneNonepredict() 方法进行推理预测,该方法会返回一个结果列表。另外,产线还提供了 predict_iter() 方法。两者在参数接受和结果返回方面是完全一致的,区别在于 predict_iter() 返回的是一个 generator,能够逐步处理和获取预测结果,适合处理大型数据集或希望节省内存的场景。可以根据实际需求选择使用这两种方法中的任意一种。以下是 predict() 方法的参数及其说明:| 参数 | 参数说明 | 参数类型 | 默认值 |
|---|---|---|---|
input |
含义:待预测数据
说明:支持多种输入类型,必填。
/root/data/(当前不支持目录中包含PDF文件的预测,PDF文件需要指定到具体文件路径);[numpy.ndarray, numpy.ndarray],["/root/data/img1.jpg", "/root/data/img2.jpg"],["/root/data1", "/root/data2"]。 |
Python Var|str|listuse_doc_orientation_classifybool|NoneNoneuse_doc_unwarpingbool|NoneNoneuse_textline_orientationbool|NoneNonetext_det_limit_side_lenNone表示使用实例化参数,否则该参数优先级更高。int|NoneNonetext_det_limit_typeNone表示使用实例化参数,否则该参数优先级更高。str|NoneNonetext_det_threshNone表示使用实例化参数,否则该参数优先级更高。float|NoneNonetext_det_box_threshNone表示使用实例化参数,否则该参数优先级更高。float|NoneNonetext_det_unclip_ratioNone表示使用实例化参数,否则该参数优先级更高。float|NoneNonetext_rec_score_threshNone表示使用实例化参数,否则该参数优先级更高。float|NoneNonejson文件的操作:| 方法 | 方法说明 | 参数 | 参数类型 | 参数说明 | 默认值 |
|---|---|---|---|---|---|
print() |
打印结果到终端 | format_json |
bool |
是否对输出内容进行使用 JSON 缩进格式化。 |
True |
indent |
int |
指定缩进级别,以美化输出的 JSON 数据,使其更具可读性,仅当 format_json 为 True 时有效。 |
4 | ||
ensure_ascii |
bool |
控制是否将非 ASCII 字符转义为 Unicode。设置为 True 时,所有非 ASCII 字符将被转义;False 则保留原始字符,仅当format_json为True时有效。 |
False |
||
save_to_json() |
将结果保存为json格式的文件 | save_path |
str |
保存的文件路径,当为目录时,保存文件命名与输入文件类型命名一致。 | 无 |
indent |
int |
指定缩进级别,以美化输出的 JSON 数据,使其更具可读性,仅当 format_json 为 True 时有效。 |
4 | ||
ensure_ascii |
bool |
控制是否将非 ASCII 字符转义为 Unicode。设置为 True 时,所有非 ASCII 字符将被转义;False 则保留原始字符,仅当format_json为True时有效。 |
False |
||
save_to_img() |
将结果保存为图像格式的文件 | save_path |
str |
保存的文件路径,支持目录或文件路径。 | 无 |
print() 方法会将结果打印到终端,打印到终端的内容解释如下:
input_path: (str) 待预测图像的输入路径page_index: (Union[int, None]) 如果输入是PDF文件,则表示当前是PDF的第几页,否则为 Nonemodel_settings: (Dict[str, bool]) 配置产线所需的模型参数
use_doc_preprocessor: (bool) 控制是否启用文档预处理子产线use_textline_orientation: (bool) 控制是否启用文本行方向分类模块doc_preprocessor_res: (Dict[str, Union[str, Dict[str, bool], int]]) 文档预处理子产线的输出结果。仅当use_doc_preprocessor=True时存在
input_path: (Union[str, None]) 图像预处理子产线接受的图像路径,当输入为numpy.ndarray时,保存为Nonemodel_settings: (Dict) 预处理子产线的模型配置参数
use_doc_orientation_classify: (bool) 控制是否启用文档方向分类use_doc_unwarping: (bool) 控制是否启用文本图像矫正angle: (int) 文档方向分类的预测结果。启用时取值为[0,1,2,3],分别对应[0°,90°,180°,270°];未启用时为-1dt_polys: (List[numpy.ndarray]) 文本检测的多边形框列表。每个检测框由4个顶点坐标构成的numpy数组表示,数组shape为(4, 2),数据类型为int16dt_scores: (List[float]) 文本检测框的置信度列表text_det_params: (Dict[str, Dict[str, int, float]]) 文本检测模块的配置参数
limit_side_len: (int) 图像预处理时的边长限制值limit_type: (str) 边长限制的处理方式thresh: (float) 文本像素分类的置信度阈值box_thresh: (float) 文本检测框的置信度阈值unclip_ratio: (float) 文本检测框的膨胀系数text_type: (str) 文本检测的类型,当前固定为"general"textline_orientation_angles: (List[int]) 文本行方向分类的预测结果。启用时返回实际角度值(如[0,0,1]),未启用时返回[-1,-1,-1]text_rec_score_thresh: (float) 文本识别结果的过滤阈值rec_texts: (List[str]) 文本识别结果列表,仅包含置信度超过text_rec_score_thresh的文本rec_scores: (List[float]) 文本识别的置信度列表,已按text_rec_score_thresh过滤rec_polys: (List[numpy.ndarray]) 经过置信度过滤的文本检测框列表,格式同dt_polysrec_boxes: (numpy.ndarray) 检测框的矩形边界框数组,shape为(n, 4),dtype为int16。每一行表示一个矩形框的[x_min, y_min, x_max, y_max]坐标,其中(x_min, y_min)为左上角坐标,(x_max, y_max)为右下角坐标save_to_json() 方法会将上述内容保存到指定的save_path中,如果指定为目录,则保存的路径为save_path/{your_img_basename}_res.json,如果指定为文件,则直接保存到该文件中。由于json文件不支持保存numpy数组,因此会将其中的numpy.array类型转换为列表形式。save_to_img() 方法会将可视化结果保存到指定的save_path中,如果指定为目录,则保存的路径为save_path/{your_img_basename}_ocr_res_img.{your_img_extension},如果指定为文件,则直接保存到该文件中。(产线通常包含较多结果图片,不建议直接指定为具体的文件路径,否则多张图会被覆盖,仅保留最后一张图)此外,也支持通过属性获取带结果的可视化图像和预测结果,具体如下:
| 属性 | 属性说明 |
|---|---|
json |
获取预测的 json 格式的结果 |
img |
获取格式为 dict 的可视化图像 |
json 属性获取的预测结果为dict类型的数据,相关内容与调用 save_to_json() 方法保存的内容一致。img 属性返回的预测结果是一个dict类型的数据。其中,键分别为 ocr_res_img 和 preprocessed_img,对应的值是两个 Image.Image 对象:一个用于显示 OCR 结果的可视化图像,另一个用于展示图像预处理的可视化图像。如果没有使用图像预处理子模块,则dict中只包含 ocr_res_img。如果通用 OCR 产线可以达到您对产线推理速度和精度的要求,您可以直接进行开发集成/部署。
若您需要将通用 OCR 产线直接应用在您的Python项目中,可以参考2.2 Python脚本方式集成中的示例代码。
此外,PaddleOCR 也提供了其他两种部署方式,详细说明如下:
🚀 高性能推理:在实际生产环境中,许多应用对部署策略的性能指标(尤其是响应速度)有着较严苛的标准,以确保系统的高效运行与用户体验的流畅性。为此,PaddleOCR 提供高性能推理功能,旨在对模型推理及前后处理进行深度性能优化,实现端到端流程的显著提速,详细的高性能推理流程请参考高性能推理。
☁️ 服务化部署:服务化部署是实际生产环境中常见的一种部署形式。通过将推理功能封装为服务,客户端可以通过网络请求来访问这些服务,以获取推理结果。详细的产线服务化部署流程请参考服务化部署。
以下是基础服务化部署的API参考与多语言服务调用示例:
对于服务提供的主要操作:
200,响应体的属性如下:| 名称 | 类型 | 含义 |
|---|---|---|
logId |
string |
请求的UUID。 |
errorCode |
integer |
错误码。固定为0。 |
errorMsg |
string |
错误说明。固定为"Success"。 |
result |
object |
操作结果。 |
| 名称 | 类型 | 含义 |
|---|---|---|
logId |
string |
请求的UUID。 |
errorCode |
integer |
错误码。与响应状态码相同。 |
errorMsg |
string |
错误说明。 |
服务提供的主要操作如下:
infer获取图像OCR结果。
POST /ocr
| 名称 | 类型 | 含义 | 是否必填 |
|---|---|---|---|
file |
string |
服务器可访问的图像文件或PDF文件的URL,或上述类型文件内容的Base64编码结果。默认对于超过10页的PDF文件,只有前10页的内容会被处理。 要解除页数限制,请在产线配置文件中添加以下配置:
|
是 |
fileType |
integer | null |
文件类型。0表示PDF文件,1表示图像文件。若请求体无此属性,则将根据URL推断文件类型。 |
否 |
useDocOrientationClassify |
boolean | null |
请参阅产线对象中 predict 方法的 use_doc_orientation_classify 参数相关说明。 |
否 |
useDocUnwarping |
boolean | null |
请参阅产线对象中 predict 方法的 use_doc_unwarping 参数相关说明。 |
否 |
useTextlineOrientation |
boolean | null |
请参阅产线对象中 predict 方法的 use_textline_orientation 参数相关说明。 |
否 |
textDetLimitSideLen |
integer | null |
请参阅产线对象中 predict 方法的 text_det_limit_side_len 参数相关说明。 |
否 |
textDetLimitType |
string | null |
请参阅产线对象中 predict 方法的 text_det_limit_type 参数相关说明。 |
否 |
textDetThresh |
number | null |
请参阅产线对象中 predict 方法的 text_det_thresh 参数相关说明。 |
否 |
textDetBoxThresh |
number | null |
请参阅产线对象中 predict 方法的 text_det_box_thresh 参数相关说明。 |
否 |
textDetUnclipRatio |
number | null |
请参阅产线对象中 predict 方法的 text_det_unclip_ratio 参数相关说明。 |
否 |
textRecScoreThresh |
number | null |
请参阅产线对象中 predict 方法的 text_rec_score_thresh 参数相关说明。 |
否 |
visualize |
boolean | null |
是否返回可视化结果图以及处理过程中的中间图像等。
例如,在产线配置文件中添加如下字段:
将默认不返回图像,通过请求体中的visualize参数可以覆盖默认行为。如果请求体和配置文件中均未设置(或请求体传入null、配置文件中未设置),则默认返回图像。
|
否 |
| 名称 | 类型 | 含义 |
|---|---|---|
ocrResults |
object |
OCR结果。数组长度为1(对于图像输入)或实际处理的文档页数(对于PDF输入)。对于PDF输入,数组中的每个元素依次表示PDF文件中实际处理的每一页的结果。 |
dataInfo |
object |
输入数据信息。 |
ocrResults中的每个元素为一个object,具有如下属性:
| 名称 | 类型 | 含义 |
|---|---|---|
prunedResult |
object |
产线对象的 predict 方法生成结果的 JSON 表示中 res 字段的简化版本,其中去除了 input_path 和 page_index 字段。 |
ocrImage |
string | null |
OCR结果图,其中标注检测到的文本位置。图像为JPEG格式,使用Base64编码。 |
docPreprocessingImage |
string | null |
可视化结果图像。图像为JPEG格式,使用Base64编码。 |
inputImage |
string | null |
输入图像。图像为JPEG格式,使用Base64编码。 |
import base64
import requests
API_URL = "http://localhost:8080/ocr"
file_path = "./demo.jpg"
with open(file_path, "rb") as file:
file_bytes = file.read()
file_data = base64.b64encode(file_bytes).decode("ascii")
payload = {"file": file_data, "fileType": 1}
response = requests.post(API_URL, json=payload)
assert response.status_code == 200
result = response.json()["result"]
for i, res in enumerate(result["ocrResults"]):
print(res["prunedResult"])
ocr_img_path = f"ocr_{i}.jpg"
with open(ocr_img_path, "wb") as f:
f.write(base64.b64decode(res["ocrImage"]))
print(f"Output image saved at {ocr_img_path}")
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include "cpp-httplib/httplib.h" // https://github.com/Huiyicc/cpp-httplib
#include "nlohmann/json.hpp" // https://github.com/nlohmann/json
#include "base64.hpp" // https://github.com/tobiaslocker/base64
int main() {
httplib::Client client("localhost", 8080);
const std::string filePath = "./demo.jpg";
std::ifstream file(filePath, std::ios::binary | std::ios::ate);
if (!file) {
std::cerr << "Error opening file." << std::endl;
return 1;
}
std::streamsize size = file.tellg();
file.seekg(0, std::ios::beg);
std::vector buffer(size);
if (!file.read(buffer.data(), size)) {
std::cerr << "Error reading file." << std::endl;
return 1;
}
std::string bufferStr(buffer.data(), static_cast(size));
std::string encodedFile = base64::to_base64(bufferStr);
nlohmann::json jsonObj;
jsonObj["file"] = encodedFile;
jsonObj["fileType"] = 1;
auto response = client.Post("/ocr", jsonObj.dump(), "application/json");
if (response && response->status == 200) {
nlohmann::json jsonResponse = nlohmann::json::parse(response->body);
auto result = jsonResponse["result"];
if (!result.is_object() || !result["ocrResults"].is_array()) {
std::cerr << "Unexpected response structure." << std::endl;
return 1;
}
for (size_t i = 0; i < result["ocrResults"].size(); ++i) {
auto ocrResult = result["ocrResults"][i];
std::cout << ocrResult["prunedResult"] << std::endl;
std::string ocrImgPath = "ocr_" + std::to_string(i) + ".jpg";
std::string encodedImage = ocrResult["ocrImage"];
std::string decodedImage = base64::from_base64(encodedImage);
std::ofstream outputImage(ocrImgPath, std::ios::binary);
if (outputImage.is_open()) {
outputImage.write(decodedImage.c_str(), static_cast(decodedImage.size()));
outputImage.close();
std::cout << "Output image saved at " << ocrImgPath << std::endl;
} else {
std::cerr << "Unable to open file for writing: " << ocrImgPath << std::endl;
}
}
} else {
std::cerr << "Failed to send HTTP request." << std::endl;
if (response) {
std::cerr << "HTTP status code: " << response->status << std::endl;
std::cerr << "Response body: " << response->body << std::endl;
}
return 1;
}
return 0;
}
import okhttp3.*;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Base64;
public class Main {
public static void main(String[] args) throws IOException {
String API_URL = "http://localhost:8080/ocr";
String imagePath = "./demo.jpg";
File file = new File(imagePath);
byte[] fileContent = java.nio.file.Files.readAllBytes(file.toPath());
String base64Image = Base64.getEncoder().encodeToString(fileContent);
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode payload = objectMapper.createObjectNode();
payload.put("file", base64Image);
payload.put("fileType", 1);
OkHttpClient client = new OkHttpClient();
MediaType JSON = MediaType.get("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON, payload.toString());
Request request = new Request.Builder()
.url(API_URL)
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
String responseBody = response.body().string();
JsonNode root = objectMapper.readTree(responseBody);
JsonNode result = root.get("result");
JsonNode ocrResults = result.get("ocrResults");
for (int i = 0; i < ocrResults.size(); i++) {
JsonNode item = ocrResults.get(i);
JsonNode prunedResult = item.get("prunedResult");
System.out.println("Pruned Result [" + i + "]: " + prunedResult.toString());
String ocrImageBase64 = item.get("ocrImage").asText();
byte[] ocrImageBytes = Base64.getDecoder().decode(ocrImageBase64);
String ocrImgPath = "ocr_result_" + i + ".jpg";
try (FileOutputStream fos = new FileOutputStream(ocrImgPath)) {
fos.write(ocrImageBytes);
System.out.println("Saved OCR image to: " + ocrImgPath);
}
}
} else {
System.err.println("Request failed with HTTP code: " + response.code());
}
}
}
}
package main
import (
"bytes"
"encoding/base64"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
func main() {
API_URL := "http://localhost:8080/ocr"
filePath := "./demo.jpg"
fileBytes, err := ioutil.ReadFile(filePath)
if err != nil {
fmt.Printf("Error reading file: %v\n", err)
return
}
fileData := base64.StdEncoding.EncodeToString(fileBytes)
payload := map[string]interface{}{
"file": fileData,
"fileType": 1,
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
fmt.Printf("Error marshaling payload: %v\n", err)
return
}
client := &http.Client{}
req, err := http.NewRequest("POST", API_URL, bytes.NewBuffer(payloadBytes))
if err != nil {
fmt.Printf("Error creating request: %v\n", err)
return
}
req.Header.Set("Content-Type", "application/json")
res, err := client.Do(req)
if err != nil {
fmt.Printf("Error sending request: %v\n", err)
return
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
fmt.Printf("Unexpected status code: %d\n", res.StatusCode)
return
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Printf("Error reading response body: %v\n", err)
return
}
type OcrResult struct {
PrunedResult map[string]interface{} `json:"prunedResult"`
OcrImage *string `json:"ocrImage"`
}
type Response struct {
Result struct {
OcrResults []OcrResult `json:"ocrResults"`
DataInfo interface{} `json:"dataInfo"`
} `json:"result"`
}
var respData Response
if err := json.Unmarshal(body, &respData); err != nil {
fmt.Printf("Error unmarshaling response: %v\n", err)
return
}
for i, res := range respData.Result.OcrResults {
if res.OcrImage != nil {
imgBytes, err := base64.StdEncoding.DecodeString(*res.OcrImage)
if err != nil {
fmt.Printf("Error decoding image %d: %v\n", i, err)
continue
}
filename := fmt.Sprintf("ocr_%d.jpg", i)
if err := ioutil.WriteFile(filename, imgBytes, 0644); err != nil {
fmt.Printf("Error saving image %s: %v\n", filename, err)
continue
}
fmt.Printf("Output image saved at %s\n", filename)
}
}
}
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
class Program
{
static readonly string API_URL = "http://localhost:8080/ocr";
static readonly string inputFilePath = "./demo.jpg";
static async Task Main(string[] args)
{
var httpClient = new HttpClient();
byte[] fileBytes = File.ReadAllBytes(inputFilePath);
string fileData = Convert.ToBase64String(fileBytes);
var payload = new JObject
{
{ "file", fileData },
{ "fileType", 1 }
};
var content = new StringContent(payload.ToString(), Encoding.UTF8, "application/json");
HttpResponseMessage response = await httpClient.PostAsync(API_URL, content);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
JObject jsonResponse = JObject.Parse(responseBody);
JArray ocrResults = (JArray)jsonResponse["result"]["ocrResults"];
for (int i = 0; i < ocrResults.Count; i++)
{
var res = ocrResults[i];
Console.WriteLine($"[{i}] prunedResult:\n{res["prunedResult"]}");
string base64Image = res["ocrImage"]?.ToString();
if (!string.IsNullOrEmpty(base64Image))
{
string outputPath = $"ocr_{i}.jpg";
byte[] imageBytes = Convert.FromBase64String(base64Image);
File.WriteAllBytes(outputPath, imageBytes);
Console.WriteLine($"OCR image saved to {outputPath}");
}
else
{
Console.WriteLine($"OCR image at index {i} is null.");
}
}
}
}
const axios = require('axios');
const fs = require('fs');
const path = require('path');
const API_URL = 'http://localhost:8080/layout-parsing';
const imagePath = './demo.jpg';
const fileType = 1;
function encodeImageToBase64(filePath) {
const bitmap = fs.readFileSync(filePath);
return Buffer.from(bitmap).toString('base64');
}
const payload = {
file: encodeImageToBase64(imagePath),
fileType: fileType
};
axios.post(API_URL, payload)
.then(response => {
const results = response.data.result.layoutParsingResults;
results.forEach((res, index) => {
console.log(`\n[${index}] prunedResult:`);
console.log(res.prunedResult);
const outputImages = res.outputImages;
if (outputImages) {
Object.entries(outputImages).forEach(([imgName, base64Img]) => {
const imgPath = `${imgName}_${index}.jpg`;
fs.writeFileSync(imgPath, Buffer.from(base64Img, 'base64'));
console.log(`Output image saved at ${imgPath}`);
});
} else {
console.log(`[${index}] No outputImages.`);
}
});
})
.catch(error => {
console.error('Error during API request:', error.message || error);
});
<?php
$API_URL = "http://localhost:8080/ocr";
$image_path = "./demo.jpg";
$image_data = base64_encode(file_get_contents($image_path));
$payload = array(
"file" => $image_data,
"fileType" => 1
);
$ch = curl_init($API_URL);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true)["result"]["ocrResults"];
foreach ($result as $i => $item) {
echo "[$i] prunedResult:\n";
print_r($item["prunedResult"]);
if (!empty($item["ocrImage"])) {
$output_img_path = "ocr_{$i}.jpg";
file_put_contents($output_img_path, base64_decode($item["ocrImage"]));
echo "OCR image saved at $output_img_path\n";
} else {
echo "No ocrImage found for item $i\n";
}
}
?>
如果 通用OCR 产线提供的默认模型权重在您的场景中,精度或速度不满意,您可以尝试利用您自己拥有的特定领域或应用场景的数据对现有模型进行进一步的微调,以提升 通用OCR 产线的在您的场景中的识别效果。
通用 OCR 产线包含若干模块,模型产线的效果如果不及预期,可能来自于其中任何一个模块。您可以对识别效果差的图片进行分析,进而确定是哪个模块存在问题,并参考以下表格中对应的微调教程链接进行模型微调。
| 情形 | 微调模块 | 微调参考链接 |
|---|---|---|
| 整图旋转矫正不准 | 文档图像方向分类模块 | 链接 |
| 图像扭曲矫正不准 | 文本图像矫正模块 | 暂不支持微调 |
| 文本行旋转矫正不准 | 文本行方向分类模块 | 链接 |
| 文本漏检 | 文本检测模块 | 链接 |
| 文本内容不准 | 文本识别模块 | 链接 |
当您使用私有数据集完成微调训练后,可获得本地模型权重文件,然后可以通过参数指定本地模型保存路径的方式,或者通过自定义产线配置文件的方式,使用微调后的模型权重。
在初始化产线对象时,通过参数指定本地模型路径。以文本检测模型微调后的权重的使用方法为例,示例如下:
命令行方式:
# 通过 --text_detection_model_dir 指定本地模型路径
paddleocr ocr -i ./general_ocr_002.png --text_detection_model_dir your_det_model_path
# 默认使用 PP-OCRv5_server_det 模型作为默认文本检测模型,如果微调的不是该模型,通过 --text_detection_model_name 修改模型名称
paddleocr ocr -i ./general_ocr_002.png --text_detection_model_name PP-OCRv5_mobile_det --text_detection_model_dir your_v5_mobile_det_model_path
脚本方式:
from paddleocr import PaddleOCR
# 通过 text_detection_model_dir 指定本地模型路径
pipeline = PaddleOCR(text_detection_model_dir="./your_det_model_path")
# 默认使用 PP-OCRv5_server_det 模型作为默认文本检测模型,如果微调的不是该模型,通过 text_detection_model_name 修改模型名称
# pipeline = PaddleOCR(text_detection_model_name="PP-OCRv5_mobile_det", text_detection_model_dir="./your_v5_mobile_det_model_path")
1.获取产线配置文件
可调用 PaddleOCR 中 通用 OCR 产线对象的 export_paddlex_config_to_yaml 方法,将当前产线配置导出为 YAML 文件:
from paddleocr import PaddleOCR
pipeline = PaddleOCR()
pipeline.export_paddlex_config_to_yaml("PaddleOCR.yaml")
2.修改配置文件
在得到默认的产线配置文件后,将微调后模型权重的本地路径替换至产线配置文件中的对应位置即可。例如
......
SubModules:
TextDetection:
box_thresh: 0.6
limit_side_len: 64
limit_type: min
max_side_limit: 4000
model_dir: null # 替换为微调后的文本测模型权重路径
model_name: PP-OCRv5_server_det # 如果微调的模型名称与默认模型名称不同,请一并修改此处
module_name: text_detection
thresh: 0.3
unclip_ratio: 1.5
TextLineOrientation:
batch_size: 6
model_dir: null # 替换为微调后的文本行方向分类模型权重路径
model_name: PP-LCNet_x1_0_textline_ori # 如果微调的模型名称与默认模型名称不同,请一并修改此处
module_name: textline_orientation
TextRecognition:
batch_size: 6
model_dir: null # 替换为微调后的文本识模型权重路径
model_name: PP-OCRv5_server_rec # 如果微调的模型名称与默认模型名称不同,请一并修改此处
module_name: text_recognition
score_thresh: 0.0
......
在产线配置文件中,不仅包含 PaddleOCR CLI 和 Python API 支持的参数,还可进行更多高级配置,具体信息可在 PaddleX模型产线使用概览 中找到对应的产线使用教程,参考其中的详细说明,根据需求调整各项配置。
3.在 CLI 中加载产线配置文件
在修改完成配置文件后,通过命令行的 --paddlex_config 参数指定修改后的产线配置文件的路径,PaddleOCR 会读取其中的内容作为产线配置。示例如下:
paddleocr ocr --paddlex_config PaddleOCR.yaml ...
4.在 Python API 中加载产线配置文件
初始化产线对象时,可通过 paddlex_config 参数传入 PaddleX 产线配置文件路径或配置dict,PaddleOCR 会读取其中的内容作为产线配置。示例如下:
from paddleocr import PaddleOCR
pipeline = PaddleOCR(paddlex_config="PaddleOCR.yaml")
lang |
语言名称 |
|---|---|
abq | 阿布哈兹文 |
af | 南非荷兰文 |
ang | 古英文 |
ar | 阿拉伯文 |
ava | 阿瓦尔文 |
az | 阿塞拜疆文 |
be | 白俄罗斯文 |
bg | 保加利亚文 |
bgc | 哈里亚纳文 |
bh | 比哈尔文 |
bho | 博杰普尔文 |
bs | 波斯尼亚文 |
ch | 简体中文 |
che | 车臣文 |
chinese_cht | 繁体中文 |
cs | 捷克文 |
cy | 威尔士文 |
da | 丹麦文 |
dar | 达尔格瓦文 |
de or german | 德文 |
en | 英文 |
es | 西班牙文 |
et | 爱沙尼亚文 |
fa | 波斯文 |
fr or french | 法文 |
ga | 爱尔兰文 |
gom | 孔卡尼文 |
hi | 印地文 |
hr | 克罗地亚文 |
hu | 匈牙利文 |
id | 印尼文 |
inh | 印古什文 |
is | 冰岛文 |
it | 意大利文 |
japan | 日文 |
ka | 格鲁吉亚文 |
kbd | 卡巴尔达文 |
korean | 韩文 |
ku | 库尔德文 |
la | 拉丁文 |
lbe | 拉克文 |
lez | 列兹金文 |
lt | 立陶宛文 |
lv | 拉脱维亚文 |
mah | 马加希文 |
mai | 迈蒂利文 |
mi | 毛利文 |
mn | 蒙古文 |
mr | 马拉地文 |
ms | 马来文 |
mt | 马耳他文 |
ne | 尼泊尔文 |
new | 尼瓦尔文 |
nl | 荷兰文 |
no | 挪威文 |
oc | 奥克文 |
pi | 巴利文 |
pl | 波兰文 |
pt | 葡萄牙文 |
ro | 罗马尼亚文 |
rs_cyrillic | 塞尔维亚语西里尔字母 |
rs_latin | 塞尔维亚语拉丁字母 |
ru | 俄文 |
sa | 梵文 |
sck | 萨达里文 |
sk | 斯洛伐克文 |
sl | 斯洛文尼亚文 |
sq | 阿尔巴尼亚文 |
sv | 瑞典文 |
sw | 斯瓦希里文 |
tab | 塔巴萨兰文 |
ta | 泰米尔文 |
te | 泰卢固文 |
tl | 塔加洛文 |
tr | 土耳其文 |
ug | 维吾尔文 |
uk | 乌克兰文 |
ur | 乌尔都文 |
uz | 乌兹别克文 |
vi | 越南文 |
ocr_version |
Supported lang |
|---|---|
PP-OCRv5 |
ch, en, fr, de, japan, korean, chinese_cht, af, it, es, bs, pt, cs, cy, da, et, ga, hr, hu, rslatin, id, oc, is, lt, mi, ms, nl, no, pl, sk, sl, sq, sv, sw, tl, tr, uz, la, ru, be, uk |
PP-OCRv4 |
ch, en |
PP-OCRv3 |
abq, af, ady, ang, ar, ava, az, be,
bg, bgc, bh, bho, bs, ch, che,
chinese_cht, cs, cy, da, dar, de, german,
en, es, et, fa, fr, french, ga, gom,
hi, hr, hu, id, inh, is, it, japan,
ka, kbd, korean, ku, la, lbe, lez, lt,
lv, mah, mai, mi, mn, mr, ms, mt,
ne, new, nl, no, oc, pi, pl, pt,
ro, rs_cyrillic, rs_latin, ru, sa, sck, sk,
sl, sq, sv, sw, ta, tab, te, tl,
tr, ug, uk, ur, uz, vi
|