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

2025-01-01 03:50

本文主要是介绍使用 Python 和 LabelMe 实现图片验证码的自动标注功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《使用Python和LabelMe实现图片验证码的自动标注功能》文章介绍了如何使用Python和LabelMe自动标注图片验证码,主要步骤包括图像预处理、OCR识别和生成标注文件,通过结合Pa...

使用 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}")
    www.chinasem.cn    return
    # 图像预处理
    gray_image = China编程cv2.cvtColor(androidimage, 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,
            "shappythone_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 的结合,可以快速实现验证码字符的自动标注,节省大量时间和精力。

测试

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

运行完脚本,出来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 实现图片验证码的自动标注的文章就介绍BGWCOwM到这了,更多相关Python图片验证码自动标注内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于使用 Python 和 LabelMe 实现图片验证码的自动标注功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1152878

相关文章

TP-LINK/水星和hasivo交换机怎么选? 三款网管交换机系统功能对比

《TP-LINK/水星和hasivo交换机怎么选?三款网管交换机系统功能对比》今天选了三款都是”8+1″的2.5G网管交换机,分别是TP-LINK水星和hasivo交换机,该怎么选呢?这些交换机功... TP-LINK、水星和hasivo这三台交换机都是”8+1″的2.5G网管交换机,我手里的China编程has

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

python subprocess.run中的具体使用

《pythonsubprocess.run中的具体使用》subprocess.run是Python3.5及以上版本中用于运行子进程的函数,它提供了更简单和更强大的方式来创建和管理子进程,本文就来详细... 目录一、详解1.1、基本用法1.2、参数详解1.3、返回值1.4、示例1.5、总结二、subproce

使用Spring Cache时设置缓存键的注意事项详解

《使用SpringCache时设置缓存键的注意事项详解》在现代的Web应用中,缓存是提高系统性能和响应速度的重要手段之一,Spring框架提供了强大的缓存支持,通过​​@Cacheable​​、​​... 目录引言1. 缓存键的基本概念2. 默认缓存键生成器3. 自定义缓存键3.1 使用​​@Cacheab

python中poetry安装依赖

《python中poetry安装依赖》本文主要介绍了Poetry工具及其在Python项目中的安装和使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前言1. 为什么pip install poetry 会造成依赖冲突1.1 全局环境依赖混淆:1

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

详解Java中如何使用JFreeChart生成甘特图

《详解Java中如何使用JFreeChart生成甘特图》甘特图是一种流行的项目管理工具,用于显示项目的进度和任务分配,在Java开发中,JFreeChart是一个强大的开源图表库,能够生成各种类型的图... 目录引言一、JFreeChart简介二、准备工作三、创建甘特图1. 定义数据集2. 创建甘特图3.

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景

windows端python版本管理工具pyenv-win安装使用

《windows端python版本管理工具pyenv-win安装使用》:本文主要介绍如何通过git方式下载和配置pyenv-win,包括下载、克隆仓库、配置环境变量等步骤,同时还详细介绍了如何使用... 目录pyenv-win 下载配置环境变量使用 pyenv-win 管理 python 版本一、安装 和

Django中使用SMTP实现邮件发送功能

《Django中使用SMTP实现邮件发送功能》在Django中使用SMTP发送邮件是一个常见的需求,通常用于发送用户注册确认邮件、密码重置邮件等,下面我们来看看如何在Django中配置S... 目录1. 配置 Django 项目以使用 SMTP2. 创建 Django 应用3. 添加应用到项目设置4. 创建