You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

训练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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:35:16