【2025全网首发B站教程】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 ‘` 报错,查看解决方案~
相关文章:
【2025全网首发B站教程】YOLOv12训练数据集构建:标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测!
【2025全站首发】YOLOv12训练数据集构建:标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测! 文章目录 1. 数据集准备1.1 标签格式转换1.2 数据集划分1.3 yaml配置文件创建 2. 训练验证 1. 数据集准备 示例数据集下载链接:P…...
设计模式教程:中介者模式(Mediator Pattern)
中介者模式是一种行为型设计模式,它用于减少对象之间的直接依赖关系。通过引入一个中介者对象,所有对象的交互都通过中介者进行,而不是直接相互通信。这种模式的主要目的是减少对象之间的耦合,提升系统的灵活性和可维护性。 1. 定…...
编写dockercompose脚本,管理redis,activemq,mysql5.7
编写dockercompose脚本,管理redis,activemq,mysql5.7,mysql的root密码设置Duke2007,redis密码设置duke0591 Docker Compose 多服务编排脚本(安全增强版) yaml 复制 services: # # MySQL 5.7 服务配置 #…...
【编程语言】委托与函数指针
委托与函数指针的相似之处: 指向方法:C# 的委托和 C 的函数指针都可以用来指向一个方法或函数。调用方法:它们都可以通过引用(委托或函数指针)来调用指向的方法。 委托与函数指针的主要区别: 类型安全&am…...
基于vue和微信小程序的校园自助打印系统(springboot论文源码调试讲解)
第3章 系统设计 3.1系统功能结构设计 本系统的结构分为管理员和用户、店长。本系统的功能结构图如下图3.1所示: 图3.1系统功能结构图 3.2数据库设计 本系统为小程序类的预约平台,所以对信息的安全和稳定要求非常高。为了解决本问题,采用前端…...
数字后端实现之Innovus中open net原因解析及解决方案
数字IC后端设计实现Innovus中我们经常会碰到如下的WARNING警告信息。这个log是在route或ECO Route阶段报的。这个WARNING必须要看,因为这里是报告当前设计存在open的net,即某些pin只有逻辑连接,而没有实际的物理连接。 这里正常工具应该报ERR…...
MATLAB基础学习相关知识
MATLAB安装参考:抖音-记录美好生活 MATLAB基础知识学习参考:【1小时Matlab速成教程-哔哩哔哩】 https://b23.tv/CnvHtO3 第1部分:变量定义和基本运算 生成矩阵: % 生成矩阵% 直接法% ,表示行 ;表示列 a [1,2,3;4,5,6;7,8,9];%…...
Mac系统下使用Docker快速部署MaxKB:打造本地知识库问答系统
随着大语言模型的广泛应用,知识库问答系统逐渐成为提升工作效率和个人学习的有力工具。MaxKB是一款基于LLM(Large Language Model)大语言模型的知识库问答系统,支持多模型对接、文档上传和自动爬取等功能。本文将详细介绍如何在Ma…...
RT-Thread+STM32L475VET6——icm20608传感器
文章目录 前言一、板载资源二、具体步骤1.打开CubeMX进行配置1.1 使用外部高速时钟,并修改时钟树1.2 打开I2C3,参数默认即可(I2C根据自己需求调整)1.3 打开串口1.4 生成工程 2. 添加icm20608软件包3. 使能传感器,打开动态链接库4.…...
【信息系统项目管理师-案例真题】2022下半年案例分析答案和详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一(24分)【问题1】(6分)【问题2】(10分)【问题3】(8分)试题二(26分)【问题1】(8分)【问题2】(8分)【问题3】(4分)【问题4】(6分)试题三(25分)【问题1】(12分)【问题2】(7分)【问题…...
3D机器视觉工业3D图像格式常见的格式
工业3D图像格式主要用于存储和交换三维模型数据,常见的格式包括: STL (Stereolithography) 用途: 3D打印和快速成型。 特点: 存储三角面片信息,文件较小,但不包含颜色和材质数据。STEP (Standard for the Exchange of Product Data) 用途: CAD数据交换。 特点: 支持几何、拓…...
SkyWalking集成Kafka实现日志异步采集经验总结
SkyWalking日志异步采集架构 【重点知识】 1、【Agent】kafka-reporter-plugin-x.x.x.jar包放plugins目录后必走kafka(kafka没有正确配置就会报错) 2、【Agent】异步如不开启数据压缩,日志数据较大,pod多、业务大时容易造成网络…...
Java知识点——IO流
目录 一、IO流基础概念 二、常见的IO流类 三、字符流 1.字符输入流(Reader)与字符输出流(Writer) 2.常用实现类 3.实例 四、字节流 1.字节输入流(InputStream)与字节输出流(OutputStrea…...
uniapp h5端和app端 使用 turn.js
前提:添加页后,添加页与当前页会重叠在一起,不知道为什么,没有找到解决办法 1.h5端 <template><view class"container"><view id"flipbook"><view class"page page1">Page 1</view><view class"page pag…...
使用大语言模型(Deepseek)构建一个基于 SQL 数据的问答系统
GitHub代码仓库 架构 从高层次来看,这些系统的步骤如下: 将问题转换为SQL查询:模型将用户输入转换为SQL查询。 执行SQL查询:执行查询。 回答问题:模型根据查询结果响应用户输入。 样本数据 下载样本数据…...
时间转换(acwing)c/c++/java/python
读取一个整数值,它是工厂中某个事件的持续时间(以秒为单位),请你将其转换为小时:分钟:秒来表示。 输入格式 输入一个整数 NN。 输出格式 输出转换后的时间表示,格式为 hours:minutes:second…...
连接Sql Server时报错无法通过使用安全套接字层加密与 SQL Server 建立安全连接
文章目录 一. 前言二. 解决方案 方案1方案2 三. 总结 一. 前言 在《数据库原理》这门课的实验上,需要使用SQL Server,然后使用jdbc连接sql server突然报错为:SQLServerException: “Encrypt”属性设置为“true”且 “trustServerCertific…...
基于CNN的FashionMNIST数据集识别3——模型验证
源码 import torch import torch.utils.data as Data from torchvision import transforms from torchvision.datasets import FashionMNIST from model import LeNetdef test_data_process():test_data FashionMNIST(root./data,trainFalse,transformtransforms.Compose([tr…...
go channel 的用法和核心原理、使用场景
一、Channel 的核心用法 1. 基本操作 // 创建无缓冲 Channel(同步通信) ch : make(chan int) // 创建有缓冲 Channel(容量为5,异步通信) bufferedCh : make(chan int, 5) // 发送数据到 Channel ch <- 42 // 从…...
pyside6学习专栏(七):自定义QTableWidget的扩展子类QTableWidgetEx
PySide6界面编程中较常用的控件还有QTableWidget表格控件,用来将加载的数据在表格中显示出来,下面继承QTableWidget编写其扩展子类QTableWidgetEx,来实现用单元格来显示除数据文字外,还可以对表格的单元格的文字颜色、背景底色进行设置&#…...
科学家完成澳大利亚北部珊瑚礁海域地图绘制
澳大利亚北部海域发现逾千处此前从未被记录的珊瑚礁,科学家足不出户便完成了这一重大海洋生态系统的探测工作。此次项目由澳大利亚海洋科学研究所(AIMS)联合昆士兰大学共同主导,作为"海洋与海岸中心"项目的重要组成部分…...
情感分析准确率骤降19%?——R 4.5中sentimentr 2.4.1与dplyr 1.1.0冲突根源及热补丁部署方案
第一章:情感分析准确率骤降19%的现场复现与影响评估在某次例行模型灰度发布后,线上情感分析服务的准确率监控指标在15分钟内从86.3%断崖式下跌至67.4%,降幅达19.1%。该异常立即触发SLO熔断告警,下游12个业务方反馈推荐文案情绪倾向…...
保姆级教程:用Python和Basemap绘制台风‘利奇马’期间的卫星云图(附完整代码)
用Python和Basemap绘制台风卫星云图实战指南 去年夏天,当超强台风"利奇马"逼近华东沿海时,气象部门发布了大量卫星云图数据。这些看似简单的彩色图片背后,其实隐藏着台风的强度、移动路径等关键信息。作为气象爱好者或相关领域的研…...
别再乱调PID了!平衡小车直立环用PD还是PI?手把手教你根据噪声和响应速度做选择
平衡小车PID控制实战:如何根据噪声与响应需求选择PD或PI方案 调试平衡小车时,最让人头疼的莫过于看着它要么像喝醉一样左右摇摆,要么反应迟钝得像树懒。这往往源于PID控制器中D(微分)和I(积分)参…...
DeckTape与竞品对比:为什么它是HTML转PDF的最佳选择
DeckTape与竞品对比:为什么它是HTML转PDF的最佳选择 【免费下载链接】decktape PDF exporter for HTML presentations 项目地址: https://gitcode.com/gh_mirrors/de/decktape DeckTape是一款高质量的HTML演示文稿PDF导出工具,基于Puppeteer构建&…...
告别ArcGIS手动操作:用Python脚本批量处理MCD12Q2植被物候数据(附完整代码)
用Python全自动处理MODIS物候数据:从HDF到生长季分析的完整解决方案 在植被物候研究中,MCD12Q2数据集因其高时间分辨率和全球覆盖能力成为不可替代的数据源。但面对动辄数十GB的HDF文件,传统ArcGIS点选操作不仅效率低下,更难以应对…...
SAP S/4HANA Cloud 公有云实施:广州企业服务商选型与落地实践
随着数字化转型的深入推进,越来越多的广州企业开始关注SAP ERP公有云解决方案。相比传统本地部署,公有云版本具有部署周期短、运维成本低、弹性扩展灵活等优势,特别适合中大型企业快速构建数字化核心能力。为什么选择SAP ERP公有云࿱…...
【Dify日志审计黄金标准】:20年SRE亲授企业级审计配置、合规留痕与实时告警闭环实践
第一章:Dify日志审计的核心价值与架构全景日志审计是保障 Dify 平台安全、可追溯与合规运行的关键能力。在 LLM 应用快速迭代与多租户共享的场景下,原始请求、提示词工程、模型调用链路、响应内容及用户操作行为均需完整记录与结构化归档,为异…...
LangChain 已老,LangGraph 当立?新一代编排框架的崛起
LangChain 已老,LangGraph 当立?新一代编排框架的崛起 元数据 标题:LangChain 已老,LangGraph 当立?新一代编排框架的崛起——从线性链到有向无环图再到循环状态机的AI应用架构革命 关键词:LLM应用编排、LangChain、LangGraph、状态机、RAG、Agent、提示工程、异步IO 摘…...
Xiaomi Cloud Tokens Extractor:解锁智能设备管理新维度的安全密钥提取工具
Xiaomi Cloud Tokens Extractor:解锁智能设备管理新维度的安全密钥提取工具 【免费下载链接】Xiaomi-cloud-tokens-extractor This tool retrieves tokens for all devices connected to Xiaomi cloud and encryption keys for BLE devices. 项目地址: https://gi…...
