YOLOv8实战:从零制作自定义数据集,训练专属检测模型
前两章我们搞定了环境搭建和基础推理,能处理图片、视频,但用的都是官方预训练模型,只能检测80类通用目标(比如人、车、猫)。实际做项目时,肯定要检测自己的专属目标——比如检测工厂的零件缺陷、自家宠物、特定商品,这就需要做自定义数据集,训练专属模型。这一章全程手把手带做,从标注工具安装到训练出第一个自己的模型,所有步骤都拆到新手能看懂,代码直接复用。
一、前期准备:明确目标+选对工具
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 lxml2. 安装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 install3. 验证安装(启动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,放在桌面(方便查找); - 里面建
images和labels两个子文件夹; images里再建train和val,labels同理。
2. 准备图片并划分训练/验证集
- 找20-50张包含“水杯、键盘、鼠标”的图片(数量不用多,新手先跑通流程);
- 选16-40张放入
images/train(训练集,占80%),剩下的4-10张放入images/val(验证集,占20%); - 所有图片重命名为纯英文+数字,比如
img_001.jpg、img_002.jpg(避免中文/特殊字符报错)。
3. 用LabelImg标注图片(逐步教)
标注的核心是“给每张图片里的目标画框,指定类别,导出YOLO格式标注文件”,步骤如下:
步骤1:设置标注环境
- 打开LabelImg,点击左上角
File→Change 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 Dir到labels/val,标注验证集图片。
步骤3:检查标注文件
标注完成后,labels/train和labels/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.354. 新建类别映射文件(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”被识别出来,就算训练成功了!
七、本章常见问题与解决方法
- 训练报错“Dataset not found”
原因:yaml文件里的path路径错误、数据集文件夹结构不对、图片/标注文件缺失
解决:核对绝对路径是否正确,确保images/train和labels/train里的文件一一对应(图片和txt文件名完全一致)。 - 训练时显存不足(CUDA out of memory)
原因:batch批次太大、模型版本太高(比如用yolov8l/x)
解决:把batch降到4甚至2,换回yolov8n/s模型,或用CPU训练(device=-1)。 - 标注文件报错“IndexError: list index out of range”
原因:类别编号超出范围(比如标注了4类,但yaml里nc=3)、classes.txt和标注类别名不一致
解决:核对nc数值和实际类别数一致,类别名大小写/拼写完全匹配。 - 训练完成后检测不到自定义目标
原因:标注图片数量太少、标注框不准确、训练轮数不够
解决:增加标注图片数量(至少20张),重新标注确保框准确,把epochs调到80-100。
八、本章小结
这一章我们完成了“自定义数据集制作→配置文件编写→模型训练→推理验证”的全流程,核心是“先搭对文件夹结构、选对标注格式、写对yaml路径”,这三个环节不出错,训练基本就能跑通。
新手第一次训练效果可能不完美(比如漏检、误检),不用急,后续可以通过增加标注数据、调整训练参数(比如batch、epochs)、优化标注质量来提升。下一章我们会专门讲“YOLOv8训练调参技巧”,教你怎么用最少的改动,让模型效果翻倍。