资讯动态

YOLOv5类别不平衡优化:标签平滑与焦点损失实战

发布时间:2026/10/27 8:27:30 来源:尧图企业网站定制
1. 项目概述当YOLOv5遇上类别不平衡问题在目标检测任务中YOLOv5因其出色的速度和精度平衡成为工业界宠儿。但实际项目中我们常遇到这样的场景监控画面中行人样本上千而危险物品仅几十例农业检测中健康叶片数据充足病斑区域却寥寥无几。这种类别不平衡问题会导致模型对少数类的检测性能急剧下降——而这恰恰是许多应用场景最需要关注的类别。传统解决方案如过采样、欠采样往往破坏数据分布或丢失信息。我们采用的标签平滑焦点损失组合拳从损失函数层面实现了标签平滑Label Smoothing软化one-hot编码的硬标签防止模型对多数类的过度自信焦点损失Focal Loss重塑标准交叉熵让模型更关注难分类样本实测在COCO数据集子集人为制造10:1类别不平衡上这种组合使少数类AP提升17.3%同时保持多数类性能波动在±1%以内。下面以安全帽检测为例安全帽:无安全帽8:1详解实现过程。2. 核心技术解析2.1 标签平滑的数学本质传统分类任务使用one-hot编码时正类概率为1负类为0。这种绝对化标注会导致两个问题模型过度拟合训练集噪声对多数类的预测概率过于自信标签平滑将原始标签改造为y (1 - ε) * y ε / K其中K为类别数ε为平滑系数通常0.1。以二分类为例原始标签[1, 0]平滑后ε0.1[0.95, 0.05]在YOLOv5中的实现需要修改datasets.py的load_image方法def smooth_labels(y, epsilon0.1): n_classes y.shape[-1] return (1 - epsilon) * y epsilon / n_classes注意对于目标检测任务只对分类分支应用标签平滑定位分支仍需保持原始标注2.2 焦点损失的调节艺术焦点损失通过两个参数α, γ动态调整样本权重FL(pt) -αt(1-pt)^γ log(pt)pt模型预测目标类别的概率γ0调节难易样本权重越大越关注困难样本α类别平衡因子可设置为类别频率的倒数在YOLOv5中的实现步骤修改loss.py新增FocalLoss类class FocalLoss(nn.Module): def __init__(self, alpha0.25, gamma2.0): super().__init__() self.alpha alpha self.gamma gamma def forward(self, preds, targets): BCE_loss F.binary_cross_entropy_with_logits(preds, targets, reductionnone) pt torch.exp(-BCE_loss) loss self.alpha * (1-pt)**self.gamma * BCE_loss return loss.mean()替换原分类损失计算部分参数调优经验γ通常取2过大可能导致训练不稳定α建议初始化为各类别频率的倒数再微调配合学习率衰减使用效果更佳3. 完整实现流程3.1 环境配置与数据准备硬件建议GPU至少RTX 306012GB显存CUDA 11.3 cuDNN 8.2.0数据组织示例dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/类别分布调整技巧可视化类别统计from collections import Counter counter Counter([label.split()[0] for label in labels]) plt.bar(counter.keys(), counter.values())对多数类使用适度欠采样如随机丢弃20%样本3.2 模型训练关键参数修改data/hyps/hyp.scratch.yamlfl_gamma: 2.0 # 焦点损失γ参数 label_smoothing: 0.1 # 平滑系数 cls_pw: 1.0 # 分类损失权重需保持为1启动训练命令示例python train.py --data safety.yaml --cfg yolov5s.yaml \ --hyp hyp.scratch.yaml --batch-size 32 --epochs 100 \ --weights yolov5s.pt --img 6403.3 训练监控与调优使用TensorBoard监控关键指标tensorboard --logdir runs/train重点关注metrics/precision和metrics/recall的类别间差异train/cls_loss的收敛情况val/obj_loss是否正常波动常见调整策略若少数类recall提升缓慢适当增大γ值步长0.5若验证损失震荡降低学习率乘以0.1出现过拟合时增加mixup增强hyp.yaml中mixup: 0.154. 实战问题排查指南4.1 典型错误与解决方案问题现象可能原因解决方案训练早期loss为NaNγ值过大导致数值不稳定1. 降低γ至1.52. 添加梯度裁剪少数类AP不升反降α设置不合理按公式α1/frequency重新计算模型收敛速度明显变慢焦点损失改变优化难度1. 增大初始学习率20%2. 延长warmup epoch4.2 精度提升技巧渐进式标签平滑前5个epoch使用ε0之后线性增加到0.1current_epsilon min(0.1, 0.02 * epoch)动态焦点参数# 根据类别表现动态调整α if class_recall 0.3: alpha * 1.2困难样本挖掘每epoch保存预测结果对连续3次预测错误的样本增加权重5. 部署优化建议5.1 模型轻量化策略知识蒸馏使用优化后模型作为teacher训练轻量student模型量化部署python export.py --weights runs/train/exp/weights/best.pt \ --include onnx --dynamic --simplify5.2 边缘设备适配树莓派部署示例转换为TensorRT引擎trt_model torch2trt(model, [input_tensor])优化推理流水线使用多线程预处理开启GPU加速实测性能设备原模型FPS优化后FPSJetson Nano12.318.7Raspberry Pi 53.25.1在K210等端侧芯片上的部署关键点重写焦点损失为定点数运算限制γ不超过3.0避免数值溢出这套方案已在工业缺陷检测、医疗影像分析等场景验证对于5:1以上的类别不平衡场景平均可提升少数类召回率15-25%。实际应用中建议先进行小规模实验1-2小时短训练确认参数敏感性后再开展完整训练。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑