【2020华为云AI实战营】第三章作业Mask R-CNN模型训练配置参数解释

举报
hw54024525 发表于 2020/06/18 14:06:29 2020/06/18
【摘要】 1 作业指南对于模型迅雷参数是这么讲的,稍微有点少第二步:生成相关配置项我们定义Config类的子类MyTrainConfig,指定相关的参数,较为关键的参数有:NAME: Config的唯一名称NUM_CLASSES: 分类的数量,COCO中共有80种物体+背景IMAGE_MIN_DIM和IMAGE_MAX_DIM: 图片的最大和最小尺寸,我们生成固定的128x128的图片,因此都设置为1...

1 作业指南对于模型迅雷参数是这么讲的,稍微有点少

第二步:生成相关配置项
我们定义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的数量可以加速训练,但是检测精度降低

以下是稍微详细一点的,转自csdn

    # 使用的gpu的数量,当使用cpu训练时,数量为1,一般设置为1就可以
    GPU_COUNT = 1

    # 每个GPU上要训练的图像数。一个12 GB的GPU通常可以处理2张1024x1024像素的图像。
    # 根据您的GPU内存和图像大小进行调整。使用GPU能够处理的最高数字,以获得最佳性能,我们设置8可能会好一点
    IMAGES_PER_GPU = 2

    # steps_per_epoch为keras中的fit_generator函数中的参数,可以理解为每轮迭代多少次,fit_generator就是
    # 因为训练集太大而设置的自动生成batch的函数,当这轮生成的batch数达到steps_per_epoch就进行下一个epoch。
    # steps_per_epoch不需要考虑训练集大小,tensorboard会自动更新并在每个epoch结束时保存更新,此参数小意味着tensorboard更新的快。
    # 验证集也是在epoch最后记录的,而且比较花时间,所以steps_per_epoch不要设置太小,避免在验证上花大量时间。
    #按需求修改参数值
    STEPS_PER_EPOCH = 120

    # validation_steps也是fit_generator中的参数,当validation_data为验证集生成器时,validation_steps同样是验证集一轮的迭代次数,
    # 即生成的batch数,此参数越大验证越精确,但同样训练的也越慢。
    # 在keras中,steps一般就是batchs of samples。
    #按需求修改参数值。
    VALIDATION_STEPS = 20

    # 主干网络结构,resnet50 or resner101
    BACKBONE = "resnet101"

    # 基于主干网络的降采样倍数,参照物是原始图片,这不能更改,在FPN中需要用到。
    BACKBONE_STRIDES = [4, 8, 16, 32, 64]

    # 训练集中图片的类别数,包括背景
    NUM_CLASSES = 1  # 按要求修改

    # 使用FPN进行RPN时,从p2-p6对应的锚框的尺寸大小
    RPN_ANCHOR_SCALES = (32, 64, 128, 256, 512)

    #基于rpn_anchor_scales的每个尺寸又对应3种比例。
    RPN_ANCHOR_RATIOS = [0.5, 1, 2]

    # 锚步长
    # 如果为1就为feature map中的每个点创建锚,如果是2就在feature map上跨一个点创建锚,以此类推。
    RPN_ANCHOR_STRIDE = 1

    # 非极大值抑制的阈值,可以剔除rpn生成的proposals中不合格的,在训练时可以修改阈值。
    #注意NMS只在RPN网络的预测阶段在proposal layer使用
    RPN_NMS_THRESHOLD = 0.7

    # 在进行rpn训练时每幅图片使用多少个anchor
    RPN_TRAIN_ANCHORS_PER_IMAGE = 256

    # 进行非极大值抑制后在训练和测试阶段输入的ROI个数,即通过proposal layer之后的rois的个数
    POST_NMS_ROIS_TRAINING = 2000
    POST_NMS_ROIS_INFERENCE = 1000

    # instance masks 使用小尺寸以节省内存,建议使用高分辨率图片
    USE_MINI_MASK = True
    MINI_MASK_SHAPE = (56, 56)  # (height, width) of the mini-mask
    # 输入图片尺寸重置
    #通常将图片设置为正方形,这样训练效果一般很好,重置大小是短边为IMAGE_MIN_DIM,长边不超过IMAGE_MAX_DIM,然后
    # 用0填充至正方形,多个图片可以设置为一个batch
    #具体方法:
    # none:   No resizing or padding. Return the image unchanged.
    # square: Resize and pad with zeros to get a square image
    #         of size [max_dim, max_dim].
    # pad64:  Pads width and height with zeros to make them multiples of 64.
    #         If IMAGE_MIN_DIM or IMAGE_MIN_SCALE are not None, then it scales
    #         up before padding. IMAGE_MAX_DIM is ignored in this mode.
    #         The multiple of 64 is needed to ensure smooth scaling of feature
    #         maps up and down the 6 levels of the FPN pyramid (2**6=64).
    # crop:   Picks random crops from the image. First, scales the image based
    #         on IMAGE_MIN_DIM and IMAGE_MIN_SCALE, then picks a random crop of
    #         size IMAGE_MIN_DIM x IMAGE_MIN_DIM. Can be used in training only.
    #         IMAGE_MAX_DIM is not used in this mode.
    # 我们使用第二种方法
    IMAGE_RESIZE_MODE = "square"
    IMAGE_MIN_DIM = 800
    IMAGE_MAX_DIM = 1024
    # 最小缩放比率。在MIN_IMAGE_DIM后进行检查,并可以强制进一步缩放。
    # 例如,如果设置为2,那么图像的宽度和高度会增加一倍,甚至更多,
    # 即使MIN_IMAGE_DIM不需要它。但是,在“square”模式下,它可以被IMAGE_MAX_DIM覆盖。
    IMAGE_MIN_SCALE = 0

    # Image mean (RGB),np.array创建一个数组
    MEAN_PIXEL = np.array([123.7, 116.8, 103.9])

    # 每副图像使用多少roi作为后面分类和掩膜网络的输入,论文中采用512,但通常
    # rpn产生不了那么多positive proposal,使得positive:negative为1:3
    # 但可以修改非极大值抑制的阈值来增加roi数量。注意这是detection target layer的输出
    TRAIN_ROIS_PER_IMAGE = 200 #train_rois_per_image

    # Positive roi的比例
    ROI_POSITIVE_RATIO = 0.33

    # poolalign中pooling后的大小,分为两段,一段用来分类,一段用来掩膜
    POOL_SIZE = 7
    MASK_POOL_SIZE = 14

    # 掩膜网络最后的输出,如果改变这个值,就需要修改对应的掩膜网络,
    MASK_SHAPE = [28, 28]

    # 在一副图像中最多有多少gt实例数目
    MAX_GT_INSTANCES = 100

    # 在rpn和最后分类中做bounding boxing 回归的标准偏差。
    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])

    # 最终检测包含的实例最大数量,即在测试阶段经过分类回归后的proposal中串行的输入到mask网络中的roi数量
    DETECTION_MAX_INSTANCES = 100

    # 在测试阶段的detection layer中用来过滤实例的分类得分没有达到这个置信度的目标,即在测试阶段的输入
    # 由RPN网络生成的rois,经过fast rcnn后输出每个roi的分类得分和第二次边界回归值,然后判别这个分类得分中最高的类的得分
    # 大于下面的置信度的roi才进入掩码网络生成掩码
    DETECTION_MIN_CONFIDENCE = 0.7 # 置信度小于0.7就跳过检测

    #  最终目标检测后被判别为属于实例的rois之间的NMS的非极大值抑制,这个是第二次修正后且置信度大于0.7的rois与GT的NMS阈值
    # 且经过NMS后只选择置信度前100名输入到下一个mask网络
    DETECTION_NMS_THRESHOLD = 0.3

    # 学习率和动量
    # 论文中学习率为0.02,会造成梯度爆炸,所以修改了
    LEARNING_RATE = 0.001
    LEARNING_MOMENTUM = 0.9

    # 正则化权重衰减系数
    WEIGHT_DECAY = 0.0001

    # 为了更好的优化设置的损失权重,在训练阶段可以使用
    LOSS_WEIGHTS = {
        "rpn_class_loss": 1.,
        "rpn_bbox_loss": 1.,
        "mrcnn_class_loss": 1.,
        "mrcnn_bbox_loss": 1.,
        "mrcnn_mask_loss": 1.
    }

    #在训练时是否使用rpn生成的roi,一般情况下为true,只有不经过rpn网络,直接调试后面的分类或者掩膜时,可以改为false
    USE_RPN_ROIS = True

    # 是否使用bn
    #     None: Train BN layers. This is the normal mode
    #     False: Freeze BN layers. Good when using a small batch size
    #     True: (不使用). Set layer in training mode even when inferencing
    TRAIN_BN = False  # Defaulting to False since batch size is often small
 # 梯度标准裁剪,暂时不知道用来干什么
    GRADIENT_CLIP_NORM = 5.0 # gradient_clip_norm

    def __init__(self):
        """设置计算属性值"""
        # batch size大小如何设置
        self.BATCH_SIZE = self.IMAGES_PER_GPU * self.GPU_COUNT

        # 输入图像尺寸如何重置
        if self.IMAGE_RESIZE_MODE == "crop":
            self.IMAGE_SHAPE = np.array([self.IMAGE_MIN_DIM, self.IMAGE_MIN_DIM, 3])
        else:
            self.IMAGE_SHAPE = np.array([self.IMAGE_MAX_DIM, self.IMAGE_MAX_DIM, 3])

        # 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):
        """在不同的实验中显示配置中对应属性的值"""
        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")
————————————————
版权声明:本文为CSDN博主「竹魂剑身琴心雪魄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lingshanshengzu/java/article/details/80401507






【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。