制作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步进行:

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql基本查询(上)

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 1. 创建&#xff08;create&#xff09; 全列插入 省略into插入 插入…

[工控机安全] 使用DriverView快速排查不可信第三方驱动(附详细图文教程)

导语&#xff1a; 在工业控制领域&#xff0c;设备驱动程序的安全性至关重要。第三方驱动可能存在兼容性问题、安全漏洞甚至恶意代码&#xff0c;威胁设备稳定运行。本文将手把手教你使用 DriverView工具&#xff0c;高效完成工控机驱动安全检查&#xff0c;精准识别可疑驱动&a…

Docker 镜像构建与优化

一、Dockerfile 构建镜像 1.1.拉取所需镜像 首先 docker pull 拉取一个 centos7 的镜像。 docker pull centos:7 下载 nginx 源码包。 官网&#xff1a;nginx: download wget https://nginx.org/download/nginx-1.26.3.tar.gz 1.2.解决 CentOS 7 安装源问题 因为原本的 …

PHP回调后门分析

什么是PHP回调后门&#xff1f; PHP回调后门是指攻击者利用PHP的回调函数等技术&#xff0c;绕过WAF&#xff08;Web应用防火墙&#xff09;&#xff0c;在受攻击的PHP应用程序中插入恶意代码。这种后门可以被用来执行任意PHP代码&#xff0c;例如访问数据库、执行系统命令、窃…

vue数据重置

前言 大家在开发后台管理系统的过程中&#xff0c;一定会遇到一个表格的条件查询重置功能吧&#xff0c;如果说查询条件少&#xff0c;重置起来还算是比较简单&#xff0c;如果元素特别多呢&#xff0c;那玩意写起来可遭老罪喽&#xff0c;那今天就给大家整一个如何快速重置数…

【js逆向入门】图灵爬虫练习平台 第九题

地址&#xff1a;aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvOS8 f12进入了debugger&#xff0c;右击选择一律不在此处暂停&#xff0c; 点击继续执行 查看请求信息 查看载荷&#xff0c;2个加密参数&#xff0c;m和tt 查看启动器&#xff0c;打上断点 进来 往…

OpenCV第2课 OpenCV的组成结构与图片/视频的加载及展示

1.OpenCV 的组成结构 2.OpenCV 的具体模块 3. 图像的读取 4. 视频的读取 1.OpenCV 的组成结构 OpenCV 是由很多模块组成的,这些模块可以分成很多层: 最底层是基于硬件加速层(HAL)的各种硬件优化。再上一层是opencv_contrib 模块所包含的OpenCV 由其他开发人员所贡献的代…

scNET:整合scRNA-seq和PPI用于学习基因和细胞的embedding

scRNA-seq 技术的最新进展为深入了解各种组织的异质性提供了前所未有的视角。然而&#xff0c;仅靠基因表达数据往往无法捕捉和识别细胞通路和复合物的变化&#xff0c;因为这些变化在蛋白质水平上更容易被察觉。此外&#xff0c;由于scRNA-seq数据存在高噪声水平和零膨胀等固有…

吴恩达机器学习笔记复盘(十一)逻辑回归的代价和损失函数

简介 逻辑回归是一种二分类算法&#xff0c;损失函数和代价函数和线性回归模型不同。目标是根据特征预测标签Y&#xff08;0或1&#xff09;。模型通过参数W和B拟合数据&#xff0c;但如何选择最优参数成为关键。本质上说线性回归的损失函数是对数值本身的误差平均值描述&…

ctfshow WEB web3

提示是一道php伪协议文件包含的题目&#xff0c;通过get传递的参数是 url 使用 Burp 抓包&#xff0c;发送给 Repeater 构造php伪协议&#xff0c;通过url传递 ?urlphp://input <?php system("pwd");?> 查看当前目录 <?php system("ls");?…

Windows部署deepseek R1训练数据后通过AnythingLLM当服务器创建问答页面

如果要了解Windows部署Ollama 、deepseek R1请看我上一篇内容。 这是接上一篇的。 AnythingLLM是一个开源的全栈AI客户端&#xff0c;支持本地部署和API集成。它可以将任何文档或内容转化为上下文&#xff0c;供各种语言模型&#xff08;LLM&#xff09;在对话中使用。以下是…

word中指定页面开始添加页码

第一步&#xff1a; 插入页码 第二步&#xff1a; 把光标放到指定起始页码处 第三步&#xff1a; 取消链接到前一节 此时关掉页脚先添加分节符 添加完分节符后恢复点击 第四步&#xff1a; 设置页码格式&#xff0c;从1开始 第五步&#xff1a; 删掉不要的页码&#xff0c…

多语言语料库万卷·丝路2.0开源,数据模态全面升级,搭建文化交流互鉴AI桥梁

3月22日&#xff0c;上海人工智能实验室&#xff08;上海AI实验室&#xff09;联合新华社新闻信息中心、上海外国语大学、外研在线等&#xff0c;发布全新升级的“万卷丝路2.0”多语言语料库&#xff0c;通过构建多语言开源数据底座&#xff0c;以人工智能赋能“一带一路”高质…

Windows桌面采集技术

在进入具体的方式讨论前&#xff0c;我们先看看 Windows 桌面图形界面的简化架构&#xff0c;如下图&#xff1a; 在 Windows Vista 之前&#xff0c;Windows 界面的复合画面经由 Graphics Device Interface&#xff08;以下简称 GDI&#xff09;技术直接渲染到桌面上。 在 Wi…

C# BULK INSERT导入大数据文件数据到SqlServer

BULK INSERT 的核心原理 BULK INSERT 是一种通过数据库原生接口高效批量导入数据的技术&#xff0c;其核心原理是绕过逐条插入的 SQL 解析和执行开销&#xff0c;直接将数据以二进制流或批量记录的形式传输到数据库。 在.NET中&#xff0c;主要通过 ​SqlBulkCopy 类​&#x…

Power BI嵌入应用:常见问题与调试技巧

将Power B 嵌入应用时的常见问题与调试技巧 Power BI Embedded 是一项 Microsoft Azure 服务&#xff0c;允许开发人员将交互式 Power BI 报表和仪表板嵌入到外部自定义应用程序或网站中。将Power BI嵌入应用程序能有效提升用户体验&#xff0c;但实施过程中可能面临一些典型问…

Android Studio编译问题

文章目录 GradleJDK版本不兼容 Gradle JDK版本不兼容 Incompatible because this component declares an API of a component compatible with Java 11 and the consumer needed a runtime of a component compatible with Java 8 查看module内gradle文件是否设置jdk版本&…

Four.meme是什么,一篇文章读懂

一、什么是Four.meme&#xff1f; Four.meme 是一个运行在 BNB 链的去中心化平台旨在为 meme 代币供公平启动服务。它允许用户以极低的成本创建和推出 meme 代币&#xff0c;无需预售或团队分配&#xff0c;它消除了传统的预售、种子轮和团队分配&#xff0c;确保所有参与者有…

解决PHP内存溢出问题的讨论和分析

PHP作为一种广泛使用的服务器端脚本语言&#xff0c;在处理大量数据或复杂任务时&#xff0c;常常会遇到内存溢出的问题。内存溢出不仅会导致程序崩溃&#xff0c;还可能影响服务器的稳定性。本文将探讨解决PHP内存溢出问题的最佳实践&#xff0c;并通过代码示例进行详细说明。…

git,openpnp - 根据安装程序打包名称找到对应的源码版本

文章目录 git,openpnp - 根据安装程序打包名称找到对应的源码版本概述笔记备注 - 提交时间不可以作为查找提交记录的依据END git,openpnp - 根据安装程序打包名称找到对应的源码版本 概述 想在openpnp官方最新稳定版上改一改&#xff0c;首先就得知道官方打包的安装程序对应的…