从零到一:YOLOv5模型训练与推理实战指南(附环境检查清单)
1. 环境准备与项目结构解析第一次接触YOLOv5时最让我头疼的就是那一堆文件夹和配置文件。记得去年给工厂做零件缺陷检测项目光是搞明白data和models目录的区别就花了整整两天。现在回头看其实YOLOv5的项目结构设计得非常清晰就像乐高积木一样模块化。data文件夹是你的数据集大本营。这里有个小技巧我习惯在data目录下新建images和labels两个子目录分别存放图片和对应的标注文件。标注文件建议用YOLO格式的.txt文件每行格式为类别编号 x_center y_center width height所有坐标都是相对图片宽高的归一化值0-1之间。比如我在做交通标志检测时一个标注行可能是3 0.5 0.5 0.2 0.3表示第3类目标位于图片正中央宽度占图片20%高度占30%。models文件夹藏着YOLOv5的五个预训练模型就像游戏里的角色属性面板YOLOv5s刺客型速度快但攻击力弱参数量7.2MYOLOv5m战士型平衡性好参数量21.2MYOLOv5l坦克型血厚攻高参数量46.5MYOLOv5xBOSS级全能但吃资源参数量86.7MYOLOv5n精灵型超轻量参水量1.9M新手建议从YOLOv5s开始练手。上周帮学生调试无人机识别项目在Jetson Nano上跑YOLOv5s能达到35FPS换成YOLOv5m直接掉到15FPS这就是模型尺寸的威力。注意官方代码库更新频繁建议用git clone --depth 1 https://github.com/ultralytics/yolov5获取最新稳定版2. 数据配置的黄金法则很多教程一上来就让人改yaml文件但没人告诉你这就像配中药——分量差一点效果天壤之别。去年做医疗影像项目时因为一个路径配置错误白白训练了20个epoch才发现问题。创建数据集配置文件时我总结了个万能模板# my_dataset.yaml path: ../datasets/my_project # 总目录 train: images/train # 训练集相对路径 val: images/val # 验证集相对路径 test: images/test # 测试集相对路径可选 nc: 3 # 类别数我上次做安全帽检测就设成3helmet, person, other names: [cat, dog, bird] # 类别名称数据集目录结构应该像这样datasets/ └── my_project/ ├── images/ │ ├── train/ # 训练图片 │ ├── val/ # 验证图片 │ └── test/ # 测试图片 └── labels/ ├── train/ # 训练标注 ├── val/ # 验证标注 └── test/ # 测试标注数据增强是提升模型泛化能力的关键。YOLOv5默认会启用Mosaic增强像拼图一样混合四张图和HSV色彩空间扰动。如果检测小物体建议在data.yaml里添加# 小物体专用配置 small_object_params: mosaic: 1.0 # 保持mosaic增强 hsv_h: 0.015 # 色调扰动幅度 hsv_s: 0.7 # 饱和度扰动 hsv_v: 0.4 # 明度扰动 fliplr: 0.5 # 水平翻转概率3. 训练参数的实战心得第一次训练YOLOv5时我被那一长串参数吓到了。其实日常项目只需要关注这几个核心参数python train.py \ --weights yolov5s.pt \ # 预训练权重 --data my_dataset.yaml \ # 数据配置 --cfg models/yolov5s.yaml \ # 模型结构 --epochs 100 \ # 训练轮次 --batch-size 16 \ # 批大小 --img 640 \ # 输入尺寸 --device 0 \ # GPU编号 --name exp1 # 实验名称batch-size设置有个经验公式显存(GB)除以3。比如8GB显存的RTX 3070设batch-size16比较安全。我在Colab上测试过Tesla T4 (16GB): 最大batch-size32RTX 3090 (24GB): 最大batch-size64学习率调优是门艺术。默认lr00.01对大多数情况适用但如果数据集很小1k张图可以降到0.001。有个小技巧用--hyp data/hyps/hyp.scratch-low.yaml启用保守的超参配置适合小数据集。训练过程中要盯紧这些指标mAP0.5IoU阈值为0.5时的平均精度mAP0.5:0.95IoU阈值从0.5到0.95的平均精度precision查准率预测正确的正样本比例recall查全率被正确预测的正样本比例实测发现当验证集mAP连续3个epoch不提升时可以提前终止训练4. 推理部署的十八般武艺训练完的模型就像刚出炉的刀剑得实际砍砍东西才知道好不好用。YOLOv5的detect.py支持多种推理模式# 图片推理 python detect.py --weights runs/train/exp/weights/best.pt --source test.jpg # 视频流处理 python detect.py --weights best.pt --source test.mp4 # 摄像头实时检测 python detect.py --weights best.pt --source 0 # 0表示默认摄像头 # 批量处理文件夹 python detect.py --weights best.pt --source ../input_images/性能优化技巧添加--half启用半精度推理速度提升20%且几乎不掉精度使用--augment启用测试时增强TTAmAP能提升1-2%但速度减半对于嵌入式设备导出ONNX后可以用TensorRT加速python export.py --weights best.pt --include onnx --img 640 --dynamic trtexec --onnxbest.onnx --saveEnginebest.engine --fp16常见坑点如果推理结果全是乱框检查训练时的--img尺寸和推理时是否一致出现CUDA out of memory时尝试减小--img-size如从640降到416视频推理卡顿可以加--stride 32牺牲少量精度换流畅度记得第一次部署到树莓派上时原始模型要2秒处理一帧经过TensorRT优化后达到0.15秒/帧这才是边缘计算该有的速度。关键是要根据硬件特性选择合适的模型格式和推理参数。