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

部署运行你感兴趣的模型镜像

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

1. 数据集准备

示例数据集下载链接:PKU-Market-PCB数据集
上述地址失效,使用以下百度网盘下载:
链接:https://pan.baidu.com/s/1Cr_J97jvtnCxATfFwhE4tg?pwd=na28

1.1 标签格式转换

cursor prompt

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

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

import os
import xml.etree.ElementTree as ET
import glob

def convert_coordinates(size, box):
    """
    将XML中的边界框坐标转换为YOLO格式
    """
    dw = 1.0/size[0]
    dh = 1.0/size[1]
    
    # XML格式为 xmin, ymin, xmax, ymax
    x = (box[0] + box[2])/2.0
    y = (box[1] + box[3])/2.0
    w = box[2] - box[0]
    h = box[3] - box[1]
    
    # 归一化
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    
    return (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
            
            # 获取类别ID
            if class_name not in class_mapping:
                continue
            class_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 random

def 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_hole
  1: Mouse_bite
  2: Open_circuit
  3: Short
  4: Spur
  5: Spurious_copper

2. 训练验证

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

from ultralytics import YOLO

model = 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.9
  mosaic=1.0,
  mixup=0.0,  # S:0.05; M:0.15; L:0.15; X:0.2
  copy_paste=0.1,  # S:0.15; M:0.4; L:0.5; X:0.6
  device="0",
  workers=0,
)

# Evaluate model performance on the validation set
metrics = model.val()

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

您可能感兴趣的与本文相关的镜像

Yolo-v5

Yolo-v5

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

<think>好的,我现在需要帮助用户寻找关于YOLOv10验证集的使用或下载信息。首先,我应该确认用户的需求是什么。用户提到了YOLOv10的验证集,可能是想了解如何正确使用它,或者在哪里可以下载到相关数据集。 首先,我需要回忆现有的知识库内容。根据提供的引用,用户之前可能在使用YOLOv5和YOLOv8,现在转向YOLOv10。但根据现有引用,并没有直接提到YOLOv10的信息,特别是验证集的具体使用方法或下载链接。因此,可能需要基于现有的YOLO系列通用做法来推断YOLOv10的可能处理方式。 接下来,验证集在目标检测任务中的作用通常是调整模型参数、防止过拟合,并评估模型性能。用户可能已经知道这一点,但需要具体到YOLOv10的操作步骤。根据引用[4],数据集通常按70-15-15或80-10-10分割,这可能适用于YOLOv10的数据集划分。 然后,YOLO系列通常要求数据格式为特定的结构,比如YOLO格式的标签文件,每个图像对应一个.txt文件。用户可能需要按照这种格式准备数据,并在配置文件中指定验证集的路径。引用[2]和[3]提到了训练时的参数设置和数据准备步骤,这可能适用于YOLOv10,但需要确认是否有版本差异。 关于下载公开数据集,用户可能需要寻找现有的口罩检测数据集或其他相关数据集。引用[1]提到了口罩检测任务,可能用户之前使用过类似的数据集,但需要YOLOv10的验证集。可能需要建议用户参考公开数据集如COCO、VOC或自定义数据集,并按照YOLO格式转换。 另外,用户可能需要官方文档或GitHub资源。虽然现有引用中没有YOLOv10的具体信息,但可以推测其与YOLOv5或v8的使用方法类似。建议用户查看YOLOv10的官方文档,了解数据配置的具体参数,如data.yaml中的验证集路径设置,如引用[3]中提到的步骤。 此外,数据增强和预处理可能在验证阶段有所不同,如不需要增强,仅进行标准化。用户需要注意验证时的参数设置,如batch size和是否启用augment,如引用[2]中的训练参数可能相关。 最后,用户可能遇到问题,如验证集指标不佳,需要检查数据标注或划分是否正确。可能需要建议用户确保数据集划分正确,路径配置无误,并参考社区资源或论坛寻求帮助。 总结来说,虽然没有直接的YOLOv10验证集信息,但基于YOLO系列通用方法和现有引用,可以给出数据准备、配置、使用步骤,并推荐查阅官方文档和公开数据集资源。</think>关于YOLOv10验证集的使用与获取,以下是系统化的解决方案: ### 一、YOLOv10验证集通用处理原则 1. **数据集划分要求** YOLOv10延续了YOLO系列的数据划分标准,建议按照$80\text{-}10\text{-}10$或$70\text{-}15\text{-}15$比例分割训练集/验证集/测试集[^4]。验证集的主要作用是: - 调整超参数(如学习率、权重衰减系数) - 监控模型是否过拟合 - 评估中间训练结果 2. **数据格式规范** 需确保验证集符合YOLO格式要求: ```plaintext dataset/ ├── images/ │ ├── train/ │ └── val/ # 验证集图片 └── labels/ ├── train/ └── val/ # 验证集标注文件(.txt) ``` 每个标注文件格式为:`<class_id> <x_center> <y_center> <width> <height>`,坐标需归一化 ### 、具体实施步骤 #### (一)使用公开数据集 1. **标准数据集验证** 推荐使用以下预标注数据集- COCO val2017(官方基准测试集) 下载地址:`https://cocodataset.org/#download` - Pascal VOC 2012验证集 通过`torchvision.datasets.VOCDetection`可直接加载 2. **口罩检测专用数据** 可复用已有口罩检测数据集(如引用[1]所述项目数据),按比例划分验证集: ```python from sklearn.model_selection import train_test_split train_files, val_files = train_test_split(all_files, test_size=0.1, random_state=42) ``` #### ()自定义数据集处理 1. **配置数据参数** 在`data.yaml`中明确指定验证集路径: ```yaml val: ../dataset/images/val val_labels: ../dataset/labels/val ``` 2. **验证阶段执行命令** 使用官方提供的验证脚本: ```shell python val.py --data data.yaml --weights yolov10n.pt --batch 16 ``` 关键参数说明: - `--task`:指定验证模式(speed/accuracy) - `--augment`:禁用数据增强(验证阶段建议关闭) ### 三、典型问题解决方案 | 问题现象 | 排查方向 | 工具方法 | |---------|----------|---------| | 验证指标异常波动 | 数据泄露检查 | 使用`hashlib`校验训练/验证集文件MD5值 | | 验证速度过慢 | 数据加载优化 | 启用`--workers 8 --cache ram`参数 | | 验证mAP低于预期 | 标注质量检测 | 通过`labelImg`工具随机抽样检查标注文件 | ### 四、进阶实践建议 1. **动态验证策略** 推荐在训练过程中启用**跨阶段验证**: ```python # 在train.py中设置验证频率 parser.add_argument('--val-interval', type=int, default=2, help='每2个epoch执行一次完整验证') ``` 2. **多维度评估** 建议同时关注以下指标: $$ mAP_{0.5:0.95} = \frac{1}{10}\sum_{t=0.5}^{0.95} AP_t $$ 使用官方评估脚本生成混淆矩阵和PR曲线: ```shell python val.py --plots ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只云卷云舒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值