使用 Python 和 LabelMe 实现图片验证码的自动标注功能

 更新时间:2024年12月31日 15:30:10   作者:XMYX-0  
文章介绍了如何使用Python和LabelMe自动标注图片验证码,主要步骤包括图像预处理、OCR识别和生成标注文件,通过结合PaddleOCR,可以快速实现验证码字符的自动标注,大幅提升工作效率,感兴趣的朋友一起看看吧

使用 Python 和 LabelMe 实现图片验证码的自动标注

在处理图片验证码时,手动标注是一项耗时且枯燥的工作。本文将介绍如何使用 Python 和 LabelMe 实现图片验证码的自动标注。通过结合 PaddleOCR 实现自动识别,再生成 LabelMe 格式的标注文件,大幅提升工作效率。

环境准备

必备工具

  • Python 3.7+
  • PaddleOCR(支持文字识别)
  • OpenCV(图像处理)
  • LabelMe(标注工具)

安装依赖

使用以下命令安装所需库:

pip install paddleocr labelme opencv-python

实现自动标注

自动标注分为以下几个步骤:

  • 加载图片:读取图片文件,确保格式正确。
  • 图像预处理:对验证码图片进行灰度化和二值化处理,优化识别效果。
  • OCR 识别:使用 PaddleOCR 获取验证码中的文字和位置。
  • 生成标注文件:根据 OCR 结果创建符合 LabelMe 格式的 JSON 文件。

核心代码实现

以下是完整的自动标注脚本:

import os
import cv2
from paddleocr import PaddleOCR
def auto_label_image(image_path, output_path):
    # 检查文件是否存在
    if not os.path.exists(image_path):
        print(f"Error: File not found: {image_path}")
        return
    # 加载图像
    image = cv2.imread(image_path)
    if image is None:
        print(f"Error: Failed to load image. Check the file path or format: {image_path}")
        return
    # 图像预处理
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    _, binary_image = cv2.threshold(gray_image, 128, 255, cv2.THRESH_BINARY)
    # 保存预处理后的图片(可选,用于调试)
    preprocessed_path = os.path.join(output_path, "processed_image.jpg")
    cv2.imwrite(preprocessed_path, binary_image)
    # 初始化 OCR
    ocr = PaddleOCR(use_angle_cls=True, lang='en')
    # OCR 识别
    results = ocr.ocr(preprocessed_path)
    if not results or not results[0]:
        print(f"No text detected in the image: {image_path}")
        return
    # 获取图像尺寸
    image_height, image_width, _ = image.shape
    # 构建标注 JSON
    label_data = {
        "version": "4.5.7",
        "flags": {},
        "shapes": [],
        "imagePath": os.path.basename(image_path),
        "imageData": None,
        "imageHeight": image_height,
        "imageWidth": image_width,
    }
    # 遍历 OCR 结果
    for line in results[0]:
        points = line[0]  # 字符位置 [左上, 右上, 右下, 左下]
        text = line[1][0]  # 识别的文本
        shape = {
            "label": text,
            "points": [points[0], points[2]],  # 左上角和右下角
            "group_id": None,
            "shape_type": "rectangle",
            "flags": {}
        }
        label_data["shapes"].append(shape)
    # 保存标注 JSON
    json_path = os.path.join(output_path, os.path.basename(image_path).replace('.jpg', '.json'))
    with open(json_path, 'w') as f:
        import json
        json.dump(label_data, f, indent=4)
    print(f"Saved LabelMe annotation: {json_path}")
# 示例
image_path = r"C:\Users\wangzq\Desktop\images\captcha.jpg"
output_path = "./annotations"
os.makedirs(output_path, exist_ok=True)
auto_label_image(image_path, output_path)

核心逻辑解析

图像预处理

为了提高 OCR 的识别精度,对验证码图片进行灰度化和二值化处理:

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, binary_image = cv2.threshold(gray_image, 128, 255, cv2.THRESH_BINARY)

二值化处理可以去除背景噪声,使字符更加清晰。

OCR 识别

使用 PaddleOCR 对图片进行文字检测和识别,返回检测框和文字内容:

ocr = PaddleOCR(use_angle_cls=True, lang='en')
results = ocr.ocr(preprocessed_path)

如果 results 为空,说明 OCR 未检测到任何文本。

生成标注文件

根据 OCR 结果,生成 LabelMe 格式的标注文件,关键字段包括:

  • shapes:标注框信息,包括位置和对应文字。
  • imageHeight 和 imageWidth:图像的尺寸。

运行结果

  • 输出预处理图片:在指定路径下保存经过预处理的图片(processed_image.jpg)。
  • 生成标注文件:在 output_path 目录下生成与图片同名的 .json 文件。
  • 无文本检测提示:如果未检测到任何文本,提示 No text detected in the image

扩展与优化

模型适配

如果验证码中的字符种类较复杂,可以考虑训练一个专用模型,替代通用的 PaddleOCR。

批量处理

针对多张图片验证码,可以将脚本扩展为批量处理模式:

for image_file in os.listdir(input_folder):
    image_path = os.path.join(input_folder, image_file)
    auto_label_image(image_path, output_path)

标注类型扩展

目前代码仅支持矩形框标注。如果需要支持多边形标注,可以调整 shape_typepolygon 并提供相应点坐标。

总结

本文介绍了如何使用 Python 和 LabelMe 自动标注图片验证码,从图像预处理到生成标注文件的完整流程。通过 PaddleOCR 的结合,可以快速实现验证码字符的自动标注,节省大量时间和精力。

测试

运行完脚本,出来json

{
    "version": "4.5.7",
    "flags": {},
    "shapes": [
        {
            "label": "OZLQ",
            "points": [
                [
                    6.0,
                    1.0
                ],
                [
                    68.0,
                    21.0
                ]
            ],
            "group_id": null,
            "shape_type": "rectangle",
            "flags": {}
        }
    ],
    "imagePath": "captcha.png",
    "imageData": null,
    "imageHeight": 22,
    "imageWidth": 76
}
{
    "version": "4.5.7",
    "flags": {},
    "shapes": [
        {
            "label": "3081",
            "points": [
                [
                    6.0,
                    1.0
                ],
                [
                    63.0,
                    21.0
                ]
            ],
            "group_id": null,
            "shape_type": "rectangle",
            "flags": {}
        }
    ],
    "imagePath": "captcha.png",
    "imageData": null,
    "imageHeight": 22,
    "imageWidth": 76
}

目前较为复杂还需要深度研究

到此这篇关于使用 Python 和 LabelMe 实现图片验证码的自动标注的文章就介绍到这了,更多相关Python图片验证码自动标注内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Python实现批量修改文件的修改日期功能

    使用Python实现批量修改文件的修改日期功能

    在日常的文件管理中,您可能需要批量修改文件的修改日期,比如,您可能希望将某个文件夹中的所有文件的修改日期随机设置为6到8月份之间的日期,这在数据整理中可能非常有用,本文将详细介绍如何使用Python实现这一功能,需要的朋友可以参考下
    2024-10-10
  • Python Numpy:找到list中的np.nan值方法

    Python Numpy:找到list中的np.nan值方法

    今天小编就为大家分享一篇Python Numpy:找到list中的np.nan值方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Python实现链表反转与合并操作详解

    Python实现链表反转与合并操作详解

    这篇文章主要为大家详细介绍了 Python 中反转链表和合并链表的应用场景及实现方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2025-02-02
  • python序列化与数据持久化实例详解

    python序列化与数据持久化实例详解

    这篇文章主要介绍了python序列化与数据持久化,结合实例形式详细分析了Python序列化与数据持久化相关原理、实现技巧与操作注意事项,需要的朋友可以参考下
    2019-12-12
  • python语法 之垃圾回收机制

    python语法 之垃圾回收机制

    这篇文章主要介绍了python语法 之垃圾回收机制,垃圾回收机制 是Python解释器自带一种机,专门用来回收不可用的变量值所占用的内存空间,下文相关介绍,需要的朋友可以参考一下
    2022-04-04
  • python 读取更新中的log 或其它文本方式

    python 读取更新中的log 或其它文本方式

    今天就为大家分享一篇python 读取更新中的log 或其它文本方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python 调用函数时检查参数的类型是否合规的实现代码

    Python 调用函数时检查参数的类型是否合规的实现代码

    这篇文章主要介绍了Python 调用函数时检查参数的类型是否合规的实现代码,本文给大家讲解的非常详细,需要的朋友可以参考下
    2024-06-06
  • 如何不用安装python就能在.NET里调用Python库

    如何不用安装python就能在.NET里调用Python库

    这篇文章主要介绍了如何不用安装python就能在.NET里调用Python库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 一文学会VSCode使用python

    一文学会VSCode使用python

    Pycharm用着卡还收费!何不试试VSCode!一文学会VSCode使用python,本文通过图文实例相结合给大家介绍的非常详细,需要的朋友参考下吧
    2021-08-08
  • Python实现的排列组合计算操作示例

    Python实现的排列组合计算操作示例

    这篇文章主要介绍了Python实现的排列组合计算操作,涉及Python数学运算的相关函数与使用技巧,需要的朋友可以参考下
    2017-10-10

最新评论