用YOLO和LLM增强的OCR

news2025/4/5 16:21:29

虽然最近我花了很多时间在大型语言模型 (LLM) 上进行实验,但我对计算机视觉的热情始终未减。因此,当我有机会将两者融合在一起时,我迫不及待地想要立即开始。在 Goodreads 上扫描书籍封面并将其标记为已读一直感觉有点神奇,我很兴奋自己尝试一下。

将自定义训练的 YOLOv10 模型与 OCR 技术相结合可显著提高准确率,但真正的转变发生在集成 LLM(如 Llama 3.1)时——它将杂乱的 OCR 输出转换为可用于实际应用的精致文本。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

1、为什么需要 YOLO 、Ollama 和OCR?

传统的 OCR(光学字符识别)方法非常适合从简单图像中提取文本,但当文本与其他视觉元素交织在一起时,通常会遇到困难。通过首先使用自定义 YOLO 模型检测文本区域等对象,我们可以隔离这些区域以进行 OCR,从而显著减少噪音并提高准确率。

让我们通过在没有 YOLO 的图像上运行基本的 OCR 示例来证明这一点,以强调单独使用 OCR 的挑战:

import easyocr
import cv2
# Initialize EasyOCR
reader = easyocr.Reader(['en'])
# Load the image
image = cv2.imread('book.jpg')
# Run OCR directly
results = reader.readtext(image)
# Display results
for (bbox, text, prob) in results:
    print(f"Detected Text: {text} (Probability: {prob})")

输出结果如下:

THE 0 R |G |NAL B E STSELLE R THE SECRET HISTORY DONNA TARTT Haunting, compelling and brilliant The Times 

虽然这种方法适用于较简单的图像,但当存在噪声或复杂的视觉模式时,你会注意到错误会增加。这时 YOLO 模型可以发挥巨大作用。

2、使用自定义数据集训练 Yolov10

使用对象检测增强 OCR 的第一步是在数据集上训练自定义 YOLO 模型。

YOLO(You Only Look Once)是一种功能强大的实时对象检测模型,它将图像划分为网格,使其能够在一次前向传递中识别多个对象。这种方法非常适合检测图像中的文本,尤其是当你想要通过隔离特定区域来改善 OCR 结果时。

我们将使用此处链接的预标注书籍封面数据集,并在其上训练 YOLOv10 模型。YOLOv10 针对较小的物体进行了优化,使其非常适合在视频或扫描文档等具有挑战性的环境中检测文本。

from ultralytics import YOLO

model = YOLO("yolov10n.pt")
# Train the model
model.train(data="datasets/data.yaml", epochs=50, imgsz=640)

就我而言,在 Google Colab 上训练此模型大约需要 6 个小时,共 50 个 epoch。你可以调整 epoch 数量、数据集大小或超参数等参数来提高模型的性能和准确性。

2、在视频上运行自定义模型以获取边界框

YOLO 模型训练完成后,您可以将其应用于视频以检测文本区域周围的边界框。这些边界框隔离了感兴趣的区域,确保 OCR 过程更加清晰:

import cv2
# Open video file
video_path = 'books.mov'
cap = cv2.VideoCapture(video_path)
# Load YOLO model
model = YOLO('model.pt')
# Function for object detection and drawing bounding boxes
def predict_and_detect(model, frame, conf=0.5):
    results = model.predict(frame, conf=conf)
    for result in results:
        for box in result.boxes:
            # Draw bounding box
            x1, y1, x2, y2 = map(int, box.xyxy[0].tolist())
            cv2.rectangle(frame, (x1, y1), (x2, y2), (255, 0, 0), 2)
    return frame, results
# Process video frames
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    # Run object detection
    processed_frame, results = predict_and_detect(model, frame)
    # Show video with bounding boxes
    cv2.imshow('YOLO + OCR Detection', processed_frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# Release video
cap.release()
cv2.destroyAllWindows()

该代码实时处理视频,在检测到的文本周围绘制边界框,并为下一步 OCR 准备这些区域。

3、在边界框上运行 OCR

现在我们已经使用 YOLO 隔离了文本区域,我们可以在这些特定区域内应用 OCR,与在整个图像上运行 OCR 相比,这大大提高了准确性:

import easyocr
# Initialize EasyOCR
reader = easyocr.Reader(['en'])
# Function to crop frames and perform OCR
def run_ocr_on_boxes(frame, boxes):
    ocr_results = []
    for box in boxes:
        x1, y1, x2, y2 = map(int, box.xyxy[0].tolist())
        cropped_frame = frame[y1:y2, x1:x2]
        ocr_result = reader.readtext(cropped_frame)
        ocr_results.append(ocr_result)
    return ocr_results
# Perform OCR on detected bounding boxes
for result in results:
    ocr_results = run_ocr_on_boxes(frame, result.boxes)
    # Extract and display the text from OCR results
    extracted_text = [detection[1] for ocr in ocr_results for detection in ocr]
    print(f"Extracted Text: {', '.join(extracted_text)}")

输出结果如下:

'THE, SECRET, HISTORY, DONNA, TARTT'

结果明显改善,因为 OCR 引擎现在只处理明确标识为包含文本的区域,从而降低了因不相关图像元素而产生误解的风险。

4、使用 Ollama 改进文本

使用 easyocr 提取文本后,Ollama 的 Llama 3.1 可以进一步完善通常不完美且混乱的结果。OCR 功能强大,但它仍然可能误解文本或无序返回数据,尤其是书名或作者姓名。

Ollama 的 Llama 3.1 介入清理输出,从原始 OCR 结果中提供结构化、连贯的文本。通过向 Llama 3.1 提供识别和组织文本的具体说明,我们可以将不完美的 OCR 输出转换为格式整齐的书名和作者姓名。

import ollama
# Construct a prompt to clean up the OCR output
prompt = f"""
- Below is a text extracted from an OCR. The text contains mentions of famous books and their corresponding authors.
- Some words may be slightly misspelled or out of order.
- Your task is to identify the book titles and corresponding authors from the text.
- Output the text in the format: '<Name of the book> : <Name of the author>'.
- Do not generate any other text except the book title and the author.
TEXT:
{output_text}
"""
# Use Ollama to clean and structure the OCR output
response = ollama.chat(
    model="llama3",
    messages=[{"role": "user", "content": prompt}]
)
# Extract cleaned text
cleaned_text = response['message']['content'].strip()
print(cleaned_text)

输出结果如下:

The Secret History : Donna Tartt

一旦 Llama 3.1 清理了文本,经过润色的输出就可以存储在数据库中或用于各种实际应用,例如:

  • 数字图书馆或书店:自动对书名进行分类,并在作者旁边显示书名。
  • 档案系统:将扫描的书籍封面或文档转换为可搜索的数字记录。
  • 自动元数据生成:根据提取的信息为图像、PDF 或其他数字资产生成元数据。
  • 数据库输入:将清理后的文本直接插入数据库,确保大型系统的数据结构化和一致性。

通过结合对象检测、OCR 和 LLM,你可以解锁强大的管道,以实现更结构化的数据处理,非常适合需要高精度水平的应用程序。

5、结束语

通过将定制训练的 YOLOv10 模型与 EasyOCR 相结合并使用 Ollama 的 Llama 3.1 增强结果,你可以显著改善文本识别工作流程。无论是在检测复杂图像或视频中的文本、清理 OCR 结果还是使输出更易于使用,此管道都可以实现实时、高度准确的文本提取和细化。

完整的源代码和 Jupyter Notebook 可在 GitHub 存储库中找到。


原文链接:YOLO和LLM增强的OCR - BimAnt

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

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

相关文章

SSM外卖点餐软件APP-计算机毕业设计源码30768

目 录 摘要 1 绪论 1.1 研究背景 1.2研究目的 1.3论文结构与章节安排 2 外卖点餐软件APP系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能…

这些编程工具竟然能让我效率翻倍?开发者必备神器盘点!

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

基于深度学习多层感知机进行手机价格预测

数据集介绍 数据集采用了Kaggle实战数据集,链接如下,如有需要可自行下载 https://www.kaggle.com/datasets/atefehmirnaseri/cell-phone-price/data 数据集简要介绍 • battery_power&#xff1a;电池的总能量存储&#xff08;毫安时&#xff09; • blue&#xff1a;设备…

人工智能对未来工作影响的四种可能性

随着人工智能&#xff08;AI&#xff09;技术的迅速发展&#xff0c;其对人类工作的影响已成为讨论的热点话题。我们经常听到有关AI威胁论的观点&#xff0c;担心它将取代人类工作&#xff0c;但也有专家认为AI将成为一种辅助工具&#xff0c;帮助人类提升工作效率。宾夕法尼亚…

嵌入式硬件设计

嵌入式硬件设计是指针对嵌入式系统&#xff08;一种专用的计算机系统&#xff0c;通常嵌入到其他设备中&#xff09;进行的硬件设计工作。嵌入式系统广泛应用于消费电子、工业控制、医疗设备、汽车电子、航空航天等领域。以下是嵌入式硬件设计的主要内容和步骤&#xff1a; 1.…

括号匹配——(栈实现)

题目链接 有效的括号https://leetcode.cn/problems/valid-parentheses/description/ 题目要求 样例 解题代码 import java.util.*; class Solution {public boolean isValid(String str) {Stack<Character> stacknew Stack<>();for(int i0;i<str.length();i)…

传统流程图和N-S流程图的区别

传统流程图和N-S流程图在表示算法和逻辑结构时有不同的特点和用途。以下是它们的主要区别&#xff1a; ### 传统流程图 1. **符号多样**&#xff1a;传统流程图使用多种几何形状表示不同的操作类型&#xff0c;如椭圆表示开始和结束&#xff0c;平行四边形表示输入输出&#…

JumperServer入门

一、安装部署 官方安装文档&#xff1a;快速入门 - JumpServer 文档 机器准备 CentOS7 ip 角色 192.168.252.145 主节点 192.168.252.146 被控节点1 192.168.252.148 被控节点2 安装JumperServer curl -sSL https://resource.fit2cloud.com/jumpserver/jumpserver…

数据结构——七种排序(java)实现

文章目录 直接插入排序希尔排序选择排序冒泡排序快速排序归并排序计数排序 直接插入排序 思想&#xff1a; /*** 直接插入排序* 具有稳定性* 时间复杂度为&#xff1a;&#xff08;计算时间复杂度的时候应计算执行次数最多的语句类&#xff0c;在直接插入排序中次数最多的语句…

【AI大模型】深入Transformer架构:编码器部分的实现与解析(下)

目录 &#x1f354; 编码器介绍 &#x1f354; 前馈全连接层 2.1 前馈全连接层 2.2 前馈全连接层的代码分析 2.3 前馈全连接层总结 &#x1f354; 规范化层 3.1 规范化层的作用 3.2 规范化层的代码实现 3.3 规范化层总结 &#x1f354; 子层连接结构 4.1 子层连接结…

环境对于写作有何影响?

如果你是有灵性、热爱文学创作的人&#xff0c;多半就会喜欢安静的生活环境。因为你会感受到唯有在这样的环境里更才能够沉下心来思考创作的路径。而且此时的你&#xff0c;显得头脑清醒、思维活跃而自由&#xff0c;因之文思泉涌。 网络图&#xff1a;宁静的书房 反之&#x…

快递物流跟踪:掌握最后更新时间,高效筛选单号管理

在现代社会&#xff0c;快递物流已成为人们日常生活中不可或缺的一部分&#xff0c;无论是网购商品还是寄送文件&#xff0c;都离不开快递服务。然而&#xff0c;随着快递单量的不断增加&#xff0c;如何有效跟踪快递物流信息&#xff0c;特别是掌握最后更新时间&#xff0c;并…

SSM湘农乐市农产品交易平台-计算机毕业设计源码28246

目 录 SSM湘农乐市农产品交易平台 1 绪论 1.1研究背景 1.2研究意义 1.3研究方法 1.4论文结构与章节安排 2 湘农乐市农产品交易平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.3 系统功能分析 2.4 系统用例分析 2.5本章小结 3 湘农乐市农产品交易平…

通信工程学习:什么是RIP路由信息协议

RIP&#xff1a;路由信息协议 RIP&#xff08;Routing Information Protocol&#xff09;路由信息协议是一种基于距离矢量算法的内部网关协议&#xff08;IGP&#xff09;&#xff0c;主要用于在自治系统&#xff08;AS&#xff09;内部进行路由信息的交换和传播。以下是关于RI…

第6篇:三大渗透测试框架权限维持技术

0x00 前言 在渗透测试中&#xff0c;有三个非常经典的渗透测试框架----Metasploit、Empire、Cobalt Strike。 那么&#xff0c;通过漏洞获取到目标主机权限后&#xff0c;如何利用框架获得持久性权限呢&#xff1f; 0x01 MSF权限维持 使用MSF维持权限的前提是先获得一个met…

SpringBoot驱动的明星周边产品电商解决方案

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

透过现象看本质,《Final Glory》缘何能成为现象级链游?

近期&#xff0c;《黑神话&#xff1a;悟空》的爆火不仅让 AAA 游戏重回焦点&#xff0c;也引发了玩家与开发者的热议。Web2 游戏的持续成功导致部分 Web3 玩家们的倒戈&#xff0c;对比之下 Web3 游戏存在生命周期短且商业模式难以明确的问题&#xff0c;尤其在当前加密市场环…

SSM社区慢性病管理系统—计算机毕业设计源码37572

摘 要 社区慢性病管理是社区卫生服务的主要内容&#xff0c;发展社区卫生服务是提供基本卫生服务、满足人民群众日益增长的卫生服务需求&#xff0c;也是提高人民健康水平的重要保障。为迎接慢性病防治的挑战我国进行了社区卫生服务改革&#xff0c;但由于社区卫生存在的诸多问…

✨ComfyUI workflow加密工具节点ComfyUI_CryptoCat

✨背景 玩comfyui的朋友都了解&#xff0c;工作流workflow是一种很重要的资产&#xff0c;可以通过workflow把一系列的处理工作组织起来&#xff0c;提升工作效率&#xff0c;甚至分享生成的图片就可以还原整个的工作流&#xff0c;对于分享传播是个好事情&#xff0c;但是对于…

C语言实践: 使用哨兵找出数组中的最大元素

开篇 本题来源于《编程珠玑》第9章【代码调优】课后习题8。旨在实现一段使用哨兵找出数组中最大元素的逻辑代码。 题目描述 如何在程序中使用哨兵来找出数组中的最大元素? 思路分析 这个问题相对来说比较简单&#xff0c;以初始值作为哨兵&#xff0c;和后续的值进行比较及处理…