计算机视觉领域的对象检测一直是工业界和学术界的热点研究方向。YOLO(You Only Look Once)系列作为单阶段检测器的代表,以其出色的速度和精度平衡著称。YOLOv8作为该系列的最新版本,在保持实时性的同时进一步提升了检测精度。本文将完整呈现从零开始训练YOLOv8模型的全过程,特别适合需要快速上手实践的开发者和研究人员。
提示:本文基于Ultralytics官方实现,所有代码和配置文件均经过实际验证,可直接用于生产环境。
优质的数据集是模型性能的基础保障。根据项目需求,我们通常需要收集以下类型的数据:
实际项目中,我们使用混合数据源策略:
python复制# 示例:多源数据合并
import os
from glob import glob
custom_data = glob('dataset/custom/*.jpg') # 自采数据
public_data = glob('dataset/public/*.jpg') # 公开数据集
all_images = custom_data + public_data
推荐使用LabelImg或CVAT进行标注,保存为YOLO格式的txt文件。每个标注文件包含:
code复制<class_id> <x_center> <y_center> <width> <height>
其中所有坐标值都是相对于图像宽高的归一化值(0-1之间)。
标注时需要特别注意:
典型的数据集划分比例为:
使用以下代码实现自动划分:
python复制from sklearn.model_selection import train_test_split
train_val, test = train_test_split(images, test_size=0.1)
train, val = train_test_split(train_val, test_size=0.15/0.9) # 保持最终比例
数据增强配置示例(data.yaml):
yaml复制train: ../train/images
val: ../val/images
nc: 3 # 类别数
names: ['person', 'car', 'bicycle'] # 类别名称
# 增强参数
augmentation:
hsv_h: 0.015 # 色调增强幅度
hsv_s: 0.7 # 饱和度增强幅度
hsv_v: 0.4 # 明度增强幅度
degrees: 10 # 旋转角度范围
translate: 0.1 # 平移比例
scale: 0.5 # 缩放比例
shear: 0.0 # 剪切幅度
perspective: 0.001 # 透视变换系数
flipud: 0.0 # 上下翻转概率
fliplr: 0.5 # 左右翻转概率
推荐使用Python 3.8+和PyTorch 1.8+环境:
bash复制conda create -n yolov8 python=3.8
conda activate yolov8
pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113
pip install ultralytics
YOLOv8的训练参数主要分为以下几类:
yaml复制depth_multiple: 0.33 # 网络深度系数
width_multiple: 0.50 # 网络宽度系数
yaml复制lr0: 0.01 # 初始学习率
lrf: 0.01 # 最终学习率 = lr0 * lrf
momentum: 0.937 # SGD动量
weight_decay: 0.0005 # 权重衰减
warmup_epochs: 3.0 # 热身epoch数
warmup_momentum: 0.8 # 热身阶段动量
warmup_bias_lr: 0.1 # 热身阶段偏置学习率
yaml复制box: 7.5 # 边界框损失权重
cls: 0.5 # 分类损失权重
dfl: 1.5 # 分布焦点损失权重
启动训练的命令行示例:
bash复制yolo task=detect mode=train model=yolov8n.pt data=data.yaml epochs=100 imgsz=640 batch=16
训练过程中的关键监控指标:
| 指标名称 | 健康范围 | 异常处理建议 |
|---|---|---|
| train/box_loss | 0.05-0.15 | >0.2需检查标注质量 |
| train/cls_loss | 0.01-0.05 | >0.1可能类别不平衡 |
| val/mAP50 | 随epoch上升 | 波动>5%可能过拟合 |
| val/precision | 0.7-0.95 | <0.6需调整置信度阈值 |
| val/recall | 0.7-0.95 | <0.6需增加负样本 |
YOLOv8默认使用余弦退火调度,但对于特定场景可以自定义:
python复制# yolov8/cfg/default.yaml
lr_scheduler: cosine
lrf: 0.1 # 最终学习率=lr0*lrf
python复制# 自定义调度器
def custom_scheduler(optimizer, epochs):
milestones = [epochs//3, epochs*2//3]
gamma = 0.1
return torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma)
对于样本数量差异大的情况:
python复制# 在数据加载器中设置
dataset = LoadImagesAndLabels(..., oversample_threshold=0.8)
yaml复制# data.yaml
class_weights: [1.0, 2.0, 1.5] # 对应类别权重
python复制# 修改models/yolo.py
cls_loss = FocalLoss(gamma=2.0)
训练后优化技巧:
bash复制yolo train ... amp=True # 减少显存占用,加速训练
python复制from ultralytics import YOLO
model = YOLO('yolov8n.pt')
model.export(format='onnx', dynamic=True, simplify=True)
bash复制yolo export model=yolov8n.pt format=engine device=0
可能原因及解决方案:
学习率设置不当:
标注不一致:
python复制from ultralytics.yolo.utils.ops import check_annotations
check_annotations('data.yaml')
数据增强过强:
优化策略:
调整批量大小:
bash复制yolo train ... batch=8 # 默认16,根据显存减半
使用梯度累积:
yaml复制# config.yaml
accumulate: 2 # 每2个batch更新一次梯度
优化数据加载:
python复制# 在数据加载器中设置
workers: 4 # 根据CPU核心数调整
pin_memory: True
识别与解决方法:
早停法(Early Stopping):
yaml复制# config.yaml
patience: 20 # 验证指标连续20epoch不提升则停止
增加正则化:
yaml复制weight_decay: 0.001 # 默认0.0005,适当增加
dropout: 0.1 # 新增dropout层
数据增强多样化:
yaml复制mosaic: 0.8 # 马赛克增强概率
mixup: 0.1 # mixup增强概率
copy_paste: 0.1 # 复制粘贴增强概率
关键评估指标及其意义:
| 指标 | 计算公式 | 应用场景 |
|---|---|---|
| mAP50 | AP@IoU=0.5 | 通用检测性能评估 |
| mAP50-95 | AP@IoU=0.5:0.05:0.95 | 严格场景评估 |
| Precision | TP/(TP+FP) | 误报敏感场景 |
| Recall | TP/(TP+FN) | 漏检敏感场景 |
| F1-score | 2*(Precision*Recall)/(P+R) | 综合平衡评估 |
运行评估的命令:
bash复制yolo val model=yolov8n.pt data=data.yaml split=test
使用遗传算法进行超参数搜索:
python复制from ultralytics import YOLO
model = YOLO('yolov8n.yaml')
model.tune(data='data.yaml',
epochs=30,
iterations=20,
optimizer='AdamW',
plots=True)
优化重点参数范围:
yaml复制lr0: (0.001, 0.1) # 学习率
momentum: (0.8, 0.98) # 动量
weight_decay: (0.0001, 0.01) # 权重衰减
hsv_h: (0.0, 0.1) # 色调增强
hsv_s: (0.0, 0.9) # 饱和度增强
hsv_v: (0.0, 0.9) # 明度增强
python复制model.export(format='engine',
workspace=4, # GB
int8=True, # 量化
calib='data.yaml')
bash复制yolo export model=yolov8n.pt format=openvino
bash复制yolo export model=yolov8n.pt format=tflite
在实际部署中发现,使用TensorRT可以将推理速度提升2-3倍,特别是对于边缘设备效果显著。一个实用的技巧是在导出时固定输入尺寸:
python复制model.export(..., dynamic=False, imgsz=[640,640])