当前位置: 首页 > article >正文

yolo标签自动标注(使用python和yolo方法)

yolo代码自动标注

  • 1.引言
  • 1.初阶“自动标注”,给每个图像都生成一个固定的标注文件,进而在labglimg中对矩形框进行微调,减少标注的工作量
  • 2.高阶自动标注,利用我们训练好的(但是没有特别精准的)yolo文件先对每张图进行检测,再手动微调
  • 3.总结

1.引言

在图像处理与机器视觉领域,标注数据的质量和数量对于模型的训练至关重要。然而,手动标注大量图像是一项繁琐且耗时的工作。为了解决这个问题,自动标注技术应运而生。本文将介绍如何使用YOLOv10结合传统图像处理算法进行验证码图像的自动标注,从初步的自动标注到高阶的基于检测结果的自动标注。

1.初阶“自动标注”,给每个图像都生成一个固定的标注文件,进而在labglimg中对矩形框进行微调,减少标注的工作量

在初步的自动标注阶段,我们首先为每张图像生成一个固定的标注文件,这些文件的内容通常是预设的,矩形框的位置并不精确,因此适合用作标注的初步框架。

import os

# 图像文件夹路径
image_folder = 'D:'
# 标注文件即txt文件路径
txt_folder = 'D:'

# 基于上述两个路径检索图像和txt即yolo格式的标注文件
image_files = [f.split('.')[0] for f in os.listdir(image_folder) if f.lower().endswith(('jpg', 'jpeg', 'png', 'bmp'))]
txt_files = [f.split('.')[0] for f in os.listdir(txt_folder) if f.lower().endswith('txt')]

# 遍历图像文件名
for img_name in image_files:
    # 如果某图像没有对应的标签文件即txt文件
    if img_name not in txt_files:
        # 写入txt文件
        txt_content = """0 0.808621 0.945652 0.072414 0.073913
                        0 0.250000 0.604348 0.093103 0.078261
                        0 0.660345 0.584783 0.086207 0.100000
                        0 0.613793 0.160870 0.117241 0.139130
                        0 0.293103 0.184783 0.103448 0.117391"""
        with open(os.path.join(txt_folder, img_name + '.txt'), 'w') as f:
            f.write(txt_content)

print("Process complete.")

由于我们对每张图都生成的是一份固定的标注txt文件,所以生成的文件一般都是这种的,矩形框 不在正确的位置上,虽然能够降低一定的标注工作量,但是我们还是想让它更精准一点,那就需要使用训练好的模型了。

局限性:
矩形框位置不准确,标注结果可能与实际物体位置存在偏差。
无法自动识别图像中的所有物体,可能遗漏检测。
在这里插入图片描述

2.高阶自动标注,利用我们训练好的(但是没有特别精准的)yolo文件先对每张图进行检测,再手动微调

为了提高自动标注的精度,我们可以使用YOLOv10模型对每张图像进行目标检测,并根据检测结果生成标注文件。这种方式能够提供较为准确的初步标注,用户只需要对检测框进行微调即可,减少了大量的手动标注工作。


import os
from ultralytics import YOLOv10

# Folder paths
image_folder = 'D:'
txt_folder = 'D:'

# Load a pretrained YOLOv10n model
model = YOLOv10("\weights\\best.pt")
image_files = [f for f in os.listdir(image_folder) if f.lower().endswith(('jpg', 'jpeg', 'png', 'bmp'))]

# Perform object detection on each image file
for img_name in image_files:
    img_path = os.path.join(image_folder, img_name)
    # Perform prediction
    results = model.predict(img_path)

    # Extract detection results (assuming results[0] contains the detection)
    detections = results[0].boxes.xywh  # Get bounding box coordinates (xywh format)

    # If no .txt file exists, create a new one
    txt_path = os.path.join(txt_folder, img_name.split('.')[0] + '.txt')

    if not os.path.exists(txt_path):  # Check if .txt file already exists
        # Write detection results to the .txt file
        with open(txt_path, 'w') as f:
            for detection in detections:
                # Assuming you want the format: class_id x_center y_center width height (normalized)
                # Convert coordinates from pixels to normalized values by dividing by image width/height
                x_center, y_center, width, height = detection
                x_center /= results[0].orig_img.shape[1]  # Normalize by image width
                y_center /= results[0].orig_img.shape[0]  # Normalize by image height
                width /= results[0].orig_img.shape[1]  # Normalize by image width
                height /= results[0].orig_img.shape[0]  # Normalize by image height

                # Write to file (Assuming class id is 0 here, change based on your model)
                f.write(f"0 {x_center} {y_center} {width} {height}\n")

print("Process complete.")

代码详解:
1.加载YOLOv10模型:使用YOLOv10模型进行物体检测。通过model.predict()函数对每张图像进行检测。
2.提取检测结果:模型返回的结果中包含了检测到的目标的坐标信息,采用boxes.xywh提取出目标的位置。
3.坐标归一化:将检测结果的坐标从像素值转换为相对图像大小的比例(即归一化值),以符合YOLO标注格式。
4.生成标注文件:根据模型检测结果生成标注文件,格式为class_id x_center y_center width height。

这种方式得到的数据一般是下图这样的,1.会有一些框不准,2.有一些框是重复的,3.有一些代码没有检测到。此时我们只需要微调这三种情况的框即可,显著降低了工作量。
在这里插入图片描述

3.总结

本文介绍了基于YOLOv10的自动标注方法,从初阶的固定标注到高阶的基于YOLO检测结果的自动标注。两者相比,高阶方法显著提高了标注的准确性,并减少了人工操作的时间。

初阶方法:快速生成标注文件,适用于初步标注,但需要人工微调和修正。
高阶方法:通过YOLOv10检测得到较为精准的标注结果,适合更高精度要求的任务,但仍需要人工微调。
希望这些代码能帮助大家提升标注工作的效率和精度,降低人工标注的成本。在未来的工作中,我们可以继续优化和扩展该方法,进一步提高自动标注的精度和适用范围。


http://www.kler.cn/a/392787.html

相关文章:

  • Web开发:ORM框架之使用Freesql的分表分页写法
  • 【每日学点鸿蒙知识】gbk2313传到native、NAPI打印日志问题、table表格控件、Web 触发新窗口卡住、修饰列表
  • blender中合并的模型,在threejs中显示多个mesh;blender多材质烘培成一个材质
  • Apifox 12月更新|接口的测试覆盖情况、测试场景支持修改记录、迭代分支能力升级、自定义项目角色权限、接口可评论
  • QML自定义DelayButton(带进度的按钮)样式
  • Overleaf中设置表格中的字体为Times New Roman
  • 031集——获取外轮廓(只支持线段多段线)(CAD—C#二次开发入门)
  • 海思Hi3516DV300上播放G711U音频文件
  • 【Hadoop】【hdfs】【大数据技术基础】实验三 HDFS 基础编程实验
  • 【监控】如何调出电脑的中摄像头,从摄像头获取视频流
  • STM32完全学习——点亮LED灯
  • C#发票识别、发票查验接口集成、电子发票(航空运输电子行程单)
  • 【再谈设计模式】抽象工厂模式~对象创建的统筹者
  • Python酷库之旅-第三方库Pandas(214)
  • 利用编程语言和脚本编写技术,实现自动化渗透测试和安全工具的开发
  • Llama微调测试记录
  • Go 加密算法工具方法
  • 嵌入式linux系统中RTC硬件的控制与实现
  • Go语言入门教案
  • 【vue】toRefs 和 toRef——如何在解构响应式对象时保持响应性
  • 免费,WPS Office教育考试专用版
  • 【初阶数据结构篇】插入、希尔、选择、堆排序
  • 约束(MYSQL)
  • github高分项目 WGCLOUD - 运维实时管理工具
  • A032-基于Spring Boot的健康医院门诊在线挂号系统
  • PCB+SMT线上报价系统+PCB生产ERP系统自动化拼板模块升级