当前位置: 首页 > news >正文

YOLOv5模型训练翻车实录:从Ubuntu20.04环境配置到Pillow版本冲突的避坑指南

YOLOv5模型训练实战避坑指南:从环境搭建到版本冲突解决

第一次在Ubuntu系统上训练YOLOv5模型时,我遇到了无数令人抓狂的问题。从CUDA版本不兼容到Pillow库的诡异报错,每一步都像在拆解一个技术炸弹。本文将分享我在Ubuntu 20.04上使用ROS Noetic和CUDA 12.2环境训练交通信号灯检测模型时踩过的坑,以及如何系统性地解决这些问题。

1. 环境配置:那些看似简单却暗藏玄机的步骤

Ubuntu 20.04作为深度学习开发的黄金标准系统,理论上应该能提供稳定的基础环境。但当我开始搭建YOLOv5训练环境时,才发现事情没那么简单。

1.1 CUDA与cuDNN的版本迷宫

安装NVIDIA驱动和CUDA工具包时,第一个坑就出现了。官方文档推荐使用CUDA 11.3,但我的RTX 3080显卡需要CUDA 12.2才能发挥最佳性能。经过多次尝试,最终确定了这套组合:

# 安装NVIDIA驱动 sudo apt install nvidia-driver-535 # 安装CUDA 12.2 wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600 sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /" sudo apt-get update sudo apt-get -y install cuda-12-2

注意:安装完成后务必验证CUDA版本是否与系统环境匹配,使用nvcc --version检查

1.2 Conda环境管理的艺术

为了避免污染系统Python环境,我创建了专门的conda环境:

conda create -n yolov5 python=3.8 conda activate yolov5 pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu116

这里遇到了第二个坑:PyTorch与CUDA版本的兼容性问题。经过多次尝试,发现PyTorch 1.12.1与CUDA 11.6的组合最为稳定,尽管我安装了CUDA 12.2。

2. 数据准备:从标注到格式转换的完整流程

数据是模型训练的核心,但数据处理过程往往比想象中复杂得多。

2.1 LabelMe标注实战技巧

使用LabelMe进行标注时,有几个关键点需要注意:

  • 标注顺序一致性:始终按顺时针或逆时针方向标注,确保多边形顶点顺序一致
  • 标签命名规范:采用全小写、无空格的命名方式,如"red_light"而非"Red Light"
  • 图像预处理:标注前统一调整图像尺寸,建议使用640x640分辨率

标注完成后,文件结构应该如下:

yolov5_train/ ├── images/ # 原始图像 ├── jsons/ # LabelMe生成的JSON标注文件 ├── txts/ # 转换后的YOLO格式标注 └── train_data/ # 最终训练数据集

2.2 标注格式转换的关键脚本

将LabelMe的JSON格式转换为YOLO需要的TXT格式是个技术活。以下是核心转换代码:

def convert_labelme_to_yolo(json_file, output_dir, class_list): with open(json_file) as f: data = json.load(f) image_width = data['imageWidth'] image_height = data['imageHeight'] output_lines = [] for shape in data['shapes']: label = shape['label'] class_id = class_list.index(label) # 转换多边形坐标为YOLO格式 points = np.array(shape['points']) normalized_points = points / [image_width, image_height] flattened_points = normalized_points.flatten().tolist() line = [str(class_id)] + [str(round(p, 6)) for p in flattened_points] output_lines.append(' '.join(line) + '\n') output_path = os.path.join(output_dir, os.path.splitext(os.path.basename(json_file))[0] + '.txt') with open(output_path, 'w') as f: f.writelines(output_lines)

提示:转换后务必检查生成的TXT文件,确认坐标值在0-1范围内且类别ID正确

3. 模型训练:那些官方文档没告诉你的细节

3.1 配置文件调优实战

YOLOv5的模型配置文件看似简单,实则暗藏玄机。以下是我的TLD.yaml配置关键部分:

# 数据配置 train: ../train_data/images/train/ val: ../train_data/images/valid/ test: ../train_data/images/test/ # 类别数量和名称 nc: 3 # red, green, yellow names: ['red', 'green', 'yellow'] # 超参数 lr0: 0.01 # 初始学习率 lrf: 0.2 # 最终学习率系数 momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 3.0 warmup_momentum: 0.8 warmup_bias_lr: 0.1

3.2 Pillow版本冲突的终极解决方案

训练过程中最令人崩溃的错误莫过于:

ImportError: cannot import name 'PILLOW_VERSION' from 'PIL'

这个问题源于新版本Pillow(>=10.0.0)移除了PILLOW_VERSION属性。解决方法有几种:

  1. 降级Pillow(推荐):

    pip install Pillow==9.5.0
  2. 修改YOLOv5源码: 在utils/datasets.py中找到相关导入,替换为:

    try: from PIL import PILLOW_VERSION except ImportError: from PIL import __version__ as PILLOW_VERSION
  3. 使用Docker环境

    docker pull ultralytics/yolov5:latest

经过测试,方案1最为简单可靠,不会引入其他兼容性问题。

4. 训练优化与结果分析

4.1 关键训练参数设置

启动训练时,这些参数对结果影响巨大:

python train.py \ --img 640 \ # 图像尺寸 --batch 16 \ # 批次大小 --epochs 100 \ # 训练轮次 --data data/TLD.yaml \ # 数据配置 --cfg models/TLD.yaml \ # 模型配置 --weights yolov5s.pt \ # 预训练权重 --cache \ # 启用缓存加速 --device 0 \ # 使用GPU 0 --adam \ # 使用Adam优化器 --single-cls # 单类别训练模式

4.2 常见训练问题排查表

问题现象可能原因解决方案
GPU利用率低批次大小过小增加--batch参数值
验证集mAP不升学习率过高降低--lr0参数值
训练损失震荡数据不平衡检查标注分布,增加数据增强
内存溢出图像尺寸过大减小--img参数值
NaN损失梯度爆炸添加梯度裁剪,降低学习率

4.3 训练结果可视化技巧

训练完成后,使用YOLOv5内置工具分析结果:

python val.py \ --weights runs/train/exp/weights/best.pt \ --data data/TLD.yaml \ --task test \ --verbose

关键指标解读:

  • mAP@0.5: 交并比阈值为0.5时的平均精度
  • mAP@0.5:0.95: 不同IOU阈值下的平均精度
  • Precision: 预测为正样本中实际为正的比例
  • Recall: 实际正样本中被正确预测的比例

5. 模型部署与性能优化

训练好的模型需要经过优化才能在实际应用中发挥价值。使用以下命令导出优化后的模型:

python export.py \ --weights runs/train/exp/weights/best.pt \ --img 640 \ --batch 1 \ --device 0 \ --include onnx \ --optimize

导出ONNX格式后,可以使用TensorRT进一步加速:

trtexec \ --onnx=best.onnx \ --saveEngine=best.engine \ --fp16 \ --workspace=2048

实际测试中,经过TensorRT优化的模型推理速度提升了3-5倍,显存占用减少40%。

http://www.jsqmd.com/news/933350/

相关文章:

  • 别再让亚稳态搞垮你的FPGA设计:一个真实项目中的跨时钟域踩坑实录
  • 2026年靠谱的户外滑梯/温州乐园滑梯/定制滑梯生产厂家推荐 - 行业平台推荐
  • 不止于安装:在Jetson Nano上为onnxruntime-gpu编译TensorRT支持,提升YOLO推理速度
  • 一文讲透企业级 Harness Coding 架构落地实战!
  • Jetson Nano上编译onnxruntime-gpu踩坑实录:从内存不足到成功运行Python/C++推理
  • 【会议征稿通知 | 福建理工大学主办 | SAE出版 | EI 、Scopus稳定检索】第二届智慧交通与低空运输国际学术会议(ITLAT 2026)
  • 3分钟掌握res-downloader:全网资源一键下载的终极方案
  • **string*、*object**和**struct**
  • geth常用命令
  • 告别手动画圈!用Perl脚本自动化统计MS动力学模拟中的氢键变化
  • Python Web开发实战:从零到精通的15章完整指南
  • 【会议征稿通知 | 北京航空航天大学主办 | IEEE出版 | EI 、Scopus稳定检索】第六届智能通信与计算国际学术会议(ICICC 2026)
  • 别再纠结选哪个了!用鸢尾花数据集手把手对比XGBoost、LightGBM和CatBoost(附Python代码)
  • 【无标题】HELLO WORLD
  • 别再到处找安装包了!2024年JDK 8/17/21最新版(含401补丁)一键下载与环境变量配置保姆级教程
  • 别再羡慕别人的丝滑慢动作了!手把手教你用Super SloMo给视频补帧(附Python代码)
  • LeetCode--Median of Two Sorted Arrays
  • Halcon实战:用edges_sub_pix和fit_circle_contour_xld搞定金属零件圆孔尺寸测量
  • 人机协作新范式:2026年最值得入手的专业AI论文工具
  • 【独家内测实录】Sora 2面部表情生成API调用失败率下降92.7%的7个隐藏配置项(附GitHub验证脚本)
  • 生产级 RAG 不是搜几个 chunk:从召回到引用的一条可信链
  • 手把手解读ACPI表:用Linux命令‘窥探’你电脑的电源管理蓝图
  • LeetCode--Merge k Sorted Lists--分治策略
  • 好用还专业!2026年最流行一键生成论文工具榜单,AI工具一键写高质论文
  • 从Fire Module到移动端部署:手把手教你用PyTorch复现SqueezeNet 1.1(附完整代码)
  • 如何用现代化Rust工具彻底改变Total War模组开发:终极指南
  • 用C# WinForm给汇川H3U PLC做个上位机:从API引用到读写数据的完整流程
  • 观察者模式实战——从消息订阅看一对多通知
  • Longest Valid Parentheses(动态规划)
  • OrCAD端口转换补丁实测:一键切换Port与Off-Page Connector,附详细安装避坑指南