【已解决】ERROR:The testing results of the whole dataset is empty

解决MMdetection测试结果为空的问题:学习率设置不当的排查与修复

一、问题描述

在使用MMdetection进行对比实验时,遇到了如下错误:

Loading and preparing results... 05/30 15:29:43 - mmengine - ERROR - C:\Users\DaoXin\anaconda3\lib\site-packages\mmdet\evaluation\metrics\coco_metric.py - compute_metrics - 465 - The testing results of the whole dataset is empty.

错误信息明确指出:整个数据集的测试结果为空

二、初步排查:排除数据集问题

首先考虑常见原因:配置文件中的类别标签(class_name)与COCO数据集JSON文件中的标签不对应。但经过验证:

  • 相同的COCO数据集在MMdetection的其他算法(如Faster R-CNN、YOLOX)中可正常运行;
  • 手动检查配置文件的class_name与JSON文件的categories字段,标签完全一致。

结论:数据集本身及标签映射无问题,问题出在算法的参数设置上。

三、核心原因:学习率(LR)设置过高

进一步分析发现,在运行某些对比实验时(如尝试使用较大的学习率加速训练),模型可能因参数更新幅度过大而无法收敛,导致测试时未生成有效检测结果。

  • 默认学习率:MMdetection中部分算法(如Cascade R-CNN、Swin Transformer等)的默认学习率为0.01(针对8卡训练场景);
  • 问题场景:当使用单卡训练或数据集规模较小时,0.01的学习率可能导致梯度爆炸或模型震荡,最终输出空结果。
四、解决方案:降低学习率

将配置文件中的学习率从0.01调整为0.05,如果还是不行,就逐步对半向下调整,修改示例如下:

# 原配置文件中的学习率设置(通常在schedule.py或模型配置文件中)
optim_wrapper = dict(
    optimizer=dict(lr=0.01),
    paramwise_cfg=dict(bias_lr_mult=2., bias_decay_mult=0.),
    clip_grad=dict(max_norm=35, norm_type=2))

# 修改后(关键改动:lr=0.005)
optim_wrapper = dict(
    optimizer=dict(lr=0.005),
    paramwise_cfg=dict(bias_lr_mult=2., bias_decay_mult=0.),
    clip_grad=dict(max_norm=35, norm_type=2))

修改后重新训练并测试,模型正常生成检测结果,错误消失。

五、扩展建议:学习率调整策略
  1. 根据训练卡数调整
    • 若使用单卡训练,默认学习率需除以GPU数量(如8卡默认0.01,单卡应设为0.01/8=0.00125,可近似取0.001)。
  2. 使用学习率预热(Warm-up)
    在训练初期使用更小的学习率(如0.0001)逐步提升,避免模型初始训练时因梯度不稳定而崩溃。
  3. 监控训练日志
    若训练过程中损失值(Loss)突然飙升或长时间不下降,可能是学习率过高,需及时调整。
六、总结

MMdetection中“测试结果为空”的错误可能由多种原因导致,当排除数据集标签问题后,学习率设置是需要重点排查的参数之一。合理的学习率设置需结合训练资源(GPU数量)、数据集规模和模型复杂度综合调整,建议从小值开始尝试并逐步优化。通过本次调整,不仅解决了报错问题,也为后续对比实验的稳定性提供了保障。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值