
YOLOv5训练猫狗数据集翻车实录我是如何解决‘只检测到猫’这个诡异问题的训练一个目标检测模型听起来很酷直到你发现它只认猫不认狗。这就像养了一只偏科的AI宠物让人哭笑不得。本文将带你深入排查这个看似简单却暗藏玄机的问题。1. 问题现象与初步排查我的训练日志看起来一切正常损失函数稳步下降验证集准确率逐步提升。但当我在测试集上运行detect.py时模型对狗视而不见仿佛世界上只有猫这一种动物。关键异常表现测试图片中的狗全部被忽略部分猫被错误分类为背景模型置信度波动较大注意当模型出现偏科现象时首先检查数据集标注格式是否正确这是最常见的问题根源。我使用以下命令检查了数据集标注python -c from utils.general import *; check_dataset(data/catdog.yaml)2. 数据集层面的深度检查2.1 标签文件结构剖析YOLOv5要求的标签格式是每行一个对象格式为class_id x_center y_center width height常见标签错误对比表错误类型正确示例错误示例导致问题类别ID错误0 0.5 0.5 0.2 0.31 0.5 0.5 0.2 0.3类别混淆坐标越界0 0.5 0.5 0.2 0.30 1.2 0.5 0.2 0.3训练崩溃格式混乱0 0.5 0.5 0.2 0.3cat 50% 50% 20% 30%解析失败2.2 数据分布诊断使用以下Python代码分析类别分布import os from collections import Counter label_dir data/labels/train class_counts Counter() for label_file in os.listdir(label_dir): with open(os.path.join(label_dir, label_file)) as f: for line in f: class_id int(line.split()[0]) class_counts[class_id] 1 print(类别分布:, class_counts)典型数据不平衡问题猫样本远多于狗样本某些角度的狗样本缺失光照条件分布不均3. 模型配置陷阱排查3.1 配置文件关键参数在data/catdog.yaml中必须明确定义类别# 类别数量和名称 nc: 2 # 类别数 names: [cat, dog] # 类别名称模型配置文件对比参数正确配置错误配置影响nc21忽略第二类names[cat,dog][animal]分类混乱anchors自动计算不适配检测框不准3.2 训练参数优化调整train.py中的关键参数# 针对类别不平衡的调整 hyp { lr0: 0.01, # 初始学习率 cls: 0.5, # 分类损失权重 obj: 1.0, # 目标存在损失权重 fl_gamma: 1.5 # 焦点损失参数 }4. 进阶解决方案与技巧4.1 数据增强策略在data/hyps/hyp.scratch-low.yaml中添加针对性增强# 针对猫狗数据集的特殊增强 hsv_h: 0.015 # 色调增强 hsv_s: 0.7 # 饱和度增强 hsv_v: 0.4 # 明度增强 flipud: 0.5 # 垂直翻转概率效果对比实验数据增强策略mAP0.5 (猫)mAP0.5 (狗)提升幅度基础增强0.870.62-色调扰动0.860.689.7%垂直翻转0.850.7114.5%4.2 迁移学习技巧使用预训练模型时需注意python train.py --weights yolov5s.pt --data catdog.yaml --epochs 100 --freeze 10提示冻结前10层可以防止小数据集上的过拟合同时加速训练5. 系统化调试流程建立系统化的排查清单标签验证阶段使用labelImg复查随机样本运行verify_labels.py脚本检查类别ID连续性训练监控阶段观察各类别AP曲线检查混淆矩阵验证数据加载器输出测试分析阶段在不同子集上测试可视化注意力图分析错误案例模式典型错误模式诊断表错误模式可能原因解决方案只检测大类类别不平衡重采样/重加权漏检小物体锚点不适配聚类重计算误检背景负样本不足添加困难负样本最后分享一个实用技巧当遇到难以诊断的问题时可以先用一个极小的子集如50张图进行快速实验这能大大缩短调试周期。我在解决这个猫狗问题时就是通过简化实验发现是标签文件中的类别ID定义错误——所有狗都被标记成了猫。