Pixellib自定义实例分割训练未过滤_background_标签报错问题
Pixellib自定义实例分割训练_background_类别报错修复
问题现象
- 基于Pixellib实现实例分割任务,使用labelme标注苹果、香蕉、饮料瓶、塑料袋共4类检测目标,标注过程中用
_background_标签标记非目标区域。 - 初始训练代码如下:
from pixellib.custom_train import instance_custom_training train_maskrcnn = instance_custom_training() train_maskrcnn.modelConfig(network_backbone = "resnet101", num_classes=4, batch_size=4, class_names= ["_background_","apple","banana","drinkBottle","plasticBag"]) train_maskrcnn.load_pretrained_model("mask_rcnn_coco.h5") train_maskrcnn.load_dataset(r'myData') train_maskrcnn.train_model(num_epochs = 300, augmentation=True, path_trained_models = r"D:/pythonProjects/model")
- 数据集格式转换后,生成的
train.json、test.json的categories字段错误包含_background_类别,片段如下:
"categories": [ { "supercategory": "apple", "id": 1, "name": "apple" }, { "supercategory": "_background_", "id": 2, "name": "_background_" }, { "supercategory": "banana", "id": 3, "name": "banana" }, { "supercategory": "plasticBag", "id": 4, "name": "plasticBag" }, { "supercategory": "drinkBottle", "id": 5, "name": "drinkBottle" } ]
- 启动训练触发维度不匹配报错,核心报错信息:
ValueError: Error when checking input: expected input_image_meta to have shape (17,) but got array with shape (18,)
- 根因:
_background_是Pixellib内置保留的背景类,不需要手动标注、也不需要加入自定义类别列表,手动添加后会导致数据集加载的类别总数和模型配置的类别数不一致,最终触发输入维度校验失败。
修复步骤
1. 清理数据集标注JSON文件
打开数据集目录下的train.json和test.json,做3项修改:
- 删除
categories数组中name为_background_的条目 - 遍历
annotations数组,删除所有category_id对应_background_类别的标注记录 - 将剩余4个目标类别的id重新映射为连续的1-4,修正后的
categories格式如下:
"categories": [ { "supercategory": "apple", "id": 1, "name": "apple" }, { "supercategory": "banana", "id": 2, "name": "banana" }, { "supercategory": "drinkBottle", "id": 3, "name": "drinkBottle" }, { "supercategory": "plasticBag", "id": 4, "name": "plasticBag" } ]
2. 修正训练代码配置
Mask RCNN的num_classes计算规则为自定义检测类别数 + 1(内置背景类),class_names参数仅需传入自定义检测类,不需要手动添加_background_,修正后的训练代码如下:
from pixellib.custom_train import instance_custom_training train_maskrcnn = instance_custom_training() train_maskrcnn.modelConfig( network_backbone = "resnet101", num_classes=5, # 4个检测类 + 1个内置背景类 batch_size=4, class_names= ["apple","banana","drinkBottle","plasticBag"] # 仅传自定义目标类 ) train_maskrcnn.load_pretrained_model("mask_rcnn_coco.h5") train_maskrcnn.load_dataset(r'myData') train_maskrcnn.train_model(num_epochs = 300, augmentation=True, path_trained_models = r"D:/pythonProjects/model")
修改完成后重新启动训练即可正常运行。
内容的提问来源于stack exchange,提问作者CR7
相关产品推荐
相关产品推荐

