百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

用YOLO和LLM增强OCR(yolov4数据增强)

ztj100 2024-10-30 05:12 24 浏览 0 评论

虽然最近我花了很多时间在大型语言模型 (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

相关推荐

Vue 技术栈(全家桶)(vue technology)

Vue技术栈(全家桶)尚硅谷前端研究院第1章:Vue核心Vue简介官网英文官网:https://vuejs.org/中文官网:https://cn.vuejs.org/...

vue 基础- nextTick 的使用场景(vue的nexttick这个方法有什么用)

前言《vue基础》系列是再次回炉vue记的笔记,除了官网那部分知识点外,还会加入自己的一些理解。(里面会有部分和官网相同的文案,有经验的同学择感兴趣的阅读)在开发时,是不是遇到过这样的场景,响应...

vue3 组件初始化流程(vue组件初始化顺序)

学习完成响应式系统后,咋们来看看vue3组件的初始化流程既然是看vue组件的初始化流程,咋们先来创建基本的代码,跑跑流程(在app.vue中写入以下内容,来跑流程)...

vue3优雅的设置element-plus的table自动滚动到底部

场景我是需要在table最后添加一行数据,然后把滚动条滚动到最后。查网上的解决方案都是读取html结构,暴力的去获取,虽能解决问题,但是不喜欢这种打补丁的解决方案,我想着官方应该有相关的定义,于是就去...

Vue3为什么推荐使用ref而不是reactive

为什么推荐使用ref而不是reactivereactive本身具有很大局限性导致使用过程需要额外注意,如果忽视这些问题将对开发造成不小的麻烦;ref更像是vue2时代optionapi的data的替...

9、echarts 在 vue 中怎么引用?(必会)

首先我们初始化一个vue项目,执行vueinitwebpackechart,接着我们进入初始化的项目下。安装echarts,npminstallecharts-S//或...

无所不能,将 Vue 渲染到嵌入式液晶屏

该文章转载自公众号@前端时刻,https://mp.weixin.qq.com/s/WDHW36zhfNFVFVv4jO2vrA前言...

vue-element-admin 增删改查(五)(vue-element-admin怎么用)

此篇幅比较长,涉及到的小知识点也比较多,一定要耐心看完,记住学东西没有耐心可不行!!!一、添加和修改注:添加和编辑用到了同一个组件,也就是此篇文章你能学会如何封装组件及引用组件;第二能学会async和...

最全的 Vue 面试题+详解答案(vue面试题知识点大全)

前言本文整理了...

基于 vue3.0 桌面端朋友圈/登录验证+60s倒计时

今天给大家分享的是Vue3聊天实例中的朋友圈的实现及登录验证和倒计时操作。先上效果图这个是最新开发的vue3.x网页端聊天项目中的朋友圈模块。用到了ElementPlus...

不来看看这些 VUE 的生命周期钩子函数?| 原力计划

作者|huangfuyk责编|王晓曼出品|CSDN博客VUE的生命周期钩子函数:就是指在一个组件从创建到销毁的过程自动执行的函数,包含组件的变化。可以分为:创建、挂载、更新、销毁四个模块...

Vue3.5正式上线,父传子props用法更丝滑简洁

前言Vue3.5在2024-09-03正式上线,目前在Vue官网显最新版本已经是Vue3.5,其中主要包含了几个小改动,我留意到日常最常用的改动就是props了,肯定是用Vue3的人必用的,所以针对性...

Vue 3 生命周期完整指南(vue生命周期及使用)

Vue2和Vue3中的生命周期钩子的工作方式非常相似,我们仍然可以访问相同的钩子,也希望将它们能用于相同的场景。...

救命!这 10 个 Vue3 技巧藏太深了!性能翻倍 + 摸鱼神器全揭秘

前端打工人集合!是不是经常遇到这些崩溃瞬间:Vue3项目越写越卡,组件通信像走迷宫,复杂逻辑写得脑壳疼?别慌!作为在一线摸爬滚打多年的老前端,今天直接甩出10个超实用的Vue3实战技巧,手把...

怎么在 vue 中使用 form 清除校验状态?

在Vue中使用表单验证时,经常需要清除表单的校验状态。下面我将介绍一些方法来清除表单的校验状态。1.使用this.$refs...

取消回复欢迎 发表评论: