ai之pdf解析rapidOCR 的两种底层依赖PaddlePaddle 和ONNXRuntime
rapidocr_onnxruntime
与 rapidocr
(通常指 rapidocr_paddle
或其他后端实现)的核心区别及使用推荐:
一、核心区别
特性 | rapidocr_onnxruntime | rapidocr (以 rapidocr_paddle 为例) |
---|---|---|
后端引擎 | 基于 ONNXRuntime 推理框架,支持 CPU 和 GPU(通过 ONNXRuntime 的 CUDA/TensorRT 后端) | 基于 PaddlePaddle 框架,主要针对 GPU 优化(需安装 PaddlePaddle-GPU 版本) |
推理速度 | CPU 端性能优异,比 PaddlePaddle 快 4-5 倍,且解决内存泄漏问题 | GPU 端速度更快(如 V100 上单图推理耗时约 0.05 秒),适合大规模图像处理 |
模型格式 | 使用 ONNX 模型,跨框架兼容性强,支持从 PaddleOCR 转换的模型 | 直接使用 PaddleOCR 原生模型,需依赖 PaddlePaddle 框架进行推理 |
安装依赖 | 轻量级,仅需 onnxruntime 和基础图像处理库(如 OpenCV、Pillow) | 需安装完整的 PaddlePaddle 框架(CPU/GPU 版本),依赖较重 |
多语言支持 | 默认支持中英文,其他语言需自定义模型转换 | 与 PaddleOCR 一致,支持更多预训练语言模型(需自行配置) |
跨平台部署 | 支持 Python/C++/Java/C# 等多语言调用,适合嵌入式设备和信创环境 | 主要面向 Python 和 Paddle 生态,跨平台能力较弱 |
二、使用场景推荐
1. 推荐 rapidocr_onnxruntime
的情况
- CPU 环境:需快速、轻量级 OCR 推理,尤其适合资源受限的设备。
- 跨框架需求:希望使用 ONNX 模型兼容不同深度学习框架(如 PyTorch 转 ONNX)。
- 内存敏感场景:需避免内存泄漏问题(如长期运行的服务)。
- 多语言部署:需通过 C++/Java 等非 Python 语言集成 OCR 功能。
2. 推荐 rapidocr_paddle
的情况
- GPU 环境:需利用 GPU 加速大规模图像处理(如批量文档识别)。
- Paddle 生态整合:已在项目中深度使用 PaddlePaddle 框架,需无缝衔接 OCR 功能。
- 自定义模型微调:需基于 PaddleOCR 进行模型训练或微调后直接部署。
三、代码示例对比
rapidocr_onnxruntime
示例
from rapidocr_onnxruntime import RapidOCR# 初始化(默认 CPU,可指定 GPU)
engine = RapidOCR(det_use_cuda=False, # 开启需安装 onnxruntime-gpurec_model_path="custom_rec.onnx"
)result, _ = engine("image.jpg")
print(result)
rapidocr_paddle
示例
from rapidocr_paddle import RapidOCR# 初始化(需安装 PaddlePaddle-GPU)
engine = RapidOCR(det_use_cuda=True, # 显式启用 GPUrec_use_cuda=True
)result, _ = engine("image.jpg")
print(result)
四、总结建议
- 优先选择
rapidocr_onnxruntime
:适用于大多数场景,尤其是 CPU 环境或需要轻量级、跨平台部署的情况。 - 特定场景选
rapidocr_paddle
:仅在需 GPU 加速或深度集成 PaddleOCR 生态时使用。
如需进一步优化性能,可参考官方文档调整参数(如 box_thresh
、unclip_ratio
)。
根据搜索结果的分析,from rapidocr import RapidOCR
的用法已不再是当前推荐的方式,主要原因在于 RapidOCR 项目架构的演进和后端支持的细化。以下是具体说明:
B、上面的补充,我的seek_backend_fast 处理7kpdf时,用的 from rapidocr import RapidOCR
根据搜索结果的分析,from rapidocr import RapidOCR 的用法已不再是当前推荐的方式,主要原因在于 RapidOCR 项目架构的演进和后端支持的细化。以下是具体说明:
一、rapidocr
包的现状
-
历史背景
早期 RapidOCR 以单一包rapidocr
提供支持,用户可直接通过from rapidocr import RapidOCR
调用(如网页1的示例代码所示)。该版本基于 PaddleOCR 模型,但封装较简单。 -
架构调整
随着项目发展,RapidOCR 团队将核心功能拆分为不同后端实现,以优化性能和兼容性:rapidocr_onnxruntime
:基于 ONNXRuntime,支持 CPU/GPU 推理,跨平台适配性强。rapidocr_paddle
:基于 PaddlePaddle,专为 GPU 优化,适合大规模图像处理。- 其他变体:如
rapidocr_openvino
(Intel 硬件加速)、RapidOCR-json
(多语言接口)等。
原始的
rapidocr
包逐渐被这些细分后端取代,官方文档和最新代码示例已转向推荐使用具体后端包。 -
过时表现
- 安装问题:若直接安装
rapidocr
包,可能会发现其依赖模型或接口与最新版本不兼容(如网页3提到的 Pillow 版本冲突问题)。 - 功能缺失:旧版
rapidocr
不支持新模型(如 PP-OCRv4)和优化特性(如 JSON 结果返回、多线程处理)。
- 安装问题:若直接安装
二、当前推荐替代方案
1. 根据场景选择后端包
场景需求 | 推荐包 | 优势 |
---|---|---|
CPU 推理 | rapidocr_onnxruntime | 速度快 4-5 倍,内存占用低,跨平台支持(Windows/Mac/Linux) |
GPU 加速 | rapidocr_paddle | 基于 PaddlePaddle,适合批量处理,支持最新模型(如 V4) |
多语言/嵌入式部署 | RapidOcr-Java 等 | 提供 Java/C# 接口,适配移动端和信创环境 |
2. 代码迁移示例
# 旧版写法(已过时)
from rapidocr import RapidOCR
ocr = RapidOCR()# 新版写法(以 ONNXRuntime 后端为例)
from rapidocr_onnxruntime import RapidOCR
ocr = RapidOCR(det_use_cuda=False) # 显式指定 CPU/GPU
三、版本升级的兼容性问题
-
依赖冲突
如网页3所述,新版 RapidOCR 依赖 Pillow 10.0.1+,可能与 OpenCV 4.8.1 存在兼容性问题。建议升级 OpenCV 或锁定 Pillow 版本。 -
模型格式变化
新版本默认使用 ONNX 格式模型(如ch_PP-OCRv4_det
),需从旧版 Paddle 模型转换。
四、总结建议
- 停止使用
rapidocr
包,改用具体后端实现(如rapidocr_onnxruntime
)。 - GPU 用户优先选择
rapidocr_paddle
,需安装 PaddlePaddle-GPU 版本。 - 参考官方文档更新代码:RapidOCR 的 GitHub 仓库和 CSDN 技术博客 提供了最新示例。
若需进一步验证环境配置或模型路径,可运行以下命令检查:
import rapidocr_onnxruntime
print(rapidocr_onnxruntime.__version__) # 应输出 ≥1.3.0
C、rapidocr_onnxruntime 实例
最后,需要提供一个完整的代码示例,涵盖从PDF读取、分页转换、OCR处理到结果保存的整个流程,同时给出环境配置建议和可能的优化措施,帮助用户顺利实施项目。
以下是一个基于 rapidocr_onnxruntime 的完整项目实例,用于在 PyCharm 中处理多页复杂 PDF 的 OCR 识别,包含分页处理、性能优化和错误处理逻辑:
以下是一个基于 rapidocr_onnxruntime
的完整项目实例,用于在 PyCharm 中处理多页复杂 PDF 的 OCR 识别,包含分页处理、性能优化和错误处理逻辑:
一、环境准备
1. 安装依赖库
pip install rapidocr_onnxruntime PyMuPDF Pillow tqdm pandas
2. 目录结构
project_root/
├── input_pdfs/ # 存放待处理的PDF文件
├── output_texts/ # 存放OCR识别结果(按PDF分页)
├── temp_images/ # 临时存放PDF转换的图片
├── config.py # 配置文件
├── pdf_ocr.py # 主程序
└── requirements.txt
二、代码实现
1. 配置文件 (config.py
)
import osclass Config:# 输入输出路径PDF_DIR = os.path.join(os.getcwd(), "input_pdfs")OUTPUT_DIR = os.path.join(os.getcwd(), "output_texts")TEMP_IMG_DIR = os.path.join(os.getcwd(), "temp_images")# OCR参数DPI = 300 # 影响清晰度和处理速度,复杂内容建议≥300BATCH_SIZE = 10 # 每处理10页保存一次结果,避免内存溢出OCR_PARAMS = {"det_use_cuda": False, # CPU模式(GPU需安装onnxruntime-gpu)"box_thresh": 0.6, # 调高检测框阈值,过滤复杂背景干扰"text_score": 0.5, # 识别置信度阈值}# 日志配置LOG_FILE = "ocr_errors.log"
2. 主程序 (pdf_ocr.py
)
import fitz # PyMuPDF
import os
import logging
from tqdm import tqdm
from rapidocr_onnxruntime import RapidOCR
from PIL import Image
import pandas as pd
from config import Configdef setup_logging():logging.basicConfig(filename=Config.LOG_FILE,level=logging.ERROR,format='%(asctime)s - %(message)s')def pdf_to_images(pdf_path, output_dir):"""将PDF分页转换为高清PNG图像"""doc = fitz.open(pdf_path)images = []for pg_num in range(len(doc)):page = doc.load_page(pg_num)pix = page.get_pixmap(matrix=fitz.Matrix(Config.DPI/72, Config.DPI/72)) # 提高DPIimg_path = os.path.join(output_dir, f"page_{pg_num+1}.png")pix.save(img_path)images.append(img_path)doc.close()return imagesdef process_batch(image_paths, ocr_engine, pdf_name):"""批量处理图像并保存结果"""results = []for img_path in image_paths:try:result, _ = ocr_engine(img_path)text = "\n".join([line[1] for line in result])page_num = int(os.path.basename(img_path).split('_')[1].split('.')[0])results.append({"pdf": pdf_name, "page": page_num, "text": text})except Exception as e:logging.error(f"处理 {img_path} 失败: {str(e)}")return resultsdef main():setup_logging()ocr_engine = RapidOCR(**Config.OCR_PARAMS)# 遍历PDF目录for pdf_file in os.listdir(Config.PDF_DIR):if not pdf_file.endswith(".pdf"):continuepdf_path = os.path.join(Config.PDF_DIR, pdf_file)pdf_name = os.path.splitext(pdf_file)[0]os.makedirs(Config.TEMP_IMG_DIR, exist_ok=True)# 分页转换PDF为图像print(f"正在处理: {pdf_file}")image_paths = pdf_to_images(pdf_path, Config.TEMP_IMG_DIR)# 分批OCR处理all_results = []for i in tqdm(range(0, len(image_paths), Config.BATCH_SIZE), desc="OCR进度"):batch = image_paths[i:i+Config.BATCH_SIZE]batch_results = process_batch(batch, ocr_engine, pdf_name)all_results.extend(batch_results)# 每批保存一次,防止数据丢失df = pd.DataFrame(all_results)output_path = os.path.join(Config.OUTPUT_DIR, f"{pdf_name}_ocr.csv")df.to_csv(output_path, index=False, mode='a', header=not os.path.exists(output_path))# 清理临时图片for img in image_paths:os.remove(img)if __name__ == "__main__":main()
三、关键优化策略
-
内存控制
- 分页处理:将5000页PDF分解为多个批次(
BATCH_SIZE
控制),避免一次性加载所有图像导致内存溢出。 - 及时清理:每处理完一批次立即删除临时图片。
- 分页处理:将5000页PDF分解为多个批次(
-
清晰度与速度平衡
- 通过
DPI=300
保证复杂内容的识别精度,若需更快速度可降低至 200(需测试质量损失)。 - 调整
box_thresh
和text_score
过滤低质量识别结果。
- 通过
-
容错机制
- 使用
try-except
捕获单页处理异常,记录到日志文件,避免程序整体中断。 - 追加模式保存CSV,确保即使崩溃也能保留已处理结果。
- 使用
-
性能提升技巧
- GPU加速:若设备支持,修改
det_use_cuda=True
并安装onnxruntime-gpu
。 - 并行处理:可结合
concurrent.futures
实现多页并发OCR(需注意GPU显存限制)。
- GPU加速:若设备支持,修改
四、运行示例
- 将待处理的PDF放入
input_pdfs/
文件夹 - 执行主程序:
python pdf_ocr.py
- 结果查看:
- 文本内容:
output_texts/xxx_ocr.csv
(包含PDF名称、页码和识别文本) - 错误日志:
ocr_errors.log
- 文本内容:
五、处理复杂内容的增强建议
若PDF包含表格、手写体或特殊符号,可额外添加以下处理:
# 在 process_batch 函数中添加预处理
from preprocessor import enhance_image # 自定义图像增强函数def process_batch(...):...try:# 图像增强:提高对比度、去噪img = Image.open(img_path)enhanced_img = enhance_image(img) # 自定义实现enhanced_img.save(img_path) # 覆盖原图...
需要实现 enhance_image
函数(示例):
# preprocessor.py
import cv2
import numpy as npdef enhance_image(image):"""图像预处理增强对比度"""img_array = np.array(image)# 自适应直方图均衡化lab = cv2.cvtColor(img_array, cv2.COLOR_RGB2LAB)l, a, b = cv2.split(lab)clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))limg = clahe.apply(l)merged = cv2.merge((limg, a, b))enhanced = cv2.cvtColor(merged, cv2.COLOR_LAB2RGB)return Image.fromarray(enhanced)
六、预估性能参考
硬件配置 | 处理速度 (页/分钟) | 预估5000页耗时 |
---|---|---|
CPU (i7-12700H) | 60-80 | 10-14小时 |
GPU (RTX 3060) | 200-300 | 3-4小时 |
建议首次运行时先用小样本PDF测试参数效果!
相关文章:
ai之pdf解析rapidOCR 的两种底层依赖PaddlePaddle 和ONNXRuntime
rapidocr_onnxruntime 与 rapidocr(通常指 rapidocr_paddle 或其他后端实现)的核心区别及使用推荐: 一、核心区别 特性rapidocr_onnxruntimerapidocr(以 rapidocr_paddle 为例)后端引擎基于 ONNXRuntime 推理框架&…...

驱动开发硬核特训 · 专题篇:Vivante GPU 与 DRM 图形显示体系全解析(i.MX8MP 平台实战)
视频教程请关注 B 站:“嵌入式Jerry”。 一、背景导读:GPU 与 DRM 到底谁负责“显示”? 在嵌入式 Linux 图形系统中,“画面怎么显示出来”的问题,表面看似简单,实则涉及多个内核子系统与用户态组件的协同&…...

C——猜数字游戏
前面我们已经学习了C语言常见概念,数据类型和变量以及分置于循环的内容,现在我们可以将这些内容结合起来写一个有趣的小游戏。下面正式开始我们今天的主题——猜数字游戏的实现。 猜数字游戏的要求: 1.电脑自动生成1~100的随机数。 2.玩家…...

C/C++实践(三)深入理解 C++ 三大特性之一:封装
一、封装的概念与核心思想 封装(Encencapsulation)是 C 面向对象编程(OOP)的三大核心特性之一,其本质是将数据(成员变量)和对数据的操作(成员函数)捆绑在一个逻辑单元&a…...
Filecoin存储管理:如何停止Lotus向特定存储路径写入新扇区数据
Filecoin存储管理:如何停止Lotus向特定存储路径写入新扇区数据 引言背景问题场景解决方案步骤1:修改sectorstore.json文件步骤2:重新加载存储配置步骤3:验证更改 技术原理替代方案最佳实践结论 引言 在Filecoin挖矿过程中&#x…...

1、RocketMQ 核心架构拆解
1. 为什么要使用消息队列? 消息队列(MQ)是分布式系统中不可或缺的中间件,主要解决系统间的解耦、异步和削峰填谷问题。 解耦:生产者和消费者通过消息队列通信,彼此无需直接依赖,极大提升系统灵…...

vue3 element-plus 输入框回车跳转页面问题处理
问题描述: 当页面搜索条件只有一个的情况下,输入框不管有没有值,回车后会跳转页面 解决办法,给表单添加 submit.prevent <el-form ref"ruleForm" :model"search" label-width"120px" class&qu…...
常见WEB漏洞----暴力破解
什么是暴力破解 暴力破解 (Brue Force) 是一种攻击方法 (穷举法),简称为“爆破”,黑客通过反复猜解和实验,旨在以暴力手段登入、访问目标主机获取服务,破坏系统安全,其属于 ATT&CK技术中的一种,常利用…...

快速入门深度学习系列(2)----损失函数、逻辑回归、向量化
针对深度学习入门新手目标不明确 知识体系杂乱的问题 拟开启快速入门深度学习系列文章的创作 旨在帮助大家快速的入门深度学习 写在前面: 本系列按照吴恩达系列课程顺序发布(说明一下为什么不直接看原笔记 因为内容太多 没有大量时间去阅读 所有作者需要一次梳理…...

[超详细,推荐!!!]前端性能优化策略详解
学习记录,部分内容版权归妙码学院 1.优化内容包括那些 其实前端的优化,整体粗略概括下来,白话之: 打开速度怎么变快再次打开速度怎么变快操作怎么才顺滑动画怎么保证流畅 2.性能优化 2.1首屏加载优化 在了解优化方法和策略之…...

数据提取之BeautifulSoup4快速使用
文章目录 一、前言二、概述2.1 安装2.2 初始化2.3 对象类型 三、遍历文档树3.1 子节点3.2 父节点3.3 兄弟节点3.4 前后节点3.5 节点内容3.5.1 文本内容3.5.2 属性值3.5.3 标签删除 四、搜索文档树4.1 find_all4.2 find4.3 CSS选择器4.4 更多 一、前言 官方文档:http…...

list类的详细讲解
【本节目标】 1. list的介绍及使用 2. list的深度剖析及模拟实现 3. list与vector的对比 1. list的介绍及使用 1.1 list的介绍 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2. list 的底层是双向链表结构&a…...

Linux系统下安装mongodb
1. 配置MongoDB的yum仓库 创建仓库文件 sudo vi /etc/yum.repos.d/mongodb-org.repo添加仓库配置 根据系统版本选择配置(以下示例为CentOS 7和CentOS 9的配置): CentOS 7(安装MongoDB 5.0/4.2等旧版本): In…...

kuka, fanuc, abb机器人和移动相机的标定
基础知识 : 一, 9点标定之固定相机标定: 图1: 固定位置相机拍照 因为相机和机器人的基坐标系是固定的, 所以在海康威视相机的9点标定功能栏中, 填上海康使用“圆查找”捕捉到的坐标值, 再将机器人显示的工具坐标系在基坐标系的实时位置pos_act值填入物理坐标X, Y中即可 图2:…...

Android Framework学习四:init进程实现
文章目录 init流程简介init源码执行顺序执行顺序 init进程的具体工作事项挂载文件系统设置 SELinuxSecondStageMaininit.rc启动zygote和serviceManager进程的重要性serviceManager工作原理 Framework学习之系列文章 init流程简介 下面图片主要围绕 Android 系统中init进程的运…...
Linux计划任务与进程
at 命令使用方法 at 命令可在指定时间执行任务,适用于一次性任务调度。以下是基本用法: 安装 atd 服务(如未安装) # Debian/Ubuntu sudo apt-get install at# CentOS/RHEL sudo yum install at启动服务 sudo systemctl start atd…...

Java引用RabbitMQ快速入门
这里写目录 Java发送消息给MQ消费者接收消息实现一个队列绑定多个消费者消息推送限制 Fanout交换机路由的作用Direct交换机使用案例 Topic交换机声明队列和交换机的方式MQ消息转换器业务改造生产者可靠性设置重连 系统可靠性 Java发送消息给MQ public void testSendMessage() t…...

用R语言+随机森林玩转遥感空间预测-基于R语言机器学习遥感数据处理与模型空间预测技术及实际项目案例分析
遥感数据具有高维度、非线性及空间异质性等特点,传统分析方法往往难以充分挖掘其信息价值。机器学习技术的引入为遥感数据处理与模型预测提供了新的解决方案,其中随机森林(Random Forest)以其优异的性能和灵活性成为研究者的首选工…...
【许可证】Open Source Licenses
长期更新 扩展:shield.io装饰 开源许可证(Open Source Licenses)有很多种,每种都有不同的授权和限制,适用于不同目的。 默认的ISC🟰MIT License是否可商用是否要求开源衍生项目是否必须署名是否有专利授权…...

Spring Boot 文件上传实现详解
在项目开发过程中,文件上传是极为常见的功能需求。对于熟悉 Spring MVC 文件上传操作的开发者而言,Spring Boot 中的文件上传与之原理基本相通,只是在依赖管理和配置方式上更为简化。接下来,将详细阐述 Spring Boot 项目中文件上传…...

查看单元测试覆盖率
文章目录 1、POM文件配置2、编写单元测试3、执行单元测试4、查看单元测试覆盖率 1、POM文件配置 pom文件配置jacoco插件 <!-- 生成JaCoCo覆盖率数据插件 --> <plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artif…...

基于SpringBoot的在线教育管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
交叉编译 opencv-4.10
编译说明 opencv 下包含很多模块,各个模块的作用可以参考Opencv—模块概览. 嵌入式考虑有限存储等因素会对模块进行裁剪,我这里主要保留图像拼接(stitching)图片编解码(imgcodecs)与特征点匹配(…...

C# 方法(方法重载)
本章内容: 方法的结构 方法体内部的代码执行 局部变量 局部常量 控制流 方法调用 返回值 返回语句和void方法 局部函数 参数 值参数 引用参数 引用类型作为值参数和引用参数 输出参数 参数数组 参数类型总结 方法重载 命名参数 可选参数 栈帧 递归 方法重载 一个类中可以有多个…...

3、食品包装控制系统 - /自动化与控制组件/food-packaging-control
76个工业组件库示例汇总 食品包装线控制系统 这是一个用于食品包装线控制系统的自定义组件,提供了食品包装生产线的可视化监控与控制界面。组件采用工业风格设计,包含生产流程控制、实时数据监控和逻辑编程三个主要功能区域。 功能特点 工业风格UI设…...

初始图形学(7)
上一章完成了相机类的实现,对之前所学的内容进行了封装与整理,现在要学习新的内容。 抗锯齿 我们放大之前渲染的图片,往往会发现我们渲染的图像边缘有尖锐的"阶梯"性质。这种阶梯状被称为"锯齿"。当真实的相机拍照时&a…...
Linux NVIDIA 显卡驱动安装指南(适用于 RHEL/CentOS)
📌 一、禁用 Nouveau 开源驱动 NVIDIA 闭源驱动与开源的 nouveau 驱动冲突,需先禁用: if [ ! -f /etc/modprobe.d/blacklist-nouveau.conf ]; thenecho -e "blacklist nouveau\noptions nouveau modeset0" | sudo tee /etc/modpr…...

线程的一些事(2)
在java中,线程的终止,是一种“软性”操作,必须要对应的线程配合,才能把终止落实下去 然而,系统原生的api其实还提供了,强制终止线程的操作,无论线程执行到哪,都能强行把这个线程干掉…...
数据可视化:艺术与科学的交汇点,如何让数据“开口说话”?
数据可视化:艺术与科学的交汇点,如何让数据“开口说话”? 数据可视化,是科技与艺术的结合,是让冰冷的数字变得生动有趣的桥梁。它既是科学——讲究准确性、逻辑性、数据处理的严谨性;又是艺术——强调美感…...

使用lldb看看Rust的HashMap
目录 前言 正文 读取桶的状态 获取键值对 键值对的指针地址 此时,读取数据 读取索引4的键值对 多添加几个键值对 使用i32作为键,&str作为值 使用i32作为键,String作为值 前言 前面使用ldb看了看不同的类型,这篇再使用…...