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

news2024/12/23 9:48:35

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.coloradmin.cn/o/2240693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git在版本控制中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 Git在版本控制中的应用 Git在版本控制中的应用 Git在版本控制中的应用 引言 Git 概述 定义与原理 发展历程 Git 的关键技术 分布…

vue2.7.14 + vant + vue cli脚手架转vite启动运行问题记录

文章目录 前言方案一(借用插件转换)启动命令,转换方案一转换遇到的问题 方案二(手动调整)方案两者对比小结 前言 vue cli 脚手架转成vite启动 简单说说这个项目的一些底层基本结构哈,以及写这篇博客的目的…

边缘提取函数 [OPENCV--2]

OPENCV中最常用的边界检测是CANNY函数 下面展示它的用法 通常输入一个灰度图像(边界一般和颜色无关)这样也可以简化运算cv::Canny(inmat , outmat , therhold1, therhold2 ) 第一个参数是输入的灰度图像,第二个是输出的图像这两个参数都是引用…

SpringBoot基础系列学习(七):整合Mybatis

文章目录 一丶介绍1.基本信息2.特性 二丶代码1.项目结构2.数据表3.引入依赖4.实体类5.mapper6.sql.xml7.Controller8.结果 一丶介绍 1.基本信息 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手…

什么岗位需要学习 OpenGL ES ?说说 3.X 的新特性

什么是 OpenGL ES OpenGL ES 是一种为嵌入式系统和移动设备设计的3D图形API(应用程序编程接口)。它是标准 OpenGL 3D 图形库的一个子集,专门为资源受限的环境(如手机、平板电脑、游戏机和其他便携式设备)进行了优化。 由于其在移动设备上的广泛适用性,OpenGL ES是学习移…

记一次谷歌chrome浏览器 18 以上和 18 以下,最小字号不一致,导致的样式兼容问题解决过程

**记录一次谷歌chrome浏览器 18 以上和 18 以下,最小字号不一致,导致的样式兼容问题解决过程:** 定位问题尝试解决方案第一时间想到的解决方案:方案一尝试方案二:scale 缩放方案三:rem、em测试 方案四 SVG最…

Elasticsearch 和 Kibana 8.16:Kibana 获得上下文和 BBQ 速度并节省开支!

作者:来自 Elastic Platform Product Team Elastic Search AI 平台(Elasticsearch、Kibana 和机器学习)的 8.16 版本包含大量新功能,可提高性能、优化工作流程和简化数据管理。 使用更好的二进制量化 (Better Binary Quantizatio…

HarmonyOS Next星河版笔记--界面开发(5)

1.字符串 1.1.字符串拼接 作用:把两个或多个字符串,拼成一个字符串。(通常是用来拼接字符串和变量) hello world > helloworld 加好作用:拼接 let name:string 小明 console.log(简介信息,名字是 name) …

kafka中topic的数据抽取不到hdfs上问题解决

在上一个博客中有一个案例: 将json文件抽取到kafka的消息队列(topic)中,再从topic中将数据抽取到hdfs https://blog.csdn.net/qq_62984376/article/details/143759037?spm1001.2014.3001.5501 我们在从kafka中topic的数据抽到hdf…

scala中的case class

package test_27 //Set的特点:唯一(元素不同);无序 //case class定义一组数据 case class Book(var bookName:String,var author:String,var price:Double){} object caseclass {def main(args: Array[String]): Unit {//定义一个…

【Excel】数据透视表分析方法大全

数据透视表的最常用的功能是分类汇总,其实它还有很强大的数据分析功能。在数据透视表右键菜单的值显示方式中,可以看到有14个很实用的分析选项。 1、总计的百分比 作用:透视表中每一个数字(包括汇总行、总计行)占右…

交互新体验:Axure动态面板下的图片拖动技巧

交互新体验:Axure动态面板下的图片拖动技巧 前言 在数字产品的设计过程中,用户体验的每一个细节都至关重要。 动态交互效果,如拖动按钮控制图片展示区域,不仅能够提升用户的参与度,还能增强界面的直观性和互动性。 …

批量将MySQL中的MyISAM引擎,改成InnoDB引擎

一、InnoDB和MyISAM的区别 MySQL中InnoDB和MyISAM是两种常用的存储引擎,具有以下不同的特点: 序号InnoDBMyISAM说明事务支持支持不支持InnoDB可以处理更复杂的业务逻辑,而MyISAM在处理大量并发写入时可能会遇到问题‌锁定机制行级锁定表级锁…

力扣经典面试题

1.本题的目标是判断字符串ransomNote是否由字符串magazine中的字符构成,且由magazine中的每个字符只能在ransomNote中使用一次 2.采用的方法是通过一个字典cahr_countl来统计magazine字符串中每个字符出现的次数 3.然后遍历ransomNote字符串,对于其中的…

灵神 刷题DAY1

Python与java的刷题的区别 1. Python没有分号 2. Python不能return的时候赋值 3. Python没有小括号和花括号 4. Python的循环很奇怪&#xff0c;没有for(int i0;i<32;i)这种形式 而是直接用的是for i in range(n)这种 5. Python中没有 6. Python中没有&& 是an…

Servlet三小时速成

Servlet三小时速成 实例驱动的速成教程。自己敲一遍的话入门还是没问题的。如有错误请读着多多包涵。 Serlet的前辈&#xff1a;CGI 通用网关接口 CGI通过调用外部程序来处理HTTP请求&#xff0c;对于每个请求都会启动一个新的进程。 这就导致了许多问题&#xff0c;首先是…

Qt主线程把数据发给子线程,主线程会阻塞吗

演示&#xff1a; #include <QCoreApplication> #include <QThread> #include <QObject> #include <QDebug>// 子线程类 class Worker : public QObject {Q_OBJECT public slots:void processData(int data) {qDebug() << "Processing dat…

「QT」文件类 之 QTemporaryFile 临时文件类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制…

探索Python的HTTP利器:Requests库的神秘面纱

文章目录 **探索Python的HTTP利器&#xff1a;Requests库的神秘面纱**一、背景&#xff1a;为何选择Requests库&#xff1f;二、Requests库是什么&#xff1f;三、如何安装Requests库&#xff1f;四、Requests库的五个简单函数使用方法1. GET请求2. POST请求3. PUT请求4. DELET…

【Java语言】String类

在C语言中字符串用字符可以表示&#xff0c;可在Java中有单独的类来表示字符串&#xff08;就是String&#xff09;&#xff0c;现在我来介绍介绍String类。 字符串构造 一般字符串都是直接赋值构造的&#xff0c;像这样&#xff1a; 还可以这样构造&#xff1a; 图更能直观的…