基于EasyOCR实现条码字符识别

2024-11-22 08:45   重庆  
点击下方卡片,关注“机器视觉与AI深度学习

视觉/图像重磅干货,第一时间送达!

    EasyOCR是一个Python 软件包,用于从照片或扫描文档等图像中检测和提取文本。它带有预先训练的模型,旨在快速高效地进行文本识别,并支持 80 多种语言。
    在本文中,我们将探讨如何使用 EasyOCR 包从图像中检测和提取文本。让我们开始吧!
EasyOCR 如何工作
    EasyOCR 内部的文本识别过程主要包括三个步骤:特征提取、序列标记和解码。
    ResNet和VGG(视觉几何组)等 eep 学习模型从图像中提取关键特征,LSTM(长短期记忆)网络处理序列上下文,CTC(联结时间分类)算法将这些标记序列转换为可读文本。
如何使用 EasyOCR 从图像中提取文本
    现在我们已经了解了什么是 EasyOCR 以及它的一些用例,接下来,我们将探索一个编码示例,展示如何使用 EasyOCR 从图像中提取文本。
    步骤#1:安装
    首先,安装所有必需的库。我们将使用“pip”包安装程序安装 PyTorch 库(核心依赖项)和 EasyOCR 库。打开命令提示符或终端并运行以下命令开始安装。
pip install torch torchvision torchaudio easyocr
    步骤2:初始化阅读器
    安装依赖项后,我们可以导入 EasyOCR 包并初始化其“阅读器”功能。我们还可以选择要检测和提取的语言。有超过 80 种语言可供选择。在这个例子中,我们选择英语为“en”。 
import easyocrreader = easyocr.Reader(['en'])
    在“reader”函数中,我们还可以管理系统规格设置,例如启用或禁用 GPU 或选择自定义目录来存储 EasyOCR 模型。对于 EasyOCR 库,建议使用 GPU 来加快处理速度,但也可以禁用它以在 CPU 上工作。要禁用 GPU 设置(默认情况下设置为“True”):
reader = easyocr.Reader(['en'],gpu=False)
    选择自定义目录来存储模型:
reader = easyocr.Reader(['en'],model_storage_directory='path/to/directory')
    步骤3:在图像上运行EasyOCR
    一旦初始化了阅读器函数,模型就会自动下载(如果选择,则下载到自定义目录)。接下来,我们可以初始化“readtext”函数并将输入图像的路径传递给它。 
    在此示例中,我们将使用包含产品序列号和零件号的图像作为输入。您也可以使用同一图像或任何其他相关图像。
    当我们打印出结果时,它将包括图像内检测到的文本的边界框坐标、检测到的文本和置信度分数。 
    以下是我们输入图像返回的输出:
[([[28, 22], [353, 22], [353, 72], [28, 72]], 'SERIAL NUMBER', 0.8874381662616708), ([[35, 75], [397, 75], [397, 137], [35, 137]], 'AOC1715821', 0.8521895819573561), ([[39, 255], [315, 255], [315, 299], [39, 299]], 'PART NUMBER', 0.9971079202290591), ([[42, 298], [370, 298], [370, 354], [42, 354]], '9-00864-01', 0.8142346378327698)]
    首先显示边界框坐标,然后是提取的文本,最后是置信度分数。但理想情况下,我们不需要所有这些数据;我们只需要提取的文本。EasyOCR 允许轻松自定义输出选项。接下来,我们将重点介绍自定义和可视化输出。
    步骤#4:配置输出格式
    EasyOCR 库提供了许多不同的输出自定义选项。我们可以通过在“readtext”函数中将“detail”参数设置为零来避免检索边界框坐标和置信度分数,如下所示。
import easyocrreader = easyocr.Reader(['en'])result = reader.readtext('/path/of/image',detail=0) print(result)
    对于我们的输入图像,这将是打印的结果。如您所见,我们仅过滤掉了检测到的文本。 
['SERIAL NUMBER', 'AOC1715821', 'PART NUMBER', '9-00864-01']
    我们还可以通过设置“paragraph”为true来将文本分组,如下所示。 
result = reader.readtext('/path/of/image',detail=0, paragraph=True) print(result)
    这将是我们输入图像的打印结果。提取的文本现在被分组在一起。
['SERIAL NUMBER AOC1715821', 'PART NUMBER 9-00864-01']
    以下是逐行打印结果的代码片段示例:
import easyocrreader = easyocr.Reader(['en'])result = reader.readtext('/path/of/image')for res in result:  coord=res[0]  text=res[1]  conf=res[2]  print(text)
    这就是我们输入图像的打印结果。提取的文本按照文档中出现的顺序逐行打印出来。
SERIAL NUMBERAOC1715821PART NUMBER9-00864-01
    如果不是打印变量“text”,而是打印变量“coord”和“conf”,我们将获得带有边界框坐标和置信度分数的类似输出。
    步骤#5:可视化结果
    我们还可以可视化 EasyOCR 模块的预测结果,将其叠加在输入图像之上。使用Supervision Python 包可以轻松完成此操作。Supervision 提供了一系列可重复使用的计算机视觉工具,可用于注释各种计算机视觉模型生成的预测结果等任务。
    为了使用该库,我们需要安装 Supervision Python 包,如下所示:
pip install supervision
    安装模块后,此代码使用 EasyOCR 检测图像中的文本并使用边界框和标签对其进行注释。它会初始化英语版 EasyOCR 阅读器,处理图像以提取文本、边界框坐标和置信度分数,并将数据存储在列表中。
    然后使用 Supervision 的注释器在图像上叠加边界框和文本。最后,注释后的图像会显示并保存为“Output.jpg”,从而为 OCR 和视觉注释提供完整的工作流程。
import easyocrimport supervision as svimport cv2import numpy as npfrom google.colab.patches import cv2_imshow
# Image pathImage_path = '/path/to/image'
# Initialize EasyOCR reader (English language, CPU)reader = easyocr.Reader(['en'], gpu=False, model_storage_directory='/path/to/directory')
# Perform text detection on the imageresult = reader.readtext(Image_path)
# Load image using OpenCVimage = cv2.imread(Image_path)
# Prepare lists for bounding boxes, confidences, class IDs, and labelsxyxy, confidences, class_ids, label = [], [], [], []
# Extract data from OCR resultfor detection in result: bbox, text, confidence = detection[0], detection[1], detection[2]
# Convert bounding box format x_min = int(min([point[0] for point in bbox])) y_min = int(min([point[1] for point in bbox])) x_max = int(max([point[0] for point in bbox])) y_max = int(max([point[1] for point in bbox]))
# Append data to lists xyxy.append([x_min, y_min, x_max, y_max]) label.append(text) confidences.append(confidence) class_ids.append(0)
# Convert to NumPy arraysdetections = sv.Detections( xyxy=np.array(xyxy), confidence=np.array(confidences), class_id=np.array(class_ids))
# Annotate image with bounding boxes and labelsbox_annotator = sv.BoxAnnotator()label_annotator = sv.LabelAnnotator()
annotated_image = box_annotator.annotate(scene=image, detections=detections)annotated_image = label_annotator.annotate(scene=annotated_image, detections=detections, labels=label)
# Display and save the annotated imagesv.plot_image(image=annotated_image)cv2.imwrite("Output.jpg", annotated_image)
    输出图像如下所示:
    以下是使用不同输入图像获得的另一个示例输出图像:

OCR 挑战和注意事项
    使用 EasyOCR 等 OCR 工具检测和提取图像中的文本并不总是那么容易。为了获得最佳结果,必须考虑几个关键因素。图像的质量至关重要,它需要清晰、光线充足且分辨率高。高质量的图像有助于 OCR 模型准确检测和识别字符,而质量差的图像则会导致误解。 
    可以使用锐化、降噪、对比度调整和图像规范化等图像预处理技术来增强图像质量。EasyOCR 的另一个需要考虑的因素是语言选择。该库支持 80 多种语言。正确指定输入图像中使用的语言至关重要。
    您还可以考虑使用批处理和微调来提高效率。批处理允许您一次处理多个图像,在处理大量文档时节省时间和资源。EasyOCR 的微调选项可用于根据您的特定需求自定义引擎的工作方式。调整设置还可以针对您正在处理的内容类型优化模型,从而提高准确性和性能。

—THE END—

觉得有用,麻烦给个赞和在看 

机器视觉与AI深度学习
专注于机器视觉、AI、深度学习等技术最新资讯、实战内容及应用案例的分享,交流!
 最新文章