news 2026/9/10 11:59:11

PaddleOCR HubServing Docker 部署指南:把 OCR 服务快速打包成可调用的 Restful API

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PaddleOCR HubServing Docker 部署指南:把 OCR 服务快速打包成可调用的 Restful API

PaddleOCR HubServing Docker 部署指南:把 OCR 服务快速打包成可调用的 Restful API

【免费下载链接】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 仓库中 Docker 化部署文档 展开,讲解如何利用 Docker 将 PaddleOCR 的ocr_system模块打包为镜像,并在 CPU/GPU 环境下以 HubServing 模式启动、测试一个标准的 OCR Restful API 服务。读完本文,你可以独立完成镜像制作、容器启动、端口验证,以及通过 curl 发送 Base64 图片请求并解析结构化识别结果,同时理解服务背后的模块代码与关键可调参数。

一、部署方案总览:HubServing 模式是如何工作的

该方案的目标是:通过 Docker 技术,把 PaddleOCR 服务打包成镜像,以便在 Docker 或 K8s 环境中快速发布上线。文档中说明,当前实现的是基于 HubServing 模式的部署(作者同时计划后续增加 PaddleServing 模式的部署)。

从源码结构看,整个服务由三部分组成:

  1. PaddleHub 服务模块:deploy/hubserving/ocr_system/module.py 定义了名为ocr_system的 PaddleHub 模块(@moduleinfo(name="ocr_system", version="1.0.0"))。其核心逻辑是:
    • serving_method是对外暴露的 serving 入口(@serving装饰器),先把请求中的 Base64 字符串通过base64_to_cv2解码为图像数组,再调用predict
    • predict逐张调用TextSystem(来自 tools/infer/predict_system.py),即完整的"检测 + 方向分类 + 识别"OCR 流水线,输出textconfidencetext_region(四点多边形坐标)三类字段;
    • _initialize在启用 GPU 时会强制检查环境变量CUDA_VISIBLE_DEVICES,未正确设置会抛出RuntimeError,并把显存上限cfg.gpu_mem设为 8000 MB。
  2. 运行参数配置:deploy/hubserving/ocr_system/params.py 中的read_params()定义了全部推理参数(详见第六节),merge_configs会在启动时用这些值覆盖默认配置。
  3. 服务清单:deploy/hubserving/ocr_system/config.json 指定服务端口"port": 8868、工作进程数"workers": 2,并在init_args中声明"use_gpu": true(GPU 镜像中生效;CPU 场景需要容器内无可用 GPU 或相应调整)。

Dockerfile 的CMD正是把这三者串起来的一条命令:

hub install deploy/hubserving/ocr_system/ && hub serving start -m ocr_system

二、实施前提准备

按照文档要求,开始之前需要先安装以下基本组件:

组件说明
Docker 环境必需,用于构建与运行镜像
显卡驱动 + CUDA 10.0+仅 GPU 版本需要
NVIDIA Container ToolkitGPU 版本需要;Docker 19.03 以上版本可跳过此步
cuDNN 7.6+仅 GPU 版本需要

从 GPU 版 Dockerfile 的基础镜像registry.baidubce.com/paddlepaddle/paddle:2.0.0-gpu-cuda10.1-cudnn7也可以印证:官方 GPU 镜像按 CUDA 10.1 + cuDNN 7 环境制作,与上述前提一致。

三、制作镜像

仓库为 CPU 和 GPU 分别提供了 Dockerfile,位于 deploy/docker/hubserving/cpu/Dockerfile 与 deploy/docker/hubserving/gpu/Dockerfile,两者结构相同,区别仅在基础镜像:

  • CPU:FROM registry.baidubce.com/paddlepaddle/paddle:2.0.0
  • GPU:FROM registry.baidubce.com/paddlepaddle/paddle:2.0.0-gpu-cuda10.1-cudnn7

Dockerfile 的构建步骤可以拆分为四段:

  1. 安装依赖(基于 Python 3.7):升级 pip、安装paddlehub
  2. 拉取代码git clone https://github.com/PaddlePaddle/PaddleOCR.git /PaddleOCR,然后安装仓库requirements.txt中的依赖;
  3. 下载推理模型:为文本检测、方向分类、文本识别三个模型分别执行ADD {link}+tar xf解压到/PaddleOCR/inference/。注意 Dockerfile 中的{link}{file}是模板占位符,构建前需要替换为实际的模型下载地址与文件名。Dockerfile 中的注释明确说明:默认使用轻量版(mobile)模型,如需换成高精度(server)版本,例如把检测模型从ch_ppocr_mobile_v2.0_det_infer改为ch_ppocr_server_v2.0_det_infer,同时记得同步修改 params.py 中对应的det_model_dir字段,否则会出现模型目录不一致的问题;
  4. 暴露端口与启动命令EXPOSE 8868,并以hub install ... && hub serving start -m ocr_system作为容器启动命令。

制作镜像的具体操作(文档以 CPU 为例,GPU 版本替换关键字即可):

# a. 切换至 Dockerfile 目录(需区分 cpu 或 gpu 版本) cd deploy/docker/hubserving/cpu # b. 生成镜像 docker build -t paddleocr:cpu .

四、启动 Docker 容器

启动方式按 CPU/GPU 与 Docker 版本区分,共三种命令:

CPU 版本

sudo docker run -dp 8868:8868 --name paddle_ocr paddleocr:cpu

GPU 版本(基于 NVIDIA Container Toolkit)

sudo nvidia-docker run -dp 8868:8868 --name paddle_ocr paddleocr:gpu

GPU 版本(Docker 19.03 及以上,可直接使用--gpus参数)

sudo docker run -dp 8868:8868 --gpus all --name paddle_ocr paddleocr:gpu

说明:中文文档中该条命令写为-dp 8868:8869,与英文版 README.md 的8868:8868不一致,属于文档笔误。容器内服务监听的是 8868 端口(见 config.json 的"port": 8868与 Dockerfile 的EXPOSE 8868),宿主机端口映射应保持两端一致。

检查服务运行情况:执行

docker logs -f paddle_ocr

当日志中出现Successfully installed ocr_systemRunning on http://0.0.0.0:8868等信息时,表示服务启动成功。

五、测试服务:从 Base64 编码到返回结果解析

服务就绪后,测试分为三步:

a. 计算待识别图片的 Base64 编码。可借助任意 Base64 图片编码工具(在线工具或本地脚本均可)。

b. 发送服务请求。仓库提供了完整的示例请求文件 deploy/docker/hubserving/sample_request.txt,其中包含一张真实图片的 Base64 编码与可直接执行的 curl 命令。请求的基本格式为:

curl -H "Content-Type:application/json" -X POST --data "{\"images\": [\"填入图片Base64编码(需要删除'data:image/jpg;base64,'前缀)\"]}" http://localhost:8868/predict/ocr_system

两个要点:

  • 请求体是 JSON,字段名为images,值为 Base64 字符串数组(支持一次传多张图);如果 Base64 带有data:image/jpg;base64,前缀,需要先删除,因为模块侧的base64_to_cv2(tools/infer/utility.py)只做纯 Base64 解码;
  • 接口路径为/predict/ocr_system,即 HubServing 的predict路由加上模块名。注意sample_request.txt末尾示例写的是localhost:8866,实际服务端口应以 8868 为准(同样以 config.json 与启动日志为准)。

c. 解析返回结果。调用成功时返回如下结构:

{"msg":"","results":[[{"confidence":0.8403433561325073,"text":"约定","text_region":[[345,377],[641,390],[634,540],[339,528]]},{"confidence":0.8131805658340454,"text":"最终相遇","text_region":[[356,532],[624,530],[624,596],[356,598]]}]],"status":"0"}

字段含义与 module.py 中predict的组装逻辑一一对应:

字段含义来源
msg错误信息,正常时为空字符串HubServing 框架
status状态码,"0"表示成功HubServing 框架
results二维数组,外层对应请求中的每张图片,内层对应该图识别出的每条文本predict按图片循环追加
results[i][j].text识别出的文本rec_res
results[i][j].confidence该条文本的置信度(浮点数)float(score)
results[i][j].text_region文本区域的四个顶点坐标[[x1,y1],[x2,y2],[x3,y3],[x4,y4]],即旋转矩形多边形dt_boxes[dno].astype(np.int32).tolist()

六、参数深度解析:params.py 决定了服务识别能力

hub serving start启动时,module.py 的merge_configs会用 params.py 中read_params()的返回值逐项覆盖parse_args的默认配置。这些参数直接决定了服务的模型选择与识别行为:

文本检测(DB 算法)

cfg.det_algorithm = "DB" cfg.det_model_dir = "./inference/PP-OCRv3_mobile_det_infer/" cfg.det_limit_side_len = 960 # 缩放后最长边限制 cfg.det_limit_type = "max" # 按最长边缩放 cfg.det_db_thresh = 0.3 # 概率图二值化阈值 cfg.det_db_box_thresh = 0.5 # 多边形框得分阈值,低于此值的框被丢弃 cfg.det_db_unclip_ratio = 1.6 # 多边形外扩比例 cfg.use_dilation = False cfg.det_db_score_mode = "fast"

文本识别(CRNN)

cfg.rec_algorithm = "CRNN" cfg.rec_model_dir = "./inference/ch_PP-OCRv3_rec_infer/" cfg.rec_image_shape = "3, 48, 320" # 识别输入形状 cfg.rec_batch_num = 6 # 识别批大小 cfg.max_text_length = 25 cfg.rec_char_dict_path = "./ppocr/utils/ppocr_keys_v1.txt" # 字符字典 cfg.use_space_char = True

方向分类器

cfg.use_angle_cls = True # 启用 180° 方向分类 cfg.cls_model_dir = "./inference/ch_ppocr_mobile_v2.0_cls_infer/" cfg.cls_image_shape = "3, 48, 192" cfg.label_list = ["0", "180"] cfg.cls_batch_num = 30 cfg.cls_thresh = 0.9

其他开关

cfg.use_pdserving = False # 是否使用 PaddleServing 推理后端 cfg.use_tensorrt = False # 是否启用 TensorRT 加速 cfg.drop_score = 0.5 # 结果过滤阈值,置信度低于该值的文本框将被丢弃

调优要点(均可直接修改 params.py 后重新构建镜像):

  • 模型精度与速度取舍det_model_dir/rec_model_dir/cls_model_dir决定使用哪个推理模型。Dockerfile 注释给出了 mobile 与 server 版本互换的操作方法,并强调必须同步修改 params.py 中的目录字段;
  • 检测召回det_db_box_thresh降低可增加召回但可能引入误检,det_db_threshdet_db_unclip_ratio影响多边形连通区域与外扩范围;
  • 结果噪声控制drop_score是最终结果的置信度过滤线;
  • 模型下载 URL:params.py 末尾还保留了det_model_url/rec_model_url/cls_model_url三个 HTTPS 模型地址,可配合 Dockerfile 的ADD {link}占位符完成模型下载。

七、注意事项与适用前提

  1. 版本前提:Dockerfile 标注Version: 2.0.0,基础镜像为 PaddlePaddle 2.0.0 系列,环境基于 Python 3.7,服务模块绑定的是 v2.x 推理链路(TextSystem、PP-OCRv3/v2.0 推理模型)。该部署方案适用于 v2.x 系列的模型与推理格式,不能直接等同于仓库当前 3.x 新 API 的运行环境,使用前提以文档和 Dockerfile 实际内容为准;
  2. GPU 环境要求:若镜像以use_gpu: true初始化(见 config.json),_initialize会检查CUDA_VISIBLE_DEVICES环境变量,未设置或格式不正确将直接报RuntimeError。GPU 容器需通过nvidia-docker或 Docker 19.03+ 的--gpus all方式启动,使该环境变量正确注入;
  3. 端口一致性:镜像内固定监听 8868(EXPOSE 8868+"port": 8868)。docker run的端口映射、curl 请求地址三者需保持一致;中文文档8868:8869与示例请求文件中的8866均应按 8868 修正理解;
  4. 模型占位符:Dockerfile 中的ADD {link}tar xf ... {file}为模板形式,执行docker build前必须替换为真实可下载的模型链接与文件名,否则构建会失败;
  5. 部署模式范围:当前 Docker 方案仅覆盖 HubServing 模式,PaddleServing 模式部署在文档中属于后续计划。

综合来看,这套"文档 + Dockerfile + 服务模块"的组合,为 PaddleOCR v2.x 提供了一条从源码到 Restful API 的标准路径:改params.py控制行为、换 Dockerfile 占位符控制模型、docker build/run/logs三步完成发布与验证。

【免费下载链接】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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 11:55:01

OpenCore Legacy Patcher 实操指南:给老 Mac 装新版 macOS 的 6 步路径

OpenCore Legacy Patcher 实操指南:给老 Mac 装新版 macOS 的 6 步路径 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 系统更新窗口弹出一句&quo…

作者头像 李华
网站建设 2026/9/10 11:54:57

基于YOLO11的无人机视角行人车辆检测与界面项目

文章目录基于YOLO11的无人机视角行人车辆检测与界面项目1. 项目背景与需求2. 项目技术背景3. 系统架构4. 关键技术实现5. 应用场景6. 总结与展望基于YOLO11的无人机视角行人车辆检测与界面项目 随着无人机技术的快速发展,无人机在各个领域的应用也越来越广泛&#…

作者头像 李华
网站建设 2026/9/10 11:51:07

多人工作台:从在线文档到任务协作的新范式

「千问办公」上线多人工作台,说实话第一眼看到"业内首个"这四个字,我第一反应是"又来了,营销号式表达"。但把它的形态逻辑拆开看了一遍之后,我得承认:这玩意儿跟我们过去几年熟悉的"在线文档…

作者头像 李华