目录
前言
作为本系列的开篇,我首先介绍的是配置文件部分,因为整个模型的搭建都和配置文件有很大的关系,所以我们先来了解一下配置文件里面都有啥相关参数配置。
一、配置文件
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类
码字不易,未经许可,请勿随意转载!