【持续更新】WT-YOLO数据集配置与目录划分
本文将根据笔者实际经验来介绍YOLO数据集配置与目录划分,包括数据集配置文件dataset.yaml的详细解析,如有错误,欢迎评论区指正。
一、第一种:全面的文件目录框架
全面的YOLO项目目录框架,可支持使用多种数据集、训练多种模型。对于部署大型训练项目使用,不再赘述。
yolovX/ # YOLO 项目的根目录
├── data/ # 数据集相关文件
│ ├── datasets/ # 数据集存储目录
│ │ ├── coco/ # COCO 数据集
│ │ ├── voc/ # VOC 数据集
│ │ └── custom/ 自 #定义数据集
│ │ ├── images/ # 图像文件
│ │ │ ├── train/ # 训练集图像
│ │ │ ├── val/ # 验证集图像
│ │ │ └── test/ # 测试集图像
│ │ └── labels/ # 标签文件
│ │ ├── train/ # 训练集标签
│ │ ├── val/ # 验证集标签
│ │ └── test/ # 测试集标签
│ ├── configs/ # 数据集配置文件
│ │ ├── coco.yaml # COCO 数据集配置
│ │ ├── voc.yaml # VOC 数据集配置
│ │ └── custom.yaml # 自定义数据集配置
│ └── weights/ # 预训练权重文件
│ ├── yolovX_coco.pt # 在 COCO 数据集上预训练的权重
│ └── yolovX_custom.pt # 在自定义数据集上训练的权重
├── models/ # 模型定义和配置
│ ├── yolovX.py # YOLO 模型定义
│ ├── backbone.py # 主干网络(如 CSPDarknet)
│ ├── neck.py # Neck 模块(如 PANet)
│ └── head.py # Head 模块(如 YOLOHead)
├── utils/ # 工具函数
│ ├── datasets.py # 数据集加载和处理
│ ├── general.py # 通用工具函数(如 NMS、非极大值抑制)
│ ├── losses.py # 损失函数
│ ├── metrics.py # 评估指标(如 mAP)
│ ├── plots.py # 可视化工具
│ └── torch_utils.py # PyTorch 相关工具
├── runs/ # 训练和推理结果
│ ├── train/ # 训练结果
│ │ ├── exp0/ # 第一次实验
│ │ ├── exp1/ # 第二次实验
│ │ └── ...
│ └── detect/ # 推理结果
│ ├── exp0/ # 第一次推理
│ ├── exp1 / # 第二次推理
│ └── ...
├── scripts/ # 脚本文件
│ ├── train.py # 训练脚本
│ ├── val.py # 验证脚本
│ ├── detect.py # 推理脚本
│ └── export.py # 导出模型脚本(如 ONNX、TensorRT)
├── requirements.txt # 项目依赖
├── README.md # 项目说明
└── main.py # 主程序入口
二、第二种:单项目目录框架
笔者使用,主要用于单数据集的小型项目,以下两种划分方式都可以训练,本质没什么不同,主要看谁更有结构性或者看自己的偏好。
2.1 框架1
2.1.1 目录划分1
#WTYOLO训练模型目录框架25-04-13 目录划分一
yolovX/ # YOLO 项目的根目录
├── datasets/ # 数据集相关文件
│ ├── images/ # 图像文件(JPG)
│ │ ├── train/ # 训练集图像
│ │ ├── val/ # 验证集图像
│ │ └── test/ # 测试集图像
│ ├── labels/ # 标签文件(txt格式)
│ │ ├── train/ # 训练集标签
│ │ ├── val/ # 验证集标签
│ │ └── test/ # 测试集标签
│ ├── dataset.yaml # 自定义数据集配置
│ │
│ └── weights/ # 预训练权重文件
│ ├── yolovX.pt # 在官网数据集上预训练的权重
│ └── yolovX_yours.pt # 在自定义数据集上训练的权重
│
├── models/ # 模型定义和配置以及输出训练模型目录
│ ├── yolovX.py # YOLO 模型定义
│ ├── backbone.py # 主干网络(如 CSPDarknet)
│ ├── neck.py # Neck 模块(如 PANet)
│ ├── your_trained_model.py # 已训练模型
│ └── head.py # Head 模块(如 YOLOHead)
│
├── utils/ # 工具函数(可选)
│ ├── datasets.py # 数据集加载和处理
│ ├── general.py # 通用工具函数(如 NMS、非极大值抑制)
│ ├── losses.py # 损失函数
│ ├── metrics.py # 评估指标(如 mAP)
│ ├── plots.py # 可视化工具
│ └── torch_utils.py # PyTorch 相关工具
│
├── runs/ # 训练和推理结果(自动生成)
│ ├── train/ # 训练结果
│ │ ├── exp0/ # 第一次实验
│ │ ├── exp1/ # 第二次实验
│ │ └── ...
│ └── detect/ # 推理结果
│ ├── exp0/ # 第一次推理
│ ├── exp1 / # 第二次推理
│ └── ...
│
├── requirements.txt # 项目依赖
├── README.md # 项目说明
├── train.py # 训练脚本
├── val.py # 验证脚本
├── detect.py # 推理脚本
├── export.py # 导出模型脚本(如 ONNX、TensorRT)
├── more # 更多自定义脚本或目录
2.1.2 对应的数据集配置文件dataset.yaml
path: ../datasets
train: images/train
val: images/val
test: images/test
nc: n
names:
0: class1
1: class2
2: class3
3: ...
4: classn
解释:
path: ../datasets
解析:配置数据集根目录(可选),但如果不设置该选项,系统会自动调用上一次训练的数据集(如果有的话),前一次训练的数据集配置结果会保存在'/root/.config/Ultralytics/settings.yaml'中,从而导致新的数据集训练调用旧的数据集而发生一些错误,所以建议配置该选项。可使用相对目录,如果要保证万无一失,建议使用绝对目录引用他人的话:“这是数据集的路径,相对于代码的根目录;如果没有这个参数,则默认当前路径,也就是代码根目录”
笔者注:在 YOLO 的 dataset.yaml
配置文件中,训练图像路径前加 ../
是为了表示相对路径,详见另一篇文章YOLO 的 data.yaml 配置文件路径解析-CSDN博客。
-
../
表示返回当前目录的上一级目录,因为dataset.yaml在datasets目录下,要从当前目录索引datatsets文件夹,首先要返回到上级目录再索引datatsets。 -
这种路径配置方式使得项目结构更加灵活,方便在不同环境下迁移项目
train: images/train
val: images/val
test: images/test解析:该三项为数据集的图片和标签目录指向,在实际训练过程中,YOLO会自动将‘images’替换为‘labels’来索引图片对应的标签文件,所以不需要重复设置‘labels’的目录
nc: n
names:
0: class1
1: class2
2: class3
3: ...
4: classn
解析:nc是 "number of classes" 的缩写,表示数据集中类别的数量。这个参数用于定义模型需要检测的目标类别总数,names字段用来指定目标检测类别的名称列表。该字段是一个 Python 列表形式,按照索引顺序对应标注中的类别 ID,有两种写法,一种就是如上展示的形式,另一种是列表形式,如下:names: ['class1', 'class2', 'class3',...,'classn']
2.2 框架2
2.2.1目录划分2
#WTYOLO训练模型目录框架25-04-13 目录划分一
yolovX/ # YOLO 项目的根目录
├── datasets/ # 数据集相关文件
│ ├── train/ # 训练集
│ │ ├── images/ # 训练集图像(JPG)
│ │ └── labels/ # 训练集标签(txt)
│ ├── val/ # 验证集
│ │ ├── images/ # 验证集图像(JPG)
│ │ └── labels/ # 验证集标签(txt)
│ ├── test/ # 测试集
│ │ ├── images/ # 测试集图像(JPG)
│ │ └── labels/ # 测试集标签(txt)
│ ├── dataset.yaml # 自定义数据集配置(定义路径和分类相关)
│ │
│ └── weights/ # 预训练权重文件
│ ├── yolovX.pt # 在官网数据集上预训练的权重
│ └── yolovX_yours.pt # 在自定义数据集上训练的权重
│
├── models/ # 模型定义和配置以及输出训练模型目录
│ ├── yolovX.py # YOLO 模型定义
│ ├── backbone.py # 主干网络(如 CSPDarknet)
│ ├── neck.py # Neck 模块(如 PANet)
│ ├── your_trained_model.py # 已训练模型
│ └── head.py # Head 模块(如 YOLOHead)
│
├── utils/ # 工具函数(可选)
│ ├── datasets.py # 数据集加载和处理
│ ├── general.py # 通用工具函数(如 NMS、非极大值抑制)
│ ├── losses.py # 损失函数
│ ├── metrics.py # 评估指标(如 mAP)
│ ├── plots.py # 可视化工具
│ └── torch_utils.py # PyTorch 相关工具
│
├── runs/ # 训练和推理结果(自动生成)
│ ├── train/ # 训练结果
│ │ ├── exp0/ # 第一次实验
│ │ ├── exp1/ # 第二次实验
│ │ └── ...
│ └── detect/ # 推理结果
│ ├── exp0/ # 第一次推理
│ ├── exp1 / # 第二次推理
│ └── ...
│
├── requirements.txt # 项目依赖
├── README.md # 项目说明
├── train.py # 训练脚本
├── val.py # 验证脚本
├── detect.py # 推理脚本
├── export.py # 导出模型脚本(如 ONNX、TensorRT)
└── more # 更多自定义脚本或目录
2.2.2 对应的dataset.yaml文件
train: ../train/images
val: ../valid/images
test: ../test/images
nc: n
names: ['class1', 'class2', 'class3',...,'classn']
dataset.yaml文件解析如2.1.2说明。
三、YOLO txt标签文件解析
YOLO 标签文件用于标注图像中的目标对象,格式如下:
- 每行代表一个目标对象,包含类别编号和边界框坐标。
- 格式为:
<class_id> <x_center> <y_center> <width> <height>
。 <class_id>
:目标类别,从 0 开始编号,与data.yaml
文件中的names
对应。<x_center>
和<y_center>
:目标框中心点的 x 和 y 坐标(相对于图像的宽度和高度),值的范围是 0 到 1。<width>
和<height>
:目标框的宽度和高度(相对于图像的宽度和高度),值的范围是 0 到 1。
标签文件的命名通常与图像文件名相对应,例如图像文件名为 image.jpg
,则标签文件名为 image.txt
。标签文件所在文件夹与图像文件夹同级,通常命名为 labels
。
在配置数据集时,需要在 data.yaml
文件中指定训练集、验证集、测试集的路径,以及类别数量和类别名称列表。例如:
train: images/train
val: images/val
test: images/test
nc: 2
names: ['cat', 'dog']
其中,train
、val
和 test
分别指向训练集、验证集和测试集的图像文件夹,nc
表示类别数量,names
是一个列表,包含数据集中所有类别的名称。一个txt标签文件的实例如下:
0 0.4192685102586976 0.06182933060807358 0.8144513826940232 0.31016862544711293
1 0.03568242640499554 0.44966785896780787 0.5325602140945584 0.5958099131323454
0 0.13648528099910795 0.39141543178334187 0.23015165031222123 0.44915687276443533
0 0.41570026761819806 0.3127235564639755 0.5316681534344335 0.4471129279509453
2 0.27029438001784123 0.656617271333674 0.8911685994647636 0.771078180889116
0 0.2943800178412132 0.8640776699029126 0.8920606601248885 0.9151762902401636
0 0.4041034790365745 0.7751660705160961 0.8893844781445138 0.8630556974961676
0 0.34611953612845675 0.774144098109351 0.4023193577163247 0.801226366888094
1 0.9063336306868867 0.3321410321921308 0.9625334522747547 0.7874297393970363
0 0.4005352363960749 0.5993868165559529 0.8938447814451382 0.655595298926929
0 0.5343443354148082 0.3137455288707205 0.8911685994647636 0.5973428717424629
1 0.03568242640499554 0.08686765457332651 0.2247992863514719 0.13336739908022482
0 0.12845673505798394 0.03372508942258559 0.22390722569134702 0.0858456821665815
2 0.3951828724353256 0.38988247317322433 0.41391614629794826 0.44864588656106286
四、关于YOLO settings的一些设置
配置settings,在train.py中引入settings模块进行配置。
from ultralytics import YOLO
from ultralytics import settings
# 设置模块配置说明
# settings模块用于管理YOLO训练时的全局配置项
# update()方法可更新运行目录、tensorboard集成等设置
# reset()方法可将所有设置恢复默认值
settings.update({'datasets_dir': 'datasets'})
# 将设置恢复为默认值
settings.reset()
# 初始化YOLOv8模型(加载预训练权重)
# 初始化YOLOv8模型
# 加载预训练的YOLOv8n模型(nano版本)
# 支持更换不同尺寸模型:s(small), m(medium), l(large), x(extra large)
打印settings
from ultralytics import settings
# View all settings
print(settings)
# Return a specific setting
#value = settings['runs_dir']
五、补充更新一:nc参数缺省说明(25/4/13)
在 YOLO 数据集配置文件中,有些案例使用了类别名称的字典格式,但在配置文件中不在包含"nc"参数,这里说明一下,即使使用了类别名称的字典格式,仍然建议明确指定 nc
参数(类别数量)。这是因为 nc
参数明确告诉模型类别总数,而字典格式的 names
虽然可以推断出类别数量,但并不是所有 YOLO 实现都支持这种格式。
5.1 nc参数非却省原因
- 明确性:
nc
参数明确指定了类别数量,避免了潜在的误解或错误。 - 兼容性:某些 YOLO 实现可能不支持字典格式的
names
,明确指定nc
可以确保兼容性。 - 一致性:YOLO 的官方实现通常使用列表格式的
names
,明确指定nc
可以保持与官方实现的一致性。
5.2 示例说明
以下是一个使用字典格式的 names
的配置文件示例,同时明确指定了 nc
参数:
path: ../datasets # 数据集根目录(可选)
train: images/train # 训练集图像路径
val: images/val # 验证集图像路径
test: images/test # 测试集图像路径(可选)
nc: 5 # 类别数量
names:
0: class1
1: class2
2: class3
3: class4
4: class5
5.3 示例总结
- 建议明确指定
nc
参数:即使使用字典格式的names
,仍然建议明确指定nc
参数以确保明确性和兼容性。 - 避免潜在问题:某些 YOLO 实现可能不支持字典格式的
names
,明确指定nc
可以避免潜在问题。 - 保持一致性:与 YOLO 的官方实现保持一致,通常使用列表格式的
names
并明确指定nc
参数。
N、更多内容【持续更新本文档】
更多内容待笔者进一步探索后更新分享
……