图像分割之-MASK_RCNN
自己正在学习图像分割,下面分享下自己的经验,从标注数据开始。
修改的参数可以参考以下网址:https://blog.youkuaiyun.com/weixin_43758528/article/details/88621481
一、Labelme的安装
参考博客:https://blog.youkuaiyun.com/u012746060/article/details/81871733
**一、安装环境:**windows10,anaconda3,python3.5
二、安装过程:
1、管理员身份打开 anaconda prompt
2、输入命令:conda create --name=labelme python=3.5 (这个根据自己的版本来,我的事python 3.5)
3、输入命令:activate labelme ,会出现以下报错,不用管
4、输入命令:pip install pyqt5,pip install pyside2,在安装 pyside2 的时候超级慢
5、输入命令:pip install labelme
6、输入命令:labelme 即可打开labelme。如下:
或者直接使用图片标记工具的代码:
图片标记工具基于开源项目:https://github.com/wkentaro/labelme
二、标注自己的数据集
一、建立数据集
对于数据集编号问题,可以下载使用 Total Commander 软件,很好用
使用labelme 标记自己的数据集,本文主要参考这位大神的操作方法
https://blog.youkuaiyun.com/qq_29462849/article/details/81037343
1)首先制作数据集
根据需求将数据集分为4个文件,这是people文件夹下(本人将标注好的.json跟原图片放在一起了,主要目的在于方便查看标注是否正确,方便,修改)
2)json 与此同时,将标注好的文件复制粘贴到 json 文件夹下。
三、使用labelme_json_to_dataset.exe
labelme保存的都是xxx.json文件,需要用labelme_json_to_dataset.exe转换一下,本人主要是使用以下程序进行批量转换的。
import os
path = './json/' # path为json文件存放的路径
json_file = os.listdir(path)
os.system("activate labelme")
for file in json_file:
os.system("labelme_json_to_dataset.exe %s"%(path + '/' + file))
转换完成后,转换完的数据出现在json 文件夹下,如下所示:
这样会生成一个同名文件夹,里面包含了我们需要的mask文件,label.png,不过这个文件是16bit点,而cv2中使用的都是8bit点,所以需要转换一下。说明:这样转换后,打开转换后的图片一片漆黑,如果想看效果可以把"img = Image.fromarray(np.uint8(np.array(img)))"改成“img = Image.fromarray(np.uint8(np.array(img)) * 20 )”,不过这样不符合mask rcnn的要求,看看效果即可,后面运行还是需要不乘倍数的!
from PIL import Image
import numpy as np
import os
src_dir = r'./labelme_json'
dest_dir = r'./cv2_mask'
for child_dir in os.listdir(src_dir):
new_name = child_dir.split('_')[0] + '.png'
old_mask = os.path.join(os.path.join(src_dir, child_dir), 'label.png')
img = Image.open(old_mask)
img = Image.fromarray(np.uint8(np.array(img)) * 20 )
new_mask = os.path.join(dest_dir, new_name)
img.save(new_mask)
最后,把得到的文件统一一下,便于后续程序执行,最后文件夹如下:
四、 修改mask rcnn
在mask rcnn的根目录下,新建两个文件夹“models”和“logs” ,models用于保存已经预训练好的coco模型,mask_rcnn_coco.h5;
logs用于保存训练产生的模型。在samples文件夹下新建一个“people”文件夹,创建people.py,代码中的 init_with = “last” 第一次训练时请改成 init_with = “coco”
五、训练程序
关于训练过程的参数设置,可在config.py文件中修改,但是本人直接在程序中修改的,没有修改config.py,这个根据自己的要求啦~官方也给出了修改建议:
https://github.com/matterport/Mask_RCNN/wiki
可修改的主要有:
BACKBONE = “resnet50” ;这个是迁移学习调用的模型,分为resnet101和resnet50,电脑性能不是特别好的话,建议选择resnet50,这样网络更小,训练的更快。
model.train(…, layers=‘heads’, …) # Train heads branches (least memory)
model.train(…, layers=‘3+’, …) # Train resnet stage 3 and up
model.train(…, layers=‘4+’, …) # Train resnet stage 4 and up
model.train(…, layers=‘all’, …) # Train all layers (most memory)#这里是选择训练的层数,根据自己的要求选择
1、
IMAGE_MIN_DIM = 800
IMAGE_MAX_DIM = 1024#设置训练时的图像大小,最终以IMAGE_MAX_DIM为准,如果电脑性能不是太好,建议调小,但是尺寸为32倍数
2、
GPU_COUNT = 1
IMAGES_PER_GPU = 2#这个是对GPU的设置,如果显存不够,建议把2调成1(虽然batch_size为1并不利于收敛)
3、
基础设置
dataset_root_path = r"F:\2019.11\code\Mask_RCNN-master\Mask_RCNN-master\train_data"
后面的路径需要设置为自己的路径,train_data下的文件一般为:
训练代码为:
import os
import sys
import numpy as np
import cv2
import matplotlib.pyplot as plt
import yaml
from PIL import Image
# Root directory of the project
ROOT_DIR = os.path.abspath("../../")
sys.path.append(ROOT_DIR) # To find local version of the library
from mrcnn.config import Config
from mrcnn import utils
from mrcnn import model as modellib
# logs 用来保存训练好的模型
MODEL_DIR = os.path.join(ROOT_DIR, "logs")
iter_num = 0
# 读入预训练的权重
COCO_MODEL_PATH = os.path.join(ROOT_DIR, "mask_rcnn_coco.h5")
# Download COCO trained weights from Releases if needed
if not os.path.exists(COCO_MODEL_PATH):
utils.download_trained_weights(COCO_MODEL_PATH)
class ShapesConfig(Config):
"""Configuration for training on the toy shapes dataset.
Derives from the base Config class and overrides values specific
to the toy shapes dataset.
"""
# Give the configuration a recognizable name
NAME = "shapes"