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 python3.8 conda activate yolov5 pip install torch1.12.1cu116 torchvision0.13.1cu116 torchaudio0.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.13.2 Pillow版本冲突的终极解决方案训练过程中最令人崩溃的错误莫过于ImportError: cannot import name PILLOW_VERSION from PIL这个问题源于新版本Pillow10.0.0移除了PILLOW_VERSION属性。解决方法有几种降级Pillow推荐pip install Pillow9.5.0修改YOLOv5源码 在utils/datasets.py中找到相关导入替换为try: from PIL import PILLOW_VERSION except ImportError: from PIL import __version__ as PILLOW_VERSION使用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关键指标解读mAP0.5: 交并比阈值为0.5时的平均精度mAP0.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 \ --onnxbest.onnx \ --saveEnginebest.engine \ --fp16 \ --workspace2048实际测试中经过TensorRT优化的模型推理速度提升了3-5倍显存占用减少40%。