制作PaddleOCR/PaddleHub的Docker镜像

news2025/3/28 7:39:43

背景

在落地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步进行:

  1. paddleOCR基础镜像
  2. paddlehub基础镜像
  3. 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 /PaddleOCR

python3.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:base


WORKDIR /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能力的简易方案,给您的项目提供参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2321300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu部署Docker搭建靶场

前言 我们需要部署Docker来搭建靶场题目&#xff0c;他可以提供一个隔离的环境&#xff0c;方便在不同的机器上部署&#xff0c;接下来&#xff0c;我会记录我的操作过程&#xff0c;简单的部署一道题目 Docker安装 不推荐在物理机上部署&#xff0c;可能会遇到一些问题&…

【DFS】羌笛何须怨杨柳,春风不度玉门关 - 4. 二叉树中的深搜

本篇博客给大家带来的是二叉树深度优先搜索的解法技巧,在后面的文章中题目会涉及到回溯和剪枝,遇到了一并讲清楚. &#x1f40e;文章专栏: DFS &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的…

搭建Redis主从集群

主从集群说明 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离。 主从结构 这是一个简单的Redis主从集群结构 集群中有一个master节点、两个slave节点&#xff08;现在叫replica&#xff09;…

WSL2增加memory问题

我装的是Ubuntu24-04版本&#xff0c;所有的WSL2子系统默认memory为主存的一半&#xff08;我的电脑是16GB&#xff0c;wsl是8GB&#xff09;&#xff0c;可以通过命令查看&#xff1a; free -h #查看ubuntu的memory和swap &#xff08;改过的11GB&#xff09; 前几天由于配置E…

git 合并多次提交 commit

在工作中&#xff0c;有时候在反复修改代码中&#xff08;比如处理MR的检视意见&#xff0c;或者为了推送到测试环境&#xff0c;先 commit到自己的远程分支上&#xff09;不免会有多次 commit&#xff0c;这样发起 MR 的时候&#xff0c;就会有一堆 commit 信息&#xff0c;看…

如何分析和解决服务器的僵尸进程问题

### 如何分析和解决服务器的僵尸进程问题 #### **一、僵尸进程的定义与影响** **僵尸进程&#xff08;Zombie Process&#xff09;** 是已终止但未被父进程回收资源的进程。其特点&#xff1a; - **状态标识**&#xff1a;在进程列表&#xff08;如 ps 或 top&#xff09;中标…

XXL-Job 二次分片是怎么做的?有什么问题?怎么去优化的?

XXL-JOB二次分片机制及优化策略 二次分片实现原理 XXL-JOB的二次分片是在分片广播策略的基础上&#xff0c;由开发者自行实现的更细粒度数据拆分。核心流程如下&#xff1a; 初次分片&#xff1a;调度中心根据执行器实例数量&#xff08;总分片数n&#xff09;分配分片索引i&…

java版嘎嘎快充玉阳软件互联互通中电联云快充协议充电桩铁塔协议汽车单车一体充电系统源码uniapp

演示&#xff1a; 微信小程序&#xff1a;嘎嘎快充 http://server.s34.cn:1888/ 系统管理员 admin/123456 运营管理员 yyadmin/Yyadmin2024 运营商 operator/operator2024 系统特色&#xff1a; 多商户、汽车单车一体、互联互通、移动管理端&#xff08;开发中&#xff09; 另…

Spatial Multiplexing Power Save

802.11n中添加的PSMP&#xff0c;SMPS机制。 SM 节能功能可让 STA 在大部分时间内仅通过一条活动接收链运行&#xff0c;从而达到节能目的。 空间复用省电(Spatial Multiplexing Power Save&#xff09;模式下&#xff0c;节点会关闭多余的天线&#xff0c;仅仅使用一根天线进…

2025年渗透测试面试题总结-某360-企业蓝军面试复盘 (题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 360-企业蓝军 一、Shiro绕WAF实战方案 二、WebLogic遭遇WAF拦截后的渗透路径 三、JBoss/WebLogic反序…

C语言基础—函数指针与指针函数

函数指针 定义 函数指针本质上是指针&#xff0c;它是函数的指针&#xff08;定义了一个指针变量&#xff0c;变量中存储了函数的地址&#xff09;。函数都有一个入口地址&#xff0c;所谓指向函数的指针&#xff0c;就是指向函数的入口地址。这里函数名就代表入口地址。 函…

用DrissionPage升级网易云音乐爬虫:更稳定高效地获取歌单音乐(附原码)

一、传统爬虫的痛点分析 原代码使用requests re的方案存在以下局限性&#xff1a; 动态内容缺失&#xff1a;无法获取JavaScript渲染后的页面内容 维护成本高&#xff1a;网页结构变化需频繁调整正则表达式 反爬易触发&#xff1a;简单请求头伪造容易被识别 资源消耗大&am…

OpenCV图像拼接(5)构建图像的拉普拉斯金字塔 (Laplacian Pyramid)

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::createLaplacePyr 是 OpenCV 中的一个函数&#xff0c;用于构建图像的拉普拉斯金字塔 (Laplacian Pyramid)。拉普拉斯金字塔是一种多…

通俗一点介绍什么是场外期权交易 ?

场外期权是交易所以外的市场进行交易的期权&#xff0c;主要由期货公司、证券公司等金融机构根据客户具体要求进行设计&#xff0c;最终由期货公司等机构与客户签订协议的形式进行&#xff0c;通俗一点理解场外期权就是股票做多的玩法交易&#xff0c;下文为大家科普通俗一点介…

蓝桥杯备考:图的遍历

这道题乍一看好像没什么不对的&#xff0c;但是&#xff01;但是&#xff01;结点最大可以到10的5次方&#xff01;&#xff01;&#xff01;我们递归的时间复杂度是很高的&#xff0c;我们正常遍历是肯定通过不了的&#xff0c;不信的话我们试一下 #include <iostream>…

IIS漏洞攻略

一&#xff0c;PUT漏洞 1&#xff0c;在windows server 2003 中开启 WebDAV 和写权限&#xff0c;然后访问并使用BP抓包 2&#xff0c;使用PUT上传一个木马文件&#xff0c;后缀要改成其他格式 3&#xff0c;将上传的木马文件的内容写入到asp文件中&#xff0c;然后进行连接即…

C++《红黑树》

在之前的篇章当中我们已经了解了基于二叉搜索树的AVL树&#xff0c;那么接下来在本篇当中将继续来学习另一种基于二叉搜索树的树状结构——红黑树&#xff0c;在此和之前学习AVL树类似还是通过先了解红黑树是什么以及红黑树的结构特点&#xff0c;接下来在试着实现红黑树的结构…

struts2框架漏洞攻略

S2-057远程执⾏代码漏洞 环境 vulhub靶场 /struts2/s2-057 漏洞简介 漏洞产⽣于⽹站配置XML时如果没有设置namespace的值&#xff0c;并且上层动作配置中并没有设置 或使⽤通配符namespace时&#xff0c;可能会导致远程代码执⾏漏洞的发⽣。同样也可能因为url标签没有设置…

8662 234的和

8662 234的和 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;模拟、二维前缀和 &#x1f4d6; &#x1f4da; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int[] a ne…

Baklib企业CMS的核心功能是什么?

企业CMS标准化发布解析 现代企业内容管理中&#xff0c;标准化发布模板与元数据管理构成了高效运营的基石。通过预置行业适配的文档框架与格式规范&#xff0c;系统能够显著降低内容创建门槛&#xff0c;同时确保品牌视觉与信息架构的一致性。以某智能硬件厂商为例&#xff0c…