【已解决】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))
修改后重新训练并测试,模型正常生成检测结果,错误消失。
五、扩展建议:学习率调整策略
- 根据训练卡数调整:
- 若使用单卡训练,默认学习率需除以GPU数量(如8卡默认
0.01
,单卡应设为0.01/8=0.00125
,可近似取0.001
)。
- 若使用单卡训练,默认学习率需除以GPU数量(如8卡默认
- 使用学习率预热(Warm-up):
在训练初期使用更小的学习率(如0.0001
)逐步提升,避免模型初始训练时因梯度不稳定而崩溃。 - 监控训练日志:
若训练过程中损失值(Loss)突然飙升或长时间不下降,可能是学习率过高,需及时调整。
六、总结
MMdetection中“测试结果为空”的错误可能由多种原因导致,当排除数据集标签问题后,学习率设置是需要重点排查的参数之一。合理的学习率设置需结合训练资源(GPU数量)、数据集规模和模型复杂度综合调整,建议从小值开始尝试并逐步优化。通过本次调整,不仅解决了报错问题,也为后续对比实验的稳定性提供了保障。