Colaboratory平台+Mask R-CNN进行模型训练和实例分割

  • 通过样本增强和格式转换,我们现在终于可以开始进行模型训练和调试了,这里也没什么好说的,就是用经典的Mask R-CNN模型,网上有很多地方可以下载,但是最好去github进行下载,我会在文章最后附上下载地址,包括模型文件和权重文件。
  • 由于下载的模型文件和Colaboratory平台的tensorflow2.0+的版本是有一定冲突的,为了减少工作量(不敢动model文件,改了可能就改不回来了),我们在正式训练之前,需要在Colaboratory重新设置一下环境,环境参数如下。(在训练之前把Colaboratory的运行时类型设置为TPU或者GPU)
numpy
scipy
Pillow
cython
matplotlib
scikit-image
tensorflow==1.3.0
keras==2.0.8
opencv-python
h5py
imgaug
IPython[all]
  • 好了,确实没啥好说的了,我这里也不可能去一行一行讲代码吧,网上对mask r-cnn代码进行解读的没有一百篇也有两百篇了,而且我也讲不好。下面就直接附上我训练模型的所有代码吧。
from google.colab import drive
drive.mount('/content/drive') #装载云盘

# 指定当前的工作文件夹
import os

# 此处为google drive中的文件路径,drive为之前指定的工作根目录,要加上
os.chdir("/content/drive/My Drive/mytensorflow")
print(os.getcwd())

!pip3 install -r requirements.txt

!ls

!ls -a

!python3 setup.py install

# 指定当前的工作文件夹
import os

# 此处为google drive中的文件路径,drive为之前指定的工作根目录,要加上
os.chdir("/content/drive/My Drive/mytensorflow")
print(os.getcwd())

# Commented out IPython magic to ensure Python compatibility.
import os
import sys
import random
import math
import re
import time
import numpy as np
import tensorflow as tf
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.patches as patches

# Root directory of the project
ROOT_DIR = os.path.abspath("./")

# Import Mask RCNN
sys.path.append(ROOT_DIR)  # To find local version of the library
from mrcnn import utils
from mrcnn import visualize
from mrcnn.visualize import display_images
import mrcnn.model as modellib
from mrcnn.model import log

# %matplotlib inline 

# Directory to save logs and trained model
MODEL_DIR = os.path.join(ROOT_DIR, "logs")

# Local path to trained weights file
COCO_MODEL_PATH = os.path.join(ROOT_DIR, "./mask_rcnn_coco.h5")
#默认: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)

# Path to Shapes trained weights
# SHAPES_MODEL_PATH = os.path.join(ROOT_DIR, "mask_rcnn_shapes.h5")

#@title 
# Override the training configurations with a few
# changes for inferencing.
from mrcnn.config import Config
class ZxpConfig(Config):
    NAME = "zxp"
    GPU_COUNT = 1
    IMAGES_PER_GPU = 4  #默认2·1024*1024,我的图像256*256,因此可同时处理多些;2/4

    # 每一轮的迭代次数
    # 不需要考虑数据集的大小
    STEPS_PER_EPOCH = 100  #默认1000;100?200?500?750?1000?

    # 验证时每轮的迭代次数,注意与前者的相互关系;即每多少步验证一遍
    VALIDATION_STEPS = 50 #默认50,越大越精确,但费时

    # # FPN各层特征图相对原图的步长,原图的缩放倍数
    # # 步长=原图尺寸/各层尺寸
    # # 是由backbone确定的,补偿数组是固定的;相应各层的特征map的大小=原图像大小如256/该层步长
    # BACKBONE_STRIDES = [4, 8, 16, 32, 64] #因此特征图的尺寸分别是:64*64 32*32 16*16 8*8 4*4

    # # 分类网络中完全连接层的大小
    # FPN_CLASSIF_FC_LAYERS_SIZE = 1024 #默认1024,一般不调整

    # # 用于构建特征金字塔的自顶向下层的大小
    # TOP_DOWN_PYRAMID_SIZE = 256 #默认256,一般不调整

    # 分类类数(包括背景)
    NUM_CLASSES = 1+1  # Override in sub-classes;自己的类型数+1

    # 已定
    # 方形anchor边的长度(像素)
    RPN_ANCHOR_SCALES = (16, 32, 64, 128, 256) #默认(32,64,128,256,512),与目标在图像中的相对大小有关

    # Anchor 步长
	  # 如果为1,则为主干要素图中的每个单元创建锚定。
	  # 如果为2,则为每个其他单元格创建锚,依此类推。
    RPN_ANCHOR_STRIDE = 1

    # 过滤RPN建议的非最大抑制阈值。您可以在培训期间增加该阈值以生成更多候选框。
    RPN_NMS_THRESHOLD = 0.7 #默认0.7
    # 在进行rpn训练时每幅图片使用多少个anchor
    # 指训练RPN时,每个图像,需要的正、负【锚框样本】总数
    RPN_TRAIN_ANCHORS_PER_IMAGE = 64  #默认256
    
    # 非极大值抑制之后(即通过proposal layer之后)的ROIs的数量 (训练和推断)
    # 根据置信度,由大到小选出
    POST_NMS_ROIS_TRAINING = 100 #默认2000
    POST_NMS_ROIS_INFERENCE = 50  #默认1000

    # 使用小尺寸能节省内存建议使用高分辨率图片
    MINI_MASK_SHAPE = (56, 56)  # mini-mask的高宽,,默认56*56,shapes的例子用的默认

    # !!!!!!!!!!!!!!!!!!!!!!!!!!!是不是傻
    # # 输入图像大小调整
    # IMAGE_RESIZE_MODE = "square"
    IMAGE_MIN_DIM = 256 #根据自己样本图片实际大小设置,但是一定要是2的倍数
    IMAGE_MAX_DIM = 256
    
    # 每张图片参与three branches的 正负ROI样本 总数
    # 即Detection Target Layer输出的ROI数量
    # 图片较小,值较小;
    TRAIN_ROIS_PER_IMAGE = 100 #默认200,shapes的例子用的是32

    # 前述ROI样本中,正样本所占比例
    # 与识别目标(正)在图片场景中一般的占比情况有关
    # 我的样本中,目标近似占到一半以上
    ROI_POSITIVE_RATIO = 0.66 #默认0.33;0.66/0.5/0.8

    # # ROI Align Layer的固定尺寸
    # POOL_SIZE = 7 #默认7
    # MASK_POOL_SIZE = 14 #默认14

    # mask预测网络最终输出的尺寸
	  # 要更改此设置,还需要更改mask分支
    # !!!!!
    MASK_SHAPE = [28, 28] #默认[28, 28],【8,8】或【64,64】

    # 在一个图像中使用的最大地面真实实例ground truth instances的数量
    MAX_GT_INSTANCES = 100 #默认100

    # 最终检测包含的实例最大数量,
    # 即在测试阶段经过分类回归后的proposal中串行的输入到mask网络中的roi数量
    DETECTION_MAX_INSTANCES = 100 #默认100

    # 在测试阶段的detection layer中用来过滤实例的分类得分没有达到这个置信度的目标,即在测试阶段的输入
    # 由RPN网络生成的rois,经过fast rcnn后输出每个roi的分类得分和第二次边界回归值,然后判别这个分类得分中最高的类的得分
    # 大于下面的置信度的roi才进入掩码网络生成掩码
    DETECTION_MIN_CONFIDENCE = 0.7  #默认0.7,置信度小于0.7就跳过检测

    # 最终目标检测后被判别为属于实例的rois之间的NMS的非极大值抑制
    # 这个是第二次修正后且置信度大于 DETECTION_MIN_CONFIDENCE 的rois与GT的NMS阈值
    # 且经过NMS后只选择置信度前 DETECTION_MAX_INSTANCES 名输入到下一个mask网络
    DETECTION_NMS_THRESHOLD = 0.3 #默认0.3

config = ZxpConfig()
config.display()

def get_ax(rows=1, cols=1, size=8):  # shapes的例子用的size=8
    """Return a Matplotlib Axes array to be used in
    all visualizations in the notebook. Provide a
    central point to control graph sizes.
    
    Change the default size attribute to control the size
    of rendered images
    """
    _, ax = plt.subplots(rows, cols, figsize=(size*cols, size*rows))
    return ax

sys.path.append(ROOT_DIR+"/samples")
from coco import coco
COCO_DIR = os.path.join(ROOT_DIR, "dataset")  

# Training dataset
dataset_train = coco.CocoDataset()
dataset_train.load_coco(COCO_DIR, "train")
dataset_train.prepare()
print("Images: {}\nClasses: {}".format(len(dataset_train.image_ids), dataset_train.class_names))
# Validation dataset
dataset_val = coco.CocoDataset()
dataset_val.load_coco(COCO_DIR, "test")#注意子文件夹名称
dataset_val.prepare()
print("Images: {}\nClasses: {}".format(len(dataset_val.image_ids), dataset_val.class_names))

trainimage_ids = np.random.choice(dataset_train.image_ids, 1)
for image_id in trainimage_ids:
    image = dataset_train.load_image(image_id)
    mask, class_ids = dataset_train.load_mask(image_id)
    visualize.display_top_masks(image, mask, class_ids, dataset_train.class_names)

valimage_ids = np.random.choice(dataset_val.image_ids, 1)
for image_id in valimage_ids:
    image = dataset_val.load_image(image_id)
    mask, class_ids = dataset_val.load_mask(image_id)
    visualize.display_top_masks(image, mask, class_ids, dataset_val.class_names)

#@title
# Create model in training mode
model = modellib.MaskRCNN(mode="training", config=config,
                          model_dir=MODEL_DIR)

# Which weights to start with?
init_with = "last"  # imagenet, coco, or last

if init_with == "imagenet":
    model.load_weight
    s(model.get_imagenet_weights(), by_name=True)
elif init_with == "coco":
    # Load weights trained on MS COCO, but skip layers that
    # are different due to the different number of classes
    # See README for instructions to download the COCO weights
    model.load_weights(COCO_MODEL_PATH, by_name=True,
                       exclude=["mrcnn_class_logits", "mrcnn_bbox_fc", 
                                "mrcnn_bbox", "mrcnn_mask"])
elif init_with == "last":
    # Load the last model you trained and continue training
    model.load_weights(model.find_last(), by_name=True)

#@title
# Fine tune all layers
# Passing layers="all" trains all layers. You can also 
# pass a regular expression to select which layers to
# train by name pattern.
model.train(dataset_train, dataset_val, 
            learning_rate=config.LEARNING_RATE / 10,
            epochs=16, # shapes用2
            layers="all") #训练模型
  • 下面附上几幅运行时的图。

  • 环境配置
    在这里插入图片描述

  • 参数设置
    在这里插入图片描述

  • 样本文件读取
    在这里插入图片描述

  • 样本示例展示
    在这里插入图片描述

  • 模型训练
    在这里插入图片描述

  • 模型链接

  • 权重文件

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lemon_tttea

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

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

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

打赏作者

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

抵扣说明:

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

余额充值