Ubuntu系统YOLOv8环境搭建与训练实战指南
·
1. 环境准备与基础配置
在Ubuntu系统上搭建YOLO训练环境需要先完成基础依赖的安装。我推荐使用Python虚拟环境来隔离项目依赖,避免与系统Python环境产生冲突。
1.1 系统依赖安装
首先更新系统包管理器并安装基础工具:
sudo apt update
sudo apt upgrade -y
sudo apt install -y python3-pip python3-venv git wget unzip
注意:建议在干净的Ubuntu 20.04/22.04 LTS系统上进行操作,避免因系统版本差异导致依赖冲突
1.2 创建虚拟环境
为YOLO项目创建专用虚拟环境:
mkdir -p ~/yolo_projects && cd ~/yolo_projects
python3 -m venv yolov8_env
source yolov8_env/bin/activate
激活虚拟环境后,终端提示符前会出现 (yolov8_env) 标识。建议将以下命令添加到 ~/.bashrc 中方便后续使用:
echo "alias yoloenv='source ~/yolo_projects/yolov8_env/bin/activate'" >> ~/.bashrc
source ~/.bashrc
1.3 安装Ultralytics YOLOv8
使用清华镜像源加速安装:
pip install ultralytics --default-timeout=100 -i https://pypi.tuna.tsinghua.edu.cn/simple
验证安装是否成功:
python -c "from ultralytics import YOLO; print(YOLO('yolov8n.pt'))"
2. 数据集准备与标注
2.1 数据集目录结构
规范的目录结构对后续训练至关重要,建议采用以下结构:
my_dataset/
├── images/
│ ├── train/ # 训练集图片
│ └── val/ # 验证集图片
└── labels/
├── train/ # 训练集标签
└── val/ # 验证集标签
2.2 使用LabelImg进行标注
由于最新版LabelImg可能存在兼容性问题,建议使用Python 3.9环境:
sudo add-apt-repository ppa:deadsnakes/ppa -y
sudo apt update
sudo apt install -y python3.9 python3.9-venv
创建标注专用环境:
python3.9 -m venv ~/labelimg_env
source ~/labelimg_env/bin/activate
pip install labelImg==1.8.6 pyqt5==5.15.7
启动LabelImg:
labelImg
标注时注意:
- 使用YOLO格式输出
- 类别名称使用英文小写
- 每个图片对应一个同名的.txt标签文件
2.3 数据集划分脚本
当数据集较大时,手动划分训练/验证集会比较耗时。可以使用以下Python脚本自动划分:
import os
import random
import shutil
from tqdm import tqdm
def split_dataset(image_dir, label_dir, val_ratio=0.2, seed=42):
random.seed(seed)
images = [f for f in os.listdir(image_dir) if f.endswith(('.jpg','.png','.jpeg'))]
val_size = int(len(images) * val_ratio)
val_samples = random.sample(images, val_size)
os.makedirs(os.path.join(image_dir, '../val'), exist_ok=True)
os.makedirs(os.path.join(label_dir, '../val'), exist_ok=True)
for img in tqdm(val_samples):
# 移动图片
src_img = os.path.join(image_dir, img)
dst_img = os.path.join(image_dir, '../val', img)
shutil.move(src_img, dst_img)
# 移动标签
label_file = os.path.splitext(img)[0] + '.txt'
src_label = os.path.join(label_dir, label_file)
if os.path.exists(src_label):
dst_label = os.path.join(label_dir, '../val', label_file)
shutil.move(src_label, dst_label)
3. 模型训练实战
3.1 准备配置文件
创建 dataset.yaml 配置文件:
path: /path/to/your/dataset
train: images/train
val: images/val
test: # 可选测试集路径
# 类别信息
names:
0: person
1: car
2: dog
3: cat
3.2 基础训练命令
使用预训练模型开始训练:
yolo train data=dataset.yaml model=yolov8n.pt epochs=100 imgsz=640 batch=16
关键参数说明:
imgsz: 输入图像尺寸,建议保持640x640batch: 批大小,根据GPU显存调整epochs: 训练轮次,简单数据集100-300轮足够device: 指定使用CPU(cpu)或GPU(0)
3.3 高级训练配置
创建自定义训练脚本 custom_train.py :
from ultralytics import YOLO
model = YOLO('yolov8n.pt') # 加载预训练模型
results = model.train(
data='dataset.yaml',
epochs=300,
patience=50, # 早停轮次
batch=32,
imgsz=640,
device='0', # 使用第一块GPU
workers=8, # 数据加载线程数
optimizer='AdamW',
lr0=0.001,
weight_decay=0.0005,
hsv_h=0.015, # 图像增强参数
hsv_s=0.7,
hsv_v=0.4,
degrees=10.0,
translate=0.1,
scale=0.5,
shear=2.0,
perspective=0.0001,
flipud=0.5,
fliplr=0.5,
mosaic=1.0,
mixup=0.1,
copy_paste=0.1,
name='custom_exp'
)
4. 模型评估与优化
4.1 评估指标解读
训练完成后,在 runs/detect/train/ 目录下会生成以下关键文件:
results.png: 训练过程指标可视化confusion_matrix.png: 混淆矩阵val_batchX_labels.jpg: 验证集预测示例
重点关注以下指标:
- mAP@0.5 (PASCAL VOC标准)
- mAP@0.5:0.95 (COCO标准)
- Precision-Recall曲线
- 各类别的F1分数
4.2 模型导出与优化
将训练好的模型导出为不同格式:
yolo export model=runs/train/exp/weights/best.pt format=onnx # ONNX格式
yolo export model=runs/train/exp/weights/best.pt format=tflite # TFLite格式
对于边缘设备部署,建议进行量化:
from ultralytics import YOLO
model = YOLO('runs/train/exp/weights/best.pt')
model.export(format='onnx', dynamic=True, simplify=True, opset=12) # 动态量化
5. 常见问题排查
5.1 训练问题速查表
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| CUDA out of memory | 批大小过大 | 减小batch参数 |
| NaN损失值 | 学习率过高 | 降低lr0参数 |
| mAP不提升 | 数据标注质量差 | 检查标签文件 |
| 训练速度慢 | CPU瓶颈 | 增加workers参数 |
5.2 性能优化技巧
- 混合精度训练 :添加
amp=True参数可加速训练 - 数据加载优化 :使用
cache=ram/disk参数缓存数据集 - 早停机制 :设置
patience=50避免过拟合 - 学习率调度 :尝试
cos或linear调度器
5.3 实际部署建议
- 生产环境推荐使用TensorRT加速:
yolo export model=best.pt format=engine device=0
- 对于视频流处理,建议使用多线程流水线
- 考虑使用OpenVINO优化Intel CPU上的推理性能
我在实际项目中发现,对于小目标检测,将 imgsz 增加到1280可以显著提升效果,但会大幅增加显存消耗。一个折中方案是保持640分辨率但使用 rect=True 参数启用矩形训练。
更多推荐

所有评论(0)