从零到一YOLOv5交通灯识别实战中的7个关键陷阱与解决方案第一次在Ubuntu 20.04上部署YOLOv5训练交通灯检测模型时我经历了从满怀期待到崩溃边缘的全过程。那些深夜调试时弹出的红色报错信息至今想起来仍让人心有余悸。本文将分享我在这个项目中踩过的7个典型深坑以及如何系统性地避开这些陷阱。1. 环境配置版本冲突的连环套CUDA与PyTorch的版本匹配问题堪称深度学习领域的第一课。当我兴冲冲地安装完CUDA 12.2后却发现官方预编译的PyTorch最高只支持到CUDA 11.7。这种基础性错误浪费了我整整两天时间。关键检查点访问PyTorch官网获取官方版本匹配矩阵使用nvidia-smi确认驱动版本通过nvcc --version验证CUDA Toolkit版本提示对于Ubuntu 20.04用户推荐采用以下稳定组合CUDA 11.3PyTorch 1.12.1torchvision 0.13.1# 验证环境是否就绪的检查命令 python3 -c import torch; print(torch.__version__) python3 -c import torch; print(torch.version.cuda)2. 标注工具PyQt依赖的地雷阵选择Labelme作为标注工具看似简单但其PyQt5依赖却暗藏杀机。在conda环境中直接pip install labelme后我遭遇了无法启动GUI的诡异问题。分步解决方案创建独立conda环境Python 3.8最佳通过conda而非pip安装PyQt5最后安装labelmeconda create -n labelme python3.8 conda activate labelme conda install pyqt5.15.7 pip install labelme5.1.1注意PyQt5的版本过高可能导致与Labelme不兼容5.15.x系列最为稳定3. 数据标注那些容易忽视的细节标注质量直接决定模型上限。在标注500张交通灯图片后我才发现几个致命错误多边形闭合问题首尾点未重合标签命名不一致red vs Red未考虑特殊状态闪烁黄灯标注规范检查表项目正确示例错误示例标签命名green_lightgreen标注精度贴合灯罩边缘粗略包围框特殊状态yellow_blinkyellow经验建立标注规范文档并在团队内共享可节省后期50%的调试时间4. 格式转换JSON到YOLO的陷阱Labelme生成的JSON需要转换为YOLO格式的TXT文件这个过程中我遇到了三个典型问题坐标归一化计算错误类别索引从1开始计数换行符导致解析失败修正后的转换脚本关键部分def normalize_points(points, img_width, img_height): return [round(x/img_width, 6) for x in points[::2]] \ [round(y/img_height, 6) for y in points[1::2]] # 在写入文件时确保使用统一换行符 with open(txt_path, w, newline\n) as f: f.write(f{class_idx} { .join(map(str, normalized_points))}\n)5. 数据分割随机性带来的灾难最初我采用纯随机分割数据集结果训练集里缺少某种交通灯状态导致模型完全无法识别该类。后来改进为分层抽样from sklearn.model_selection import train_test_split # 按类别分层抽样 train_idx, temp_idx train_test_split( range(total_samples), test_size0.3, stratifylabels )数据集分配建议比例数据集比例最少样本数训练集70%≥500/类验证集15%≥100/类测试集15%≥100/类6. 训练配置那些不起眼却致命的参数复制coco128.yaml后直接修改导致我损失了三个训练周期主要问题包括路径使用绝对路径而非相对路径未更新类别数量和名称图像尺寸与预训练模型不匹配TLD.yaml关键配置示例train: ../train_data/images/train val: ../train_data/images/valid nc: 3 # red, green, yellow names: [red, green, yellow] # 保持与预训练模型一致 img_size: [640, 640]7. 训练过程突然中断的噩梦当训练到第87个epoch时进程突然被终止。排查发现是Pillow版本冲突升级到9.5.0解决显存不足减小batch_size到8未使用--resume参数续训健壮训练命令python train.py \ --batch-size 8 \ --epochs 100 \ --data data/TLD.yaml \ --weights yolov5s.pt \ --img 640 \ --cache \ --resume在经历这些挫折后当第一次看到模型准确识别出复杂路口的交通灯时那种成就感让所有付出都变得值得。记住每个错误都是进步的阶梯——我的模型最终在测试集上达到了92.3%的mAP而这些经验可能比这个数字更有价值。