告别「跑 Demo 选手」:YOLOv8 手把手教你训练自定义数据集(纯新手友好,全程无坑)

348 阅读18分钟

核心定位:从「只会跑官方图片检测 Demo」到「能训练自己的专属模型」,这是你真正入门 YOLO 的核心一步。本文全程保姆级教学,所有步骤、代码、踩坑点都给你讲透,零基础也能一次成功,你只需要跟着做就行!前置说明:本文沿用最适合新手的 YOLOv8 (Ultralytics),也是目前工业界最主流的版本,API 封装完善、训练逻辑简洁、对新手极其友好。

一、先搞懂核心认知:为什么要「训练自定义数据集」?

我们之前跑的 YOLO Demo,用的是官方预训练模型(yolov8n.pt/yolov8s.pt) ,这些模型是用 COCO 数据集 训练的,只能识别 80 类常见物体(人、车、猫、狗、杯子等)。

但实际开发中,你大概率需要检测自定义目标:比如「安全帽 / 反光衣」「口罩佩戴」「水果分类」「缺陷产品」「车牌」「无人机」等,这些都是 COCO 数据集里没有的类别。

✅ 核心结论:自定义训练 = 让 YOLO 模型「学习新的识别能力」,学会识别你需要的专属目标,训练完成后得到的模型,只对你的业务场景精准有效!


二、前置准备(无需额外配置,复用之前环境)

✅ 环境要求(已满足,无需重新配置)

我们上篇搭建的 yolo8 conda 环境(Python3.10 + ultralytics)完全够用,所有训练依赖都已经装好,无需再装任何库,直接激活环境即可:

bash

运行

conda activate yolo8

✅ 核心认知铺垫(必看,避免盲目操作)

1. 自定义训练的核心逻辑(3 句话讲透)

YOLOv8 的自定义训练用的是 迁移学习 (Transfer Learning) ,不是从零开始训练,这也是新手能快速出结果的关键:

  • 第一步:站在巨人肩膀上,加载官方预训练模型的「通用特征提取能力」(比如识别物体的轮廓、纹理);
  • 第二步:用我们自己的「自定义数据集」微调模型,让模型只学习「我们需要的目标类别」;
  • 第三步:训练完成后,得到一个「专属权重文件」,用这个文件就能精准检测你的自定义目标。

为什么不用从零训?从零训练需要几十万张图片 + 几天的 GPU 算力,迁移学习只需要几十 / 几百张图片 + 几分钟训练,效果还更好!

2. 数据集的「黄金规则」(训练成败的核心,重中之重)

YOLO 训练的本质是「喂数据给模型学习」,数据的质量和规范,决定了你训练模型的最终效果,比调参更重要!所有新手训练失败,90% 的原因都是「数据集没做好」,记住这 3 条铁律:

  1. 训练的核心是:图片 + 对应的标注文件,缺一不可;
  2. YOLO 模型只认 【YOLO 格式】 的标注,其他格式(VOC/XML)都不支持;
  3. 数据集必须严格按照指定的目录结构存放,YOLOv8 会自动读取,路径错一点就报错。

三、核心步骤一:制作「YOLO 格式」的自定义数据集(最关键步骤)

这是本文的核心重点,也是新手最容易卡壳的地方。整个数据集制作分「准备图片→标注目标→规范整理」3 步,每一步都给你写死操作流程,无脑跟着做就行。

3.1 第一步:准备你的原始图片(简单)

✅ 图片要求(新手友好,无严格限制)

  1. 图片内容:只需要包含你要检测的自定义目标即可,比如要检测「安全帽」,就拍工地工人戴安全帽 / 不戴安全帽的图片;要检测「口罩」,就拍人脸戴口罩 / 不戴口罩的图片。
  2. 数量要求:新手入门,最少准备 50~200 张即可(越多越好,比如 200 张图片训练出来的效果就很稳了),不用追求几千张。
  3. 格式 / 尺寸:支持 jpg/png 格式,尺寸随意(手机拍的 1080P、电脑截图都可以),YOLO 会自动缩放适配,不用手动裁剪。
  4. 多样性:尽量多拍不同角度、不同背景、不同光照的图片(比如安全帽在阳光下 / 阴影里、正面 / 侧面),能大幅提升模型泛化能力。

✅ 操作

新建一个文件夹,命名为 my_dataset,把所有准备好的图片统一放进去,图片命名建议:img_001.jpg、img_002.jpg... 简单规范即可。

3.2 第二步:给图片「标注目标」,生成 YOLO 格式标注文件

标注的本质:告诉模型「图片里哪里有目标、这个目标是什么类别」。比如你标注「安全帽」,就是在图片里框出安全帽的位置,然后给这个框打上「安全帽」的标签,模型会通过这些标注学习特征。

✅ 推荐标注工具:LabelImg(新手首选,免费、极简、无门槛)

这是所有 YOLO 新手的标配标注工具,纯可视化操作,不用写代码,一键生成 YOLO 格式标注文件,必须用这个,别选其他复杂工具

✔️ 步骤 1:安装 LabelImg

在激活的 yolo8 环境里,一行命令安装:

bash

运行

pip install labelImg -i https://pypi.tuna.tsinghua.edu.cn/simple
✔️ 步骤 2:打开 LabelImg,配置标注格式为「YOLO」(关键!)
  1. 终端输入命令启动工具:

    bash

    运行

    labelImg
    
  2. 启动后,先做一个致命关键配置:点击顶部菜单栏的 View → 勾选 Auto Save Mode(自动保存标注文件,不用手动点);

  3. 再做一个核心配置:点击顶部菜单栏的 Format → 选择 YOLO(必须切换到 YOLO 格式,默认是 VOC,选错了标注文件无效!);

✔️ 步骤 3:开始标注(可视化操作,超简单)
  1. 点击左侧 Open Dir → 选择你存放图片的 my_dataset 文件夹;
  2. 快捷键 W 调出「标注框」,用鼠标框选图片里的自定义目标(比如安全帽);
  3. 框选完成后,会弹出输入框,输入你的「类别名称」(比如 helmet 安全帽、mask 口罩),类别名必须英文、小写、无空格
  4. 快捷键 D 切换到下一张图片,重复框选 + 输入类别名的操作;
  5. 标注完成后,每张图片会自动生成一个同名的 .txt 标注文件,和图片放在同一文件夹里(比如 img_001.jpg → img_001.txt)。

✅ 看懂「YOLO 格式标注文件(.txt)」内容

标注文件是纯文本,内容很简单,每行对应一个目标,格式为:

plaintext

类别序号  中心点x  中心点y  宽度w  高度h

⚠️ 核心说明:

  1. 所有数值都是 归一化后的值(0~1 之间) ,YOLO 模型专用格式,不用手动修改;
  2. 类别序号必须从 0 开始连续编号(比如只有安全帽 1 类 → 0;安全帽 + 未戴安全帽 2 类 → 0 和 1);
  3. 一张图片里有几个目标,就有几行内容;没有目标的图片,不用标注,也不用生成.txt 文件。

示例(一张图片里有 1 个安全帽):

plaintext

0 0.452 0.326 0.189 0.256

3.3 第三步:规范整理数据集目录结构(YOLOv8 强制要求,必须严格遵守)

这是新手最容易出错的环节!YOLOv8 对数据集的目录结构有固定要求,差一个文件夹名称、差一个层级,训练都会直接报错,请你严格按照我给的结构建文件夹,一字不差

✅ 最终标准目录结构(复制粘贴,直接建)

在电脑任意位置新建一个根文件夹,命名为 yolo_custom_dataset,里面的结构如下:

plaintext

yolo_custom_dataset/
├─ images/        # 存放所有图片(训练+验证)
│  ├─ train/      # 训练集图片(80%的图片放这里)
│  └─ val/        # 验证集图片(20%的图片放这里)
│
└─ labels/        # 存放所有.txt标注文件(和图片一一对应)
   ├─ train/      # 训练集标注文件(对应images/train的图片)
   └─ val/        # 验证集标注文件(对应images/val的图片)

✅ 数据集划分规则(简单高效,新手直接用)

  1. 把你标注好的所有图片 + 对应的.txt 文件,按 8:2 的比例分成「训练集 (train)」和「验证集 (val)」;

    • 训练集:用来给模型「学习」的样本,占 80%;
    • 验证集:用来在训练过程中「评估模型效果」的样本,占 20%,绝对不能参与训练
  2. 核心原则:图片和标注文件必须一一对应!比如 images/train/img_001.jpg 必须对应 labels/train/img_001.txt,文件名完全一致;

  3. 数量参考:如果你有 100 张图片,就放 80 张到 train,20 张到 val,标注文件同步移动即可。

❓ 为什么要划分?防止模型「死记硬背」训练集(过拟合),验证集能真实反映模型的泛化能力,训练过程中会自动计算精度。


四、核心步骤二:创建「YOLO 配置文件(.yaml)」,告诉模型你的数据集信息

训练前最后一个准备工作:创建一个 yaml 文件(本质是一个「配置清单」),用来告诉 YOLOv8:

  • 你的训练集 / 验证集图片在哪里?
  • 你要检测的目标有多少个类别?
  • 每个类别对应的名称是什么?

这个文件是训练的入口,所有信息必须准确无误,新手直接复制模板修改即可,超简单!

✅ 步骤 1:新建 yaml 文件

在你的项目根目录(比如桌面),新建一个文本文件,重命名为 my_custom.yaml(后缀必须是 .yaml,不是.txt)。

✅ 步骤 2:yaml 文件内容(核心模板,直接复制 + 少量修改)

yaml

# 1. 训练集和验证集的图片路径(必填,修改成你自己的路径!)
train: D:/yolo_custom_dataset/images/train  # Windows路径示例
val: D:/yolo_custom_dataset/images/val      # Windows路径示例
# train: /home/user/yolo_custom_dataset/images/train  # Linux/Mac路径示例
# val: /home/user/yolo_custom_dataset/images/val

# 2. 你的检测类别数量(必填,nc = number of classes)
nc: 1

# 3. 你的类别名称列表(必填,和标注时的名称一致,英文!)
# 注意:列表里的顺序 = 类别序号(第一个是0,第二个是1,以此类推)
names: ['helmet']

✅ 关键修改说明(3 处必改,其余别动)

  1. 修改路径:把 trainval 的值改成你自己的数据集路径,绝对路径 / 相对路径都可以,推荐新手用绝对路径,避免路径错误
  2. 修改 nc 值:nc 是你要检测的「类别总数」,比如只检测安全帽 → nc=1;检测安全帽 + 未戴安全帽 → nc=2;检测口罩 + 手机 → nc=2;
  3. 修改 names 列表:列表里的字符串是你的类别名称,必须和标注时输入的名称完全一致(英文、小写、无空格),顺序对应类别序号。

❗ 致命错误提醒:yaml 文件里的冒号 : 后面必须有一个空格,这是 yaml 语法规则,少空格会直接报错!


五、核心步骤三:编写训练代码,一键启动自定义训练(超简洁,复制即用)

终于到了训练环节!YOLOv8 把所有复杂的训练逻辑都封装好了,核心训练代码只有 5 行,新手完全不用理解背后的原理,复制粘贴、修改少量参数就能直接运行,这也是 YOLOv8 最香的地方!

✅ 完整训练脚本(train_custom.py)

创建一个 Python 文件,命名为 train_custom.py,内容如下,所有注释都给你写清楚了,可修改的参数都标出来了

python

运行

# 导入YOLO核心类,所有功能都基于这个类实现
from ultralytics import YOLO

# 1. 加载预训练模型(推荐用yolov8n.pt,轻量化,适合CPU/GPU,新手首选)
# 也可以用yolov8s.pt,精度更高一点,训练速度稍慢
model = YOLO("yolov8n.pt")

# 2. 一键启动自定义训练(核心命令,所有关键参数都在这里设置)
results = model.train(
    data="my_custom.yaml",  # 必填:你的自定义yaml配置文件路径
    epochs=50,              # 训练轮数,新手建议30~100,按需调整
    batch=8,                # 批次大小,CPU建议4~8,GPU建议16~32,显存不足就调小
    imgsz=640,              # 训练图片尺寸,固定640即可,YOLO默认最优尺寸
    device="cpu",           # 训练设备:cpu=CPU训练,0=GPU训练(有N卡的话改成0)
    patience=10,            # 早停机制,训练10轮精度没提升就自动停止,防止过拟合
    save=True,              # 自动保存训练好的模型权重
    project="my_train",     # 训练结果保存的根文件夹名称
    name="helmet_model"     # 本次训练的文件夹名称,方便区分不同训练任务
)

✅ 关键参数解释(新手必看,按需修改)

  1. epochs:训练轮数,指模型把你的训练集完整学习多少遍。新手建议 50 即可,如果你的数据集图片多(>200 张),可以调到 80~100。轮数太少学不会,太多容易过拟合。
  2. batch:批次大小,指模型一次学多少张图片。CPU 用户务必调小(4/8) ,太大容易内存溢出;GPU 用户可以调大(16/32),训练速度更快。
  3. device:训练设备。如果你的电脑有 NVIDIA 显卡(配置过 CUDA),改成 device=0 用 GPU 训练,速度会比 CPU 快 5~20 倍;没有显卡就用默认的 cpu 即可,50 轮训练也就几分钟。
  4. 其他参数:保持默认就行,不用改,对新手友好。

✅ 启动训练

在激活的 yolo8 环境里,运行脚本:

bash

运行

python train_custom.py

六、看懂训练过程:训练日志解读(新手不用慌,简单易懂)

运行命令后,终端会打印训练日志,很多新手看到一堆数字会懵,其实你只需要关注 2 个核心指标,其余的不用管,超级简单!

✅ 训练日志核心解读(重点看这 2 个)

  1. Loss(损失值) :代表模型的「学习误差」,Loss 值越低越好。训练过程中,Loss 会从大到小逐渐下降,最后趋于平稳,说明模型在不断学习进步。
  2. mAP50(平均精度) :这是衡量模型检测效果的核心指标,也是你最该关注的!mAP50 越高越好,最大值是 1。一般来说,mAP50>0.8 就说明模型效果很好了,>0.7 就能满足大部分业务需求。

补充指标:Precision (精确率)、Recall (召回率),也是越高越好,和 mAP50 成正比。

✅ 训练结果自动保存(所有文件都给你整理好了)

训练完成后,YOLOv8 会在项目根目录下,生成一个 my_train/helmet_model 文件夹,里面包含了所有训练成果,核心文件只有 2 个,其余都是辅助

plaintext

my_train/helmet_model/
├─ weights/          # 权重文件存放目录(重中之重!)
│  ├─ best.pt        # ✅ 最优模型权重(效果最好,推理必用这个!)
│  └─ last.pt        # 最后一轮训练的权重(效果不如best.pt)
├─ results.csv       # 训练指标的详细数据
└─ confusion_matrix.png # 混淆矩阵,看模型对每个类别的识别效果

✅ 核心结论:训练完成后,你只需要保留 best.pt 这个文件,这就是你的「专属自定义模型」,后续所有的检测推理,都用这个文件!


七、核心步骤四:用「自己训练的模型」做推理检测(闭环!告别 Demo 选手)

这是最有成就感的一步:用你亲手训练出来的 best.pt 模型,去检测图片 / 视频,识别你自定义的目标

到这一步,你才算真正完成了「从数据准备→模型训练→实际应用」的完整流程,彻底告别「只会跑官方 Demo 的选手」!

✅ 方式 1:自定义图片检测(最常用,复制即用)

创建一个 Python 文件 detect_custom.py,代码如下,只需要修改 2 个地方:模型路径、图片路径,其余不用动!

python

运行

from ultralytics import YOLO
import cv2

# 1. 加载【自己训练好的模型】!!!不是官方的yolov8n.pt了
model = YOLO("my_train/helmet_model/weights/best.pt")

# 2. 定义要检测的图片路径(换成你自己的测试图片)
img_path = "test_helmet.jpg"

# 3. 执行检测,conf是置信度阈值,过滤低置信度的预测结果
# 新手建议0.25,想更精准就调高到0.5,过滤掉模糊的识别结果
results = model(img_path, conf=0.25)

# 4. 可视化检测结果并保存
img = cv2.imread(img_path)
for r in results:
    boxes = r.boxes
    for box in boxes:
        x1, y1, x2, y2 = map(int, box.xyxy[0])  # 检测框坐标
        cls = int(box.cls[0])                   # 目标类别序号
        conf = box.conf[0]                      # 置信度
        # 画框+写类别名称和置信度
        cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
        cv2.putText(img, f"{model.names[cls]} {conf:.2f}", (x1, y1-10),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)

# 保存检测后的图片
cv2.imwrite("detect_result.jpg", img)
print("检测完成!结果已保存为 detect_result.jpg")

✅ 方式 2:自定义视频检测(无缝切换,一行代码修改)

想检测视频?只需要把上面的 img_path 换成你的视频路径即可,YOLOv8 会自动逐帧检测,代码完全不用改:

python

运行

video_path = "test_helmet.mp4"
results = model(video_path, conf=0.25, save=True)

检测后的视频会自动保存到 runs/detect/predict 文件夹里。

✅ 运行推理脚本

bash

运行

python detect_custom.py

打开保存的 detect_result.jpg,你会看到:图片里的自定义目标(比如安全帽)被绿色框标注出来,还有类别名称和置信度!✅ 这一刻,你就真正掌握了 YOLO 的核心能力!


八、新手「高频踩坑指南」+ 解决方案(90% 的人都会遇到,必看避坑)

这部分是本文的精华彩蛋,我把新手在自定义训练中,所有大概率会遇到的报错、问题、训练效果差的原因都整理出来了,还附上了具体的解决方案,帮你节省大量排错时间,看完这部分,你能少走 99% 的弯路

✅ 【报错类】训练直接跑不起来,终端报错

  1. 报错:No labels found for images → 解决方案:标注文件和图片没有一一对应,检查文件名是否一致、路径是否正确;
  2. 报错:yaml file not found → 解决方案:yaml 配置文件的路径写错了,用绝对路径试试;
  3. 报错:out of memory (显存不足) → 解决方案:把 batch 调小(比如从 8 改成 4),CPU 用户尤其注意;
  4. 报错:syntax error in yaml → 解决方案:yaml 文件里的冒号后面少了空格,补上即可;
  5. 报错:unknown device cpu → 解决方案:device 参数写错了,CPU 是 device="cpu",GPU 是 device=0(数字)。

✅ 【训练类】训练能跑,但效果极差

  1. Loss 一直很高,不下降 → 原因:数据集太少(<50 张),模型学不会;解决方案:增加图片数量,至少 50 张以上;
  2. mAP50=0,完全识别不到目标 → 原因①:标注格式错了(选了 VOC 不是 YOLO);原因②:yaml 里的类别名称和标注的不一致;原因③:类别序号不是从 0 开始;逐一排查即可;
  3. 训练集 mAP 很高,验证集 mAP 很低 → 原因:过拟合,模型死记硬背训练集;解决方案:增加图片多样性,或者把 epochs 调小。

✅ 【推理类】训练完成,但推理识别不到目标

  1. 推理时没有检测框 → 解决方案:把 conf 置信度阈值调低(比如从 0.5 改成 0.25),模型对自定义目标的置信度会稍低;
  2. 检测框很多,但大部分是错的 → 解决方案:把 conf 调高(0.5),过滤掉低置信度的误识别;同时检查标注是否准确,有没有标错类别。

九、进阶优化:如何让你的自定义模型「更精准」?(低成本高回报)

如果你训练出来的模型效果一般,不用急着改复杂的参数,试试下面这几个简单易操作、效果立竿见影的优化技巧,不用写一行新代码,新手也能轻松做到,性价比极高:

  1. 最有效:增加数据集的「数量和多样性」 → 多拍不同角度、不同背景的图片,比如安全帽在不同工地、不同光照下的样子,模型见得多了,识别就准了;
  2. 调参优化:适当增加 epochs → 从 50 调到 80/100,让模型多学几遍,适合图片数量多的情况;
  3. 数据增强:训练时开启自带增强 → 在 model.train() 里加一个参数 augment=True,YOLO 会自动对图片做翻转、裁剪等处理,提升模型泛化能力;
  4. 换更大的预训练模型 → 把 yolov8n.pt 换成 yolov8s.pt,精度会提升,训练速度稍慢,效果立竿见影。

十、总结:完整流程复盘(帮你梳理核心逻辑,形成肌肉记忆)

到这里,你已经完成了从「零基础」到「能独立训练自定义模型」的蜕变,整个流程其实只有5 个核心步骤,非常清晰,记下来以后就能举一反三,训练任何自定义目标都能套用:

  1. 准备自定义图片 → 2. 用 LabelImg 标注生成 YOLO 格式 txt 文件 → 3. 按固定结构整理数据集目录 → 4. 编写 yaml 配置文件 → 5. 训练模型 + 推理检测。

✅ 最后想对你说的话:很多人学 YOLO 卡在「跑 Demo」阶段,觉得训练自定义数据集很难,但其实你会发现,整个过程中最复杂的环节只是「制作数据集」,而训练和推理的代码都极其简洁。这也是 YOLOv8 的魅力所在 —— 把复杂的算法封装起来,让普通人也能轻松上手。

当你成功用自己训练的模型检测出目标的那一刻,你会发现:原来 AI 实战,也可以这么简单!