YOLOv8自定义数据集制作与训练教程|训练专属检测模型

寒烟似雪
2月4日发布 /正在检测是否收录...

YOLOv8实战:从零制作自定义数据集,训练专属检测模型

前两章我们搞定了环境搭建和基础推理,能处理图片、视频,但用的都是官方预训练模型,只能检测80类通用目标(比如人、车、猫)。实际做项目时,肯定要检测自己的专属目标——比如检测工厂的零件缺陷、自家宠物、特定商品,这就需要做自定义数据集,训练专属模型。这一章全程手把手带做,从标注工具安装到训练出第一个自己的模型,所有步骤都拆到新手能看懂,代码直接复用。
ml7hddwt.png

一、前期准备:明确目标+选对工具

1. 先定检测目标(新手别贪多)

新手第一次做,别选太复杂的目标(比如检测细小的电子元件),选2-3类简单目标即可,比如:

  • 日常物品:水杯(cup)、键盘(keyboard)、鼠标(mouse)
  • 宠物类:自家的猫(cat)、狗(dog)
  • 场景类:椅子(chair)、桌子(table)

我以“检测水杯、键盘、鼠标”为例,全程演示,你可以替换成自己要检测的目标。

2. 标注工具选LabelImg(新手首选)

YOLOv8需要YOLO格式的标注文件,LabelImg是最经典、最容易上手的标注工具,支持一键导出YOLO格式,不用手动改格式,完美适配新手。

二、LabelImg安装(Windows/Mac通用)

1. 安装前置依赖

LabelImg基于Python和PyQt5,先装PyQt5:

# Windows
pip install pyqt5 lxml
# Mac/Linux
pip3 install pyqt5 lxml

2. 安装LabelImg

两种方式,选一种就行:

方式1:pip直接安装(推荐)

# Windows
pip install labelimg
# Mac/Linux
pip3 install labelimg

方式2:GitHub克隆安装(备用,解决pip安装失败)

# 克隆仓库(需要装git,没装的话先装git)
git clone https://github.com/HumanSignal/labelImg.git
cd labelImg
# 安装并运行
python setup.py install

3. 验证安装(启动LabelImg)

打开终端,输入:

# Windows/Mac通用
labelImg

回车后会弹出LabelImg的可视化窗口,说明安装成功;如果报错“找不到命令”,重启终端或检查Python环境变量(上一章提过的PATH问题)。

三、制作YOLO格式自定义数据集(核心步骤)

1. 先建标准文件夹结构

YOLOv8对数据集路径、文件夹命名有严格要求,先按下面的结构建好文件夹(纯英文命名,别用中文/空格):

my_custom_dataset/  # 总文件夹
├── images/         # 图片文件夹
│   ├── train/      # 训练集图片(80%)
│   └── val/        # 验证集图片(20%)
└── labels/         # 标注文件文件夹
    ├── train/      # 训练集标注文件(和train图片一一对应)
    └── val/        # 验证集标注文件(和val图片一一对应)

操作步骤:

  • 新建总文件夹my_custom_dataset,放在桌面(方便查找);
  • 里面建imageslabels两个子文件夹;
  • images里再建trainvallabels同理。

2. 准备图片并划分训练/验证集

  • 找20-50张包含“水杯、键盘、鼠标”的图片(数量不用多,新手先跑通流程);
  • 选16-40张放入images/train(训练集,占80%),剩下的4-10张放入images/val(验证集,占20%);
  • 所有图片重命名为纯英文+数字,比如img_001.jpgimg_002.jpg(避免中文/特殊字符报错)。

3. 用LabelImg标注图片(逐步教)

标注的核心是“给每张图片里的目标画框,指定类别,导出YOLO格式标注文件”,步骤如下:

步骤1:设置标注环境

  • 打开LabelImg,点击左上角FileChange Save Dir,选择labels/train(先标注训练集);
  • 点击左上角View,勾选Auto Save Mode(自动保存,不用手动点保存);
  • 点击左侧YOLO(切换到YOLO标注格式,关键!默认是PascalVOC,要切换)。

步骤2:加载图片并标注

  • 点击左上角Open Dir,选择images/train,加载训练集图片;
  • 按快捷键W,调出标注框工具,用鼠标框选图片里的“水杯”;
  • 弹出“Enter label”对话框,输入类别名(比如cup,小写!),点击OK
  • 继续框选同一张图里的“键盘”(输入keyboard)、“鼠标”(输入mouse);
  • 按快捷键D,切换到下一张图片,重复标注;
  • 标注完所有训练集图片后,同理切换Save Dirlabels/val,标注验证集图片。

步骤3:检查标注文件

标注完成后,labels/trainlabels/val里会出现和图片同名的.txt文件(比如img_001.txt),这就是YOLO格式标注文件,打开一个看看,格式如下(每行代表一个目标):

0 0.45 0.52 0.30 0.40  # 类别编号 中心点x 中心点y 框宽 框高(都是归一化值,不用改)
1 0.78 0.65 0.25 0.35

4. 新建类别映射文件(classes.txt)

my_custom_dataset根目录下,新建classes.txt文件,按顺序写入所有类别名(每行一个),比如:

cup
keyboard
mouse

这个文件用来关联“类别编号”和“类别名”,比如编号0对应cup,1对应keyboard,必须和标注时输入的名称一致!

四、编写数据集配置文件(yaml文件)

YOLOv8训练需要一个yaml文件,告诉模型“数据集在哪、有多少类、类别名是什么”,这是新手最容易出错的环节,我直接给模板,你改路径和类别即可。

my_custom_dataset根目录下,新建custom_dataset.yaml文件,内容如下(重点改path!):

# 数据集根路径(绝对路径!新手别用相对路径,避免找不到)
# Windows示例:path: C:/Users/你的用户名/Desktop/my_custom_dataset
# Mac示例:path: /Users/你的用户名/Desktop/my_custom_dataset
path: C:/Users/xxx/Desktop/my_custom_dataset  
# 训练集/验证集图片路径(基于上面的path,不用改)
train: images/train  
val: images/val  

# 类别数(我这里是3类:cup、keyboard、mouse,按自己的改)
nc: 3  
# 类别名(和classes.txt一致,顺序也必须一致!)
names: ['cup', 'keyboard', 'mouse']  

⚠️ 关键坑:path必须写绝对路径!比如Windows路径是C:/Users/张三/Desktop/my_custom_dataset(别用反斜杠\,用/),Mac路径是/Users/张三/Desktop/my_custom_dataset,写错路径训练时会提示“找不到数据集”。

五、训练自定义YOLOv8模型(核心代码)

所有准备工作完成后,训练代码非常简洁,基于ultralytics库一键训练,新手不用改复杂参数,先跑通再说。

完整训练代码

from ultralytics import YOLO

# 1. 加载预训练模型(用yolov8s,轻量均衡,新手首选)
model = YOLO('yolov8s.pt')

# 2. 开始训练(核心参数只改data路径)
results = model.train(
    data='C:/Users/xxx/Desktop/my_custom_dataset/custom_dataset.yaml',  # 你的yaml文件绝对路径
    epochs=50,          # 训练轮数:新手50-100足够,数据少就少点(比如30)
    batch=8,            # 批次大小:CPU/低配GPU设4-8,高配GPU设16-32
    imgsz=640,          # 输入图片尺寸:默认640,不用改
    device=0,           # 设备:0=GPU(有N卡就用),-1=CPU(无GPU)
    patience=10,        # 早停:10轮没提升就停止,避免过拟合
    save=True,          # 自动保存最佳模型
    project='runs/train',# 训练结果保存目录
    name='custom_model' # 本次训练名称,方便区分
)

# 训练完成后,最佳模型会保存在 runs/train/custom_model/weights/best.pt
print("训练完成!最佳模型路径:", results.save_dir + "/weights/best.pt")

训练过程监控

运行代码后,终端会打印训练日志,重点看两个指标:

  • mAP50:平均精度,数值越高(0-1),模型效果越好;
  • loss:损失值,随着训练轮数增加,应该逐渐降低并趋于稳定。

训练过程中,还会自动生成runs/train/custom_model文件夹,里面有训练曲线图、验证集检测示例、模型权重文件,不用手动管。

六、用自定义模型推理(验证效果)

训练完成后,用自己训的best.pt模型检测图片,验证是否能识别自定义目标:

from ultralytics import YOLO

# 加载自己训练的最佳模型
model = YOLO('runs/train/custom_model/weights/best.pt')

# 检测一张包含水杯/键盘/鼠标的图片
results = model(
    source='test_custom.jpg',  # 自己的测试图片
    conf=0.5,                  # 置信度调高,避免误检
    save=True
)

# 打印检测结果
print("自定义模型检测结果:")
for box in results[0].boxes:
    class_name = results[0].names[int(box.cls)]
    confidence = round(float(box.conf), 2)
    print(f"目标:{class_name},置信度:{confidence}")

运行后,会生成带标注框的结果图,能清晰看到自己标注的“cup/keyboard/mouse”被识别出来,就算训练成功了!

七、本章常见问题与解决方法

  1. 训练报错“Dataset not found”
    原因:yaml文件里的path路径错误、数据集文件夹结构不对、图片/标注文件缺失
    解决:核对绝对路径是否正确,确保images/trainlabels/train里的文件一一对应(图片和txt文件名完全一致)。
  2. 训练时显存不足(CUDA out of memory)
    原因:batch批次太大、模型版本太高(比如用yolov8l/x)
    解决:把batch降到4甚至2,换回yolov8n/s模型,或用CPU训练(device=-1)。
  3. 标注文件报错“IndexError: list index out of range”
    原因:类别编号超出范围(比如标注了4类,但yaml里nc=3)、classes.txt和标注类别名不一致
    解决:核对nc数值和实际类别数一致,类别名大小写/拼写完全匹配。
  4. 训练完成后检测不到自定义目标
    原因:标注图片数量太少、标注框不准确、训练轮数不够
    解决:增加标注图片数量(至少20张),重新标注确保框准确,把epochs调到80-100。

八、本章小结

这一章我们完成了“自定义数据集制作→配置文件编写→模型训练→推理验证”的全流程,核心是“先搭对文件夹结构、选对标注格式、写对yaml路径”,这三个环节不出错,训练基本就能跑通。

新手第一次训练效果可能不完美(比如漏检、误检),不用急,后续可以通过增加标注数据、调整训练参数(比如batch、epochs)、优化标注质量来提升。下一章我们会专门讲“YOLOv8训练调参技巧”,教你怎么用最少的改动,让模型效果翻倍。

© 版权声明
THE END
喜欢就支持一下吧
点赞 0 分享 收藏
评论 抢沙发
OωO
取消
SSL