使用Yolov10和Ollama增强OCR

ops/2024/10/21 1:16:21/

1. 训练自定义 Yolov10 数据集

利用物体检测增强 OCR 的第一步是在数据集上训练自定义 YOLO 模型。YOLO(只看一遍)是一种功能强大的实时对象检测模型,它将图像划分为网格,使其能够在一次前向传递中识别多个对象。这种方法非常适合检测图像中的文本,尤其是当你想通过隔离特定区域来改善 OCR 结果时。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 个历元。你可以调整epochs次数和数据集大小等参数,或者尝试使用超参数来提高模型的性能和准确性。

8

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 boxx1, 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 detectionprocessed_frame, results = predict_and_detect(model, frame)# Show video with bounding boxescv2.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 resultsextracted_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 提取文本后,Llama 3 可以进一步完善往往不完美和杂乱无章的结果。OCR 功能强大,但仍有可能误读文本或返回不符合顺序的数据,尤其是书名或作者姓名。

LLM 可以对输出结果进行整理,将原始 OCR 结果转化为结构化、连贯的文本。通过用特定的提示引导 Llama 3 识别和组织内容,我们可以将不完美的 OCR 数据细化为格式整齐的书名和作者姓名。你可以使用 Ollama 在本地运行它!

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

这是正确的!一旦 LLM 对文本进行了清理,经过润色的输出结果就可以存储到数据库中,或在各种实际应用中发挥作用,例如:

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

通过将对象检测、OCR 和 LLM 相结合,你就可以为更多结构化数据处理开启一个强大的管道,非常适合需要高精度的应用。

结论

通过将自定义训练的 YOLOv10 模型与 EasyOCR 相结合,并使用 LLM 增强结果,你可以大大改进文本识别工作流程。无论你是要处理棘手图像或视频中的文本,还是要清理 OCR 混乱,或者是要使一切都变得更加完美,这个管道都能为你提供实时、精确的文本提取和完善。

 


http://www.ppmy.cn/ops/127136.html

相关文章

jvm虚拟机调优实战

使用命令 jps查看进程使用jstat gc -1 5000查看内存占用和回收情况 正式测试 是否跑job区别。大量的job,部分用户点击的热数据 &#xff0c;不同时刻在跑 600-700对比 200 多了400-500m,代码原数据&#xff08;不占用堆区&#xff09;占了300m,所以 堆空间老年代&#xff08;90…

Python 多线程学习与使用

Python 多线程学习与使用 目录 引言&#xff1a;为什么需要多线程&#xff1f;Python中的线程基础 2.1 什么是线程&#xff1f; 2.2 Python的threading模块 2.3 创建和启动线程线程同步与互斥 3.1 竞态条件 3.2 锁&#xff08;Lock&#xff09; 3.3 可重入锁&#xff08;RLoc…

Canmv k230 C++案例1.2——image classify项目 C++代码分析(待完成)

这部分为初学&#xff0c;所以手头最好有本工具书便于查阅 01 代码初步注释 // 这里是一些定义配置 // 时间的标准库 #include <chrono> // 写入或读取文件的标准库 #include <fstream> // 文件输入输出的标准库&#xff0c;流模型 #include <iostream> //…

在Flask中记录用户端的完整访问记录,包括请求和响应信息以及用户访问IP

在Flask中记录用户端的完整访问记录&#xff0c;包括请求和响应信息以及用户访问IP&#xff0c;可以通过自定义中间件&#xff08;或称为请求预处理和后处理函数&#xff09;来实现。Flask本身提供了装饰器和信号机制来帮助我们实现这一功能。 以下是一个基本的实现步骤&#…

搭建LeNet-5神经网络,并搭建自己的图像分类训练和测试的模板,模板通用!!!均有详细注释。

本文任务&#xff1a; 1、构建LeNet神经网络。 2、搭建图像分类训练和测试的通用模板。 3、训练出自己的模型。 4、验证模型效果。 LeNet论文地址&#xff1a;原文地址http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks…

爬虫逆向学习(十二):一个案例入门补环境

此分享只用于学习用途&#xff0c;不作商业用途&#xff0c;若有冒犯&#xff0c;请联系处理 反爬前置信息 站点&#xff1a;aHR0cDovLzEyMC4yMTEuMTExLjIwNjo4MDkwL3hqendkdC94anp3ZHQvcGFnZXMvaW5mby9wb2xpY3k 接口&#xff1a;/xjzwdt/rest/xmzInfoDeliveryRest/getInfoDe…

git clone 鉴权失败

git clone 鉴权失败问题 1. 问题描述2. 解决方法 1. 问题描述 使用git clone自己的代码报如下错误&#xff1a; 正克隆到 xxx... Username for https://github.com: Password for https://xxxgithub.com: remote: Support for password authentication was removed on Augu…

【Flutter】页面布局:线性布局(Row 和 Column)

在 Flutter 中&#xff0c;布局&#xff08;Layout&#xff09;是应用开发的核心之一。通过布局组件&#xff0c;开发者可以定义应用中的控件如何在屏幕上排列。Row 和 Column 是 Flutter 中最常用的两种线性布局方式&#xff0c;用于水平和垂直排列子组件。在本教程中&#xf…