【PYTHON-YOLOV8N】如何自定义数据集
-
-
- [一、核心前提:明确 YOLO 数据集格式](#一、核心前提:明确 YOLO 数据集格式)
- [二、步骤 1:整理原始数据(图片)](#二、步骤 1:整理原始数据(图片))
-
- [1. 文件夹结构(推荐)](#1. 文件夹结构(推荐))
- [2. 数据收集/筛选](#2. 数据收集/筛选)
- [三、步骤 2:标注数据(生成 YOLO 格式标签)](#三、步骤 2:标注数据(生成 YOLO 格式标签))
-
- [方式 1:手动标注(新手/小数据集,精准)](#方式 1:手动标注(新手/小数据集,精准))
- [方式 2:自动标注(大数据集/快速迭代,高效)](#方式 2:自动标注(大数据集/快速迭代,高效))
- [四、步骤 3:编写数据集配置文件(.yaml)](#四、步骤 3:编写数据集配置文件(.yaml))
- [五、步骤 4:验证数据集(避免训练报错)](#五、步骤 4:验证数据集(避免训练报错))
-
- [1. 可视化验证](#1. 可视化验证)
- [2. 基础检查项](#2. 基础检查项)
- [六、步骤 5:使用自定义数据集训练 YOLOv8](#六、步骤 5:使用自定义数据集训练 YOLOv8)
- 七、常见问题与解决方案
- 总结
-
自定义适配 YOLO(以 YOLOv8 为例)的数据集是训练专属模型(如面部表情识别、特定目标检测)的核心步骤,核心遵循「数据整理 → 格式标注 → 配置文件编写 → 数据集划分」四步流程,以下是详细、可落地的操作指南:
一、核心前提:明确 YOLO 数据集格式
YOLO 要求数据集为「图片 + 标签文件」的一对一结构,且标签需满足归一化坐标格式,先明确规则:
| 文件类型 | 要求 |
|---|---|
| 图片文件 | 格式:JPG/PNG/BMP 等;命名:建议数字/字母(如 001.jpg、face_002.png) |
| 标签文件 | 1. 与图片同名,后缀为 .txt(如 001.txt 对应 001.jpg); 2. 每行格式:类别索引 归一化x中心 归一化y中心 归一化宽度 归一化高度; 3. 无标注的图片无需创建 .txt 文件 |
| 类别索引 | 从 0 开始连续编号(如表情识别:0=开心,1=悲伤,2=愤怒...) |
| 归一化坐标 | 坐标值范围 0~1,公式: x中心 = (x1 + x2)/2 / 图片宽度 y中心 = (y1 + y2)/2 / 图片高度 宽度 = (x2 - x1)/图片宽度 高度 = (y2 - y1)/图片高度 (x1,y1 是框左上角,x2,y2 是框右下角) |
二、步骤 1:整理原始数据(图片)
1. 文件夹结构(推荐)
先按「用途」划分数据集,创建统一的根目录(如 my_dataset),结构如下:
my_dataset/
├── images/ # 所有图片存放目录
│ ├── train/ # 训练集图片(占总数据 70~80%)
│ │ ├── 001.jpg
│ │ ├── 002.jpg
│ │ └── ...
│ ├── val/ # 验证集图片(占 10~15%)
│ └── test/ # 测试集图片(占 10~15%,可选)
└── labels/ # 所有标签文件存放目录(与 images 结构完全对应)
├── train/
│ ├── 001.txt
│ ├── 002.txt
│ └── ...
├── val/
└── test/
2. 数据收集/筛选
- 来源:自己拍摄、公开数据集(如 FER2013 表情、VOC/COCO 目标检测)、网络爬取;
- 筛选:删除模糊、无目标、重复的图片,保证数据质量;
- 统一尺寸(可选):若图片尺寸差异大,可批量缩放到统一尺寸(如 640×640),减少训练时的尺寸适配成本。
三、步骤 2:标注数据(生成 YOLO 格式标签)
标注是核心环节,分「手动标注」和「自动标注」两种方式,按需选择:
方式 1:手动标注(新手/小数据集,精准)
用之前提到的 LabelImg/Labelme 工具,以 LabelImg 为例:
-
激活虚拟环境,安装 LabelImg:
cmdactivate about pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple -
启动 LabelImg,配置标注环境:
cmdlabelimg- 点击「Open Dir」选择
my_dataset/images/train(先标训练集); - 点击「Change Save Dir」选择
my_dataset/labels/train; - 左上角「View」→ 勾选「Auto Save Mode」(自动保存标签);
- 关键:点击「Format」→ 选择「YOLO」(切换标注格式为 YOLO)。
- 点击「Open Dir」选择
-
开始标注:
- 按
W调出标注框,拖动鼠标框选目标(如人脸); - 输入类别名称(如
happy),LabelImg 会自动映射为类别索引(需提前在predefined_classes.txt中配置类别列表,避免拼写错误); - 按
D切换下一张图片,重复标注。
- 按
详细的用法可以参考篇文章:https://blog.csdn.net/knighthood2001/article/details/125883343
方式 2:自动标注(大数据集/快速迭代,高效)
用 YOLO 预训练模型自动标注(如人脸检测用 yolov8n-face.pt,通用目标用 yolov8n.pt),大幅减少手动工作量,示例代码(以面部表情识别为例):
python
from ultralytics import YOLO
import os
import cv2
# 1. 配置路径
img_dir = "my_dataset/images/train" # 待标注图片目录
label_dir = "my_dataset/labels/train" # 标签保存目录
os.makedirs(label_dir, exist_ok=True)
# 2. 加载预训练模型(按需选择:人脸/通用目标)
model = YOLO("yolov8n-face.pt") # 人脸检测模型(表情识别先标人脸框)
# 3. 类别映射(根据你的需求定义,如表情:0=开心,1=悲伤,2=愤怒)
emotion_mapping = {"happy": 0, "sad": 1, "angry": 2}
# 4. 批量标注
for img_name in os.listdir(img_dir):
if not img_name.endswith((".jpg", ".png")):
continue
# 读取图片
img_path = os.path.join(img_dir, img_name)
img = cv2.imread(img_path)
h, w = img.shape[:2] # 图片宽高(用于坐标归一化)
# 模型预测(检测目标,如人脸)
results = model(img, conf=0.5) # conf=0.5 过滤低置信度框
# 生成标签文件
label_path = os.path.join(label_dir, img_name.replace(".jpg", ".txt"))
with open(label_path, "w", encoding="utf-8") as f:
for box in results[0].boxes:
# 提取像素坐标(x1,y1,x2,y2)
x1, y1, x2, y2 = box.xyxy.cpu().numpy()[0]
# 转换为YOLO归一化坐标
x_center = (x1 + x2) / 2 / w
y_center = (y1 + y2) / 2 / h
width = (x2 - x1) / w
height = (y2 - y1) / h
# 手动指定类别(自动标注仅标框,类别需手动/批量赋值,或结合分类模型)
# 此处示例:假设当前图片是"开心"表情,类别索引为0
class_idx = 0
# 写入标签文件(保留6位小数)
f.write(f"{class_idx} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n")
⚠️ 注意:自动标注后需抽查 10~20% 的标签,修正错误/漏标,保证数据质量。
四、步骤 3:编写数据集配置文件(.yaml)
YOLO 训练时需通过 .yaml 文件读取数据集路径和类别信息,创建 my_dataset.yaml(放在 my_dataset 根目录),示例如下:
yaml
# 1. 数据集根目录(绝对路径/相对路径,推荐绝对路径)
path: D:/projects/my_dataset # 替换为你的数据集根目录
# 2. 训练/验证/测试集路径(相对于 path)
train: images/train
val: images/val
test: images/test # 可选,若无测试集可注释
# 3. 类别数(必须与实际标注的类别数一致)
nc: 3
# 4. 类别名称(按索引顺序排列,与标注时的类别一一对应)
names:
0: happy
1: sad
2: angry
✅ 关键检查:
path路径不能有中文/空格(避免训练时报错);nc(类别数)必须准确(如表情识别有7类则 nc=7);names的顺序必须与标注时的类别索引一致(如索引0对应happy,就不能颠倒)。
五、步骤 4:验证数据集(避免训练报错)
标注和配置完成后,先验证数据集格式是否正确,避免训练时出现「找不到标签」「类别不匹配」等问题:
1. 可视化验证
用 YOLO 自带的可视化功能检查标注框:
python
from ultralytics import YOLO
# 加载预训练模型
model = YOLO("yolov8n.pt")
# 验证数据集(可视化前5张训练集图片)
results = model.val(data="my_dataset/my_dataset.yaml", split="train", save_json=False, plots=True)
# 运行后会在 runs/val 目录生成可视化图片,查看标注框是否与目标匹配
2. 基础检查项
- 图片和标签数量是否对应(训练集图片数 = 训练集标签数,无标注的图片除外);
- 标签文件中是否有超出 0~1 范围的坐标(归一化错误);
.yaml文件的path和类别信息是否正确。
六、步骤 5:使用自定义数据集训练 YOLOv8
验证无误后,即可用自定义数据集训练模型,命令如下(激活 about 环境后执行):
cmd
# 基础训练命令
yolo detect train model=yolov8n.pt data=my_dataset/my_dataset.yaml epochs=50 batch=16 imgsz=640 device=cpu
参数说明:
model=yolov8n.pt:用 YOLOv8 nano 轻量化模型(新手推荐,训练快);data=...:指定你的数据集配置文件路径;epochs=50:训练轮数(小数据集可设 30~50,大数据集设 100+);batch=16:批次大小(CPU 训练设 8/16,GPU 可设 32/64);imgsz=640:输入图片尺寸(与标注时的图片尺寸匹配);device=cpu:无 GPU 则用 CPU,有 GPU 改device=0。
七、常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 训练时报「找不到标签文件」 | 图片和标签文件名不一致/路径配置错误 | 检查文件名(如 001.jpg ↔ 001.txt),核对 .yaml 的 path |
| 标注框偏移/错位 | 归一化时图片宽高搞反(w/h 颠倒) | 检查代码中 h, w = img.shape[:2](shape 是 (高,宽,通道)) |
| 类别预测错误 | 类别索引与 names 顺序不匹配 |
修正 .yaml 的 names 顺序,与标注索引一致 |
| 训练时 loss 为 NaN | 标签中有无效值(如坐标>1)/图片损坏 | 清理无效标签/图片,重新标注 |
总结
自定义 YOLO 数据集的核心是「对齐格式」:
- 按「images/labels → train/val/test」整理文件结构;
- 保证标签文件的「归一化坐标 + 类别索引」符合 YOLO 规则;
- 编写准确的
.yaml配置文件; - 先验证再训练,减少报错概率。
小数据集(<1000张)推荐手动标注,大数据集优先用「自动标注 + 人工抽查」,既能提升效率,又能保证数据质量。