使用fine_grained训练Rotated RetinaNet时遇IndexError问题求助
问题解决:MMRotate细粒度训练HRSC2016时评估阶段IndexError错误
问题场景
- 使用配置文件
rotated_retinanet_obb_r50_fpn_6x_hrsc_rr_le90.py进行细粒度目标检测训练 - 评估阶段触发
IndexError: tuple index out of range错误,添加--no-validate参数跳过评估后训练可正常执行 - 已确认配置中
num_classes=33且classwise=True,需解决该问题以完成HRSC2016数据集上带fine_grained的基线模型评估
报错堆栈
Traceback (most recent call last): File "tools/train.py", line 192, in <module> main() File "tools/train.py", line 181, in main train_detector( File "/root/autodl-tmp/mmrotate/mmrotate/apis/train.py", line 141, in train_detector runner.run(data_loaders, cfg.workflow) File "/root/miniconda3/envs/mmrotate/lib/python3.8/site-packages/mmcv/runner/epoch_based_runner.py", line 136, in run epoch_runner(data_loaders[i], **kwargs) File "/root/miniconda3/envs/mmrotate/lib/python3.8/site-packages/mmcv/runner/epoch_based_runner.py", line 58, in train self.call_hook('after_train_epoch') File "/root/miniconda3/envs/mmrotate/lib/python3.8/site-packages/mmcv/runner/base_runner.py", line 317, in call_hook getattr(hook, fn_name)(self) File "/root/miniconda3/envs/mmrotate/lib/python3.8/site-packages/mmcv/runner/hooks/evaluation.py", line 271, in after_train_epoch self._do_evaluate(runner) File "/root/miniconda3/envs/mmrotate/lib/python3.8/site-packages/mmdet/core/evaluation/eval_hooks.py", line 63, in _do_evaluate key_score = self.evaluate(runner, results) File "/root/miniconda3/envs/mmrotate/lib/python3.8/site-packages/mmcv/runner/hooks/evaluation.py", line 367, in evaluate eval_res = self.dataloader.dataset.evaluate( File "/root/autodl-tmp/mmrotate/mmrotate/datasets/hrsc.py", line 251, in evaluate mean_ap, _ = eval_rbbox_map( File "/root/autodl-tmp/mmrotate/mmrotate/core/evaluation/eval_map.py", line 243, in eval_rbbox_map print_map_summary( File "/root/autodl-tmp/mmrotate/mmrotate/core/evaluation/eval_map.py", line 305, in print_map_summary label_names[j], num_gts[i, j], results[j]['num_dets'], IndexError: tuple index out of range
解决方案
1. 检查类别映射与数量一致性
- 打开
mmrotate/datasets/hrsc.py,确认细粒度训练对应的CLASSES列表长度是否为33,确保和配置中的num_classes完全匹配 - 若使用自定义细粒度类别,需保证数据集标注中的类别名称/ID与代码中的类别列表一一对应
2. 修复评估函数的索引越界问题
定位到mmrotate/core/evaluation/eval_map.py第305行,修改索引逻辑以避免越界:
# 替换原出错行的代码片段 if j < len(label_names): current_label = label_names[j] else: current_label = f"class_{j}" print(f"{current_label:<20} {num_gts[i, j]:<6} {results[j]['num_dets']:<6} " f"{results[j]['recall']:<10.3f} {results[j]['ap']:<10.3f}")
3. 验证数据集标注的类别ID范围
- 检查HRSC2016的标注文件(如XML或JSON),确保所有目标的类别ID都在
0~32范围内(对应33类),无超出范围的ID导致统计维度不匹配
4. 确认评估参数传递正确性
- 检查配置文件中
evaluation模块的classwise=True是否正确生效,确保评估阶段按类别统计的逻辑正常运行
内容的提问来源于stack exchange,提问作者user20646910
相关产品推荐
相关产品推荐

