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

【保姆级视频教程(二)】YOLOv12训练数据集构建:标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测!

【2025全站首发】YOLOv12训练数据集构建:标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测!

文章目录

  • 1. 数据集准备
    • 1.1 标签格式转换
    • 1.2 数据集划分
    • 1.3 yaml配置文件创建
  • 2. 训练验证

1. 数据集准备

示例数据集下载链接:PKU-Market-PCB数据集

1.1 标签格式转换

cursor prompt

请撰写一个py脚本。将@Annotations文件夹下的所有类别的xml格式的标注转换成为yolo格式。转换后的标签请新建一个labels文件夹,保存在该文件夹下。

生成的xml2yolo.py脚本内容如下:

import os
import xml.etree.ElementTree as ET
import globdef convert_coordinates(size, box):"""将XML中的边界框坐标转换为YOLO格式"""dw = 1.0/size[0]dh = 1.0/size[1]# XML格式为 xmin, ymin, xmax, ymaxx = (box[0] + box[2])/2.0y = (box[1] + box[3])/2.0w = box[2] - box[0]h = box[3] - box[1]# 归一化x = x*dww = w*dwy = y*dhh = h*dhreturn (x,y,w,h)def convert_xml_to_yolo(xml_path, class_mapping):"""转换单个XML文件到YOLO格式"""tree = ET.parse(xml_path)root = tree.getroot()# 获取图像尺寸size = root.find('size')width = int(size.find('width').text)height = int(size.find('height').text)# 创建对应的txt文件路径txt_path = xml_path.replace('Annotations', 'Labels').replace('.xml', '.txt')# 确保Labels目录存在os.makedirs(os.path.dirname(txt_path), exist_ok=True)with open(txt_path, 'w') as txt_file:# 处理每个目标for obj in root.iter('object'):# 获取类别名称class_name = obj.find('name').text# 获取类别IDif class_name not in class_mapping:continueclass_id = class_mapping[class_name]# 获取边界框坐标xmlbox = obj.find('bndbox')xmin = float(xmlbox.find('xmin').text)ymin = float(xmlbox.find('ymin').text)xmax = float(xmlbox.find('xmax').text)ymax = float(xmlbox.find('ymax').text)# 转换坐标bb = convert_coordinates((width,height), (xmin,ymin,xmax,ymax))# 写入txt文件txt_file.write(f"{class_id} {bb[0]:.6f} {bb[1]:.6f} {bb[2]:.6f} {bb[3]:.6f}\n")def main():# 定义类别映射class_mapping = {'missing_hole': 0,'mouse_bite': 1,'open_circuit': 2,'short': 3,'spur': 4,'spurious_copper': 5}# 获取所有XML文件xml_files = glob.glob('Annotations/*/*.xml')# 转换每个XML文件for xml_file in xml_files:try:convert_xml_to_yolo(xml_file, class_mapping)print(f"成功转换: {xml_file}")except Exception as e:print(f"转换失败 {xml_file}: {str(e)}")if __name__ == "__main__":main() 

1.2 数据集划分

cursor prompt

请创建一个py脚本,对数据进行划分。对于image文件夹下的每一个类别按照8:2进行随机划分。请直接生成包含所有图像绝对路径的train.txt和val.txt文件。并输出每个类别训练集验证集的数量。

生成的split_dataset.py脚本内容如下:

import os
import glob
import randomdef split_dataset(image_root='images', train_ratio=0.8, seed=42):"""数据集划分函数:param image_root: 图片根目录路径:param train_ratio: 训练集比例:param seed: 随机种子"""# 设置随机种子保证可重复性random.seed(seed)# 初始化路径列表train_paths = []val_paths = []# 获取所有类别目录class_dirs = [d for d in glob.glob(os.path.join(image_root, '*')) if os.path.isdir(d)]# 初始化统计字典class_stats = {}for class_dir in class_dirs:# 获取类别名称class_name = os.path.basename(class_dir)# 获取当前类别所有图片路径image_paths = glob.glob(os.path.join(class_dir, '*.*'))image_paths = [p for p in image_paths if p.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp'))]# 打乱顺序random.shuffle(image_paths)# 计算分割点split_idx = int(len(image_paths) * train_ratio)# 分割数据集train = image_paths[:split_idx]val = image_paths[split_idx:] if split_idx < len(image_paths) else []# 转换为绝对路径并添加路径分隔符train_paths.extend([os.path.abspath(p) + '\n' for p in train])val_paths.extend([os.path.abspath(p) + '\n' for p in val])# 记录统计信息class_stats[class_name] = {'total': len(image_paths),'train': len(train),'val': len(val)}# 写入文件with open('train.txt', 'w') as f:f.writelines(train_paths)with open('val.txt', 'w') as f:f.writelines(val_paths)# 新增统计信息输出print("\n各类别数据分布:")print("{:<15} {:<10} {:<10} {:<10}".format('类别', '总数', '训练集', '验证集'))for cls, stat in class_stats.items():print("{:<15} {:<10} {:<10} {:<10}".format(cls, stat['total'], stat['train'], stat['val']))# 原有总样本数输出保持不变print(f'\n数据集划分完成!\n训练集样本数: {len(train_paths)}\n验证集样本数: {len(val_paths)}')if __name__ == '__main__':# 使用示例(根据实际情况修改路径)split_dataset(image_root='images') 

1.3 yaml配置文件创建

pcb_detect.yaml具体内容如下:

path: E:\project\YOLOv12\dataset\PCB_DATASET # dataset root dir
train: train.txt # train images (relative to 'path') 118287 images
val: val.txt # val images (relative to 'path') 5000 images
test: # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794# Classes
names:0: Missing_hole1: Mouse_bite2: Open_circuit3: Short4: Spur5: Spurious_copper

2. 训练验证

train.py训练验证脚本内容如下:

from ultralytics import YOLOmodel = YOLO('yolov12n.yaml')# Train the model
results = model.train(data='pcb_detect.yaml',epochs=300, batch=4, imgsz=640,scale=0.5,  # S:0.9; M:0.9; L:0.9; X:0.9mosaic=1.0,mixup=0.0,  # S:0.05; M:0.15; L:0.15; X:0.2copy_paste=0.1,  # S:0.15; M:0.4; L:0.5; X:0.6device="0",workers=0,
)# Evaluate model performance on the validation set
metrics = model.val()

遇到``AttributeError: ‘InfiniteDataLoader‘ object has no attribute ‘` 报错,查看解决方案~

相关文章:

【保姆级视频教程(二)】YOLOv12训练数据集构建:标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测!

【2025全站首发】YOLOv12训练数据集构建&#xff1a;标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测&#xff01; 文章目录 1. 数据集准备1.1 标签格式转换1.2 数据集划分1.3 yaml配置文件创建 2. 训练验证 1. 数据集准备 示例数据集下载链接&#xff1a;P…...

smolagents学习笔记系列(八)Examples - Master you knowledge base with agentic RAG

这篇文章锁定官网教程中 Examples 章节中的 Master you knowledge base with agentic RAG 文章&#xff0c;主要介绍了如何将 agent 和 RAG 结合使用。 官网链接&#xff1a;https://huggingface.co/docs/smolagents/v1.9.2/en/examples/rag&#xff1b; Agentic RAG 在之前的…...

满血版DeepSeek R1使用体验

硅基流动的满血版DeepSeek&#xff0c;通过CheeryStudio可以轻松访问&#xff0c;告别DeepSeek官网服务器繁忙&#xff0c;https://cloud.siliconflow.cn/i/ewlWR6A9 即可注册 https://cloud.siliconflow.cn/i/ewlWR6A9https://cloud.siliconflow.cn/i/ewlWR6A9 一、硅基流动平…...

Java类中的this操作

在Java中,`this` 是一个关键字,用于引用当前对象的实例。它通常在类的方法或构造器中使用,主要有以下几种用途: 1. 区分成员变量和局部变量 当成员变量与局部变量同名时,使用 `this` 可以明确引用当前对象的成员变量。 public class Person { private String name; …...

LeetCode刷题---双指针---532

数组中的 k-diff 数对 532. 数组中的 k-diff 数对 - 力扣&#xff08;LeetCode&#xff09; 题目 给你一个整数数组 nums 和一个整数 k&#xff0c;请你在数组中找出 不同的 k-diff 数对&#xff0c;并返回不同的 k-diff 数对 的数目。 k-diff 数对定义为一个整数对 (nums[…...

cpp单调栈模板

题目如下 如果利用暴力解法&#xff0c;时间复杂度是O&#xff08;n^2&#xff09; 只能过60%的数据 AC解法&#xff1a; 利用单调栈的算法&#xff0c;单调栈里存的是之前遍历过的元素的下标&#xff0c;如果满足while的条件就将栈顶元素记录&#xff0c;然后将其弹出&#x…...

PyCharm 的使用 + PyCharm快捷键 + 切换中文界面

2025 - 02 - 27 - 第 62 篇 Author: 郑龙浩 / 仟濹 【PyCharm的使用】 文章目录 如何使用Pycharm1 新建工程&#xff0c;新建 .py 文件&#xff0c;运行2 常用快捷键3 其他快捷键 - DeepSeek 总结如下**代码编辑****导航与定位****查找与替换****运行与调试****代码重构****其…...

SSL/TLS 协议、SSL证书 和 SSH协议 的区别和联系

下面是 SSL/TLS 协议、SSL证书 和 SSH协议 的区别和联系&#xff0c;包含它们的英文全称和中文全称&#xff1a; 属性SSL/TLS 协议SSL证书SSH 协议英文全称Secure Sockets Layer / Transport Layer SecuritySecure Sockets Layer CertificateSecure Shell Protocol中文全称安全…...

一个典型的要求: Python | C#实现年月日创建文件夹 时分秒对应文件名的保存路径

赶时间先说python: 用年月日作为文件夹: 年月日 时分秒 保存文件的路径根据年月日 创建文件夹 年里面包含月 月里面包含日 检查是否存在 没有就去创建 最后文件名用 时分秒毫秒.txt 这是一个典型的要求: import os from datetime import datetimenow datetime.now()# 获取当…...

知识库功能测试难点

图表交互功能测试难点 知识库图表类型多&#xff0c;每种图表交互功能不同。像柱状图&#xff0c;可能有点击柱子查看详细数据、鼠标悬停显示数据提示等交互&#xff1b;折线图除了这些&#xff0c;还可能支持缩放查看不同时间段数据。多种交互操作在不同图表间存在差异&#x…...

如何实现某短视频平台批量作品ID的作品详情采集

声明: 本文仅供学习交流使用,请勿用于非法用途。 在短视频平台的数据分析和内容监测中,批量采集作品详情是一个常见的需求。本文将介绍如何使用 Python 编写一个高效的爬虫程序,根据批量作品 ID 实现作品详情的批量采集。 1. 需求分析 输入:一批作品 ID。输出:每个作品 …...

uniapp中使用leaferui使用Canvas绘制复杂异形表格的实现方法

需求&#xff1a; 如下图&#xff0c;要实现左图的样式&#xff0c;先实现框架&#xff0c;文字到时候 往里填就行了&#xff0c;原来的解决方案是想用css,html来实现&#xff0c;发现实现起来蛮麻烦的。我也没找到合适的实现方法&#xff0c;最后换使用canvas来实现&#xff…...

判别分析:原理推导、方法对比与Matlab实战

内容摘要 本文深入解析判别分析的三大核心方法——距离判别、Fisher判别与Bayes判别&#xff0c;结合协方差估计、投影优化及贝叶斯决策理论&#xff0c;系统阐述数学原理与实现细节。通过气象数据春早预测、产品厂家分类及城市竞争力评估三大实战案例&#xff0c;完整演示数据…...

PMP项目管理—整合管理篇—4.管理项目知识

文章目录 基本信息知识的分类显性知识隐性知识 如何分享知识&#xff1f;4W1HITTO输入工具与技术输出 经验教训登记册 基本信息 知识管理指管理显性知识和隐性知识&#xff0c;旨在重复使用现有知识并生成新知识。有助于达成这两个目的的关键活动是知识分享和知识集成&#xf…...

Makefile编写和相关语法规则

makefile基本概念 Makefile 本质上是一个文本文件&#xff0c;它包含了一系列规则和指令&#xff0c;用于告诉构建工具&#xff08;如 make&#xff09;如何编译和链接程序&#xff0c;以及如何处理项目中的各种文件。其核心思想是通过定义目标&#xff08;target&#xff09;…...

点云 PCL 滤波在自动驾驶的用途。

1.直通滤波 2.体素滤波...

NL2SQL的应用-长上下文模型在处理NL2SQL任务时,相较于传统模型,有哪些显著的优势

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下NL2SQL的应用-长上下文模型在处理NL2SQL任务时&#xff0c;相较于传统模型&#xff0c;有哪些显著的优势。NL2SQL&#xff08;自然语言转SQL&#xff09;技术旨在将用户自然语言提问自动转换为结构化查询语句&#…...

图像处理基础(8):图像的灰度直方图、直方图均衡化、直方图规定化(匹配)

本文主要介绍了灰度直方图相关的处理&#xff0c;包括以下几个方面的内容&#xff1a; • 利用OpenCV计算图像的灰度直方图&#xff0c;并绘制直方图曲线 • 直方图均衡化的原理及实现 • 直方图规定化&#xff08;匹配&#xff09;的原理及实现 图像的灰度直方图 一…...

探寻数组中两个不重复数字的奥秘:C 语言实战之旅

在编程的世界里&#xff0c;经常会遇到各种各样有趣的问题&#xff0c;今天我们就来探讨一个经典的题目&#xff1a;在一个整数数组中&#xff0c;除了两个数字只出现一次&#xff0c;其余数字都出现了两次&#xff0c;如何高效地找出这两个只出现一次的数字呢&#xff1f;我们…...

Mercury、LLaDA 扩散大语言模型

LLaDA 参考&#xff1a; https://github.com/ML-GSAI/LLaDA https://ml-gsai.github.io/LLaDA-demo/ 在线demo&#xff1a; https://huggingface.co/spaces/multimodalart/LLaDA Mercury 在线demo&#xff1a; https://chat.inceptionlabs.ai/ 速度很快生成...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...