本文基于如下环境,完整演示如何从零开始搭建 YOLOv8 训练环境,并使用 COCO128 数据集训练 YOLOv8n 模型,同时深入讲解 YOLOv8 的训练原理、参数含义、模型结构、ONNX 导出以及后续模型压缩优化路线。
本文适合:
- AI 初学者
- 想学习目标检测的工程师
- 想学习模型训练/部署/压缩的开发者
- 想学习 YOLOv8 工业化流程的同学
使用项目:
一、实验环境
本文使用如下环境:
| 项目 | 配置 |
|---|---|
| GPU | GTX1660 Super 6GB |
| OS | Ubuntu 22.04 |
| Docker镜像 | nvcr.io/nvidia/pytorch:24.12-py3 |
| CUDA | 容器内自带 |
| 框架 | PyTorch |
| 模型 | YOLOv8n |
| 数据集 | COCO128 |
二、为什么选择 YOLOv8
YOLO(You Only Look Once)是当前最主流的目标检测模型之一。
YOLO特点:
- 单阶段检测
- 推理速度快
- 精度高
- 部署简单
- 工业应用广泛
YOLOv8 相比 YOLOv5 的升级:
| 特性 | YOLOv5 | YOLOv8 |
|---|---|---|
| Head | Anchor-Based | Anchor-Free |
| Backbone | C3 | C2f |
| 损失函数 | 较旧 | 更先进 |
| 部署 | 较方便 | 更方便 |
| 泛化能力 | 一般 | 更强 |
三、YOLOv8 模型结构原理
YOLOv8 网络整体结构:
Input
↓
Backbone
↓
Neck
↓
Head
1.Backbone(主干网络)
作用:
提取图像特征
例如:
- 边缘
- 纹理
- 物体轮廓
YOLOv8 使用:
C2f模块
相比 YOLOv5:
- 参数更少
- 梯度传播更稳定
- 推理更快
2.Neck(特征融合)
作用:
融合不同层的特征
原因:
- 小目标需要高分辨率特征
- 大目标需要深层语义特征
YOLOv8 使用:
FPN + PAN
实现多尺度特征融合。
3.Head(检测头)
作用:
预测:
边界框
类别
置信度
YOLOv8 最大变化:
Anchor-Free
相比传统 Anchor:
- 更简单
- 泛化更强
- 更容易训练
四、为什么选择 YOLOv8n
YOLOv8 模型有:
| 模型 | 参数量 | 特点 |
|---|---|---|
| n | 最小 | 最快 |
| s | 小 | 平衡 |
| m | 中 | 精度更高 |
| l | 大 | 更强 |
| x | 超大 | 最强 |
GTX1660S 只有 6GB 显存,因此推荐:
YOLOv8n
优点:
- 显存占用低
- 训练速度快
- 适合学习
- 容易部署
五、Docker 训练环境搭建
1.启动 Docker 容器
执行:
docker run --gpus all -it --rm \
-v /home/workspace:/workspace \
--shm-size=16g \
nvcr.io/nvidia/pytorch:24.12-py3
参数说明:
| 参数 | 作用 |
|---|---|
| --gpus all | 使用GPU |
| -v | 挂载目录 |
| --shm-size | 增大共享内存 |
| --rm | 退出自动删除 |
2.验证 GPU
进入容器后:
nvidia-smi
正常会看到:
- GTX1660 Super
- CUDA 信息
- 显存占用
六、安装 YOLOv8
1.克隆仓库
cd /workspace
git clone https://github.com/ultralytics/ultralytics.git
2.进入项目
cd ultralytics
3.安装依赖
pip install -e .
4.验证安装
yolo version
看到版本号说明安装成功。
七、下载 COCO128 数据集
COCO128 是官方提供的小型测试集。
特点:
- 仅128张图片
- 适合快速测试
- 适合学习
1.下载数据集
cd /workspace
mkdir datasets
cd datasets
wget https://ultralytics.com/assets/coco128.zip
2.解压
unzip coco128.zip
目录结构:
datasets/
└── coco128/
├── images/
├── labels/
└── coco128.yaml
八、开始训练 YOLOv8
1.训练命令
cd /workspace/ultralytics
yolo detect train \
model=yolov8n.pt \
data=/workspace/datasets/coco128.yaml \
epochs=50 \
imgsz=640 \
batch=16 \
device=0 \
workers=4
九、训练参数详细解释
1.model
model=yolov8n.pt
作用:
加载预训练模型。
本质:
迁移学习
即:
COCO预训练
↓
你的数据集微调
优点:
- 收敛快
- 精度高
- 不容易过拟合
2.data
data=coco128.yaml
指定数据集配置文件。
包括:
- 训练集路径
- 验证集路径
- 类别数量
- 类别名称
3.epochs
epochs=50
含义:
整个数据集训练 50 次。
例如:
1 epoch =
所有图片完整训练一次
4.batch
batch=16
含义:
一次送入 GPU 的图片数量。
GTX1660S 推荐:
| imgsz | batch |
|---|---|
| 640 | 8~16 |
如果显存不足:
nvidia-smi
观察显存。
5.imgsz
imgsz=640
输入图片大小:
640x640
越大:
- 精度更高
- 更慢
- 更吃显存
6.workers
workers=4
数据加载线程数。
CPU 核数较多时可以增大。
十、训练过程解析
训练过程中:
数据读取
↓
数据增强
↓
Forward
↓
计算Loss
↓
Backward
↓
更新参数
十一、YOLOv8 Loss 组成
YOLOv8 Loss:
总Loss =
Box Loss +
Cls Loss +
DFL Loss
数学表达:
L=Lbox+Lcls+LdflL = L_{box} + L_{cls} + L_{dfl}L=Lbox+Lcls+Ldfl
1.Box Loss
作用:
预测框位置误差
例如:
- x
- y
- w
- h
2.Classification Loss
作用:
类别预测误差
例如:
- cat
- dog
- person
3.DFL Loss
YOLOv8 的高级边框回归方式。
作用:
提升边框精度
十二、训练输出结果
训练完成后:
runs/detect/train/
会生成:
| 文件 | 作用 |
|---|---|
| best.pt | 最优模型 |
| last.pt | 最后模型 |
| results.png | loss曲线 |
| confusion_matrix.png | 混淆矩阵 |
十三、推理测试
使用训练后的模型:
yolo detect predict \
model=runs/detect/train/weights/best.pt \
source=/workspace/datasets/coco128/images/train2017
输出目录:
runs/detect/predict/