Mask RCNN 训练自己的数据集报错之解决办法

        在完成了Mask RCNN的demo复现工作之后,用maskrcnn训练自己的数据集时,图片已标记完成,代码也已改好(代码修改参考的是博客:https://blog.csdn.net/u012746060/article/details/82143285#commentsedit),代码运行时报错

boolean index did not match indexed array along dimension 0; dimension is 4 but corresponding boolean dimension is 2

或与其类似的错误,布尔操作、矩阵。。。。。并不理解是什么原因,经过几天的研究后终于发现,是图片大小的原因。

       我将图片大小统一改成1024*512,png格式,301张,命名为 image_000000.png~~~image_000300.png,代码还在训练中,由于我只有一块GPU,估计训练的时间会很长。

       除此之外,我在尝试的过程中,还发现了如下问题:

 1. 在https://blog.csdn.net/qq_29462849/article/details/81037343#commentsedit里的一张图,其中ETA为该图片训练的时间,第一个loss为后面五个loss之和,训练的epochs的不同应该是使loss越来越小,该图中loss已达到0.028附近,训练的效果较好(该例子训练集共有700张图片)

2. 在测试的代码里面,

这个位置若报错:(原谅我具体什么错误记不清了,当时忘记截屏了,大概是什么model找不到。。)将上面 model.load_weights(COCO_MODEL_PATH,by_name=True) 改成

model.load_weights(COCO_MODEL_PATH,by_name=True,exclude=["mrcnn_class_logits","mrcnn_bbox_fc","mrcnn_bbox","mrcnn_mask"])

3. 关于 labelme 编辑好的图片如何转化为 img.png , info.yaml , label.png , label_names.txt , label_viz.png 这五种格式的问题:

(1)打开anaconda prompt ,创建一个叫 labelme 的环境,

(2)键入activate labelme 

(3)键入labelme  开始标记

(4)在图片所在的文件夹下面新建一个文件夹用于存放.json格式的文件(如:json文件夹),将标记好的json文件全部存在该文件夹下;

(5)打开python编辑器(我的是pycharm)键入:

import os

path='E:\\\\photos\\\\json\\\\'      # path是你存放json的路径

json_file = os.listdir(path)

for file in json_file:
    os.system("python E:\\\\anaconda\envs\labelme\Scripts\labelme_json_to_dataset.exe %s" % (path + file))  ###此处为你anaconda所在的文件夹

(6)发现json文件夹里面出现一堆 xxxxx_json文件夹,打开文件夹发现里面的 label.png 是彩色的,说明其已经是8bit了,不应再进行格式上的转换。

4. jupyter notebook如何出现行数:View---Toggle Line Numbers 即可。

5. 打开 Mask_RCNN/samples/balloon/balloon.py 发现里面的代码和我们的不一样,研究代码发现,它是用VGG Image Annotator (VIA)进行标记的,所以如果你也是用VIA进行标记的,就可以参照 balloon.py 的代码(不过我还没满月用过VIA)。

6. 其余的就是一些小错误:比如某处缩进不对,某处出现了中文字符。。。。。就讲报错的行数改改即可。

7. 关于图片尺寸以及训练的快慢问题:我的图片大小是1024*512的,训练起来特别慢,一块GPU;不知道你们训练的时候快慢如何呢?欢迎留言讨论;

后续再发现什么问题,会继续添加,希望此博客可以帮助到有同样问题的你。

Mask R-CNN 是一种基于 Faster R-CNN 的目标检测算法,可以检测出物体的位置,还可以精确地分割出物体的 mask。下面是一个 Mask R-CNN 训练自己数据集的基本步骤: 1. 准备数据集 首先,您需要准备自己的数据集,包括图片和标注。图片可以是任何大小,但最好是统一大小,以便于训练。标注可以使用标准的 COCO 标注格式,包括标注文件和类别文件。 2. 定义类别 您需要定义自己数据集的类别,例如人、车、动物等等。您可以创建一个名为 `CustomConfig` 的类,继承自 `Config` 类,并在其中设置 `NUM_CLASSES` 参数为您的类别数量加 1(因为需要加入一个背景类别): ```python class CustomConfig(Config): # Give the configuration a recognizable name NAME = "custom_dataset" # Train on 1 GPU and 1 image per GPU GPU_COUNT = 1 IMAGES_PER_GPU = 1 # Number of classes (including background) NUM_CLASSES = 1 + 4 # Background + 4 classes ``` 3. 定义数据集加载器 您需要定义一个数据集加载器,将准备好的数据集导入到模型中。您可以创建一个名为 `CustomDataset` 的类,继承自 `utils.Dataset` 类,并在其中实现 `load_dataset()`、`load_image()`、`load_mask()`、`image_reference()` 等方法,具体实现可以参考 Mask R-CNN 官方代码。 ```python class CustomDataset(utils.Dataset): def load_dataset(self, dataset_dir, subset): self.add_class("custom_dataset", 1, "class1") self.add_class("custom_dataset", 2, "class2") self.add_class("custom_dataset", 3, "class3") self.add_class("custom_dataset", 4, "class4") # Load annotations annotations = json.load(open(os.path.join(dataset_dir, "annotations.json"))) annotations = annotations["annotations"] # Add images and annotations to dataset for a in annotations: image_id = a["image_id"] image_path = os.path.join(dataset_dir, "images", str(image_id) + ".jpg") if not os.path.exists(image_path): continue if a["iscrowd"]: continue if a["category_id"] not in [1, 2, 3, 4]: continue self.add_image( "custom_dataset", image_id=image_id, path=image_path, width=a["width"], height=a["height"], annotations=a["bbox"] ) def load_mask(self, image_id): # Load annotations for image annotations = self.image_info[image_id]["annotations"] # Create one mask per instance masks = np.zeros([self.image_info[image_id]["height"], self.image_info[image_id]["width"], len(annotations)], dtype=np.uint8) # Load masks for i, a in enumerate(annotations): x1, y1, w, h = a x2 = x1 + w y2 = y1 + h masks[y1:y2, x1:x2, i] = 1 # Return masks and class IDs return masks, np.ones([len(annotations)], dtype=np.int32) def image_reference(self, image_id): info = self.image_info[image_id] return info["path"] ``` 4. 训练模型 在训练之前,您需要将预训练 COCO 权重加载到模型中: ```python model.load_weights(COCO_MODEL_PATH, by_name=True, exclude=["mrcnn_class_logits", "mrcnn_bbox_fc", "mrcnn_bbox", "mrcnn_mask"]) ``` 然后,您可以使用 `train()` 方法训练模型。在训练之前,您需要创建一个名为 `CustomConfig` 的配置对象,并设置好超参数和文件路径: ```python config = CustomConfig() config.display() model = modellib.MaskRCNN(mode="training", config=config, model_dir=MODEL_DIR) # Train the head branches model.train(dataset_train, dataset_val, learning_rate=config.LEARNING_RATE, epochs=30, layers='heads') ``` 5. 测试模型 在测试模型之前,您需要将模型切换到 inference 模式: ```python model = modellib.MaskRCNN(mode="inference", config=config, model_dir=MODEL_DIR) ``` 然后,您可以使用 `detect()` 方法对图片进行检测和分割: ```python results = model.detect([image], verbose=1) r = results[0] visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'], class_names, r['scores']) ``` 以上就是使用 Mask R-CNN 训练自己数据集的基本步骤。具体实现可以参考 Mask R-CNN 官方代码。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值