1. 环境准备:从零搭建Ubuntu20.04深度学习基础

在开始Yolov8的部署之前,我们需要先搭建一个稳定的基础环境。Ubuntu20.04作为长期支持版本(LTS),是深度学习开发的理想选择。我建议使用全新的系统安装,避免之前安装的软件包造成冲突。

首先更新系统软件包:

sudo apt update && sudo apt upgrade -y

安装必要的系统依赖:

sudo apt install -y build-essential cmake git wget unzip python3-dev python3-pip

对于深度学习开发,我强烈推荐使用Anaconda来管理Python环境。这不仅能够隔离不同项目的依赖,还能避免系统Python环境被污染。下载并安装Anaconda:

wget https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-x86_64.sh
bash Anaconda3-2023.03-Linux-x86_64.sh

安装完成后,创建一个名为yolov8的专用环境:

conda create -n yolov8 python=3.8 -y
conda activate yolov8

接下来安装PyTorch,这是Yolov8运行的底层框架。根据你的硬件配置选择安装命令:

对于NVIDIA GPU用户(推荐):

conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=11.3 -c pytorch

对于仅使用CPU的情况:

conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cpuonly -c pytorch

验证PyTorch安装是否成功:

import torch
print(torch.__version__)  # 应该输出1.11.0
print(torch.cuda.is_available())  # GPU用户应该显示True

2. Yolov8安装与验证

环境准备就绪后,我们就可以安装Yolov8了。Ultralytics团队已经将Yolov8的核心功能封装成了一个Python包,这使得安装过程变得非常简单。

使用pip安装ultralytics包:

pip install ultralytics

如果遇到网络问题导致安装失败,可以尝试使用国内镜像源:

pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple

安装完成后,我们需要验证Yolov8是否能够正常运行。创建一个简单的测试脚本test_yolov8.py:

from ultralytics import YOLO

# 加载预训练模型
model = YOLO('yolov8n.pt')  # 会自动下载yolov8n模型

# 进行预测
results = model('https://ultralytics.com/images/bus.jpg')

# 显示结果
results[0].show()

运行这个脚本:

python test_yolov8.py

如果一切正常,你会看到程序自动下载yolov8n.pt模型文件,并对示例图片进行目标检测,最后显示检测结果。第一次运行时模型下载可能会比较慢,建议耐心等待。

Yolov8提供了多种不同规模的模型,从轻量级的nano版本到高精度的xlarge版本。你可以根据需要选择不同的模型:

  • yolov8n.pt:最轻量级,速度最快
  • yolov8s.pt:小型模型
  • yolov8m.pt:中型模型
  • yolov8l.pt:大型模型
  • yolov8x.pt:最大模型,精度最高但速度最慢

3. 自定义数据集准备

在实际项目中,我们通常需要使用自己的数据集进行训练。以智能停车位检测为例,我来详细介绍如何准备和标注自定义数据集。

首先创建数据集目录结构:

mkdir -p ~/yolov8_datasets/mydata/{train,val}/{images,labels}

这个结构遵循YOLO格式的标准:

  • train/images:存放训练集图片
  • train/labels:存放训练集标注文件
  • val/images:存放验证集图片
  • val/labels:存放验证集标注文件

对于停车位检测项目,我们需要收集大量停车场的图片。可以使用手机拍摄或从公开数据集中获取。建议至少准备1000张以上的图片,其中80%用于训练,20%用于验证。

标注工具推荐使用LabelImg或CVAT:

pip install labelImg
labelImg

标注时需要注意以下几点:

  1. 每个停车位用一个矩形框标注
  2. 标注文件保存为YOLO格式(.txt文件)
  3. 确保标注框紧贴停车位边缘
  4. 避免遗漏或错误标注

标注完成后,每个图片会对应一个同名的.txt文件,内容格式如下:

<class_id> <x_center> <y_center> <width> <height>

例如:

0 0.4453125 0.6342592592592593 0.1484375 0.07407407407407407

接下来创建数据集配置文件mydata.yaml:

# 训练和验证图像的路径
train: ~/yolov8_datasets/mydata/train/images
val: ~/yolov8_datasets/mydata/val/images

# 类别数量
nc: 1

# 类别名称
names: ['parking_slot']

4. 模型训练与调优

准备好数据集后,我们就可以开始训练自定义模型了。Yolov8提供了非常简单的训练接口。

基础训练命令:

yolo detect train data=~/yolov8_datasets/mydata/mydata.yaml model=yolov8n.yaml epochs=100 imgsz=640 device=0

这个命令中各个参数的含义:

  • data:指定数据集配置文件路径
  • model:指定使用的模型配置
  • epochs:训练轮数
  • imgsz:输入图像尺寸
  • device:指定使用的设备,0表示第一个GPU

训练过程中,Yolov8会自动记录各种指标,包括损失函数值、精度、召回率等。你可以在终端看到实时输出,也可以在训练完成后查看详细的日志文件。

训练完成后,模型权重会保存在runs/detect/train/weights/目录下,其中:

  • best.pt:验证集上表现最好的模型
  • last.pt:最后一个epoch的模型

如果训练结果不理想,可以考虑以下调优策略:

  1. 增加训练数据量
  2. 调整学习率:使用--lr参数
  3. 尝试更大的模型:如yolov8s或yolov8m
  4. 增加数据增强:在配置文件中调整augment参数
  5. 延长训练时间:增加epochs数量

一个更完整的训练示例:

yolo detect train data=~/yolov8_datasets/mydata/mydata.yaml \
model=yolov8s.yaml \
epochs=300 \
imgsz=640 \
batch=16 \
device=0 \
lr0=0.01 \
cos_lr=True \
augment=True

5. 模型测试与部署

训练完成后,我们需要对模型进行测试,评估其在实际场景中的表现。

使用训练好的模型进行预测:

yolo detect predict \
model=runs/detect/train/weights/best.pt \
source=~/test_images/parking_lot.jpg \
conf=0.5 \
save=True

参数说明:

  • model:指定使用的模型权重
  • source:可以是单张图片、视频文件、目录或URL
  • conf:置信度阈值
  • save:是否保存预测结果

预测结果会保存在runs/detect/predict目录下,包含标注框的图片和预测信息。

对于性能评估,可以使用val模式:

yolo detect val \
model=runs/detect/train/weights/best.pt \
data=~/yolov8_datasets/mydata/mydata.yaml \
device=0

这会输出模型的各项指标,包括mAP、精确率、召回率等。

如果需要在生产环境中部署模型,可以考虑以下方案:

  1. 使用ONNX格式导出模型:
yolo export model=runs/detect/train/weights/best.pt format=onnx
  1. 使用TensorRT加速(需要NVIDIA GPU):
yolo export model=runs/detect/train/weights/best.pt format=engine
  1. 开发Flask或FastAPI接口提供Web服务
  2. 集成到OpenCV应用中实现实时检测

6. 常见问题与解决方案

在实际部署过程中,可能会遇到各种问题。这里分享一些我遇到的典型问题及解决方法。

问题1:CUDA out of memory 解决方案:

  • 减小batch size
  • 降低输入图像尺寸
  • 使用更小的模型
  • 检查是否有其他程序占用GPU内存

问题2:训练损失不下降 可能原因:

  • 学习率设置不当
  • 数据标注质量差
  • 模型容量不足 解决方案:
  • 尝试不同的学习率
  • 检查并修正标注错误
  • 使用更大的模型

问题3:模型在测试集上表现差 可能原因:

  • 训练数据不足
  • 训练集和测试集分布不一致
  • 过拟合 解决方案:
  • 收集更多训练数据
  • 确保训练和测试数据来自同一分布
  • 增加数据增强
  • 使用早停策略

问题4:安装依赖时冲突 解决方案:

  • 使用全新的conda环境
  • 严格按照官方推荐的版本安装
  • 可以先导出环境配置:pip freeze > requirements.txt

对于性能优化,可以考虑以下技巧:

  1. 使用半精度训练(--half参数)
  2. 启用CUDA Graph加速
  3. 使用DALI加速数据加载
  4. 对模型进行剪枝和量化

7. 进阶技巧与最佳实践

经过多个项目的实践,我总结出一些Yolov8使用的最佳实践,能够显著提升开发效率和模型性能。

数据增强策略 在mydata.yaml中添加增强配置:

# 数据增强参数
augment: 
  hsv_h: 0.015  # 图像HSV-色调增强(分数)
  hsv_s: 0.7    # 图像HSV-饱和度增强(分数)
  hsv_v: 0.4    # 图像HSV-明度增强(分数)
  degrees: 10.0 # 图像旋转(+/- deg)
  translate: 0.1  # 图像平移(+/- 分数)
  scale: 0.5    # 图像缩放(+/- 增益)
  shear: 0.0    # 图像剪切(+/- deg)
  perspective: 0.0001  # 图像透视(+/- 分数)
  flipud: 0.0   # 图像上下翻转(概率)
  fliplr: 0.5   # 图像左右翻转(概率)

模型架构调整 可以修改yolov8n.yaml中的网络结构:

# YOLOv8n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]]  # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]]  # 1-P2/4
  # ...其他层配置...

# 修改检测头
head:
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  # ...其他配置...

训练监控 使用TensorBoard监控训练过程:

tensorboard --logdir runs/detect/train

模型集成 训练多个模型后进行集成:

from ensemble_boxes import weighted_boxes_fusion

# 加载多个模型
model1 = YOLO('yolov8n.pt')
model2 = YOLO('yolov8s.pt')

# 分别预测
results1 = model1('image.jpg')
results2 = model2('image.jpg')

# 使用WBF进行结果融合
boxes, scores, labels = weighted_boxes_fusion(...)

实际部署建议

  1. 对于边缘设备,使用TensorRT加速
  2. 对于服务器部署,考虑使用Triton推理服务器
  3. 对于移动端,转换为CoreML或TFLite格式
  4. 实现异步处理提高吞吐量
  5. 添加预处理和后处理流水线
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐