制作PaddleOCR/PaddleHub的Docker镜像
背景
在落地RAG知识库过程中,遇到了图文识别、图片表格内容识别的需求。但那时(2024年4月)各开源RAG项目还没有集成成熟的解决方案,经调研我选择了百度开源的PaddleOCR。支持国产!
概念梳理
PaddleOCR
百度飞桨的OCR框架,结合对应模型实现OCR能力。可通过命令行操作,项目中可集成该SDK实现OCR能力。主要包含了如下组件:
- ocr_system:可识别图片中的文字;
- structure_table:可识别图片中的表格,默认返回html格式。集成时按需解析成目标格式,如markdown。
- structure_layout:识别如火车票、发票等版面。
PaddleHub
将PaddleOCR的能力封装成http服务,项目集成时可直接通过API调用完成。
我的RAG使用的也是开源项目,更新频繁。为降低影响,我选择了PaddleHub方式集成。
在集成时,考虑到便利性,使用Docker部署方式。由于是首次制作该Docker镜像,过程分为3步进行:
- paddleOCR基础镜像
- paddlehub基础镜像
- paddlehub运行镜像
当制作过程成熟后可直接使用Dockerfile制作即可。在后续的文章中我会提供完整版的Dockerfile文件。
1 制作paddleOCR基础镜像
基础环境
- ubuntu 22.04
- gcc/g++ 11.04
- Python 3.10
- paddleocr 2.7.5
- paddpaddle 2.5.2
- paddlehub 2.4.0
- opencv-python 4.6.0.66
拉取Ubuntu
docker pull ubuntu:22.04# 启动容器
docker run -it --name=myUbuntu -d ubuntu:22.04# 进入容器
docker exec -it myUbuntu /bin/bash
📌 以下操作需要在容器内进行。
依赖包安装
依次执行如下操作:
# 设置时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \echo "Asia/Shanghai" > /etc/timezone# 安装依赖
apt-get update && apt-get install -y --no-install-recommends \python3.10 \python3-pip \git \wget \unzip \&& apt-get clean all && \rm -rf /var/lib/apt/lists/*# 安装vi
apt-get update && apt-get install -y --no-install-recommends \vim \&& apt-get clean all && \rm -rf /var/lib/apt/lists/*# 安装gcc 和 g++ 11.4.0
apt-get update && apt-get install -y --no-install-recommends \gcc-11 \g++-11 \&& apt-get clean all && \rm -rf /var/lib/apt/lists/*# 为 gcc-11 和 g++-11 建立软连接
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 100 && \update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 100# 安装paddlehub
pip3.10 install --upgrade pip -i https://mirror.baidu.com/pypi/simple && \
pip3.10 install paddlehub --upgrade -i https://mirror.baidu.com/pypi/simple# 下载PaddleOCR
wget https://github.com/PaddlePaddle/PaddleOCR/archive/refs/tags/v2.7.5.tar.gz && \tar -zxvf v2.7.5.tar.gz && \mv PaddleOCR-2.7.5 PaddleOCR \&& rm -rf v2.7.5.tar.gz \&& cd PaddleOCR \&& pip3.10 install -r requirements.txt -i https://mirror.baidu.com/pypi/simple \&& mkdir -p /PaddleOCR/inference/ \&& wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar && \tar xf ch_ppocr_mobile_v2.0_det_infer.tar -C /PaddleOCR/inference/ && \wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar && \tar xf ch_ppocr_mobile_v2.0_cls_infer.tar -C /PaddleOCR/inference/ && \wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar && \tar xf ch_ppocr_mobile_v2.0_rec_infer.tar -C /PaddleOCR/inference/ \&& rm -rf ch_ppocr_mobile_v2.0_det_infer.tar \&& rm -rf ch_ppocr_mobile_v2.0_cls_infer.tar \&& rm -rf ch_ppocr_mobile_v2.0_rec_infer.tar# 安装paddleocr 2.7.5
pip3.10 install -i https://mirror.baidu.com/pypi/simple paddleocr==2.7.5# 安装paddlepaddle 2.5.2
pip3.10 install -i https://mirror.baidu.com/pypi/simple paddlepaddle==2.5.2# 安装paddleclas
pip3.10 install -i https://mirror.baidu.com/pypi/simple paddleclas==2.5.2# 安装 opencv-python
pip3.10 install -i https://mirror.baidu.com/pypi/simple opencv-python==4.6.0.66
安装完上述依赖后,可以测试一下paddleocr是否可用。如执行表格识别:
paddleocr --image_dir=ppstructure/docs/table/table.jpg --type=structure --layout=false
可以正常输出的话,说明paddleocr安装成功了。
镜像提交
安装完所有依赖后,提交镜像,以生成基础镜像:
docker commit myUbuntu paddleocr:base
查看生成的基础镜像:
root@os1:/home/parallels# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
paddleocr base d48f60f25c7e 19 minutes ago 3.53GB
ubuntu 22.04 437ec753bef3 10 days ago 77.9MB
可能的问题
在依赖包安装过程中,可能会出现如下问题:
📌 问题:
…………
class PaddleOCR(predict_system.TextSystem):
NameError: name 'predict_system' is not defined
原因: 通过pip安装的2.7.5这个版本有个小bug,需要手动修改一下 paddleocr.py:
vi /usr/local/lib/python3.10/dist-packages/paddleocr/paddleocr.py
路径需要按照你的实际路径修改。然后引入包 predict_system:
from tools.infer import predict_system
2 制作paddlehub基础镜像
参考文档:基于HubServing的服务部署
# 启动容器
docker run -it --name=ocr -d paddleocr:base /bin/bash#进入容器
docker exec -it ocr /bin/bash
📌 以下操作需要在容器内进行。
安装表格识别模型
修改配置
cd /PaddleOCR
vi deploy/hubserving/structure_table/params.py
将模型和字典修改为我们下载好的内容,中文版的:

安装模块
# 切换路径
cd /PaddleOCR#PP-Structure
hub install deploy/hubserving/structure_system#表格识别
hub install deploy/hubserving/structure_table#表格版面分析
hub install deploy/hubserving/structure_layout
可能的问题
❓ 问题:
File "/usr/local/lib/python3.10/dist-packages/google/protobuf/descriptor.py", line 914, in __new__
_message.Message._CheckCalledFromGeneratedFile()
TypeError: Descriptors cannot be created directly.
If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
If you cannot immediately regenerate your protos, some other possible workarounds are:
1. Downgrade the protobuf package to 3.20.x or lower.
2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).
原因:
我们默认安装的protobuf为5.26.1:
root@443924942e80:/PaddleOCR# pip show protobuf
Name: protobuf
Version: 5.26.1
Summary:
Home-page: https://developers.google.com/protocol-buffers/
Author: protobuf@googlegroups.com
Author-email: protobuf@googlegroups.com
License: 3-Clause BSD License
Location: /usr/local/lib/python3.10/dist-packages
Requires:
Required-by: onnx, onnxruntime, paddlenlp, paddlepaddle, visualdl
而paddlepaddle是基于3.19版本生成的proto。
解决方案:
降级protobuf至3.20.2,不能再低了!
pip3.10 install -i https://mirror.baidu.com/pypi/simple protobuf==3.20.2
启动服务
执行下面的指令启动服务:
hub serving start -m structure_table \--port 8866 \--use_multiprocess \--workers
显示结果参考如下:

验证
在容器中的PaddleOCR目录中执行下面的指令进行测试:
cd /PaddleOCRpython3.10 tools/test_hubserving.py --server_url=http://127.0.0.1:8866/predict/structure_table --image_dir=./pic_3.png
响应信息参考:
root@443924942e80:/PaddleOCR# python3.10 tools/test_hubserving.py --server_url=http://127.0.0.1:8866/predict/structure_table --image_dir=./pic_3.png
[2024/04/29 07:13:14] ppocr INFO: Predict time of ./pic_3.png: 14.628s
[2024/04/29 07:13:14] ppocr INFO: {'html': '<html><body><table><tbody><tr><td colspan="8">中国***视频 ***报价表</td></tr><tr><td>序号</td><td>产品型号</td><td>配置描述</td><td></td><td>购买账号数 报价单位</td><td>用户价(每个)</td><td>备注</td></tr><tr><td rowspan="3">1</td>…………………………………………</td></tr></tbody></table></body></html>'}
[2024/04/29 07:13:14] ppocr INFO: avg time cost: 14.628179788589478
安装文字识别模型
ocr_system
修改模型配置文件
vi deploy/hubserving/ocr_system/params.py
将检测模型替换为模型替换为 OCRv4 版本:
🔔 注意:
此处替换成 ch_PP-OCRv4_rec_server_infer 后(100M的高精度模型),当机器资源有限时,客户端调用会超时!(我的虚拟机配置是4c8g)
安装模块
cd /PaddleOCR
hub install deploy/hubserving/ocr_system
安装成功显示如下:
root@443924942e80:/PaddleOCR# hub install deploy/hubserving/ocr_system
[2024-04-29 07:28:38,423] [INFO] - Successfully installed ocr_system-1.0.0
启动服务
root@443924942e80:/PaddleOCR# hub serving start -m ocr_system \--port 8866 \--use_multiprocess \--workers
[2024-04-29 07:30:17,132] [ WARNING] - The _initialize method in HubModule will soon be deprecated, you can use the __init__() to handle the initialization of the object
[2024-04-29 07:30:18 +0000] [419] [INFO] Starting gunicorn 22.0.0
[2024-04-29 07:30:18 +0000] [419] [INFO] Listening at: http://0.0.0.0:8866 (419)
[2024-04-29 07:30:18 +0000] [419] [INFO] Using worker: sync
[2024-04-29 07:30:18 +0000] [436] [INFO] Booting worker with pid: 436
验证
root@443924942e80:/PaddleOCR# python3.10 tools/test_hubserving.py --server_url=http://127.0.0.1:8866/predict/ocr_system --image_dir=./pic_3.png
[2024/04/29 07:58:47] ppocr INFO: Predict time of ./pic_3.png: 23.598s
[2024/04/29 07:58:47] ppocr INFO: [{'confidence': 0.9993818998336792, 'text': '中国***视频', 'text_region': [[387, 17], [514, 17], [514, 34], [387, 34]]}, {'confidence': 0.9982057213783264, 'text': '报价表', 'text_region': [[519, 17], [656, 17], [656, 35], [519, 35]]}, {'confidence': 0.9998618364334106, 'text': '序号', 'text_region': [[13, 55], [41, 55], [41, 75], [13, 75]]}, {'confidence': 0.9999333620071411, 'text': '产品**', 'text_region': [[120, 56], [170, 56], [170, 74], [120, 74]]}, {'confidence': 0.9986265897750854, 'text': '配置描述', 'text_region': [[372, 56], [423, 56], [423, 74], [372, 74]]}, {'confidence': 0.9993833303451538, 'text': '购买**数', 'text_region': [[562, 53], [623, 56], [622, 74], [561, 72]]}, {'confidence': 0.9999394416809082, 'text': '报价单位', 'text_region': [[637, 56], [687, 56], [687, 74], [637, 74]]}, ………………………………………… {'confidence': 0.9988632202148438, 'text': '每增加*T存储,增加****元', 'text_region': [[776, 699], [918, 699], [918, 716], [776, 716]]}]
[2024/04/29 07:58:47] ppocr INFO: avg time cost: 23.59811234474182
安装版面识别模型
structure_layout
修改模型配置文件
vi deploy/hubserving/structure_layout/params.py
修改配置,将模型和字典替换成最新的:
相关配置:
cfg.layout_model_dir = './inference/picodet_lcnet_x1_0_fgd_layout_cdla_infer/'
cfg.layout_dict_path = './ppocr/utils/dict/layout_dict/layout_cdla_dict.txt'
安装模块
cd /PaddleOCR
hub install deploy/hubserving/structure_layout
启动服务
hub serving start --modules structure_layout --port 8871 --use_multiprocess --workers
镜像提交
退出容器,提交镜像。
root@os1:/home/parallels# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
443924942e80 paddleocr:base "/bin/bash" 16 hours ago Up 16 hours ocr
root@os1:/home/parallels# docker commit ocr paddlehub:base
sha256:3d7e5b5fe54b84f3c02df4c059156e5bd9c3d7337a31127ac1735e6491f453a4
root@os1:/home/parallels# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
paddlehub base 3d7e5b5fe54b 3 seconds ago 3.68GB
paddleocr base d48f60f25c7e 17 hours ago 3.53GB
ubuntu 22.04 437ec753bef3 11 days ago 77.9MB
3 制作paddlehub运行镜像
Dockerfile
FROM paddlehub:baseWORKDIR /PaddleOCR# 暴露8866 端口
EXPOSE 8866#启动模型
/bin/bash", "-c", "hub serving start --modules structure_table ocr_system structure_layout --port 8866 --use_multiprocess --workers
生成镜像
docker build -t paddle-server:1.0 .
启动容器
docker run -p 8866:8866 --name=paddle-server -d paddle-server:1.0
验证
在宿主机上PaddleOCR目录下,执行客户端请求进行验证。
导出镜像
docker save paddle-server:1.0 -o paddle-server.tar
导入镜像
导入到目标环境中。
docker load -i paddle-server.tar
优化
CPU环境下启用多核
以structure_table为例:修改文件/root/.paddlehub/modules/structure_table/module.py,将 enable_mkldnn=False 修改成为True,如下:
def _initialize(self, use_gpu=False, enable_mkldnn=True):
然后 docker restart 重启容器。
写在最后
本文介绍了百度飞浆旗下的PaddleOCR和PaddleHub的用途以及Docker镜像的制作方法,并提供了一种“无侵入”式集成OCR能力的简易方案,给您的项目提供参考。
相关文章:
制作PaddleOCR/PaddleHub的Docker镜像
背景 在落地RAG知识库过程中,遇到了图文识别、图片表格内容识别的需求。但那时(2024年4月)各开源RAG项目还没有集成成熟的解决方案,经调研我选择了百度开源的PaddleOCR。支持国产! 概念梳理 PaddleOCR 百度飞桨的OCR…...
Ubuntu部署Docker搭建靶场
前言 我们需要部署Docker来搭建靶场题目,他可以提供一个隔离的环境,方便在不同的机器上部署,接下来,我会记录我的操作过程,简单的部署一道题目 Docker安装 不推荐在物理机上部署,可能会遇到一些问题&…...
【DFS】羌笛何须怨杨柳,春风不度玉门关 - 4. 二叉树中的深搜
本篇博客给大家带来的是二叉树深度优先搜索的解法技巧,在后面的文章中题目会涉及到回溯和剪枝,遇到了一并讲清楚. 🐎文章专栏: DFS 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的…...
制作rpm包
使用nfpm制作rpm包,下面是做包使用到的关键文件。 . |-- makefile |-- nfpm.yaml -- scripts |-- postinstall.sh |-- postremove.sh |-- preinstall.sh -- preremove.sh preinstall:在npm install命令前执行 install,postinstal…...
搭建Redis主从集群
主从集群说明 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 主从结构 这是一个简单的Redis主从集群结构 集群中有一个master节点、两个slave节点(现在叫replica)…...
1.NextJS基础
NextJS注意要点 文件用来定义路由,folder name becomes the route name注意区分客户端渲染和服务器渲染 html渲染完成后给到客户端(此时网页内容已经全部提供),有利于crawler和优化seo逻辑更简单request deduplication减少API请求…...
【时时三省】(C语言基础)选择结构和条件判断
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 选择结构和条件判断 在现实生活中需要进行判断和选择的情况是很多的。如:从北京出发上高速公路,到一个岔路口,有两个出口,一个是去上海方向,另一个是沈阳方向。驾车者到此处必须进行判断,根据自己的目的地…...
作业12 (2023-05-15 指针概念)
第1题/共11题【单选题】 关于指针的概念,错误的是:( ) A.指针变量是用来存放地址的变量 B.指针变量中存的有效地址可以唯一指向内存中的一块区域 C.野指针也可以正常使用 D.局部指针变量不初始化就是野指针 回答正确 答案解析: A:正确,指针变量中存储的是一个地址,指…...
WSL2增加memory问题
我装的是Ubuntu24-04版本,所有的WSL2子系统默认memory为主存的一半(我的电脑是16GB,wsl是8GB),可以通过命令查看: free -h #查看ubuntu的memory和swap (改过的11GB) 前几天由于配置E…...
git 合并多次提交 commit
在工作中,有时候在反复修改代码中(比如处理MR的检视意见,或者为了推送到测试环境,先 commit到自己的远程分支上)不免会有多次 commit,这样发起 MR 的时候,就会有一堆 commit 信息,看…...
Wireshark网络抓包分析使用详解
序言 之前学计网还有前几天备考华为 ICT 网络赛道时都有了解认识 Wireshark,但一直没怎么专门去用过,也没去系统学习过,就想趁着备考的网络相关知识还没忘光,先来系统学下整理点笔记~ 什么是抓包?抓包就是将网络传输…...
【OpenGL】GLSL基础语法
GLSL(OpenGL Shading Language)是用于编写 OpenGL 着色器程序的高级编程语言,主要分为顶点着色器(Vertex Shader)、片段着色器(Fragment Shader),有时还会用到几何着色器(…...
前端实现截图功能
前端实现截图 在前端开发中,有时我们需要在网页中实现截图功能。无论是为了记录页面内容、生成报告,还是制作网页截图,掌握如何在浏览器中进行截图是非常实用的。今天,我将通过一个简单的示例,介绍如何使用 html2canv…...
如何分析和解决服务器的僵尸进程问题
### 如何分析和解决服务器的僵尸进程问题 #### **一、僵尸进程的定义与影响** **僵尸进程(Zombie Process)** 是已终止但未被父进程回收资源的进程。其特点: - **状态标识**:在进程列表(如 ps 或 top)中标…...
智能提示词生成器:助力测试工程师快速设计高质量测试用例
在软件测试中,测试用例设计方法的选择和实施是确保软件质量的重要步骤。测试工程师经常需要根据不同的测试场景、参数维度和业务需求,设计出覆盖率高且有效的测试用例。然而,设计测试用例并非易事,特别是在面对复杂的业务逻辑时。 为了帮助测试工程师高效生成测试用例提示…...
XXL-Job 二次分片是怎么做的?有什么问题?怎么去优化的?
XXL-JOB二次分片机制及优化策略 二次分片实现原理 XXL-JOB的二次分片是在分片广播策略的基础上,由开发者自行实现的更细粒度数据拆分。核心流程如下: 初次分片:调度中心根据执行器实例数量(总分片数n)分配分片索引i&…...
java版嘎嘎快充玉阳软件互联互通中电联云快充协议充电桩铁塔协议汽车单车一体充电系统源码uniapp
演示: 微信小程序:嘎嘎快充 http://server.s34.cn:1888/ 系统管理员 admin/123456 运营管理员 yyadmin/Yyadmin2024 运营商 operator/operator2024 系统特色: 多商户、汽车单车一体、互联互通、移动管理端(开发中) 另…...
SpringMVC 配置详解
SpringMVC 是 Spring 框架中用于构建 Web 应用程序的模块,它基于 MVC(Model-View-Controller)设计模式,能够将业务逻辑、数据和显示分离,从而提高代码的可维护性和可扩展性。本文将详细介绍 SpringMVC 的配置步骤和相关…...
详细Linux中级知识(不断完善)
Nginx服务配置 基于主机名配置 映射IP和主机名 [rootlocalhost ~]# vim /etc/hosts 192.168.72.135 www.chengke.com chengke[rootlocalhost ~]# echo "192.168.72.135 www.xx.com" >> /etc/hosts以上是两种方法,前面是你的IP地址,后…...
Spatial Multiplexing Power Save
802.11n中添加的PSMP,SMPS机制。 SM 节能功能可让 STA 在大部分时间内仅通过一条活动接收链运行,从而达到节能目的。 空间复用省电(Spatial Multiplexing Power Save)模式下,节点会关闭多余的天线,仅仅使用一根天线进…...
2025年渗透测试面试题总结-某360-企业蓝军面试复盘 (题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 360-企业蓝军 一、Shiro绕WAF实战方案 二、WebLogic遭遇WAF拦截后的渗透路径 三、JBoss/WebLogic反序…...
实时图像处理:让你的应用更智能
I. 引言 实时图像处理在现代应用中扮演着重要的角色,它能够使应用更加智能、响应更加迅速。本文将深入探讨实时图像处理的原理、部署过程以及未来的发展趋势,旨在帮助开发者更好地理解如何将实时图像处理应用于他们的项目中。 II. 实时图像处理的基础概…...
C语言基础—函数指针与指针函数
函数指针 定义 函数指针本质上是指针,它是函数的指针(定义了一个指针变量,变量中存储了函数的地址)。函数都有一个入口地址,所谓指向函数的指针,就是指向函数的入口地址。这里函数名就代表入口地址。 函…...
用DrissionPage升级网易云音乐爬虫:更稳定高效地获取歌单音乐(附原码)
一、传统爬虫的痛点分析 原代码使用requests re的方案存在以下局限性: 动态内容缺失:无法获取JavaScript渲染后的页面内容 维护成本高:网页结构变化需频繁调整正则表达式 反爬易触发:简单请求头伪造容易被识别 资源消耗大&am…...
OpenCV图像拼接(5)构建图像的拉普拉斯金字塔 (Laplacian Pyramid)
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::createLaplacePyr 是 OpenCV 中的一个函数,用于构建图像的拉普拉斯金字塔 (Laplacian Pyramid)。拉普拉斯金字塔是一种多…...
03 Python 基础:数据类型、运算符与流程控制解析
文章目录 一、数据类型 内置的六大类数字类型整数类型 int浮点数 float布尔 bool字符串 str 变量命名 二、数字类型的相互转换显式类型的转换整数,浮点数,复数 之间的显式转换 隐式类型的转换 三、标识符算术运算符比较运算符逻辑运算符位运算符赋值运算…...
通俗一点介绍什么是场外期权交易 ?
场外期权是交易所以外的市场进行交易的期权,主要由期货公司、证券公司等金融机构根据客户具体要求进行设计,最终由期货公司等机构与客户签订协议的形式进行,通俗一点理解场外期权就是股票做多的玩法交易,下文为大家科普通俗一点介…...
蓝桥杯备考:图的遍历
这道题乍一看好像没什么不对的,但是!但是!结点最大可以到10的5次方!!!我们递归的时间复杂度是很高的,我们正常遍历是肯定通过不了的,不信的话我们试一下 #include <iostream>…...
【机器学习/大模型/八股文 面经 (一)】
1. PPO算法中使用GAE的好处以及参数γ和λ的作用是什么? 参考答案: GAE(Generalized Advantage Estimation) 的优势在于通过指数加权多步TD误差,平衡优势估计的偏差与方差,提升策略优化的稳定性。γ(折扣因子):控制未来奖励的衰减程度,值越大表示更关注长期收益。λ…...
IIS漏洞攻略
一,PUT漏洞 1,在windows server 2003 中开启 WebDAV 和写权限,然后访问并使用BP抓包 2,使用PUT上传一个木马文件,后缀要改成其他格式 3,将上传的木马文件的内容写入到asp文件中,然后进行连接即…...
