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 libraryfrom 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
classZxpConfig(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()defget_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 lastif 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")#训练模型