这一节将从代码库里面的demo.ipynb
笔记本入手,来整体理解一下Mask RCNN的网络架构。
下面的Figure1展示了这个工程中Mask RCNN的网络结构示意图,来自博主叠加态的猫:
这个结构图里面包含了很多细节,我们先大概理一下,后面在源码详解中会更详细的说明:
rpn_class
和rpn_bbox
来表示:rpn_class:[batch, num_rois, 2]
rpn_bbox:[batch, num_rois, (dy, dx, log(dh), log(dw))]
rpn_rois
:rpn_rois:[IMAGES_PER_GPU, num_rois, (y1, x1, y2, x2)]
mrcnn_class
和mrcnn_bbox(偏移量)
:mrcnn_class: [batch, num_rois, NUM_CLASSES] classifier probabilities
mrcnn_bbox(deltas): [batch, num_rois, NUM_CLASSES, (dy, dx, log(dh), log(dw))]
总的来说,最后网络会输出以下的张量:
# num_anchors, 每张图片上生成的锚框数量
# num_rois, 每张图片上由锚框筛选出的推荐区数量,
# # 由 POST_NMS_ROIS_TRAINING 或 POST_NMS_ROIS_INFERENCE 规定
# num_detections, 每张图片上最终检测输出框,
# # 由 DETECTION_MAX_INSTANCES 规定
# detections, [batch, num_detections, (y1, x1, y2, x2, class_id, score)]
# mrcnn_class, [batch, num_rois, NUM_CLASSES] classifier probabilities
# mrcnn_bbox, [batch, num_rois, NUM_CLASSES, (dy, dx, log(dh), log(dw))]
# mrcnn_mask, [batch, num_detections, MASK_POOL_SIZE, MASK_POOL_SIZE, NUM_CLASSES]
# rpn_rois, [batch, num_rois, (y1, x1, y2, x2, class_id, score)]
# rpn_class, [batch, num_anchors, 2]
# rpn_bbox [batch, num_anchors, 4]
首先导入需要用到的包,然后设置COCO数据集相关文件所在的根目录,加载模型的路径以及执行检测的图片路径,代码如下:
import os
import sys
import random
import math
import numpy as np
import skimage.io
import matplotlib
import matplotlib.pyplot as plt
# 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
import mrcnn.model as modellib
from mrcnn import visualize
# 导入COCO数据集的配置
# 当我们导入一个模块时:import xxx,默认情况下python解析器会搜索当前目录、已安# 装的内置模块和第三方模块,搜索路径存放在sys模块的path中.
sys.path.append(os.path.join(ROOT_DIR, "samples/coco/")) # To find local version
import coco
# 使用%matplotlib命令可以将matplotlib的图表直接嵌入到Notebook之中,或者使用指定# 的界面库显示图表,它有一个参数指定matplotlib图表的显示方式
%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")
# Download COCO trained weights from Releases if needed
if not os.path.exists(COCO_MODEL_PATH):
utils.download_trained_weights(COCO_MODEL_PATH)
# Directory of images to run detection on
IMAGE_DIR = os.path.join(ROOT_DIR, "images")
接下来需要进行配置设定,新定义了一个Class名为InferenceConfig
继承了coco.CocoConfig
类,在demo.ipynb
中我们直接使用COCO的预训练模型所以使用它的设置就可以了。又因为我们这里需要检测的是单张图片,所以需要重写几个配置参数,具体如下:
# 父类继承了Config类,目的就是记录配置,并在其基础上添加了几个新的属性
class InferenceConfig(coco.CocoConfig):
# Set batch size to 1 since we'll be running inference on
# one image at a time. Batch size = GPU_COUNT * IMAGES_PER_GPU
GPU_COUNT = 1
IMAGES_PER_GPU = 1
config = InferenceConfig()
config.display()
再打印出配置看一下:
Configurations:
BACKBONE_SHAPES [[256 256]
[128 128]
[ 64 64]
[ 32 32]
[ 16 16]]
BACKBONE_STRIDES [4, 8, 16, 32, 64]
BATCH_SIZE 1
BBOX_STD_DEV [ 0.1 0.1 0.2 0.2]
DETECTION_MAX_INSTANCES 100
DETECTION_MIN_CONFIDENCE 0.5
DETECTION_NMS_THRESHOLD 0.3
GPU_COUNT 1
IMAGES_PER_GPU 1
IMAGE_MAX_DIM 1024
IMAGE_MIN_DIM 800
IMAGE_PADDING True
IMAGE_SHAPE [1024 1024 3]
LEARNING_MOMENTUM 0.9
LEARNING_RATE 0.002
MASK_POOL_SIZE 14
MASK_SHAPE [28, 28]
MAX_GT_INSTANCES 100
MEAN_PIXEL [ 123.7 116.8 103.9]
MINI_MASK_SHAPE (56, 56)
NAME coco
NUM_CLASSES 81
POOL_SIZE 7
POST_NMS_ROIS_INFERENCE 1000
POST_NMS_ROIS_TRAINING 2000
ROI_POSITIVE_RATIO 0.33
RPN_ANCHOR_RATIOS [0.5, 1, 2]
RPN_ANCHOR_SCALES (32, 64, 128, 256, 512)
RPN_ANCHOR_STRIDE 2
RPN_BBOX_STD_DEV [ 0.1 0.1 0.2 0.2]
RPN_TRAIN_ANCHORS_PER_IMAGE 256
STEPS_PER_EPOCH 1000
TRAIN_ROIS_PER_IMAGE 128
USE_MINI_MASK True
USE_RPN_ROIS True
VALIDATION_STEPS 50
WEIGHT_DECAY 0.0001
接下来初始化模型,然后载入预训练参数文件,代码如下:
# 创建前向推理的模型对象
model = modellib.MaskRCNN(mode="inference", model_dir=MODEL_DIR, config=config)
# 加载在MS-COCO数据集上训练的模型权重
model.load_weights(COCO_MODEL_PATH, by_name=True)
注意,这里模型设置为了inference 模式。然后下面定义了以下COCO的每个类别的目标的名字,太长了这里就不贴了,可以自己查看代码。
接下来就是加载单张图片,调用模型的detect
方法,即可输出结果,最后使用辅助方法可视化结果,代码如下:
# Load a random image from the images folder
file_names = next(os.walk(IMAGE_DIR))[2]
image = skimage.io.imread(os.path.join(IMAGE_DIR, random.choice(file_names)))
# Run detection
results = model.detect([image], verbose=1)
# Visualize results
r = results[0]
visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'],
class_names, r['scores'])
获得的结果图展示:
这一节讲了一些这个项目中Mask RCNN的整体架构,再通过demo.ipynb
展示了如何加载一个COCO数据集上预训练的模型预测一张示意图片并将结果可视化出来。下一节,我们将从网络结构看起,逐渐深入到项目的细节中。
欢迎关注GiantPandaCV, 在这里你将看到独家的深度学习分享,坚持原创,每天分享我们学习到的新鲜知识。( • ̀ω•́ )✧
有对文章相关的问题,或者想要加入交流群,欢迎添加BBuf微信:
为了方便读者获取资料以及我们公众号的作者发布一些Github工程的更新,我们成立了一个QQ群,二维码如下,感兴趣可以加入。