使用 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

相关文章

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将