共计 2733 个字符,预计需要花费 7 分钟才能阅读完成。
前言
目标检测是计算机视觉领域的核心任务之一,而 YOLOv8 作为 Ultralytics 公司推出的最新版本,在精度和速度之间取得了很好的平衡。相比前代 YOLO 系列,YOLOv8 具有以下优势:

- 更高的检测精度(mAP 提升明显)
- 更快的推理速度(优化了网络结构)
- 更简单的 API 接口(几行代码即可训练)
- 支持多种部署方式(ONNX、TensorRT 等)
本文将从数据集准备开始,带你一步步完成 YOLOv8 的完整训练和部署流程。
1. 数据准备阶段
1.1 数据标注
推荐使用 LabelImg 进行标注,这是最常用的标注工具之一:
- 安装 LabelImg:
pip install labelImg - 启动工具:
labelImg - 使用快捷键
w创建标注框 - 保存为 YOLO 格式(每个图片生成对应的.txt 文件)
标注文件格式示例:
<class_id> <x_center> <y_center> <width> <height>
1.2 数据集划分
建议按照 7:2:1 的比例划分训练集、验证集和测试集:
import os
import random
from shutil import copyfile
# 创建目录结构
os.makedirs('images/train', exist_ok=True)
os.makedirs('images/val', exist_ok=True)
os.makedirs('images/test', exist_ok=True)
os.makedirs('labels/train', exist_ok=True)
os.makedirs('labels/val', exist_ok=True)
os.makedirs('labels/test', exist_ok=True)
# 随机划分
all_files = os.listdir('images')
random.shuffle(all_files)
train_files = all_files[:int(0.7*len(all_files))]
val_files = all_files[int(0.7*len(all_files)):int(0.9*len(all_files))]
test_files = all_files[int(0.9*len(all_files)):]
# 移动文件到对应目录
for f in train_files:
copyfile(f'images/{f}', f'images/train/{f}')
copyfile(f'labels/{f.replace(".jpg",".txt")}', f'labels/train/{f.replace(".jpg",".txt")}')
# 验证集和测试集同理
1.3 数据增强
YOLOv8 内置了多种数据增强策略,我们可以在配置文件中启用:
- Mosaic:4 张图片拼接增强
- RandomPerspective:随机透视变换
- HSV 颜色空间调整
- 随机旋转缩放
建议初学者保持默认配置,待熟悉后再调整。
2. 模型训练
2.1 安装依赖
pip install ultralytics
2.2 准备配置文件
创建 data.yaml 文件:
train: ./images/train
val: ./images/val
# 类别数量和名称
nc: 3 # 你的类别数
names: ['cat', 'dog', 'person'] # 你的类别名称
2.3 开始训练
from ultralytics import YOLO
# 加载预训练模型
model = YOLO('yolov8n.pt') # 可以选择 yolov8s/m/l/ x 等不同大小
# 训练模型
results = model.train(
data='data.yaml',
epochs=100,
imgsz=640,
batch=16,
optimizer='Adam',
lr0=0.001,
device='0' # 使用 GPU
)
关键参数说明:
– epochs: 训练轮数,一般 100-300
– imgsz: 输入图片大小,越大精度越高但速度越慢
– batch: 批大小,根据显存调整
– device: 指定 GPU (‘0’)或 CPU (‘cpu’)
2.4 评估模型
训练完成后会自动在验证集上评估,主要关注以下指标:
- mAP50-95: 在不同 IoU 阈值下的平均精度
- Precision-Recall 曲线
- 混淆矩阵
可以查看 runs/detect/train 目录下的结果文件。
3. 模型导出
3.1 导出 ONNX 格式
model.export(format='onnx', dynamic=True) # 动态轴导出
动态轴设置允许推理时输入不同尺寸的图片。导出的 ONNX 模型可以用于多种推理引擎。
4. 模型部署
4.1 OpenCV DNN 推理
import cv2
import numpy as np
# 加载模型
net = cv2.dnn.readNet('yolov8n.onnx')
# 预处理
img = cv2.imread('test.jpg')
blob = cv2.dnn.blobFromImage(img, 1/255.0, (640, 640), swapRB=True)
# 推理
net.setInput(blob)
outputs = net.forward(net.getUnconnectedOutLayersNames())
# 后处理 (需要根据 YOLOv8 输出格式调整)
boxes, confidences, class_ids = [], [], []
# ... 解析输出结果 ...
# 绘制检测框
for box in boxes:
x, y, w, h = box
cv2.rectangle(img, (x, y), (x+w, y+h), (0,255,0), 2)
cv2.imshow('Result', img)
cv2.waitKey(0)
4.2 TensorRT 加速
对于生产环境,建议使用 TensorRT 进行加速:
- 安装 TensorRT
- 转换 ONNX 到 TensorRT 引擎
- 使用 TensorRT 推理
5. 避坑指南
5.1 类别不平衡问题
- 对少数类别过采样
- 调整类别权重
- 使用 Focal Loss
5.2 显存不足
- 减小
batch大小 - 减小
imgsz - 使用梯度累积
5.3 常见标注错误
- 标注框不准确
- 漏标对象
- 类别标签错误
- 标注框重叠
6. 下一步学习建议
掌握了基础流程后,可以进一步学习:
- 迁移学习:在自己的数据集上微调预训练模型
- 模型量化:减小模型大小,提高推理速度
- 模型剪枝:移除不重要的神经元
- 部署优化:研究 TensorRT、OpenVINO 等推理引擎
- 多任务学习:同时检测和分割
结语
通过本文,你应该已经掌握了 YOLOv8 从数据准备到模型部署的完整流程。目标检测是一个实践性很强的领域,建议多尝试不同的数据集和参数配置,在实践中积累经验。遇到问题时,可以查阅官方文档或社区讨论,大多数问题都有解决方案。
祝你在目标检测的学习和实践中取得好成果!
正文完
发表至: 未分类
近一天内
