DL 实战:在Ubuntu20.04上从零部署Yolov8并完成自定义数据集训练
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
标注时需要注意以下几点:
- 每个停车位用一个矩形框标注
- 标注文件保存为YOLO格式(.txt文件)
- 确保标注框紧贴停车位边缘
- 避免遗漏或错误标注
标注完成后,每个图片会对应一个同名的.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的模型
如果训练结果不理想,可以考虑以下调优策略:
- 增加训练数据量
- 调整学习率:使用--lr参数
- 尝试更大的模型:如yolov8s或yolov8m
- 增加数据增强:在配置文件中调整augment参数
- 延长训练时间:增加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、精确率、召回率等。
如果需要在生产环境中部署模型,可以考虑以下方案:
- 使用ONNX格式导出模型:
yolo export model=runs/detect/train/weights/best.pt format=onnx
- 使用TensorRT加速(需要NVIDIA GPU):
yolo export model=runs/detect/train/weights/best.pt format=engine
- 开发Flask或FastAPI接口提供Web服务
- 集成到OpenCV应用中实现实时检测
6. 常见问题与解决方案
在实际部署过程中,可能会遇到各种问题。这里分享一些我遇到的典型问题及解决方法。
问题1:CUDA out of memory 解决方案:
- 减小batch size
- 降低输入图像尺寸
- 使用更小的模型
- 检查是否有其他程序占用GPU内存
问题2:训练损失不下降 可能原因:
- 学习率设置不当
- 数据标注质量差
- 模型容量不足 解决方案:
- 尝试不同的学习率
- 检查并修正标注错误
- 使用更大的模型
问题3:模型在测试集上表现差 可能原因:
- 训练数据不足
- 训练集和测试集分布不一致
- 过拟合 解决方案:
- 收集更多训练数据
- 确保训练和测试数据来自同一分布
- 增加数据增强
- 使用早停策略
问题4:安装依赖时冲突 解决方案:
- 使用全新的conda环境
- 严格按照官方推荐的版本安装
- 可以先导出环境配置:pip freeze > requirements.txt
对于性能优化,可以考虑以下技巧:
- 使用半精度训练(--half参数)
- 启用CUDA Graph加速
- 使用DALI加速数据加载
- 对模型进行剪枝和量化
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(...)
实际部署建议
- 对于边缘设备,使用TensorRT加速
- 对于服务器部署,考虑使用Triton推理服务器
- 对于移动端,转换为CoreML或TFLite格式
- 实现异步处理提高吞吐量
- 添加预处理和后处理流水线
更多推荐


所有评论(0)