Mask-RCNN应用 - 结合源码详细解析Config.py

MaskRCNN入门路径–> Mask-RCNN应用研究方法 - 持续更新中

大家在理解Config.py时结合Model.py会更容易理解
如有问题或需要咨询,请私信或用手机打开https://m.tb.cn/h.fINaraE?tk=PCzA2jPp4V0进行咨询

"""
Mask R-CNN
Base Configurations class.

Copyright (c) 2017 Matterport, Inc.
Licensed under the MIT License (see LICENSE for details)
Written by Waleed Abdulla
"""

import numpy as np

  • 基础配置类
  • 不要直接使用该类,在使用Mask RNN时可以定义子类集成Config,在子类中重新改写Config中的配置
  • 因为大多配置具有默认值,所以子类中仅需改写所需的配置即可
class Config(object):
    """Base configuration class. For custom configurations, create a
    sub-class that inherits from this one and override properties
    that need to be changed.
    """
NAME
  • 模型名称的配置,如需定义自己的模型名称,需要重新定义NAME
    NAME = None  # Override in sub-classes
  • 根据Config中的init函数,batch_size=GPU_COUNT x IMAGES_PER_GPU
GPU_COUNT
  • 模型调用GPU的个数
  • 在MaskRCNN中,有model.py和parallel_model.py两个模型定义的文件。model.py是基础model配置,适用于只有CPU及1个GPU的情况,而超过1个GPU时,model将会进入parallel_model.py中对将nput的数据分配到多GPU上
  • 注意,当仅使用CPU时需要将GPU_COUNT设置为1
    GPU_COUNT = 1
IMAGES_PER_GPU
  • 每个GPU上要训练的图像个数

  • 一个12GB的GPU通常可以处理2个1024x1024px的图片。该参数根据GPU性能和所需处理的图片大小进行调整。

  • 推荐使用GPU能处理的最大数据

    IMAGES_PER_GPU = 2
STEPS_PER_EPOCH
  • 在keras.fit_generator中调用,想要理解该参数,需要简单理解下 keras.fit_generator
  • keras.fit_generator输入input的迭代数组(batch_size在生成迭代数组的过程中确定),并且指定steps_per_epoch和epoch若每一个epoch会将所有的样本训练一次,steps_per_epoch = len(x_train)/batch_size。
  • 当然实际训练时候由于样本量可能大可能小,因此每一个epoch不一定正好训练所有的样本,因此steps_per_epoch实际是需要自定义的值,每一个epoch所使用的样本数量=batch_size x steps_per_epoch。Min(steps_per_epoch) = len(x_train)/(batch_size x num_epoch)
  • STEPS_PER_EPOCH值越小,每次epoch所用的样本数越少,训练迭代一次的时间也就越短,但同时为保证训练精度,所需的num_epoch也越大。同时MaskRCNN在训练迭代结束后会进行验证,因此STEPS_PER_EPOCH值过小会导致验证次数过多,降低模型训练的速度
    STEPS_PER_EPOCH = 1000
VALIDATION_STEPS
  • 在keras.fit_generator中调用,想要理解该参数,需要简单理解下 keras.fit_generator
  • 其设置过程类似于STEPS_PER_EPOCH,分析参考STEPS_PER_EPOCH
  • Min(validdation_steps) = len(x_val)/(batch_size x num_epoch)
  • validdation_steps越大,验证精度越高,但是验证所花时间也越长
    VALIDATION_STEPS = 50
BACKBONE
  • 模型的主干网络结构,目前MaskRCNN支持resnet50 or resnet101
  • 当然你也快可以自己生成,提供model.resnet_graph中所需的callable函数
   BACKBONE = "resnet101"
COMPUTE_BACKBONE_SHAPE
  • 使用resnet50 or resnet101无需使用,只有定义自己的backbone是才需定义
    COMPUTE_BACKBONE_SHAPE = None
BACKBONE_STRIDES
  • 特征图相对于原图缩小的倍数,参照物是原始图片,这不能更改,在FPN中需要用到
  • [4, 8, 16, 32, 64]是基于resnet101设定的数值,在resnet101中,C2的大小是原图的1/4,C3是原图的1/8,C4是的原图1/16,C5是原图的1/32,其和FPN输出的P2-P5是对应的,P6在P5的基础上进行了一个下采样,因此P6是原图的1/64
  • 理解该参数,需要简单了解RestNet
    BACKBONE_STRIDES = [4, 8, 16, 32, 64]
FPN_CLASSIF_FC_LAYERS_SIZE
    FPN_CLASSIF_FC_LAYERS_SIZE = 1024
TOP_DOWN_PYRAMID_SIZE
    TOP_DOWN_PYRAMID_SIZE = 256
NUM_CLASSES
  • 所需分类的数目,根据实际训练中的object分类决定。
  • NUM_CLASSES = object_classes + background
    NUM_CLASSES = 1  # Override in sub-classes
RPN_ANCHOR_SCALES
  • 生成锚框时所需参数
  • 使用FPN进行RPN时,从p2-p6对应的锚框的尺寸大小,这里的锚框是方形
  • 小的锚框尺寸有利于检测小的物体
    RPN_ANCHOR_SCALES = (32, 64, 128, 256, 512)
RPN_ANCHOR_RATIOS
  • 生成锚框时所需参数
  • 每个cell中anchors的长宽比(宽/高)
  • 为1代表方形的anchor, 0.5是宽的anchor
    RPN_ANCHOR_RATIOS = [0.5, 1, 2]
RPN_ANCHOR_STRIDE
  • 生成锚框时所需参数
  • 锚框采样的步长,一般无需修改
    RPN_ANCHOR_STRIDE = 1
RPN_NMS_THRESHOLD
  • 对RPN预测区域的非极大值抑制所用的阈值
  • RPN预测同一个物体会产生多个区域,计算这些区域的IoU,并将IoU低RPN_NMS_THRESHOLD的区域去除,剩下的即为RPN预测该物体概率最大的区域
  • 我们可以在训练的过程中改变RPN_NMS_THRESHOLD的值
    RPN_NMS_THRESHOLD = 0.7
RPN_TRAIN_ANCHORS_PER_IMAGE
  • RPN训练时每张图片所用的锚框的数目
    RPN_TRAIN_ANCHORS_PER_IMAGE = 256
POST_NMS_ROIS_TRAINING
POST_NMS_ROIS_INFERENCE
  • 训练和预测中非极大值抑制后保留的ROI的数目
    POST_NMS_ROIS_TRAINING = 2000
    POST_NMS_ROIS_INFERENCE = 1000
USE_MINI_MASK
MINI_MASK_SHAPE
  • Mask在最初输出的分辨率为图片分辨率,Mask的size,该图像中有多少个目标,就mask就有多少个channal,一个目标一个channal,因此图片分辨率很大的时候,Mask的输出会消耗大量内存
  • USE_MINI_MASK设定是否使用mini_mask,该参数可以在图片分辨率大的时候使用,用于降低内存消耗
  • MINI_MASK_SHAPE用来指定mini_mask的大小,当USE_MINI_MASK为True时,将把Mask进行resize到shape的大小
    USE_MINI_MASK = True
    MINI_MASK_SHAPE = (56, 56)  # (height, width) of the mini-mask
IMAGE_RESIZE_MODE
IMAGE_MIN_DIM
IMAGE_MAX_DIM
  • 输入图像调整大小
  • 通常,使用“正方形”调整大小模式进行训练和预测,并且在大多数情况下应该可以正常使用。 在此模式下,按比例放大图像,使小边= IMAGE_MIN_DIM,但要确保缩放不会使长边> IMAGE_MAX_DIM。 然后用零填充图像以使其成为正方形,以便在一个批量中可以放置多个图像
  • 可以选用的模式:
  • none: 无缩放或填充. 返回原图.
  • square: 缩放或填充0,返回[IMAGE_MIN_DIM, IMAGE_MAX_DIM]大小的图像.
  • pad64: 宽和高填充0,使他们成为64的倍数.如果IMAGE_MIN_DIM 或 IMAGE_MIN_SCALE不为None, 则在填充之前先缩放. IMAGE_MAX_DIM在该模式中被忽略.要求为64的倍数是因为在对FPN金字塔的6个levels进行上/下采样时保证平滑(2^6=64).
  • crop: 对图像进行随机裁剪. 首先, 基于IMAGE_MIN_DIM和IMAGE_MIN_SCALE对图像进行缩放, 然后随机裁剪IMAGE_MIN_DIM x IMAGE_MIN_DIM大小.仅在训练时使用.IMAGE_MAX_DIM在该模式中未使用.
    IMAGE_RESIZE_MODE = "square"
    IMAGE_MIN_DIM = 800
    IMAGE_MAX_DIM = 1024
IMAGE_MIN_SCALE
  • 最小缩放比例。 在MIN_IMAGE_DIM之后检查,可以强制进一步扩大比例。 例如,如果设置为2,则即使MIN_IMAGE_DIM不需要,图像也会按比例放大以使其宽度和高度加倍,甚至更多。 但是,在“正方形”模式下,它可以被IMAGE_MAX_DIM否决。
    IMAGE_MIN_SCALE = 0
IMAGE_CHANNEL_COUNT
    IMAGE_CHANNEL_COUNT = 3
MEAN_PIXEL
  • 图像像素均值,默认为RGB,所以len(MEAN_PIXEL)=3
  • 如果图像为灰度图或RGB-D图,MEAN_PIXEL需要进行相应修改
    MEAN_PIXEL = np.array([123.7, 116.8, 103.9])
TRAIN_ROIS_PER_IMAGE
  • 每幅图像喂给classifier/mask heads的ROIs数量
  • Mask RCNN论文中使用的是512, 但是RPN通常产生不了这么多的
  • positive proposals,所以这里保证 positive:negative=1:3.
  • 可以通过调整RPN NMS的阈值来获得更多的proposals。
    TRAIN_ROIS_PER_IMAGE = 200
ROI_POSITIVE_RATIO
  • 训练classifier/mask heads时positive ROIs的比例,一般无需修改
    ROI_POSITIVE_RATIO = 0.33
POOL_SIZE
MASK_POOL_SIZE
  • 池化ROIS
    POOL_SIZE = 7
    MASK_POOL_SIZE = 14
MASK_SHAPE
  • 输出的Mask形状
  • 更改这个参数需要同时修改neural network mask branch
    MASK_SHAPE = [28, 28]
MAX_GT_INSTANCES
  • ground_trust实例的最大数目,该参数用在data_generator中
  • 如果所需检测的图像中没有特别多的数目,可以降低该值的数目
    MAX_GT_INSTANCES = 100
RPN_BBOX_STD_DEV
BBOX_STD_DEV
  • RPN和最终检测的边界框优化标准差
    RPN_BBOX_STD_DEV = np.array([0.1, 0.1, 0.2, 0.2])
    BBOX_STD_DEV = np.array([0.1, 0.1, 0.2, 0.2])
DETECTION_MAX_INSTANCES
  • 最终检测实例的最大数目
  • 如果所需检测的图像中没有特别多的数目,可以降低该值的数目
    DETECTION_MAX_INSTANCES = 100
DETECTION_MIN_CONFIDENCE
  • 接受一个被检测的实例的最小可能值
  • 小于该阈值的ROIs将被跳过
    DETECTION_MIN_CONFIDENCE = 0.7
DETECTION_NMS_THRESHOLD
  • 检测时非极大值抑制的阈值
    DETECTION_NMS_THRESHOLD = 0.3
LEARNING_RATE
LEARNING_MOMENTUM
  • 学习率和学习动量
  • MaskRCNN用了动量更新的SGD方法
  • MaskRCNN论文中使用 lr=0.02,但是在TensorFlow中会导致权重爆炸。可能是优化器不同所导致的
    LEARNING_RATE = 0.001
    LEARNING_MOMENTUM = 0.9
WEIGHT_DECAY
  • 权重衰减正则化
    WEIGHT_DECAY = 0.0001
LOSS_WEIGHTS
  • 更精准优化的loss权重
  • 可以用于R-CNN训练设置
    LOSS_WEIGHTS = {
        "rpn_class_loss": 1.,
        "rpn_bbox_loss": 1.,
        "mrcnn_class_loss": 1.,
        "mrcnn_bbox_loss": 1.,
        "mrcnn_mask_loss": 1.
    }
USE_RPN_ROIS
  • 可以使用RPN ROIs或外部生成的ROIs用于训练。
  • 在大部分情况下将该值设为true.如果在训练 head branches时,不使用RPN生成的ROIs,将其设为false。例如, 调试classifier head而不是训练RPN时.
    USE_RPN_ROIS = True
# Train or freeze batch normalization layers
#     None: Train BN layers. This is the normal mode
#     False: Freeze BN layers. Good when using a small batch size
#     True: (don't use). Set layer in training mode even when predicting
TRAIN_BN
  • 训练或冻结batch normalization层
  • 可以设置的模式有三种:
  • None:训练BN层。这是标准模式
  • False:冻结BN层。当batch_size小时使用效果比较好
  • True:(未使用)。即使在预测时也将图层设置为训练模式
    TRAIN_BN = False  # Defaulting to False since batch size is often small
GRADIENT_CLIP_NORM
    GRADIENT_CLIP_NORM = 5.0
Init & Display
    def __init__(self):
        """Set values of computed attributes."""
        # Effective batch size
        self.BATCH_SIZE = self.IMAGES_PER_GPU * self.GPU_COUNT

        # Input image size
        if self.IMAGE_RESIZE_MODE == "crop":
            self.IMAGE_SHAPE = np.array([self.IMAGE_MIN_DIM, self.IMAGE_MIN_DIM,
                self.IMAGE_CHANNEL_COUNT])
        else:
            self.IMAGE_SHAPE = np.array([self.IMAGE_MAX_DIM, self.IMAGE_MAX_DIM,
                self.IMAGE_CHANNEL_COUNT])

        # Image meta data length
        # See compose_image_meta() for details
        self.IMAGE_META_SIZE = 1 + 3 + 3 + 4 + 1 + self.NUM_CLASSES

    def display(self):
        """Display Configuration values."""
        print("\nConfigurations:")
        for a in dir(self):
            if not a.startswith("__") and not callable(getattr(self, a)):
                print("{:30} {}".format(a, getattr(self, a)))
       print("\n")
  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天木青

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

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

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

打赏作者

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

抵扣说明:

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

余额充值