PixelLib自定义实例分割训练时出现input_image_meta形状不匹配报错
报错原因分析
本次报错的核心是Mask R-CNN输入层期望的input_image_meta维度(15)与数据集生成的实际维度(14)不一致,维度计算和模型总类数(含背景)直接绑定,同时伴随验证集为空的配置错误。
排查与解决步骤
1. 修正数据集目录结构
PixelLib的load_dataset方法强制要求数据集根目录下必须包含train和val两个子目录,每个子目录下再分别放置images和annotations文件夹,正确结构如下:
Dataset/ ├── train/ # 训练集目录 │ ├── images/ # 训练图片存放路径 │ │ ├── img1.jpg │ │ └── ... │ └── annotations/ # 训练集标注文件(json格式,与图片同名) │ ├── img1.json │ └── ... └── val/ # 验证集目录(必须存在,可放少量样本) ├── images/ # 验证图片存放路径 │ ├── val_img1.jpg │ └── ... └── annotations/ # 验证集标注文件 ├── val_img1.json └── ...
- 从现有训练集中拆分至少3-5张图片到
val目录,解决Validate 0 images问题,同时避免类数识别异常。 - 确认所有标注json文件的
label字段类名完全统一,无拼写错误、多余类名。
2. 修正num_classes参数配置
modelConfig中的num_classes参数仅统计需要识别的自定义类数量,不包含背景类:
- 若仅需识别1类目标(如道路破损),设置
num_classes=1,此时总类数为1+1(背景)=2,对应生成的input_image_meta维度为14,与实际匹配。 - 若需识别2类自定义目标,保持
num_classes=2,此时总类数为2+1(背景)=3,对应生成的input_image_meta维度为15,匹配模型期望。
当前配置大概率存在标注仅含1类自定义目标,但错误设置num_classes=2的问题,导致模型按总类数3计算meta维度为15,实际数据集仅识别到总类数2,生成的meta维度为14,触发报错。
3. 修正预训练模型加载逻辑
加载mask_rcnn_coco.h5预训练权重时,添加exact=False参数,跳过权重层的严格维度校验,避免类数不匹配导致的加载异常:
train_maskrcnn.load_pretrained_model("/content/drive/MyDrive/AI ML Trainee/Damage Detection/pix/mask_rcnn_coco.h5", exact=False)
同时确认network_backbone参数与预训练权重匹配,你当前使用的resnet101与官方COCO权重兼容,无需调整。
4. 最小变量测试
先降低训练配置到最低值,排除其他变量干扰:
- 将
batch_size调整为2,num_epochs调整为1,augmentation设为False,运行测试代码:train_maskrcnn.modelConfig(network_backbone = "resnet101", num_classes= 1, batch_size = 2) train_maskrcnn.load_pretrained_model("/content/drive/MyDrive/AI ML Trainee/Damage Detection/pix/mask_rcnn_coco.h5", exact=False) train_maskrcnn.load_dataset("/content/drive/MyDrive/AI ML Trainee/Damage Detection/pix/Dataset") train_maskrcnn.train_model(num_epochs = 1, augmentation=False, path_trained_models = "mask_rcnn_models")
测试运行正常后,再逐步调高epoch数、batch_size,开启数据增强。
内容的提问来源于stack exchange,提问作者Arihant Kamdar
相关产品推荐
相关产品推荐

