Detectron2自定义模型在CPU环境报‘配置键不存在’错误,配置项已存在
解决Detectron2自定义模型CPU环境KeyError问题
针对自定义Detectron2模型在CPU环境报错KeyError: 'Non-existent config key: MODEL.ROI_BOX_HEAD.FED_LOSS_FREQ_WEIGHT_POWER'、但GPU环境和预训练模型正常运行的问题,可按以下方案解决:
1. 对齐Detectron2版本
该报错最常见原因是训练环境(GPU)与推理环境(CPU)的Detectron2版本不一致。MODEL.ROI_BOX_HEAD.FED_LOSS_FREQ_WEIGHT_POWER是较新版本Detectron2新增的配置项,若CPU环境版本偏旧,会无法识别该键。
- 查看GPU训练环境的Detectron2版本:
pip show detectron2 - 在CPU环境安装完全相同的版本:
pip install detectron2==<训练时的版本号>
2. 手动注册缺失的配置项
若无法统一版本(比如CPU环境有依赖限制),可在加载配置前,手动给对应配置类添加缺失的键:
from detectron2.config import CfgNode as CN # 初始化基础配置结构,添加缺失的配置项 cfg = CN() cfg.MODEL = CN() cfg.MODEL.ROI_BOX_HEAD = CN() cfg.MODEL.ROI_BOX_HEAD.FED_LOSS_FREQ_WEIGHT_POWER = 0.5 # 加载自定义配置文件 cfg.merge_from_file("config.yaml") # 后续正常加载模型 cfg.MODEL.WEIGHTS = "outputs/model_final.pth" cfg.MODEL.DEVICE = "cpu" # 显式指定CPU设备
或贴合Detectron2配置体系,修改Box Head的默认配置:
from detectron2.modeling.roi_heads.box_head import FastRCNNConvFCHead from detectron2.config import get_cfg # 给Box Head默认配置添加缺失项 default_box_head_config = FastRCNNConvFCHead.default_config default_box_head_config.FED_LOSS_FREQ_WEIGHT_POWER = 0.5 # 正常加载配置和模型 cfg = get_cfg() cfg.merge_from_file("config.yaml") cfg.MODEL.DEVICE = "cpu"
3. 安全加载自定义配置
若上述方法无效,可手动解析YAML配置,递归设置配置项以避免KeyError:
from detectron2.config import get_cfg import yaml # 初始化基础配置(需与训练时使用的基础配置一致) cfg = get_cfg() # 示例:若训练基于faster_rcnn_R_50_FPN_3x,先加载该基础配置 # cfg.merge_from_file(model_zoo.get_config_file("COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml")) # 加载自定义配置文件 with open("config.yaml", "r") as f: custom_config = yaml.safe_load(f) # 递归设置配置项,自动添加缺失的键 def update_config(cfg_node, config_dict): for key, value in config_dict.items(): if isinstance(value, dict): if not hasattr(cfg_node, key): setattr(cfg_node, key, CN()) update_config(getattr(cfg_node, key), value) else: setattr(cfg_node, key, value) update_config(cfg, custom_config) # 配置CPU设备并加载模型 cfg.MODEL.DEVICE = "cpu" cfg.MODEL.WEIGHTS = "outputs/model_final.pth"
4. 训练时导出兼容配置
在GPU训练完成后,确保保存的配置包含所有必要项:
# 训练结束后,确认所有配置项正确后再保存 cfg.freeze() with open("outputs/config.yaml", "w") as f: f.write(cfg.dump())
使用该导出的配置文件在CPU环境加载,可避免配置项缺失问题。
内容的提问来源于stack exchange,提问作者rudyoactiv
相关产品推荐
相关产品推荐

