【PYTHON-YOLOV8N】如何自定义数据集
- 一、核心前提:明确 YOLO 数据集格式
- 二、步骤 1:整理原始数据(图片)
- 1. 文件夹结构(推荐)
- 2. 数据收集/筛选
- 三、步骤 2:标注数据(生成 YOLO 格式标签)
- 方式 1:手动标注(新手/小数据集,精准)
- 方式 2:自动标注(大数据集/快速迭代,高效)
- 四、步骤 3:编写数据集配置文件(.yaml)
- 五、步骤 4:验证数据集(避免训练报错)
- 1. 可视化验证
- 2. 基础检查项
- 六、步骤 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:
activate about pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple - 启动 LabelImg,配置标注环境:
labelimg- 点击「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),大幅减少手动工作量,示例代码(以面部表情识别为例):
fromultralyticsimportYOLOimportosimportcv2# 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. 批量标注forimg_nameinos.listdir(img_dir):ifnotimg_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"))withopen(label_path,"w",encoding="utf-8")asf:forboxinresults[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# 手动指定类别(自动标注仅标框,类别需手动/批量赋值,或结合分类模型)# 此处示例:假设当前图片是“开心”表情,类别索引为0class_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根目录),示例如下:
# 1. 数据集根目录(绝对路径/相对路径,推荐绝对路径)path:D:/projects/my_dataset# 替换为你的数据集根目录# 2. 训练/验证/测试集路径(相对于 path)train:images/trainval:images/valtest:images/test# 可选,若无测试集可注释# 3. 类别数(必须与实际标注的类别数一致)nc:3# 4. 类别名称(按索引顺序排列,与标注时的类别一一对应)names:0:happy1:sad2:angry✅ 关键检查:
path路径不能有中文/空格(避免训练时报错);nc(类别数)必须准确(如表情识别有7类则 nc=7);names的顺序必须与标注时的类别索引一致(如索引0对应happy,就不能颠倒)。
五、步骤 4:验证数据集(避免训练报错)
标注和配置完成后,先验证数据集格式是否正确,避免训练时出现「找不到标签」「类别不匹配」等问题:
1. 可视化验证
用 YOLO 自带的可视化功能检查标注框:
fromultralyticsimportYOLO# 加载预训练模型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环境后执行):
# 基础训练命令 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张)推荐手动标注,大数据集优先用「自动标注 + 人工抽查」,既能提升效率,又能保证数据质量。