PaddleDetection icon indicating copy to clipboard operation
PaddleDetection copied to clipboard

训练COCO自定义数据集出现label_map索引异常问题

Open isLinXu opened this issue 3 years ago • 0 comments

问题确认 Search before asking

  • [X] 我已经查询历史issue,没有报过同样bug。I have searched the issues and found no similar bug report.

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.pycategory_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!

isLinXu avatar Aug 01 '22 10:08 isLinXu