使用Mask-RCNN训练自己的数据集

一、安装labelme 

深度学习算法等基于神经网络的算法都是基于数据驱动的,数据的好坏会影响你最后生成的模型的好坏,在使用Mask-RCNN时,第一件事就是标注数据集,这里我们默认你已经配置好了anaconda的环境,如果你没有配置好可以参考一下其他人的博客,在已经配置好的conda环境下新建一个虚拟环境,在终端中输入以下命令安装标注工具labelme:

pip install labelme
 
pip install pyqt5
 
pip install pillow==4.0.0
二、标注数据集

下一步开始标注数据,在终端中输入下面的代码会自动打开标注工具:

labelme

接着选择第二项打开文件夹,如下图所示:

 

选择数据图片所在文件夹,右键对图片逐个标注。并填写标签信息。标注好后点击D切换到下一张,这里会弹出保存界面,直接保存到我们原图像所在文件夹即可。将图片全部标注好后,得到如下的全部json文件后,关闭终端。 

 

 三、批量处理Json文件

现在的.json包含了我们标注的信息,但是还不是可以让代码直接读取的数据格式,对于不同的深度学习代码,数据存放的格式要根据不同代码的写法来定,下面以上述的mask-rcnn为例,将数据修改为我们需要的格式。在保存.json文件的文件夹下新建一个.txt文件,输入以下内容:

@echo off

for %%i in (*.json) do labelme_json_to_dataset "%%i"

pause

保存后将文件后缀名改为.bat,将其改为一个更改文件的存放格式的脚本,保存后双击运行即可。运行后等一会,会得到如下文件夹。

如下图所示建立文件夹:

 

labelme_json文件夹存放的是上一步中得到的文件夹。

json文件夹存放的是标注得到的.json文件。

pic文件夹存放的是原图。

以上三个文件夹存放的东西直接复制粘贴过来即可,这里有一个小技巧,在电脑上的文件的排序中可以选择按文件类型排序,这样可以方便我们复制粘贴。

cv2_mask存放的是上一步中得到的文件夹中生成的后缀为.png的mask文件,大概内容如下:

 

将.png文件复制逐个复制进文件夹并重命名比较麻烦,这里我们写一个python脚本copy.py文件进行批量操作:

import os 
import shutil
 
for dir_name in os.listdir('./labelme_json'):
    pic_name = dir_name[:-5] + '.png'
    from_dir = './labelme_json/'+dir_name+'./label.png'
    to_dir = './cv2_mask/'+pic_name
    shutil.copyfile(from_dir, to_dir)
        
    print (from_dir)
    print (to_dir)

将上述文件.py文件保存到如下目录,运行即可:

到此我们的数据集制作完毕。 

 
四、下载Mask-RCNN源码

下载修改过后的代码(想要修改版的代码可以加qq群:817442229或直接加博主的qq:2425113371免费领取),并将我们制作好的数据集改名为mydata放到该文件夹下即可直接使用,也可以下载官方版代码,但是官方版需要对代码有深入的理解才能使用,下面附上官方版源码的github链接,新手建议直接找我拿源码:Release Mask R-CNN 2.0 · matterport/Mask_RCNN · GitHub

五、环境搭建

搞深度学习的对conda这个工具应该不陌生,这里我们假设你已经安装好conda这个管理虚拟环境的工具。直接在base下新建一个虚拟环境,这个源码开发的时间比较久远,python版本太高会导致后续出现很多问题,最好使用python2进行环境搭建,但是我这里使用python3版本进行搭建,你直接跟着我来用python3也没问题,搭建好环境后还需要修改源码(后面再说):

conda create -n MaskRCNN python=3.6

创建好后使用如下命令激活环境:

source activate MaskRCNN

这里在ubuntu系统下应该是:

conda activate MaskRCNN

接下来在该环境下安装tensorflow,注意,这里tensorflow不能过高也不能过低,我使用的是1.5.0版本,千万不要不指定版本,不指定版本默认下载最高版,后面跑程序会有问题:

pip install tensorflow==1.5.0

这里也可以下载gpu版本,gpu版跑起来会比cpu快很多,但是gpu版本的tensorflow和cuda和cudnn有版本的对应关系,想用gpu版本很可能需要重装cuda和cudnn:

pip install tensorflow-gpu==1.5.0

这里对应的cuda版本是9.0,到pytorch官网查看对应的pytorch版本,然后利用pytorch帮我们安装cuda和cudnn:

conda install pytorch==1.1.0 torchvision==0.3.0 cudatoolkit=9.0 -c pytorch

可以使用如下代码查看是否安装成功:

import torch
print(torch.cuda.is_available())
print(torch.backends.cudnn.is_available())
print(torch.cuda_version)
print(torch.backends.cudnn.version())

运行结果打出两个true就说明配置成功,最后两行可能由于版本原因会报错,但是没关系,忽略即可,接着往下做。

下面再安装keras,注意,keras的版本要和tensorflow对应:

pip install keras==2.1.6

如果下载过于缓慢,考虑换源,在上述代码后-i换源,举例如下,安装其他包的时候也可以如法炮制,非常好用:

pip install keras==2.1.6 -i https://pypi.tuna.tsinghua.edu.cn/simple

安装好后,用pycharm打开代码文件夹,点击下方的terminal,在这里可以使用下面代码安装requirements.txt中的所有需要的包:

pip install -r requirements.txt

如果下载后没有问题且能运行代码,即说明环境以及配置完毕。但是大概率会失败,因为博主就失败了...,如果使用这个方式失败了,就要逐个安装requirements.txt中的包:

pip install numpy
pip install scipy
pip install Pillow
pip install cython
pip install matplotlib
pip install scikit-image
pip install opencv-python
pip install h5py
pip install imgaug
pip install IPython[all]

逐行运行上述代码,建议每安装好一个包后都要运行一遍测试代码,以测试tensorflow是否还能正常工作,因为有些包的版本对应不上可能会影响tensorflow,下面是测试代码:

import tensorflow as tf
import keras
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()

如果你在未安装requirements.txt下面的包时上述代码报错,大概率是tensorflow和numpy的版本不对应导致出现问题。我使用的numpy版本是1.16.0,这是恰好能运行所有包且和tensorflow1.5.0兼容的最低版本:

pip install numpy==1.16.0

如果numpy的版本更改后任然报错,可能是python3的编码格式问题,将topology.py下面的所有的.decode('utf8')前加入如下图所示即可:

在安装opencv-python的时候,大概率会报错,因为默认下载的是最高版本,最高版本的cv与tensorflow==1.5.0不兼容,我使用的是:

pip install opencv-python==4.3.0.38

安装完以上的包,运行代码可能还会出现警告:

这个警告出现的原因是scikit-image的版本不兼容,使用如下命令重新安装即可:

pip install -U scikit-image==0.16.2

至于其他的警告无关痛痒,忽略即可,但是红红的报错看起来非常不爽,可以在代码的最前面加入以下内容进行屏蔽:

# 版本不兼容报错,直接忽略
import warnings
warnings.filterwarnings("ignore")

六、对下载好的源码进行修改

1、修改train_test.py的第57行,改为类别数+1。

2、修改train_test.py的121行,将原有的注释掉,有多少类别就重新写多少行,每行第二个参数是序号,第三个参数是类别名。

 

3、修改train_test.py的178~182行,修改为自己的路径,这里使用的是相对路径,如果你的dataset是按照我前面所说的方式放置,其实这里也可以不用改。

 

4、修改config.py下的DETECTION_MIN_CONFIDENCE,调小这个值可以获得更多的预测结果。

 

5、修改train_test.py的61~62行可以指定图片大小。

 

6、修改train_test.py的160~163行。

 

其余参数无需修改,完成之后运行train_test文件即可开始训练。

七、测试代码

运行测试代码要安装pycocotools,运行:

pip install pycocotools

若出现如下报错:

 

说明缺少Microsoft Visual C++ 14.0这个东西,去以下地址安装即可:

https://my.visualstudio.com/Downloads?q=build%20tools

搜索build tools,下载DVD格式的build tools:

6ae1d524e57b49609a63a90ad279e77f.png下载完成后安装。但该方法会占用极大的内存,一种更加直接的方法,在终端运行:

conda install libpython m2w64-toolchain -c msys2

具体内容可以参考:

Microsoft Visual C++ 14.0 is required.-CSDN博客

 

 

 

 

 

 

 

 

 

 

 

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
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 官方代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FL1768317420

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值