前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【从零开始学Mask RCNN】二,Mask RCNN框架整体把握

【从零开始学Mask RCNN】二,Mask RCNN框架整体把握

作者头像
BBuf
发布2020-06-28 16:35:36
1.9K0
发布2020-06-28 16:35:36
举报
文章被收录于专栏:GiantPandaCVGiantPandaCV

1. 前言

这一节将从代码库里面的demo.ipynb笔记本入手,来整体理解一下Mask RCNN的网络架构。

2. Mask RCNN总览

下面的Figure1展示了这个工程中Mask RCNN的网络结构示意图,来自博主叠加态的猫

Mask RCNN总览,来自叠加态的猫博主

这个结构图里面包含了很多细节,我们先大概理一下,后面在源码详解中会更详细的说明:

  • 首先是BackBone,可以看到原始图片输入后首先经过一个以ResNet101为基础的FPN特征金字塔网络进行特征的提取,并且可以发现这里的实现和原始的FPN不完全相同,它在up-down的特征上又做了一次
3\times 3

卷积进行了进一步的特征提取。

  • 接下来各个FPN层的特征单独进到了RPN处理层,即根据Anchor的数目信息确定候选区域的分类(前景和背景)和粗定位结果。这部分的结果用rpn_classrpn_bbox来表示:
代码语言:javascript
复制
rpn_class:[batch, num_rois, 2]
rpn_bbox:[batch, num_rois, (dy, dx, log(dh), log(dw))]
  • 获得了大量的候选区域之后,就可以将其送入Proposal筛选部分了,首先会根据前景得分对候选框排序,然后结合配置文件中指定的保留框数目来确定哪些框需要保留,为后面的NMS(非极大值抑制)做准备。再利用RPN的回归结果来修正Anchors,需要注意的是这里的anchors都是归一化后的这就意味着修正之后还需要做边界限制以防止越界。最后做一个NMS,删减太多的话直接补上
[0,0,0,0]

以达到配置文件要求的候选框数目即可。最终,这部分的输出为rpn_rois

代码语言:javascript
复制
rpn_rois:[IMAGES_PER_GPU, num_rois, (y1, x1, y2, x2)]
  • 接下来根据候选框的实际大小(归一化的候选框需要映射回原图大小)为候选框选择合适的RPN特征层,再利用ROI Align处理得到我们最终需要的大小相等一系列子图。
  • 再对这些子图进行独立的分类和回归,获得的结果为mrcnn_classmrcnn_bbox(偏移量)
代码语言:javascript
复制
mrcnn_class: [batch, num_rois, NUM_CLASSES] classifier probabilities
mrcnn_bbox(deltas): [batch, num_rois, NUM_CLASSES, (dy, dx, log(dh), log(dw))]
  • 最后,在分类回归之后使用回归结果对候选框进行修正,然后重新进行FPN特征层选择和ROI Align特征提取,最后送入Mask分支,进行Mask生成。

总的来说,最后网络会输出以下的张量:

代码语言:javascript
复制
# 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]

3. 代码理解

3.1 基础设置

首先导入需要用到的包,然后设置COCO数据集相关文件所在的根目录,加载模型的路径以及执行检测的图片路径,代码如下:

代码语言:javascript
复制
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")

3.2 网络配置

接下来需要进行配置设定,新定义了一个Class名为InferenceConfig继承了coco.CocoConfig类,在demo.ipynb中我们直接使用COCO的预训练模型所以使用它的设置就可以了。又因为我们这里需要检测的是单张图片,所以需要重写几个配置参数,具体如下:

代码语言:javascript
复制
# 父类继承了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()

再打印出配置看一下:

代码语言:javascript
复制
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

3.3 模型初始化

接下来初始化模型,然后载入预训练参数文件,代码如下:

代码语言:javascript
复制
# 创建前向推理的模型对象
model = modellib.MaskRCNN(mode="inference", model_dir=MODEL_DIR, config=config)

# 加载在MS-COCO数据集上训练的模型权重
model.load_weights(COCO_MODEL_PATH, by_name=True)

注意,这里模型设置为了inference 模式。然后下面定义了以下COCO的每个类别的目标的名字,太长了这里就不贴了,可以自己查看代码。

3.4 检测单张图片

接下来就是加载单张图片,调用模型的detect方法,即可输出结果,最后使用辅助方法可视化结果,代码如下:

代码语言:javascript
复制
# 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'])

获得的结果图展示:

示意图的实例分割结果

4. 小结

这一节讲了一些这个项目中Mask RCNN的整体架构,再通过demo.ipynb展示了如何加载一个COCO数据集上预训练的模型预测一张示意图片并将结果可视化出来。下一节,我们将从网络结构看起,逐渐深入到项目的细节中。

5. 参考

  • https://www.cnblogs.com/hellcat/p/9789879.html
本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-24,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 GiantPandaCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 前言
  • 2. Mask RCNN总览
  • 3. 代码理解
    • 3.1 基础设置
      • 3.2 网络配置
        • 3.3 模型初始化
          • 3.4 检测单张图片
          • 4. 小结
          • 5. 参考
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
          http://www.vxiaotou.com