DETR模型中Pandas绘图报错的修复方案咨询
修复DETR中Pandas绘图的Object类型报错问题
问题根源
报错源于util/plot_utils.py的else分支中,DataFrame包含test_coco_eval_bbox这类存储list/嵌套结构的object类型字段,Pandas的plot函数无法直接处理该类型;同时新版本Pandas要求先调用infer_objects()明确数据类型,触发FutureWarning。
具体修复方案
1. 定位目标代码
找到util/plot_utils.py中触发报错的else分支,通常是如下绘图逻辑:
else: df.plot(x='epoch', y=value, ax=ax, label=run_name)
2. 选择适配的修改方式
方式一:提取list字段中的有效数值(需绘制该字段时用)
如果需要绘制test_coco_eval_bbox这类评估结果字段,可提取list/dict中的具体指标(比如COCO的mAP值),同时处理数据类型:
else: df_processed = df.copy() # 针对test_coco_eval_bbox字段提取有效数值(根据实际存储结构调整逻辑) if 'test_coco_eval_bbox' in df_processed.columns: # 示例:假设字段是存储评估结果的dict,提取bbox的AP值 df_processed['test_coco_eval_bbox'] = df_processed['test_coco_eval_bbox'].apply( lambda x: x['bbox']['AP'] if isinstance(x, dict) else (x[0] if isinstance(x, list) else x) ) # 调用infer_objects解决FutureWarning,明确数据类型 df_processed = df_processed.infer_objects() df_processed.plot(x='epoch', y=value, ax=ax, label=run_name)
方式二:过滤非数值型字段(无需绘制该类字段时用)
如果不需要绘制包含list的object字段,直接筛选数值型列进行绘图:
else: # 筛选所有数值型列,保留epoch作为x轴 df_numeric = df.select_dtypes(include=['number']).assign(epoch=df['epoch']) # 调用infer_objects消除FutureWarning df_numeric = df_numeric.infer_objects() df_numeric.plot(x='epoch', y=value, ax=ax, label=run_name)
3. 验证修复
修改代码后重新运行DETR的绘图流程,确认报错和FutureWarning消失,图表正常生成。
内容的提问来源于stack exchange,提问作者Mahdi Amrollahi
相关产品推荐
相关产品推荐

