PaddleDetection
PaddleDetection copied to clipboard
训练COCO自定义数据集出现label_map索引异常问题
问题确认 Search before asking
bug描述 Describe the Bug
将XML格式数据集转换为COCO数据集后,使用PaddleDetection中的picodet和ssdlite_mobilenet模型进行训练。 在训练到若干个Epoch即为出现以下错误:
Traceback (most recent call last):
File "tools/train.py", line 177, in <module>
main()
File "tools/train.py", line 173, in main
run(FLAGS, cfg)
File "tools/train.py", line 127, in run
trainer.train(FLAGS.eval)
File "/media/hxzh02/SB@home/hxzh/PaddleDetection/ppdet/engine/trainer.py", line 506, in train
self._eval_with_loader(self._eval_loader)
File "/media/hxzh02/SB@home/hxzh/PaddleDetection/ppdet/engine/trainer.py", line 533, in _eval_with_loader
metric.update(data, outs)
File "/media/hxzh02/SB@home/hxzh/PaddleDetection/ppdet/metrics/metrics.py", line 113, in update
outs, self.clsid2catid, bias=self.bias)
File "/media/hxzh02/SB@home/hxzh/PaddleDetection/ppdet/metrics/coco_utils.py", line 53, in get_infer_results
outs['bbox'], outs['bbox_num'], im_id, catid, bias=bias)
File "/media/hxzh02/SB@home/hxzh/PaddleDetection/ppdet/metrics/json_results.py", line 32, in get_det_res
category_id = label_to_cat_id_map[int(num_id)]
KeyError: 34
最开始怀疑是数据集格式转换出现问题,因此重新生成了几遍又继续去跑,但仍然无果,依旧出现以上错误。
接着把其他使用COCO格式的模型配置来跑当前数据集,运行正常,这里使用的是faster_rcnn。
那么这样问题就来了,有一个跑成功说明COCO格式本身是没问题的,会不会有可能是模型运行机制上存在不同,
于是顺着Error的报错位置和line来做定位,发现问题出现在label_to_cat_id_map这个变量的索引获取。
label_to_cat_id_map是一个dict结构,当前的用法是若dict获取不到key,那么就会产生Error。
抱着试一试的心态去底层代码修改调整和打印数据,将PaddleDetection/ppdet/metrics/json_results.py中 category_id = label_to_cat_id_map[int(num_id)]修改为category_id = label_to_cat_id_map.get('num_id')。
这个修改的方法是利用dict内置的get(key[,default])方法,如果key存在,则返回其value,否则返回default;使用这个方法永远不会触发KeyError,如:
t = {
'a': '1',
'b': '2',
'c': '3',
}
print(t.get('d'))
会出现:None
接着重新运行一遍所有步骤,发现运行正常。
复现训练命令:
export CUDA_VISIBLE_DEVICES=0
python -u tools/train.py -c configs/picodet/picodet_m_320_coco_lcnet.yml -o use_gpu=True --use_vdl=True --vdl_log_dir=vdl_dir/scalar --eval
export CUDA_VISIBLE_DEVICES=0
python -u tools/train.py -c configs/ssd/ssdlite_mobilenet_v3_small_320_coco.yml -o use_gpu=True --use_vdl=True --vdl_log_dir=vdl_dir/scalar --eval
复现环境 Environment
- PaddlePaddle: paddlepaddle-gpu 2.3.1.post112
- CUDA: 11.2
是否愿意提交PR Are you willing to submit a PR?
- [X] Yes I'd like to help by submitting a PR!