【PYTHON-YOLOV8N】如何自定义数据集

【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.jpgface_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 为例:

  1. 激活虚拟环境,安装 LabelImg:

    cmd 复制代码
    activate about
    pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple
  2. 启动 LabelImg,配置标注环境:

    cmd 复制代码
    labelimg
    • 点击「Open Dir」选择 my_dataset/images/train(先标训练集);
    • 点击「Change Save Dir」选择 my_dataset/labels/train
    • 左上角「View」→ 勾选「Auto Save Mode」(自动保存标签);
    • 关键:点击「Format」→ 选择「YOLO」(切换标注格式为 YOLO)。
  3. 开始标注:

    • 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),核对 .yamlpath
标注框偏移/错位 归一化时图片宽高搞反(w/h 颠倒) 检查代码中 h, w = img.shape[:2](shape 是 (高,宽,通道))
类别预测错误 类别索引与 names 顺序不匹配 修正 .yamlnames 顺序,与标注索引一致
训练时 loss 为 NaN 标签中有无效值(如坐标>1)/图片损坏 清理无效标签/图片,重新标注

总结

自定义 YOLO 数据集的核心是「对齐格式」:

  1. 按「images/labels → train/val/test」整理文件结构;
  2. 保证标签文件的「归一化坐标 + 类别索引」符合 YOLO 规则;
  3. 编写准确的 .yaml 配置文件;
  4. 先验证再训练,减少报错概率。

小数据集(<1000张)推荐手动标注,大数据集优先用「自动标注 + 人工抽查」,既能提升效率,又能保证数据质量。

相关推荐
青蛙大侠公主2 小时前
Thread及其相关类
java·开发语言
爱吃大芒果2 小时前
Flutter 主题与深色模式:全局样式统一与动态切换
开发语言·javascript·flutter·ecmascript·gitcode
云栖梦泽2 小时前
易语言数据库操作:结构化数据管理的核心
开发语言
木头左2 小时前
LSTM量化交易策略中时间序列预测的关键输入参数分析与Python实现
人工智能·python·lstm
电子硬件笔记3 小时前
Python语言编程导论第七章 数据结构
开发语言·数据结构·python
南棱笑笑生3 小时前
20251217给飞凌OK3588-C开发板适配Rockchip原厂的Buildroot【linux-5.10】后调通ov5645【只能预览】
linux·c语言·开发语言·rockchip
ulias2123 小时前
C++ 的容器适配器——从stack/queue看
开发语言·c++
HyperAI超神经3 小时前
【vLLM 学习】Prithvi Geospatial Mae
人工智能·python·深度学习·学习·大语言模型·gpu·vllm
逻极3 小时前
Python MySQL防SQL注入实战:从字符串拼接的坑到参数化查询的救赎
python·mysql·安全·sql注入