当前位置: 首页 > article >正文

LLMs之OCR:llm_aided_ocr(基于LLM辅助的OCR项目)的简介、安装和使用方法、案例应用之详细攻略

LLMs之OCR:llm_aided_ocr(基于LLM辅助的OCR项目)的简介、安装和使用方法、案例应用之详细攻略

目录

llm_aided_ocr的简介

1、特性

2、详细技术概览

PDF处理和OCR

PDF到图像转换

OCR处理

文本处理流程

分块创建

错误校正与格式化

重复内容移除

标题和页码抑制(可选)

LLM集成

灵活的LLM支持

本地LLM处理

基于API的LLM处理

异步处理

令牌管理

令牌估计

动态令牌调整

质量评估

日志记录与错误处理

3、配置与定制

4、输出与文件处理

llm_aided_ocr的安装和使用方法

1、安装

环境需求

安装

安装Pyenv和Python 3.12(如果需要):

设置项目:

安装Tesseract OCR引擎(如果尚未安装):

在.env文件中设置您的环境变量:

2、使用

3、工作原理

4、代码优化

5、配置

6、输出文件

7、限制与未来改进

llm_aided_ocr的案例应用

1、示例输出


llm_aided_ocr的简介

2024年8月,LLM辅助OCR项目是一个先进的系统,旨在显著提高光学字符识别(OCR)输出的质量。通过利用尖端的自然语言处理技术和大型语言模型(LLMs),该项目将原始OCR文本转换为高度准确、格式良好且可读性强的文档。

GitHub地址:GitHub - Dicklesworthstone/llm_aided_ocr: Enhance Tesseract OCR output for scanned PDFs by applying Large Language Model (LLM) corrections.

1、特性

>> PDF到图像的转换

>> 使用Tesseract进行OCR

>> 使用LLM(本地或基于API)进行高级错误校正

>> 智能文本分块以提高处理效率

>> 可选的Markdown格式化选项

>> 标题和页码抑制(可选)

>> 最终输出的质量评估

>> 支持本地LLM和基于云的API提供商(OpenAI, Anthropic)

>> 异步处理以提高性能

>> 详细的日志记录用于过程跟踪和调试

>> GPU加速本地LLM推理

2、详细技术概览

PDF处理和OCR

PDF到图像转换

功能:convert_pdf_to_images()

使用pdf2image库将PDF页面转换为图像

支持使用max_pages和skip_first_n_pages参数处理页面子集

OCR处理

功能:ocr_image()

利用pytesseract进行文本提取

包含预处理图像的preprocess_image()函数:

将图像转换为灰度

使用Otsu方法应用二值阈值

执行膨胀以增强文本清晰度

文本处理流程

分块创建

process_document()函数将全文拆分为可管理的块

使用句子边界进行自然分割

实现块之间的重叠以保持上下文

错误校正与格式化

核心功能:process_chunk()

两步骤过程:a. OCR校正:

使用LLM修复由OCR引起的错误

维护原始结构和内容 b. Markdown格式化(可选):

将文本转换为适当的Markdown格式

处理标题、列表、强调等

重复内容移除

在Markdown格式化步骤中实现

识别并移除完全相同或近乎相同的重复段落

保留独特内容并确保文本流畅

标题和页码抑制(可选)

可配置以移除或以不同格式显示标题、页脚和页码

LLM集成

灵活的LLM支持

支持本地LLM和基于云的API提供商(OpenAI, Anthropic)

通过环境变量配置

本地LLM处理

功能:generate_completion_from_local_llm()

使用llama_cpp库进行本地LLM推理

支持自定义语法以获得结构化输出

基于API的LLM处理

功能:generate_completion_from_claude() 和 generate_completion_from_openai()

实现了适当的错误处理和重试逻辑

管理令牌限制并动态调整请求大小

异步处理

使用asyncio并发处理基于API的LLM时的块

保持处理块的顺序以保证最终输出的一致性

令牌管理

令牌估计

功能:estimate_tokens()

在可用时使用特定于模型的分词器

回退到approximate_tokens()进行快速估计

动态令牌调整

根据提示长度和模型限制调整max_tokens参数

实现TOKEN_BUFFER和TOKEN_CUSHION以安全地管理令牌

质量评估

输出质量评估

功能:assess_output_quality()

比较原始OCR文本与处理后的输出

使用LLM提供质量评分和解释

日志记录与错误处理

代码库中的全面日志记录

详细的错误消息和堆栈跟踪用于调试

抑制HTTP请求日志以减少噪音

3、配置与定制

项目使用.env文件进行轻松配置。关键设置包括:

LLM选择(本地或基于API)

API提供商选择

不同提供商的模型选择

令牌限制和缓冲区大小

Markdown格式化选项

4、输出与文件处理

原始OCR输出:保存为{base_name}__raw_ocr_output.txt

LLM校正后的输出:保存为{base_name}_llm_corrected.md 或 .txt

脚本生成整个过程的详细日志,包括时间信息和质量评估。

llm_aided_ocr的安装和使用方法

1、安装

环境需求

Python 3.12+

Tesseract OCR引擎

PDF2Image库

PyTesseract

OpenAI API(可选)

Anthropic API(可选)

本地LLM支持(可选,需要兼容的GGUF模型)

安装

安装Pyenv和Python 3.12(如果需要):

如果需要安装Pyenv和python 3.12,并使用它来创建虚拟环境

设置项目:

使用pyenv创建虚拟环境:

安装Tesseract OCR引擎(如果尚未安装):

对于Ubuntu: sudo apt-get install tesseract-ocr

对于macOS: brew install tesseract

对于Windows: 从GitHub下载并安装

在.env文件中设置您的环境变量:

2、使用

将您的PDF文件放置在项目目录中。

更新main()函数中的input_pdf_file_path变量,使用您的PDF文件名。

运行脚本:

python llm_aided_ocr.py

脚本将生成多个输出文件,包括最终后处理的文本。

3、工作原理

LLM辅助OCR项目采用多步骤过程将原始OCR输出转换为高质量、易读的文本:

PDF转换:使用pdf2image将输入PDF转换为图像。

OCR:应用Tesseract OCR从图像中提取文本。

文本分块:将原始OCR输出拆分为可管理的块以便处理。

错误校正:每个块都经过LLM处理,以纠正OCR错误并提高可读性。

Markdown格式化(可选):将校正后的文本重新格式化为干净一致的Markdown。

质量评估:基于LLM的评估比较最终输出质量与原始OCR文本。

4、代码优化

并发处理:当使用基于API的模型时,块被并发处理以提高速度。

上下文保留:每个块都包含与前一个块的小部分重叠以维持上下文。

自适应令牌管理:系统根据输入大小和模型约束动态调整LLM请求使用的令牌数量。

5、配置

项目使用.env文件进行配置。关键设置包括:

USE_LOCAL_LLM:设为True以使用本地LLM,False则使用基于API的LLM。

API_PROVIDER:在“OPENAI”或“CLAUDE”之间选择。

OPENAI_API_KEY, ANTHROPIC_API_KEY:各自服务的API密钥。

CLAUDE_MODEL_STRING, OPENAI_COMPLETION_MODEL:指定每个提供商使用的模型。

LOCAL_LLM_CONTEXT_SIZE_IN_TOKENS:设置本地LLM的上下文大小。

6、输出文件

脚本生成多个输出文件:

{base_name}__raw_ocr_output.txt:来自Tesseract的原始OCR输出。

{base_name}_llm_corrected.md:最终LLM校正并格式化的文本。

7、限制与未来改进

系统性能严重依赖所使用的LLM的质量。

处理非常大的文档可能耗时较长,可能需要大量的计算资源。

llm_aided_ocr的案例应用

1、示例输出

要查看LLM辅助OCR项目可以做什么,请参阅这些示例输出:

  • Original PDF
  • Raw OCR Output
  • LLM-Corrected Markdown Output


http://www.kler.cn/news/315920.html

相关文章:

  • Python之一些列表的练习题
  • Spring Boot入门:构建你的首个Spring Boot应用
  • Mybatis-plus进阶篇(二)
  • 【JUC并发编程系列】深入理解Java并发机制:线程局部变量的奥秘与最佳实践(五、ThreadLocal原理、对象之间的引用)
  • 数据结构 ——— 常见的时间复杂度计算例题(最终篇)
  • Linux驱动开发 ——架构体系
  • 求最大公约数
  • CSS 布局三大样式简单学习
  • 【解密 Kotlin 扩展函数】命名参数和默认值(十三)
  • 【深入Java枚举类:不仅仅是常量的容器】
  • 数据结构——串的模式匹配算法(BF算法和KMP算法)
  • 设计模式-装饰者模式
  • VMware虚拟机经常性卡死,打开运行一段时间后卡死,CPU占比增至100%
  • 电脑网络怎么弄动态ip :步骤详解与优势探讨
  • Tomcat系列漏洞复现
  • AI时代最好的编程语言应该选择谁?
  • vue h5 蓝牙连接 webBluetooth API
  • MySQL 中删除重复的数据并只保留一条
  • C#实现指南:将文件夹与exe合并为一个exe
  • vscode 环境搭建
  • 神经网络修剪实战
  • ubuntu安装docker compose
  • 解决 TortoiseGitPlink Fatal Error:深入解析
  • JS巧用.padStart()|.padEnd()方法用另一个字符串填充当前字符串
  • 9月16日笔记
  • 工作笔记:Vue 3 中使用 vue-router 进行导航与监听路由变化
  • 关于 Qt运行加载内存较大崩溃添加扩大运行内存 的解决方法
  • 使用Stream实现事件流
  • Django一分钟:借助Django的认证系统快速实现RBAC权限校验以及Session会话
  • 深入浅出:Eclipse 中配置 Maven 与 Spark 应用开发全指南