本地部署大模型实现扫描版PDF文件OCR识别!

在使用大模型处理书籍 PDF 时,有时你会遇到扫描版 PDF,也就是说每一页其实是图像形式。这时,大模型需要先从图片中提取文本,而这就需要借助 OCR(光学字符识别)技术。

像 Gemini 2.5 这样的强大模型,具备非常强的从图片中提取文本的能力。实际上,我们完全可以利用它来执行 OCR 任务。

利用这样的大模型进行 OCR,不仅能处理复杂的图像场景,还能理解文本的结构,保留格式,并正确处理表格、标题等内容,为后续的文本分析、自动化处理和智能搜索提供强大的支持。这种结合 OCR 和 NLP 的智能文档处理方式,正在成为解决实际问题的强大工具。

然而,像 Gemini 这样的强大模型只能通过远程访问,且存在 API 受限和高成本的问题。那么,是否有可能在本地部署类似的大模型来完成这一任务呢?

虽然本地部署或直接安装已经有很多方案,后期文章中我们也将逐一比较。但我们更想自己手撸一个,想着将来大模型不断升级之中我们也能紧随其后直接升级是不。

一 多模态

首先,我们去 Hugging Face 找找具有这种本事的大模型。

图片

看到 Image-Text-to-Text 没有,它表示模型能够处理图像和文本输入,符合我们的任务要求。点击进去,首先看到的是一批新发布的模型,

图片

我们往后翻,找到下面这个 https://huggingface.co/Qwen/Qwen2.5-VL-3B-Instruct

图片

选这个模型的主要原因是想在笔记本上也能跑起来,所以参数量不能太多。先用我的 Macbook Air 试试本地大模型的 OCR 能力,然后再部署到显卡好一点的电脑上去干活。

代码放在 github 仓库:https://github.com/mathinml/pdf2md

二 项目任务

本项目的任务明确如下:实现一个本地部署的多模态大语言模型,如 Qwen2.5-VL,用于从 PDF 文件中提取文字内容并完成 OCR 任务,最好保留表格形式,并将其转换为 Markdown 文档。模型是可选的,只需调整参数即可切换到其他模型。尽管这个功能看似简单,但它为后续更复杂任务奠定了基础。

我们使用两款电脑来测试:Macbook Air M3 处理器,16G 内存;UbuntuV100 32G 显存。

三 用到的库

该项目主要涉及三部分,即 TransformersvLLM 以及具体的大模型如 QWen2.5-VL。这个模型是基于 Transformer 架构开发的多模态模型。具体通过 Hugging Face 的 Transformers 库来加载和使用它,并选择使用 vLLM 来优化 Qwen2.5-VL 模型的推理性能。考虑到后期可能会实际部署到高性能电脑上,因此选择 vLLM,而不是 Ollama

TransformersvLLM 以及 QWen2.5-VL 之间的关系如下图所示。

图片

这个关系图展示了三者之间的依赖和协作,具体如下,

  • Transformers 是基础框架:QWen2.5-VL 的代码和模型结构依赖于 Hugging Face Transformers 库。开发者和用户需要安装最新版本的 Transformers 来加载和运行 QWen2.5-VL

  • vLLM 是推理优化引擎:vLLM 增强了 QWen2.5-VL 的推理性能,尤其是在处理视觉和视频任务时。它通过张量并行、动态内存管理等技术,使 QWen2.5-VL 能够在生产环境中高效运行。vLLM 需要与 Transformers 配合使用,并确保版本兼容(例如,某些版本的 Transformers 可能需要从源代码安装)。

  • QWen2.5-VL 是应用模型:它是具体的多模态模型,利用 Transformers 提供的架构和 vLLM 的推理优化来实现其功能。换句话说,QWen2.5-VL 的设计目标是处理复杂的视觉语言任务,而 Transformers 和 vLLM 则是其技术支撑。

四 程序流程

程序流程以及几个主要 Python 文件之间的关系如下图所示。

图片

这个程序的主要功能是将 PDF 文件转换为 Markdown 格式,整个流程可以总结如下:

1、命令行参数解析:通过 cli.py 中的 parse_args 函数解析用户输入的命令行参数;主要参数包括:PDF 文件路径、模型路径、输出文件路径等。

2、初始化处理器:在 main.py 中初始化 PDFMarkdownProcessor 处理器;该处理器是整个转换过程的核心控制器。

3、PDF 处理阶段:加载指定的 PDF 文件;使用 PDFToImageConverter 将 PDF 文件转换为图像序列,图像分辨率默认为 1024 宽。

4、模型初始化:加载指定的视觉语言模型(如 Qwen2.5-VL-3B-Instruct);该模型需要提前下载到本地指定目录。

5、图像处理与转换:对每个 PDF 页面生成的图像进行处理;使用 ImageToMarkdownConverter 将图像内容转换为 Markdown 文本;这一步利用视觉语言模型识别图像中的文本、表格、图片等内容。

6、结果整合与输出:合并所有页面转换得到的 Markdown 内容;将最终的 Markdown 文本保存到指定的输出文件中。

整个流程体现了模块化设计思想,各个组件职责明确,便于维护和扩展。用户只需通过简单的命令行参数即可完成从 PDF 到 Markdown 的转换过程。

五 模型下载

可以通过命令 huggingface-cli download 来下载 Qwen2.5-VL,但如果 huggingface 不方便使用,可以选择用 modelscope

比如我们要使用的这个模型文件放在这里:https://modelscope.cn/models/Qwen/Qwen2.5-VL-3B-Instruct/files

先安装 modelscope

pip install modelscope

然后用以下命令,

modelscope download --model Qwen/Qwen2.5-VL-3B-Instruct --local_dir ../local_models/Qwen2.5-VL-3B-Instruct

将完整模型库文件下载到指定的本地目录 ../local_models/Qwen2.5-VL-3B-Instruct 中。

图片

 转化效果

对于 1024 分辨率的图像,在 Macbook Air 上转化一页需要六、七分钟,虽然有点久,但至少也能跑起来了,而在 V100 上只需要 10 秒+。

图片

如果页面较清晰,可以降低分辨率,那样自然会提高转化效率。另外,程序中有个参数 quantization=None 表明没有启用量化,保持了模型的完整精度。如果想进一步提高效率,可以使用量化版本,即 Qwen/Qwen2.5-VL-3B-Instruct-AWQ

六 转化效果

从 PDF 文件中提取的图像,

图片

转化为 Markdown 后,效果如下图所示。是不是文字、表格和数学公式都还保持的不错。

图片

代码:https://github.com/mathinml/pdf2md

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

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

相关文章

《Operating System Concepts》阅读笔记:p700-p732

《Operating System Concepts》学习第 60 天,p700-p732 总结,总计 33 页。 一、技术总结 1.Virtual machine manager (VMM) The computer function that manages the virtual machine; also called a hypervisor. VMM 也称为 hypervisor。 2.types …

软件项目验收报告模板

软件项目验收报告 一、项目基本信息 项目名称XX智能仓储管理系统开发单位XX科技有限公司验收单位XX物流集团合同签订日期2023年3月15日项目启动日期2023年4月1日验收日期2024年1月20日 二、验收范围 入库管理模块(包含RFID识别、库存预警)出库调度模…

深度学习笔记39_Pytorch文本分类入门

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境:Python 3.8 2.编译器:Pycharm 3.深度学习环境: torch1.12.1cu113torchvision…

二分查找-LeetCode

题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出: 4 解释: …

从 Ext 到 F2FS,Linux 文件系统与存储技术全面解析

与 Windows 和 macOS 操作系统不同,Linux 是由爱好者社区开发的大型开源项目。它的代码始终可供那些想要做出贡献的人使用,任何人都可以根据个人需求自由调整它,或在其基础上创建自己的发行版本。这就是为什么 Linux 存在如此多的变体&#x…

leetcode:3210. 找出加密后的字符串(python3解法)

难度:简单 给你一个字符串 s 和一个整数 k。请你使用以下算法加密字符串: 对于字符串 s 中的每个字符 c,用字符串中 c 后面的第 k 个字符替换 c(以循环方式)。 返回加密后的字符串。 示例 1: 输入&#xff…

JVM详解(曼波脑图版)

(✪ω✪)ノ 好哒!曼波会用最可爱的比喻给小白同学讲解JVM,准备好开启奇妙旅程了吗?(๑˃̵ᴗ˂̵)و 📌 思维导图 ━━━━━━━━━━━━━━━━━━━ 🍎 JVM是什么?(苹果式比…

ZStack文档DevOps平台建设实践

(一)前言 对于软件产品而言,文档是不可或缺的一环。文档能帮助用户快速了解并使用软件,包括不限于特性概览、用户手册、API手册、安装部署以及场景实践教程等。由于软件与文档紧密耦合,面对业务的瞬息万变以及软件的飞…

Git创建分支操作指南

1. 创建新分支但不切换&#xff08;仅创建&#xff09; git branch <分支名>示例&#xff1a;创建一个名为 new-feature 的分支git branch new-feature2. 创建分支并立即切换到该分支 git checkout -b <分支名> # 传统方式 # 或 git switch -c <分支名&g…

package.json 中的那些版本数字前面的符号是什么意思?

1. 语义化版本&#xff08;SemVer&#xff09; 语义化版本的格式是 MAJOR.MINOR.PATCH&#xff0c;其中&#xff1a; MAJOR&#xff1a;主版本号&#xff0c;表示不兼容的 API 修改。MINOR&#xff1a;次版本号&#xff0c;表示新增功能但保持向后兼容。PATCH&#xff1a;修订号…

如何有效防止服务器被攻击

首先&#xff0c;我们要明白服务器被攻击的危害有多大。据不完全统计&#xff0c;每年因服务器遭受攻击而导致的经济损失高达数十亿。这可不是一个小数目&#xff0c;就好比您辛苦积攒的财富&#xff0c;瞬间被人偷走了一大半。 要有效防止服务器被攻击&#xff0c;第一步就是…

Chainlit 快速构建Python LLM应用程序

背景 chainlit 是一款简单易用的Web UI goggle&#xff0c;它支持使用 Python 语言快速构建 LLM 应用程序&#xff0c;提供了丰富的功能&#xff0c;包括文本分析&#xff0c;情感分析等。 这里我们以官网openai提供的例子&#xff0c;快速的开发一个带有UI的聊天界面&#xf…

华为OD机试真题——硬件产品销售方案(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析&#xff1b; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式&#xff01; 2025华为OD真题目录全流程解析/备考攻略/经验分享 华为OD机试真题《硬件产品…

【数据结构_6】双向链表的实现

一、实现MyDLinkedList&#xff08;双向链表&#xff09; package LinkedList;public class MyDLinkedList {//首先我们要创建节点&#xff08;因为双向链表和单向链表的节点不一样&#xff01;&#xff01;&#xff09;static class Node{public String val;public Node prev…

做Data+AI的长期主义者,加速全球化战略布局

在Data与AI深度融合的新纪元&#xff0c;唯有秉持长期主义方能真正释放数智化的深层价值。2025年是人工智能从技术爆发转向规模化落地的关键节点&#xff0c;也是标志着袋鼠云即将迎来十周年的重要里程碑。2025年4月16日&#xff0c;袋鼠云成功举办了“做DataAI的长期主义者——…

构建基于PHP和MySQL的解梦系统:设计与实现

引言 梦境解析一直是人类心理学和文化研究的重要领域。随着互联网技术的发展,构建一个在线的解梦系统能够帮助更多人理解自己梦境的含义。本文将详细介绍如何使用PHP和MySQL构建一个功能完整的解梦系统,包括系统架构设计、数据库模型、核心功能实现以及优化策略。 本文源码下…

【桌面】【系统应用】Samba共享文件夹

目录 场景一&#xff1a;银河麒麟桌面与银河麒麟桌面之间共享文件夹 环境准备 实现目标 操作步骤 &#xff08;一&#xff09;配置主机A共享文件夹 1、环境准备 2、在主机A创建共享文件夹 3、设置共享文件密码 &#xff08;二&#xff09;主机B访问主机A 场景二&…

OpenCV 图形API(37)图像滤波-----分离过滤器函数sepFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 应用一个可分离的线性滤波器到一个矩阵&#xff08;图像&#xff09;。 该函数对矩阵应用一个可分离的线性滤波器。也就是说&#xff0c;首先&a…

webpack理解与使用

一、背景 webpack的最初目标是实现前端工程的模块化&#xff0c;旨在更高效的管理和维护项目中的每一个资源。 最早的时候&#xff0c;我们通过文件划分的方式实现模块化&#xff0c;也就是将每个功能及其相关状态数据都放在一个JS文件中&#xff0c;约定每个文件就是一个独立…

rac环境下,增加一个控制文件controlfile

先关闭节点二&#xff0c;在节点一上操作 1、查看控制文件个数和路径 SQL> show parameter control 2、备份参数文件 SQL> create pfile/home/oracle/orcl.pfile20250417 from spfile; 3、修改控制文件参数 SQL> alter system set contr…