PaddleOCR 基于 PaddleHub Serving 的 OCR 服务化部署详解:从服务包安装到自定义模块扩展 PaddleOCR 基于 PaddleHub Serving 的 OCR 服务化部署详解从服务包安装到自定义模块扩展【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100 languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR本文围绕 PaddleOCR 仓库中deploy/hubserving目录的官方部署文档系统讲解如何将文本检测、文本识别、版面分析、表格识别等 OCR 能力以 HTTP API 形式服务化包括 9 种服务包的安装、CPU/GPU 两种启动方式、预测请求的发送与返回结果字段以及如何结合module.py/params.py源码结构完成服务模块的自定义修改。读完本文你可以独立完成一套可接入业务系统的 OCR 推理服务并在需要时扩展其输入输出协议。一、服务包总览与目录结构PaddleOCR 将服务化部署代码组织在 deploy/hubserving/ 目录下当前包含 9 种服务包覆盖从单模块到多阶段串联的完整能力组合deploy/hubserving/ └─ ocr_cls 文本方向分类模块服务包 └─ ocr_det 文本检测模块服务包 └─ ocr_rec 文本识别模块服务包 └─ ocr_system 文本检测文本方向分类文本识别串联服务包 └─ structure_layout 版面分析服务包 └─ structure_table 表格识别服务包 └─ structure_system PP-Structure服务包 └─ kie_ser 关键信息抽取-SER服务包 └─ kie_ser_re 关键信息抽取-SERRE服务包每个服务包下包含 4 个文件以串联服务包为例目录如下见 deploy/hubserving/ocr_system/deploy/hubserving/ocr_system/ └─ __init__.py 空文件必选 └─ config.json 配置文件可选使用配置文件启动服务时作为参数传入 └─ module.py 主模块必选包含服务的完整逻辑 └─ params.py 参数文件必选包含模型路径、前后处理参数等参数从源码结构看这套目录约定与 PaddleHub 的模块注册机制严格对应。以 ocr_system/module.py 为例模块类通过moduleinfo装饰器声明服务名与版本这是后续hub install、hub serving start -m能够按名称寻址服务的依据from paddlehub.module.module import moduleinfo, runnable, serving moduleinfo( nameocr_system, version1.0.0, summaryocr system service, authorpaddle-dev, author_emailpaddle-devbaidu.com, typecv/PP-OCR_system, ) class OCRSystem(hub.Module): ...各服务包的实际能力差异体现在两个地方一是module.py中_initialize所实例化的预测引擎串联服务用tools/infer/predict_system.py的TextSystemPP-Structure 服务用ppstructure/predict_system.py的StructureSystemKIE-SER 服务用ppstructure/kie/predict_kie_token_ser.py的SerPredictor二是predict方法对不同引擎返回值的字段裁剪方式这直接决定了 HTTP 接口的返回结构第四节详述。二、启动前的准备工作2.1 安装 PaddleHubpaddlehub 需要 Python 3.6.2pip3 install paddlehub2.1.0 --upgrade -i https://mirror.baidu.com/pypi/simple2.2 下载推理模型安装服务模块前需要准备推理模型并放到正确路径。默认使用的是 PP-OCRv3 模型默认模型路径为| 模型 | 路径 | | ------- | - | | 检测模型 |./inference/PP-OCRv3_mobile_det_infer/| | 识别模型 |./inference/ch_PP-OCRv3_rec_infer/| | 方向分类器 |./inference/ch_ppocr_mobile_v2.0_cls_infer/| | 版面分析模型 |./inference/picodet_lcnet_x1_0_fgd_layout_infer/| | 表格结构识别模型 |./inference/ch_ppstructure_mobile_v2.0_SLANet_infer/| | 关键信息抽取SER模型 |./inference/ser_vi_layoutxlm_xfund_infer/| | 关键信息抽取RE模型 |./inference/re_vi_layoutxlm_xfund_infer/|模型路径可在各服务包的params.py中查看和修改。例如串联服务包中 ocr_system/params.py 定义了cfg.det_algorithm DB cfg.det_model_dir ./inference/PP-OCRv3_mobile_det_infer/ cfg.rec_algorithm CRNN cfg.rec_model_dir ./inference/ch_PP-OCRv3_rec_infer/ cfg.rec_char_dict_path ./ppocr/utils/ppocr_keys_v1.txt cfg.use_angle_cls True cfg.cls_model_dir ./inference/ch_ppocr_mobile_v2.0_cls_infer/注意这些路径是相对于服务进程工作目录的相对路径params.py中还内置了det_model_url、rec_model_url、cls_model_url等模型下载地址。更多模型可以从 PaddleOCR 提供的模型库 PP-OCR 模型列表 和 PP-Structure 模型列表 下载也可以替换成自己训练转换好的模型。2.3 安装服务模块在 Linux 环境Windows 环境请将/替换为\下按需求选择服务包安装| 服务模块 | 命令 | | ------- | - | | 检测 |hub install deploy/hubserving/ocr_det| | 分类 |hub install deploy/hubserving/ocr_cls| | 识别 |hub install deploy/hubserving/ocr_rec| | 检测识别串联 |hub install deploy/hubserving/ocr_system| | 表格识别 |hub install deploy/hubserving/structure_table| | PP-Structure |hub install deploy/hubserving/structure_system| | 版面分析 |hub install deploy/hubserving/structure_layout| | 关键信息抽取SER |hub install deploy/hubserving/kie_ser| | 关键信息抽取SERRE |hub install deploy/hubserving/kie_ser_re|三、启动服务命令行与配置文件两种方式3.1 命令行命令启动仅支持CPU启动命令hub serving start --modules Module1Version1, Module2Version2, ... \ --port 8866 \ --use_multiprocess \ --workers \参数说明参数用途--modules/-mPaddleHub Serving 预安装模型以多个ModuleVersion键值对的形式列出。当不指定 Version 时默认选择最新版本--port/-p服务端口默认为 8866--use_multiprocess是否启用并发方式默认为单进程方式推荐多核 CPU 机器使用此方式。Windows 操作系统只支持单进程方式--workers在并发方式下指定的并发任务数默认为2*cpu_count-1其中cpu_count为 CPU 核数如启动串联服务hub serving start -m ocr_system这样就完成了一个服务化 API 的部署使用默认端口号 8866。3.2 配置文件启动支持CPU、GPU启动命令hub serving start -c config.jsonconfig.json格式如下以 ocr_system/config.json 为例{ modules_info: { ocr_system: { init_args: { version: 1.0.0, use_gpu: true }, predict_args: { } } }, port: 8868, use_multiprocess: false, workers: 2 }init_args中的可配参数与module.py中的_initialize函数接口一致。对照源码 ocr_system/module.py 的签名_initialize(self, use_gpuFalse, enable_mkldnnFalse)可知除use_gpu外还可传入enable_mkldnn以启用 MKL-DNN CPU 推理加速。predict_args中的可配参数与module.py中的predict函数接口一致。当use_gpu为true时表示使用 GPU 启动服务。从源码看GPU 路径并不是简单地切换 device_initialize会在开启 GPU 时强制校验CUDA_VISIBLE_DEVICES环境变量见 ocr_system/module.py#L55-L65若变量未设置会抛出RuntimeError同时固定cfg.gpu_mem 8000并置cfg.ir_optim True开启 IR 优化。注意事项使用配置文件启动服务时其他命令行参数会被忽略。如果使用 GPU 预测即use_gpu置为true则需要在启动服务之前设置CUDA_VISIBLE_DEVICES环境变量如export CUDA_VISIBLE_DEVICES0use_gpu不可与use_multiprocess同时为true。如使用 GPU 3 号卡启动串联服务export CUDA_VISIBLE_DEVICES3 hub serving start -c deploy/hubserving/ocr_system/config.json四、服务请求链路请求如何进入模型理解请求链路对排错很有帮助。test_hubserving.py 展示了标准客户端请求方式以application/json为 Content-Type将图像二进制内容 base64 编码后放入images字段发起 POST 请求并从响应的results[0]取第一张图的结果img open(image_file, rb).read() data {images: [cv2_to_base64(img)]} r requests.post(urlargs.server_url, headersheaders, datajson.dumps(data)) res r.json()[results][0]服务端对应的入口是被serving装饰器标记的serving_method见 ocr_system/module.py#L147-L154它先把 base64 字符串解码为 OpenCV 图像base64_to_cv2再调用predict。predict支持imagesnumpy.ndarray列表与paths文件路径列表两种入参形态二者只能提供其一否则抛出TypeError——这就是为什么服务接口统一约定传 base64 图像数据。以串联服务为例单张图的预测结果在 ocr_system/module.py#L128-L144 中被组织为text/confidence/text_region三元组列表其中text_region是检测框四点坐标的int32列表。而配置合并逻辑在merge_configsocr_system/module.py#L71-L85中先以默认参数parse_args()构造配置再用params.py中read_params()返回的所有键值逐项覆盖因此params.py是模型路径与前后处理参数的最终事实来源。五、发送预测请求配置好服务端后使用仓库自带脚本发送预测请求python tools/test_hubserving.py --server_urlserver_url --image_dirimage_path需要给脚本传递 2 个必选参数见 test_hubserving.py#L148-L157 的参数定义server_url服务地址格式为http://[ip_address]:[port]/predict/[module_name]例如如果使用配置文件启动分类、检测、识别、检测分类识别 3 阶段、表格识别和 PP-Structure 服务并为每个服务修改了 port那么发送请求的 url 将分别是http://127.0.0.1:8865/predict/ocr_det http://127.0.0.1:8866/predict/ocr_cls http://127.0.0.1:8867/predict/ocr_rec http://127.0.0.1:8868/predict/ocr_system http://127.0.0.1:8869/predict/structure_table http://127.0.0.1:8870/predict/structure_system http://127.0.0.1:8871/predict/structure_layout http://127.0.0.1:8872/predict/kie_ser http://127.0.0.1:8873/predict/kie_ser_reimage_dir测试图像路径可以是单张图片路径也可以是图像集合目录路径另有 2 个可选参数visualize是否可视化结果默认为False。可视化分支与 URL 中的模块名联动见 test_hubserving.py#L122-L141URL 含structure_table时把html导出为 xlsx含structure_system时按区域类型分别保存表格 xlsx、图片裁剪与文本结果否则按返回字段绘图——ocr_det只画文本框ocr_system画框并标注文本低分框按drop_score0.5过滤。output可视化结果保存路径默认为./hubserving_result。访问示例python tools/test_hubserving.py --server_urlhttp://127.0.0.1:8868/predict/ocr_system --image_dir./doc/imgs/ --visualizefalse脚本每处理完一张图会打印该图耗时全部结束后打印平均耗时可作为简单的接口延迟观测手段。六、返回结果格式说明返回结果为列表list列表中的每一项为词典dict词典一共可能包含以下字段字段名称数据类型意义anglestr文本角度textstr文本内容confidencefloat文本识别置信度或文本角度分类置信度text_regionlist文本位置坐标htmlstr表格的 html 字符串regionslist版面分析表格识别OCR 的结果每一项为一个 list包含表示区域坐标的bbox、区域类型的type和区域结果的res三个字段layoutlist版面分析的结果每一项一个 dict包含版面区域坐标的bbox、区域类型的label不同模块返回的字段不同。例如文本识别服务模块返回结果不含text_region字段见 ocr_rec/module.py 中仅追加text、confidence两个键文本方向分类服务返回angle、confidence表格识别服务返回{html: ...}版面分析服务返回{layout: ...}见 structure_layout/module.py#L128-L131PP-Structure 服务返回{regions: ...}见 structure_system/module.py#L131-L137。各模块字段矩阵如下字段名/模块名ocr_detocr_clsocr_recocr_systemstructure_tablestructure_systemstructure_layoutkie_serkie_reangle✔✔text✔✔✔✔✔confidence✔✔✔✔✔✔text_region✔✔✔✔✔html✔✔regions✔✔layout✔ser_res✔re_res✔说明如果需要增加、删除、修改返回字段可在相应模块的module.py文件中修改predict方法的结果组装逻辑完整流程参考下一节。七、自定义修改服务模块如果需要修改服务逻辑一般需要操作以下步骤以修改deploy/hubserving/ocr_system为例停止服务hub serving stop --port/-p XXXX到deploy/hubserving/ocr_system下的module.py和params.py等文件中根据实际需求修改代码。例如如果需要替换部署服务所用模型则需要到 params.py 中修改模型路径参数det_model_dir和rec_model_dir如果需要关闭文本方向分类器则将参数use_angle_cls置为False。当然同时可能还需要修改其他相关参数如识别模型输入形状rec_image_shape请根据实际情况修改调试。强烈建议修改后先直接运行module.py调试——每个module.py文件末尾都内置了if __name__ __main__:本地入口构造实例、_initialize()后用./doc/imgs/下的示例图跑predict能正确运行预测后再启动服务测试。注意PP-OCRv3 识别模型使用的图片输入 shape 为3,48,320因此如果换成非 PP-OCRv3 的识别模型需检查 params.py 中的cfg.rec_image_shape 3, 48, 320是否匹配如果不使用 PP-OCRv3 识别模型则无需修改该参数。可选如果想要重命名模块需要更改module.py文件中的以下两处from deploy.hubserving.ocr_system.params import read_params 中的ocr_systemnameocr_system, 中的ocr_system可选可能需要删除__pycache__目录以强制刷新 CPython 缓存find deploy/hubserving/ocr_system -name __pycache__ -exec rm -r {} \;安装修改后的新服务包hub install deploy/hubserving/ocr_system重新启动服务hub serving start -m ocr_system八、近期更新记录以下为官方文档记录的服务能力演进时间线可供判断各服务包的能力基线2022.10.09 新增关键信息抽取服务kie_ser、kie_ser_re2022.08.23 新增版面分析服务structure_layout2022.05.05 新增 PP-OCRv3 检测和识别模型2022.03.30 新增 PP-Structure 和表格识别两种服务九、小结关键文件索引内容仓库路径部署文档本文蓝本deploy/hubserving/readme.md串联服务模块逻辑deploy/hubserving/ocr_system/module.py串联服务参数deploy/hubserving/ocr_system/params.pyGPU 启动配置样例deploy/hubserving/ocr_system/config.json检测服务参数阈值差异示例deploy/hubserving/ocr_det/params.py请求测试脚本tools/test_hubserving.py识别字符字典ppocr/utils/ppocr_keys_v1.txt最后补充一个容易踩坑的细节同一参数在不同服务包中的默认值并不相同。例如 DB 后处理参数在串联服务 ocr_system/params.py 中为det_db_box_thresh0.5、det_db_unclip_ratio1.6而在独立检测服务 ocr_det/params.py 中为det_db_box_thresh0.6、det_db_unclip_ratio1.5。独立部署检测服务时若期望与串联服务行为完全一致需要显式核对这些阈值而不是默认它们全局统一。【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100 languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考