YOLOv8是Ultralytics公司推出的最新一代实时目标检测算法,它在保持YOLO系列一贯高速特性的同时,在精度和易用性上都有显著提升。作为计算机视觉领域最基础也最实用的技术之一,目标检测在安防监控、自动驾驶、工业质检等场景中都有广泛应用。本文将基于我过去三年在多个实际项目中部署YOLOv8的经验,详细解析从环境配置到模型优化的全流程实战要点。
与早期版本相比,YOLOv8的主要改进包括:更高效的网络架构设计、更灵活的模型尺寸选择(从nano到xlarge共5种预训练模型)、以及原生支持的分类和分割任务扩展。实测在COCO数据集上,YOLOv8s的AP指标达到44.9,同时能在Tesla T4显卡上跑到250FPS以上的推理速度。
虽然YOLOv8可以在CPU上运行,但为了获得实时性能,建议至少配备:
注意:如果使用Docker环境,推荐使用
nvidia/cuda:11.7.1-base-ubuntu20.04作为基础镜像,可避免CUDA环境冲突问题。
通过conda创建虚拟环境是最稳妥的方式:
bash复制conda create -n yolov8 python=3.8
conda activate yolov8
pip install ultralytics torch==1.13.1+cu117 torchvision==0.14.1+cu117 --extra-index-url https://download.pytorch.org/whl/cu117
验证安装是否成功:
python复制import torch
print(torch.cuda.is_available()) # 应输出True
print(torch.__version__) # 应显示1.13.1+
YOLOv8支持多种标注格式,但推荐使用YOLO原生格式:
class_id center_x center_y width height(归一化坐标)目录结构示例:
code复制dataset/
├── images/
│ ├── train/
│ └── val/
└── labels/
├── train/
└── val/
对于新项目,推荐使用RoboFlow:
典型data.yaml内容:
yaml复制path: ../dataset
train: images/train
val: images/val
names:
0: person
1: car
2: traffic_light
使用官方CLI工具是最快捷的方式:
bash复制yolo task=detect mode=train model=yolov8s.pt data=data.yaml epochs=100 imgsz=640
关键参数解析:
task: detect/classify/segmentmodel: 预训练模型选择(n/s/m/l/x)imgsz: 输入尺寸(越大精度越高但速度越慢)batch: 根据显存调整(建议从-1自动检测开始)bash复制yolo train ... scale=0.5,1.5
python复制model = YOLO('yolov8s.pt')
model.freeze('backbone') # 只训练检测头
model.train(...)
yaml复制# 在data.yaml中添加
early_stopping:
patience: 20 # 连续20轮指标未提升则停止
min_delta: 0.001
训练完成后查看:
使用命令行验证:
bash复制yolo val model=runs/detect/train/weights/best.pt data=data.yaml
python复制from ultralytics.yolo.utils import plot_results
plot_results('runs/detect/train/results.csv')
bash复制yolo predict model=best.pt save_json=True # 生成预测结果
python -m utils.metrics.precision_recall data.yaml predictions.json
bash复制yolo export model=best.pt format=onnx opset=12
bash复制trtexec --onnx=best.onnx --saveEngine=best.engine --fp16
Python API调用:
python复制from ultralytics import YOLO
import cv2
model = YOLO('best.engine', task='detect') # 加载TensorRT模型
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
results = model(frame, stream=True) # 流式处理
for r in results:
boxes = r.boxes.xyxy # 获取边界框
for box in boxes:
x1, y1, x2, y2 = map(int, box)
cv2.rectangle(frame, (x1,y1), (x2,y2), (0,255,0), 2)
cv2.imshow('YOLOv8', frame)
if cv2.waitKey(1) == ord('q'):
break
bash复制yolo train ... batch=8
yaml复制# 在data.yaml中添加
training_params:
accumulate: 4 # 每4个批次更新一次梯度
python复制from ultralytics.yolo.data import build_dataloader
loader = build_dataloader(..., class_weights=[1.0, 2.0, 1.5]) # 对少数类加大权重
yaml复制augmentation:
over_sample: True
target_classes: [2, 5] # 对第2、5类过采样
python复制model = YOLO('yolov8s.yaml')
model.model.anchors = [[10,13, 16,30, 33,23], [30,61, 62,45, 59,119]] # 自定义锚框
yaml复制# 修改模型配置文件
backbone:
- [-1, 1, CBAM, []] # 在适当位置插入CBAM模块
YOLOv8支持端到端的多任务学习:
bash复制yolo task=segment mode=train model=yolov8s-seg.pt # 实例分割
yolo task=classify mode=train model=yolov8s-cls.pt # 分类
python复制teacher = YOLO('yolov8x.pt')
student = YOLO('yolov8n.pt')
student.train(..., teacher=teacher)
bash复制yolo train ... quantize=True
在实际项目中,我发现两个关键经验:一是训练初期一定要验证数据标注质量(特别是边界框的紧密度),二是部署时要注意预处理/后处理与训练时的一致性。最近一个工业质检项目中,通过调整anchor比例和添加CBAM模块,使小缺陷检测的AP提升了12.3%。