maskrcnn-benchmark-master(一):配置文件

目录

前言

一、配置文件

二、配置文件的使用


前言

作为本系列的开篇,我首先介绍的是配置文件部分,因为整个模型的搭建都和配置文件有很大的关系,所以我们先来了解一下配置文件里面都有啥相关参数配置。

一、配置文件

maskrcnn-benckmark-master是提供有默认的配置的,见文件:your_project/maskrcnn_benckmark/config/defaults.py

import os
# 通过yacs包来生成的默认配置
from yacs.config import CfgNode as CN


_C = CN()

_C.MODEL = CN()
# 表示是否只有RPN
_C.MODEL.RPN_ONLY = False
# 表示是否含有Mask分支
_C.MODEL.MASK_ON = False
_C.MODEL.RETINANET_ON = False
_C.MODEL.KEYPOINT_ON = False
# 表示是否使用GPU
_C.MODEL.DEVICE = "cuda"
# 默认的网络框架
_C.MODEL.META_ARCHITECTURE = "GeneralizedRCNN"
_C.MODEL.CLS_AGNOSTIC_BBOX_REG = False


...
...

那如果我们需要修改相关配置,难道需要在这个defaults.py文件中进行修改吗?

NO! NO! NO!

我们其实只要把需要修改的配置写在一个带.yaml后缀的文件中,从而通过这个文件来修改默认的配置,见文件your_project/configs/e2e_mask_rcnn_R_50_FPN_1x.yaml

下面以e2e_mask_rcnn_R_50_FPN_1x.yaml文件为例 对模型的配置文件进行简单的介绍:

# 下面的这些变量(key就可以当做变量,value就是变量的值)都是在default.py都定义好的,
# 下面出现的变量大部分都是需要进行更改的,不需要更改的直接使用默认的就行了,不需要在此处进行配置。
MODEL:
# 默认的RCNN网络框架 (代码中会有GeneralizedRCNN类,就是通过传入配置文件来生成模型的)  
  META_ARCHITECTURE: "GeneralizedRCNN"
# 预训练的权重文件
  WEIGHT: "catalog://ImageNetPretrained/MSRA/R-50"

# 骨干网络(CNN特征提取器,官方实现了好几种,下面这种是ResNet-50+FPN)
  BACKBONE:
    CONV_BODY: "R-50-FPN"
# ResNets作为特征提取网络的输出的特征维度
  RESNETS:
    BACKBONE_OUT_CHANNELS: 256

# RPN的配置
  RPN:
    # 是否使用FPN(特征金字塔网络)
    USE_FPN: True
    # anchor的配置
    ANCHOR_STRIDE: (4, 8, 16, 32, 64)
    # 用于训练过程的 筛选anchors的数目
    PRE_NMS_TOP_N_TRAIN: 2000
    # 用于测试过程的 筛选anchors的数目
    PRE_NMS_TOP_N_TEST: 1000
    # 用于测试过程 NMS操作之后留下的Proposals数目
    POST_NMS_TOP_N_TEST: 1000
    FPN_POST_NMS_TOP_N_TEST: 1000

# ROI_HEADS配置
  ROI_HEADS:
    # 是否使用FPN
    USE_FPN: True
# class分类和bounding box回归分支
  ROI_BOX_HEAD:
    # ROI Align处理之后所生成的维度
    POOLER_RESOLUTION: 7
    # 下面这几个参数还没搞明白 后续再补上~
    POOLER_SCALES: (0.25, 0.125, 0.0625, 0.03125)
    POOLER_SAMPLING_RATIO: 2
    # 特征提取器(对ROI Align之后的结果进行特征提取)
    FEATURE_EXTRACTOR: "FPN2MLPFeatureExtractor"
    # 预测器 (主要是使用全连接层进行 分类和回归)
    PREDICTOR: "FPNPredictor"
  # mask分割的分支
  ROI_MASK_HEAD:
    # 下面这几个参数还没搞明白 后续再补上~
    POOLER_SCALES: (0.25, 0.125, 0.0625, 0.03125)
    # 特征提取器(对ROI Align之后的结果进行特征提取)
    FEATURE_EXTRACTOR: "MaskRCNNFPNFeatureExtractor"
    # 预测器 (主要是生成mask)
    PREDICTOR: "MaskRCNNC4Predictor"
    # 下面这几个参数还没搞明白 后续再补上~
    POOLER_RESOLUTION: 14
    POOLER_SAMPLING_RATIO: 2
    RESOLUTION: 28
    # 是否使用ROI BOX HEAD特征提取器提取好的特征
    SHARE_BOX_FEATURE_EXTRACTOR: False
  MASK_ON: True

# 数据集的名称
DATASETS:
  TRAIN: ("coco_2014_train", "coco_2014_valminusminival")
  TEST: ("coco_2014_minival",)

# 数据集的Dataloader配置(用来读取数据集)
DATALOADER:
  SIZE_DIVISIBILITY: 32

# 相关训练参数配置
SOLVER:
  BASE_LR: 0.02
  WEIGHT_DECAY: 0.0001
  STEPS: (60000, 80000)
  MAX_ITER: 90000

整体的GeneralizedRCNN 结构如下图所示(绘画水平有限orz),可以依照下图的模块去看相应的配置,需要配置的模块主要是:Backbone、RPN、ROI Heads(包括ROI Box head 和 ROI Mask head) 。

 二、配置文件的使用

配置文件主要是在your_project/tools/train_net.py中进行调用,首先看到train_net.py中的main函数:

def main():
    parser = argparse.ArgumentParser(description="PyTorch Object Detection Training")
    
    # 配置文件(带有.yaml后缀的配置文件作为命令行参数输入)
    parser.add_argument(
        "--config-file",
        default="",
        metavar="FILE",
        help="path to config file",
        type=str,
    )

    ...
    ...
    # 将配置文件进行读取
    cfg.merge_from_file(args.config_file)
    cfg.merge_from_list(args.opts)
    cfg.freeze()
    ...
    ...
    # 将配置对象 cfg 作为参数传入train()函数
    model = train(cfg, args.local_rank, args.distributed)

接着我们在train_net.py中找到train()函数:

def train(cfg, local_rank, distributed):
    # 根据配置文件来创建模型 (发现cfg被传到了build_detection_model()函数中)
    model = build_detection_model(cfg)
    device = torch.device(cfg.MODEL.DEVICE)
    model.to(device)
    ...
    ...
    ...

cfg对象传入到了build_detection_model()函数中,这应该是一个利用配置来构建模型的函数,我们来看看这个函数里面都写了些啥:

from .generalized_rcnn import GeneralizedRCNN

# 一个字典
_DETECTION_META_ARCHITECTURES = {"GeneralizedRCNN": GeneralizedRCNN}


def build_detection_model(cfg):
    # 默认的cfg.MODEL.META_ARCHITECTURE都是GeneralizedRCNN
    meta_arch = _DETECTION_META_ARCHITECTURES[cfg.MODEL.META_ARCHITECTURE]
    # 相当于 return GeneralizedRCNN(cfg)
    return meta_arch(cfg)

其实可以看出build_detection_model()函数就是将cfg对象又作为参数,传到了GeneralizedRCNN类的init函数中,返回一个GeneralizedRCNN类对象,这个对象就是我们所定义的模型。

那么GeneraliziedRCNN类中究竟执行了哪些过程呢?它如何构建我们的Mask-RCNN模型的?

请阅读:maskrcnn-benchmark-master(二):GeneraliziedRCNN类

码字不易,未经许可,请勿随意转载!


版权声明:本文为foolishpeng原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。