YOLO数据集目录划分方式及对应的data.yaml配置
YOLO数据集目录划分主要有两种主流方式,每种方式对应的data.yaml文件写法有所不同。下面我将详细介绍这两种划分方式及其配置方法。
一、YOLO数据集目录划分的两种主要方式
1. 基于文件夹的划分方式(推荐)
这是最常用的划分方式,将数据集按照train/val/test分别存放在不同的子文件夹中。目录结构如下:
dataset/
├── images/
│ ├── train/ # 训练集图片
│ ├── val/ # 验证集图片
│ └── test/ # 测试集图片(可选)
└── labels/
├── train/ # 训练集标签
├── val/ # 验证集标签
└── test/ # 测试集标签(可选)
优点:
- 结构清晰,易于管理
- 图片和标签文件一一对应
- 适合大型数据集
2. 基于txt索引文件的划分方式
这种方式通过txt文件记录图片路径,不实际移动文件位置。目录结构如下:
dataset/
├── images/ # 所有图片混合存放
├── labels/ # 所有标签混合存放
├── train.txt # 记录训练集图片路径
├── val.txt # 记录验证集图片路径
└── test.txt # 记录测试集图片路径(可选)
优点:
- 不改变原始文件位置
- 适合小规模数据集或快速实验
二、data.yaml文件配置方法
1. 基于文件夹划分的data.yaml配置
# 数据集根目录(可选)
path: ../dataset
# 训练集路径(相对path或绝对路径)
train: images/train
val: images/val
test: images/test # 测试集可选
# 类别数量
nc: 2
# 类别名称列表
names: ['cat', 'dog']
关键点:
- 路径可以是相对path的相对路径,也可以是绝对路径
- YOLO会自动将
images
替换为labels
查找对应的标签文件
2. 基于txt文件划分的data.yaml配置
# 训练集txt文件路径
train: train.txt
val: val.txt
test: test.txt # 测试集可选
# 类别数量
nc: 2
# 类别名称列表
names: ['cat', 'dog']
关键点:
- txt文件中每行是图片的绝对路径
- 标签文件路径由图片路径自动推断(将images替换为labels)
三、进阶配置与注意事项
1. 多数据集组合配置
可以组合多个数据集文件夹:
train:
- ../dataset1/images/train
- ../dataset2/images/train
val: ../dataset1/images/val
nc: 2
names: ['cat', 'dog']
2. 特殊参数配置
# 是否使用缓存加速训练(需要足够内存)
cache: ram # 或disk
# 类别权重(用于不平衡数据集)
class_weights: [0.5, 1.0] # 对应names顺序
3. 注意事项
-
路径格式:
- 使用正斜杠
/
而非反斜杠\
- 避免中文路径和空格
- 使用正斜杠
-
类别顺序:
names
列表顺序必须与标注文件中的class_id一致- 从0开始连续编号
-
标签文件验证:
- 确保每个图片都有对应的标签文件
- 验证标签文件格式是否正确
-
数据集划分比例:
- 常见比例:train:val:test = 70:20:10 或 80:10:10
- 小数据集可省略test集
四、数据集划分代码示例
1. Python划分脚本示例
import os
import shutil
from sklearn.model_selection import train_test_split
# 参数设置
val_size = 0.1
test_size = 0.2
img_path = './images'
label_path = './labels'
output_dir = './dataset'
# 创建目录结构
os.makedirs(f'{output_dir}/images/train', exist_ok=True)
os.makedirs(f'{output_dir}/images/val', exist_ok=True)
os.makedirs(f'{output_dir}/images/test', exist_ok=True)
os.makedirs(f'{output_dir}/labels/train', exist_ok=True)
os.makedirs(f'{output_dir}/labels/val', exist_ok=True)
os.makedirs(f'{output_dir}/labels/test', exist_ok=True)
# 获取所有图片文件
img_files = [f for f in os.listdir(img_path) if f.endswith('.jpg')]
# 划分数据集
train, test = train_test_split(img_files, test_size=test_size, random_state=42)
train, val = train_test_split(train, test_size=val_size/(1-test_size), random_state=42)
# 复制文件到对应目录
for split, files in [('train', train), ('val', val), ('test', test)]:
for f in files:
# 复制图片
shutil.copy(f'{img_path}/{f}', f'{output_dir}/images/{split}/{f}')
# 复制标签
label_file = f.replace('.jpg', '.txt')
shutil.copy(f'{label_path}/{label_file}', f'{output_dir}/labels/{split}/{label_file}')
这个脚本会将原始数据集按比例划分到train/val/test子目录中
五、不同YOLO版本的注意事项
-
YOLOv5:
- 支持上述两种划分方式
- 推荐使用文件夹划分
-
YOLOv8:
- 新增对OBB(旋转框)的支持
- 需要额外配置角度参数
-
YOLOv7/YOLOv6:
- 基本配置与YOLOv5类似
- 注意模型配置文件差异
总结
YOLO数据集目录划分主要有文件夹划分和txt索引文件划分两种方式,对应的data.yaml配置有所不同。实际应用中,建议:
- 对于正式项目,使用文件夹划分方式,结构更清晰
- 对于快速实验,可以使用txt索引文件方式
- 始终验证数据集路径和标签文件是否正确
- 注意不同YOLO版本的特殊配置要求
通过合理的数据集划分和正确的data.yaml配置,可以确保YOLO模型训练过程顺利进行。