从华为云垃圾分类比赛到实战:手把手教你用YOLOv3-SPP搞定目标检测(附完整代码与避坑指南)
从华为云垃圾分类比赛到实战手把手教你用YOLOv3-SPP搞定目标检测去年参加华为云垃圾分类比赛时我花了整整两周时间才让YOLOv3-SPP模型在自定义数据集上跑出理想效果。现在回头看那些踩过的坑和验证有效的技巧完全可以总结成一套标准化流程。本文将把比赛经验转化为可复现的实战指南帮你跳过摸索阶段直接上手。1. 环境配置与数据准备在Ubuntu 18.04系统上建议使用conda创建独立Python环境。以下命令可以快速搭建基础环境conda create -n yolov3 python3.7 conda activate yolov3 pip install torch1.8.1 torchvision0.9.1数据集组织往往是最容易被忽视的环节。垃圾检测数据集需要遵循以下目录结构dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── classes.txt注意JPEG图片和对应的txt标注文件必须同名且每个txt文件中每行格式为class_id x_center y_center width height坐标需归一化到0-1范围2. 模型架构关键改进点YOLOv3-SPP相比原版有三个核心改进SPP模块在最后一个卷积层后加入空间金字塔池化提升多尺度特征提取能力K-means锚框聚类针对垃圾数据集重新计算9个先验框尺寸Stitcher数据增强将多张小图拼接成大图模拟远距离拍摄场景实现SPP层的PyTorch代码片段class SPP(nn.Module): def __init__(self): super().__init__() self.maxpool1 nn.MaxPool2d(5, stride1, padding5//2) self.maxpool2 nn.MaxPool2d(9, stride1, padding9//2) self.maxpool3 nn.MaxPool2d(13, stride1, padding13//2) def forward(self, x): o1 self.maxpool1(x) o2 self.maxpool2(x) o3 self.maxpool3(x) return torch.cat([x, o1, o2, o3], dim1)3. 训练调参实战技巧通过200次迭代实验我总结出以下超参数组合效果最佳参数推荐值作用说明初始学习率0.001使用余弦退火衰减批量大小16显存不足时可梯度累积输入尺寸608×608保持32的倍数数据增强概率0.5mosaicstitcher组合训练过程中常见的三个坑及解决方案Loss震荡不收敛检查标注是否含非法值建议添加以下验证代码assert (labels[:, 1:] 1).all(), 标注坐标超出1.0显存溢出在config文件中减小subdivisions参数或使用梯度累积python train.py --accumulate 4类别不平衡修改data/垃圾检测.data中的类别权重class_weights 1.0 2.3 0.7 ... # 根据各类别样本量倒数设置4. 模型评估与部署测试集评估建议使用mAP0.5:0.95指标更能反映实际场景效果。导出ONNX格式的部署模型时需要特别注意torch.onnx.export( model, dummy_input, yolov3_spp.onnx, opset_version11, input_names[images], output_names[output], dynamic_axes{ images: {0: batch}, output: {0: batch} } )在华为云ModelArts部署时config.json需要额外配置预处理参数{ model_algorithm: object_detection, input_format: RGB, normalization: { mean: [123.675, 116.28, 103.53], std: [58.395, 57.12, 57.375] } }5. 效果优化进阶路线当基础模型跑通后可以考虑以下优化方向知识蒸馏用更大模型(如YOLOv4)作为teacher模型量化感知训练添加QAT层实现FP16/INT8量化TensorRT加速转换engine文件时启用FP16模式实际项目中我发现对垃圾检测最有效的优化是改进数据质量。特别是增加以下场景的样本遮挡严重的垃圾堆不同光照条件下的反光物体形态变形的塑料袋/纸箱最后分享一个实用技巧用OpenCV的dnn模块做快速验证时可以通过设置net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)启用GPU加速比原生PyTorch推理快2-3倍。