MaskRCNN入门路径–> Mask-RCNN应用研究方法 - 持续更新中
大家在理解Config.py时结合Model.py会更容易理解
如有问题或需要咨询,请私信或用手机打开https://m.tb.cn/h.fINaraE?tk=PCzA2jPp4V0进行咨询
文章目录
- NAME
- GPU_COUNT
- IMAGES_PER_GPU
- STEPS_PER_EPOCH
- VALIDATION_STEPS
- BACKBONE
- COMPUTE_BACKBONE_SHAPE
- BACKBONE_STRIDES
- FPN_CLASSIF_FC_LAYERS_SIZE
- TOP_DOWN_PYRAMID_SIZE
- NUM_CLASSES
- RPN_ANCHOR_SCALES
- RPN_ANCHOR_RATIOS
- RPN_ANCHOR_STRIDE
- RPN_NMS_THRESHOLD
- RPN_TRAIN_ANCHORS_PER_IMAGE
- POST_NMS_ROIS_TRAINING
- POST_NMS_ROIS_INFERENCE
- USE_MINI_MASK
- MINI_MASK_SHAPE
- IMAGE_RESIZE_MODE
- IMAGE_MIN_DIM
- IMAGE_MAX_DIM
- IMAGE_MIN_SCALE
- IMAGE_CHANNEL_COUNT
- MEAN_PIXEL
- TRAIN_ROIS_PER_IMAGE
- ROI_POSITIVE_RATIO
- POOL_SIZE
- MASK_POOL_SIZE
- MASK_SHAPE
- MAX_GT_INSTANCES
- RPN_BBOX_STD_DEV
- BBOX_STD_DEV
- DETECTION_MAX_INSTANCES
- DETECTION_MIN_CONFIDENCE
- DETECTION_NMS_THRESHOLD
- LEARNING_RATE
- LEARNING_MOMENTUM
- WEIGHT_DECAY
- LOSS_WEIGHTS
- USE_RPN_ROIS
- TRAIN_BN
- GRADIENT_CLIP_NORM
- Init & Display
"""
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
- Network-Heads(fpn_classifier_graph)中用到,指FPN分类图中全连接层的大小,由于MaskRCNN继承了FastRCNN的FRN,所有此处的size为1024
FPN_CLASSIF_FC_LAYERS_SIZE = 1024
TOP_DOWN_PYRAMID_SIZE
- 用于构建特性金字塔的自顶向下层的大小,主网络用,此处也无需变动,可以参考MASK_RCNN代码详解(1)-Basebone部分
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
- 每个图片的通道数。RGB=3,grayscale=1,RGB-D=4
- 根据MaskRCNN文档中说明,MaskRCNN默认使用RGB图,但是如果想要用灰度图或者RGB-D图进行训练,只需修改少部分地方
- 想用RGB-D进行训练需要修改的部分
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")