YOLO 的 data.yaml
配置文件用于定义数据集的结构和类别信息。这里列出几种常见的写法和示例,在正式训练时需要根据实际需求正确配置 data.yaml
文件。
1. 基础配置(相对路径)
这是最常见的写法,使用相对路径来指定训练集、验证集和测试集的路径。
# 数据集根目录(可选)
path: ../datasets # 相对于当前文件的路径
# 训练、验证和测试集的路径(相对于 path)
train: images/train # 训练集图像路径
val: images/val # 验证集图像路径
test: images/test # 测试集图像路径(可选)
# 类别数量
nc: 5 # 假设有 5 个类别
# 类别名称列表
names: ['class1', 'class2', 'class3', 'class4', 'class5']
2. 使用绝对路径
如果项目需要在不同环境中运行,可以使用绝对路径来指定数据集的位置。
# 绝对路径
train: /absolute/path/to/train/images # 训练集图像路径
val: /absolute/path/to/val/images # 验证集图像路径
test: /absolute/path/to/test/images # 测试集图像路径(可选)
nc: 5 # 类别数量
names: ['class1', 'class2', 'class3', 'class4', 'class5'] # 类别名称
3. 多数据集配置
如果需要同时使用多个数据集(例如,分别训练和验证),可以在 train
和 val
中指定多个路径。
# 多数据集配置
train:
- /path/to/dataset1/train/images # 数据集 1 的训练集
- /path/to/dataset2/train/images # 数据集 2 的训练集
val:
- /path/to/dataset1/val/images # 数据集 1 的验证集
- /path/to/dataset2/val/images # 数据集 2 的验证集
test: /path/to/test/images # 测试集路径(可选)
nc: 5 # 类别数量
names: ['class1', 'class2', 'class3', 'class4', 'class5'] # 类别名称
4. 无测试集的配置
如果项目中没有测试集,可以省略 test
字段。
path: ../datasets # 数据集根目录(可选)
train: images/train # 训练集路径
val: images/val # 验证集路径
nc: 5 # 类别数量
names: ['class1', 'class2', 'class3', 'class4', 'class5'] # 类别名称
5. 类别名称的字典格式(不推荐)
虽然 YOLO 通常使用列表格式定义类别名称,但某些版本可能支持字典格式。不过,建议使用列表格式以确保兼容性。
path: ../datasets
train: images/train
val: images/val
nc: 5
names:
0: class1
1: class2
2: class3
3: class4
4: class5
注意事项
- 路径的正确性:确保路径正确指向图像文件夹。如果使用相对路径,
path
字段是相对于data.yaml
文件的位置。 - 类别数量和名称匹配:
nc
的值必须与names
列表的长度一致。 - 缩进和格式:YAML 文件对缩进和格式非常敏感,确保使用正确的缩进(通常为 2 个空格)。
- 测试集可选:
test
字段是可选的,如果项目中没有测试集,可以省略。
示例项目结构
假设你的项目结构如下:
yolovX/
├── data/
│ └── datasets/
│ ├── images/
│ │ ├── train/
│ │ ├── val/
│ │ └── test/
│ └── labels/
│ ├── train/
│ ├── val/
│ └── test/
└── configs/
└── data.yaml
对应的 data.yaml
文件可以这样写:
path: ../datasets # 数据集根目录
train: images/train # 训练集图像路径
val: images/val # 验证集图像路径
test: images/test # 测试集图像路径
nc: 5 # 类别数量
names: ['class1', 'class2', 'class3', 'class4', 'class5'] # 类别名称
总而言之
- 使用相对路径更灵活,便于项目迁移。
- 确保
nc
和names
的值匹配。 - 如果有多个数据集,可以在
train
和val
中指定多个路径。 - 避免使用字典格式定义类别名称,建议使用列表格式。