训练Detectron2识别树叶时出现KeyError: 'p2'错误求助
解决Detectron2训练时的KeyError: 'p2'问题
问题原因
你在配置中修改了backbone为ResNet-34,但未对应调整FPN或RPN的特征层配置:
- 原模型配置基于ResNet-50+FPN结构,RPN默认依赖FPN输出的
p2-p5特征层 - 你将
cfg.MODEL.BACKBONE.NAME设为"build_resnet_backbone",这会禁用FPN结构,此时backbone输出的特征层名称是res2-res5而非p2-p5 - RPN仍在尝试读取默认的FPN特征层名称
p2,因此触发KeyError
修复方案
以下两种方案二选一:
方案1:保留FPN结构,适配ResNet-34
修改backbone配置为带FPN的版本,并指定正确的输入特征层:
def custom_config(): cfg = get_cfg() # 加载基础配置 cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")) cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml") # Model配置 - 适配ResNet-34+FPN cfg.MODEL.MASK_ON = True cfg.MODEL.ROI_HEADS.NUM_CLASSES = 1 # 使用带FPN的ResNet backbone cfg.MODEL.BACKBONE.NAME = "build_resnet_fpn_backbone" cfg.MODEL.RESNETS.DEPTH = 34 cfg.MODEL.RESNETS.RES2_OUT_CHANNELS = 64 # 指定FPN输入特征层为ResNet-34的stage输出 cfg.MODEL.FPN.IN_FEATURES = ["res2", "res3", "res4", "res5"] # RPN和ROI Heads使用FPN输出的特征层 cfg.MODEL.RPN.IN_FEATURES = ["p2", "p3", "p4", "p5"] cfg.MODEL.ROI_HEADS.IN_FEATURES = ["p2", "p3", "p4", "p5"] # Solver配置 cfg.SOLVER.BASE_LR = 0.0002 cfg.SOLVER.MAX_ITER = 40000 cfg.SOLVER.STEPS = (20, 10000, 20000) cfg.SOLVER.GAMMA = 0.5 # 修正为大写参数,原小写配置无效 cfg.SOLVER.IMS_PER_BATCH = 4 # Test配置 cfg.TEST.DETECTIONS_PER_IMAGE = 20 # INPUT配置 cfg.INPUT.MIN_SIZE_TRAIN = (800,) # DATASETS配置 cfg.DATASETS.TEST = ('val',) cfg.DATASETS.TRAIN = ('train',) cfg.OUTPUT_DIR = "/train/" return cfg
方案2:禁用FPN,使用单特征层
如果不需要FPN结构,直接使用ResNet-34的最后一层特征,需修改RPN和ROI Heads的输入特征层:
def custom_config(): cfg = get_cfg() # 加载基础配置 cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")) cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml") # Model配置 - 仅用ResNet-34 backbone cfg.MODEL.MASK_ON = True cfg.MODEL.ROI_HEADS.NUM_CLASSES = 1 cfg.MODEL.BACKBONE.NAME = "build_resnet_backbone" cfg.MODEL.RESNETS.DEPTH = 34 cfg.MODEL.RESNETS.RES2_OUT_CHANNELS = 64 # 指定RPN使用ResNet的最后一层特征 cfg.MODEL.RPN.IN_FEATURES = ["res5"] # 指定ROI Heads使用ResNet的最后一层特征 cfg.MODEL.ROI_HEADS.IN_FEATURES = ["res5"] # Solver配置 cfg.SOLVER.BASE_LR = 0.0002 cfg.SOLVER.MAX_ITER = 40000 cfg.SOLVER.STEPS = (20, 10000, 20000) cfg.SOLVER.GAMMA = 0.5 cfg.SOLVER.IMS_PER_BATCH = 4 # Test配置 cfg.TEST.DETECTIONS_PER_IMAGE = 20 # INPUT配置 cfg.INPUT.MIN_SIZE_TRAIN = (800,) # DATASETS配置 cfg.DATASETS.TEST = ('val',) cfg.DATASETS.TRAIN = ('train',) cfg.OUTPUT_DIR = "/train/" return cfg
额外注意事项
- 原代码中
cfg.SOLVER.gamma为小写,Detectron2配置参数要求大写GAMMA,需修正避免无效配置 - 确保
load_data函数返回的数据集格式符合Detectron2的COCO规范,每个样本需包含file_name、height、width、annotations等必要字段
内容的提问来源于stack exchange,提问作者azula
相关产品推荐
相关产品推荐

