实例分割-Mask R-CNN 模型
进入ModelArts
点击如下链接:https://www.huaweicloud.com/product/modelarts.html , 进入ModelArts主页。点击“进入控制台”按钮,输入用户名和密码登录,进入ModelArts使用页面
创建ModelArts notebook
下面,我们在ModelArts中创建一个notebook开发环境,ModelArts notebook提供网页版的Python开发环境,可以方便的编写、运行代码,并查看运行结果。
第一步:在ModelArts服务主界面依次点击“开发环境”、“创建”
第二步:填写notebook所需的参数:
项目 | 建议填写方式 |
---|---|
名称 | 自定义环境名称 |
工作环境 | Python3 |
资源池 | 选择\"公共资源池\"即可 |
类型 | GPU |
规格 | [限时免费]体验规格GPU版 |
存储配置 | EVS |
磁盘规格 | 5GB |
第三步:配置好notebook参数后,点击下一步,进入notebook信息预览。确认无误后,点击“立即创建”
第四步:创建完成后,返回开发环境主界面,等待Notebook创建完毕后,打开Notebook,进行下一步操作
在ModelArts中创建开发环境
接下来,我们创建一个实际的开发环境,用于后续的实验步骤。
第一步:点击下图所示的“打开”按钮,进入刚刚创建的Notebook第二步:创建一个Python3环境的的Notebook。点击右上角的\"New\",然后选择Tensorflow-1.13.1开发环境。 第三步:点击左上方的文件名\"Untitled\",并输入一个与本实验相关的名称
在Notebook中编写并执行代码
在Notebook中,我们输入一个简单的打印语句,然后点击上方的运行按钮,可以查看语句执行的结果:开发环境准备好啦,接下来可以愉快地写代码啦!
首先进行包的安装与引用
!pip install pycocotools==2.0.0
!pip install imgaug==0.2.9
如果使用kernel tf-1.8,则需要取消下面两行代码的注释,并执行。
如果使用kernel tf-1.13,则无需执行下面两行代码。
本脚本右上角显示了当前使用的kernel是tf-1.8还是tf-1.13,如您需切换kernel,请点击本脚本顶部菜单栏Kernel->Change kernel
#!pip uninstall numpy -y
#!pip install numpy==1.15.4
对需要的代码和数据进行下载
import os
from modelarts.session import Session
session = Session()
if session.region_name == 'cn-north-1':
bucket_path="modelarts-labs/end2end/mask_rcnn/instance_segmentation.tar.gz"
elif session.region_name == 'cn-north-4':
bucket_path="modelarts-labs-bj4/end2end/mask_rcnn/instance_segmentation.tar.gz"
else:
print("请更换地区到北京一或北京四")
if not os.path.exists('./src/mrcnn'):
session.download_data(bucket_path=bucket_path,
path='./instance_segmentation.tar.gz')
if os.path.exists('./instance_segmentation.tar.gz'):
# 使用tar命令解压资源包
os.system("tar zxf ./instance_segmentation.tar.gz")
# 清理压缩包
os.system("rm ./instance_segmentation.tar.gz")
第一步:导入相应的Python库,准备预训练模型
import sys
import random
import math
import re
import time
import numpy as np
import cv2
import matplotlib
import matplotlib.pyplot as plt
from src.mrcnn.config import Config
from src.mrcnn import utils
import src.mrcnn.model as modellib
from src.mrcnn import visualize
from src.mrcnn.model import log
%matplotlib inline
# Directory to save logs and trained model
MODEL_DIR = "logs"
# Local path to trained weights file
COCO_MODEL_PATH = "data/mask_rcnn_coco.h5"
第二步:生成相关配置项
我们定义Config类的子类MyTrainConfig,指定相关的参数,较为关键的参数有:
- NAME: Config的唯一名称
- NUM_CLASSES: 分类的数量,COCO中共有80种物体+背景
- IMAGE_MIN_DIM和IMAGE_MAX_DIM: 图片的最大和最小尺寸,我们生成固定的128x128的图片,因此都设置为128
- TRAIN_ROIS_PER_IMAGE: 每张图片上训练的RoI个数
- STEPS_PER_EPOCH和VALIDATION_STEPS: 训练和验证时,每轮的step数量,减少step的数量可以加速训练,但是检测精度降低
class MyTrainConfig(Config):
# 可辨识的名称
NAME = "my_train"
# GPU的数量和每个GPU处理的图片数量,可以根据实际情况进行调整,参考为Nvidia Tesla P100
GPU_COUNT = 1
IMAGES_PER_GPU = 1
# 物体的分类个数,COCO中共有80种物体+背景
NUM_CLASSES = 1 + 80 # background + 80 shapes
# 图片尺寸统一处理为1024,可以根据实际情况再进一步调小
IMAGE_MIN_DIM = 1024
IMAGE_MAX_DIM = 1024
# 因为我们生成的形状图片较小,这里可以使用较小的Anchor进行RoI检测
# RPN_ANCHOR_SCALES = (8, 16, 32, 64, 128) # anchor side in pixels
# 每张图片上训练的RoI个数,因为我们生成的图片较小,而且每张图片上的形状较少
# 因此可以适当调小该参数,用较少的Anchor即可覆盖大致的物体信息
TRAIN_ROIS_PER_IMAGE = 200
# 每轮训练的step数量
STEPS_PER_EPOCH = 100
# 每轮验证的step数量
VALIDATION_STEPS = 20
config = MyTrainConfig()
config.display()
第三步:准备数据集
我们使用封装好的CocoDataset类,生成训练集和验证集。
from src.mrcnn.coco import CocoDataset
COCO_DIR = 'data'
# 生成训练集
dataset_train = CocoDataset()
dataset_train.load_coco(COCO_DIR, "train") # 加载训练数据集
dataset_train.prepare()
# 生成验证集
dataset_val = CocoDataset()
dataset_val.load_coco(COCO_DIR, "val") # 加载验证数据集
dataset_val.prepare()
model = modellib.MaskRCNN(mode="training", config=config,
model_dir=MODEL_DIR)
第二步:加载预训练模型的权重
model.load_weights(COCO_MODEL_PATH, by_name=True)
接下来,我们使用预训练的模型,结合Shapes数据集,对模型进行训练
训练模型
Keras中的模型可以按照制定的层进行构建,在模型的train方法中,我们可以通过layers参数来指定特定的层进行训练。layers参数有以下几种预设值:
- heads:只训练head网络中的分类、mask和bbox回归
- all: 所有的layer
- 3+: 训练ResNet Stage3和后续Stage
- 4+: 训练ResNet Stage4和后续Stage
- 5+: 训练ResNet Stage5和后续Stage
此外,layers参数还支持正则表达式,按照匹配规则指定layer,可以调用model.keras_model.summary()查看各个层的名称,然后按照需要指定要训练的层。
model.train(dataset_train, dataset_val,
learning_rate=config.LEARNING_RATE,
epochs=1,
layers='all')
model_savepath = 'my_mrcnn_model.h5'
model.keras_model.save_weights(model_savepath)
class InferenceConfig(MyTrainConfig):
GPU_COUNT = 1
IMAGES_PER_GPU = 1
inference_config = InferenceConfig()
inference_model = modellib.MaskRCNN(mode="inference",
config=inference_config,
model_dir=MODEL_DIR)
将我们生成的模型权重信息加载进来
# 加载我们自己训练出的形状模型文件的权重信息
print("Loading weights from ", model_savepath)
inference_model.load_weights(model_savepath, by_name=True)
第二步:从验证数据集中随机选出一张图片进行预测,并显示结果
# 随机选出图片进行测试
image_id = random.choice(dataset_val.image_ids)
original_image, image_meta, gt_class_id, gt_bbox, gt_mask =\
modellib.load_image_gt(dataset_val, inference_config,
image_id, use_mini_mask=False)
log("original_image", original_image)
log("image_meta", image_meta)
log("gt_class_id", gt_class_id)
log("gt_bbox", gt_bbox)
log("gt_mask", gt_mask)
det_instances_savepath = 'random.det_instances.jpg'
visualize.display_instances(original_image, gt_bbox, gt_mask, gt_class_id,
dataset_train.class_names, figsize=(8, 8),
save_path=det_instances_savepath)
# 定义助手函数用于设置matplot中的子绘制区域所在的行和列
def get_ax(rows=1, cols=1, size=8):
_, ax = plt.subplots(rows, cols, figsize=(size*cols, size*rows))
return ax
results = inference_model.detect([original_image], verbose=1)
r = results[0]
prediction_savepath = 'random.prediction.jpg'
visualize.display_instances(original_image, r['rois'], r['masks'], r['class_ids'],
dataset_val.class_names, r['scores'], ax=get_ax(),
save_path=prediction_savepath)
第三步:也可以通过上传自己的图片进行预测。
上传图片方式:点击网页的’upload‘按钮,将本地图片文件上传,上传后图片所在的路径存储为test_path
。
test_path = './test.jpg'
import skimage.io
image = skimage.io.imread(test_path)
results = inference_model.detect([image], verbose=1)
r = results[0]
prediction_savepath = 'self.prediction.jpg'
visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'],
dataset_val.class_names, r['scores'], ax=get_ax(),
save_path=prediction_savepath)
# 计算VOC类型的 mAP,条件是 IoU=0.5
# 下面的示例中只选出10张图片进行评估,增加图片数量可以增加模型评估的准确性
image_ids = np.random.choice(dataset_val.image_ids, 10)
APs = []
for image_id in image_ids:
# Load image and ground truth data
image, image_meta, gt_class_id, gt_bbox, gt_mask =\
modellib.load_image_gt(dataset_val, inference_config,
image_id, use_mini_mask=False)
molded_images = np.expand_dims(modellib.mold_image(image, inference_config), 0)
# Run object detection
results = inference_model.detect([image], verbose=0)
r = results[0]
# Compute AP
AP, precisions, recalls, overlaps =\
utils.compute_ap(gt_bbox, gt_class_id, gt_mask,
r["rois"], r["class_ids"], r["scores"], r['masks'])
APs.append(AP)
print("mAP: ", np.mean(APs))
- 点赞
- 收藏
- 关注作者
评论(0)