MMseg1

MMseg教程(1)

配置文件的结构:

config:
├─ _base_
├    ├─datasets
├    ├─models
├    └─schedules
├─ unet
├─ upernet
├─ vit
├─ ...

config文件夹下有各种模型的配置文件夹,各个模型配置文件夹下装有该模型的不同网络,在不同的数据集下的配置,由于配置有很多的相似部分,因此这些配置都继承于在_base_文件夹下的基础配置文件

​ 在 config/_base_ 文件夹下面有4种基本组件类型: 数据集(dataset),模型(model),训练策略(schedule)和运行时的默认设置(default runtime)。许多模型都可以容易地通过组合这些组件进行实现,比如 DeepLabV3,PSPNet。使用 _base_ 下的组件构建的配置信息叫做原始配置 (primitive)

​ 对于同一个文件夹下的所有配置文件,建议只有一个对应的原始配置文件。所有其他的配置文件都应该继承自这个原始配置文件,从而保证每个配置文件的最大继承深度为 3

​ 就是建议从现有的方法继承。例如,如果在 DeepLabV3 基础上进行了一些修改,用户可以先通过指定 _base_ = ../deeplabv3/deeplabv3_r50-d8_4xb2-40k_cityscapes-512x1024.py 继承基本的 DeepLabV3 结构,然后在配置文件中修改必要的字段

配置文件命名风格

​ 遵循以下格式来命名配置文件

1
{algorithm name}_{model component names [component1]_[component2]_[...]}_{training settings}_{training dataset information}_{testing dataset information}

配置文件的文件名分为五个部分,组成文件名每一个部分和组件之间都用_连接,每个部分或组件中的每个单词都要用-连接。

  • {algorithm name}: 算法的名称,如 deeplabv3, pspnet 等。
  • {model component names}: 算法中使用的组件名称,如主干(backbone)、解码头(head)等。例如,r50-d8 表示使用ResNet50主干网络,并使用主干网络的8倍下采样输出作为下一级的输入。
  • {training settings}: 训练时的参数设置,如 batch size、数据增强(augmentation)、损失函数(loss)、学习率调度器(learning rate scheduler)和训练轮数(epochs/iterations)。例如: 4xb4-ce-linearlr-40K 意味着使用4个gpu,每个gpu4个图像,使用交叉熵损失函数(CrossEntropy),线性学习率调度程序,训练40K iterations。 一些缩写:
    • {gpu x batch_per_gpu}: GPU数量和每个GPU的样本数。bN 表示每个GPU的batch size为N,如 8xb2 为8个gpu x 每个gpu2张图像的缩写。如果未提及,则默认使用 4xb4
    • {schedule}: 训练计划,选项有20k40k等。20k 40k 分别表示20000次迭代(iterations)和40000次迭代(iterations)。
  • {training dataset information}: 训练数据集名称,如 cityscapes ade20k 等,以及输入分辨率。例如: cityscapes-768x768 表示使用 cityscapes 数据集进行训练,输入分辨率为768x768
  • {testing dataset information} (可选): 测试数据集名称。当您的模型在一个数据集上训练但在另一个数据集上测试时,请将测试数据集名称添加到此处。如果没有这一部分,则意味着模型是在同一个数据集上进行训练和测试的

PSPNet 的一个例子

​ 我们对使用ResNet50V1c作为主干网络的PSPNet的配置文件作简要说明。要了解更详细的用法和每个模块对应的替换方法,请参阅API文档。

1
2
3
4
5
6
7
8
_base_ = [
'../_base_/models/pspnet_r50-d8.py', '../_base_/datasets/cityscapes.py',
'../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py'
] # 我们可以在基本配置文件的基础上 构建新的配置文件
crop_size = (512, 1024)
data_preprocessor = dict(size=crop_size)
model = dict(data_preprocessor=data_preprocessor)
# 至此,一个模型就已经配置好了

​ 其中_base_/models/pspnet_r50-d8.py是使用ResNet50V1c作为主干网络的PSPNet的基本模型配置文件,详情配置去那个文件中详细查看

要加载和解析它们,我们可以使用MMEngine实现的Config

1
2
3
4
from mmengine.config import Config

cfg = Config.fromfile('configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py')
print(cfg.train_dataloader)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{'batch_size': 2,
'num_workers': 2,
'persistent_workers': True,
'sampler': {'type': 'InfiniteSampler', 'shuffle': True},
'dataset': {'type': 'CityscapesDataset',
'data_root': 'data/cityscapes/',
'data_prefix': {'img_path': 'leftImg8bit/train',
'seg_map_path': 'gtFine/train'},
'pipeline': [{'type': 'LoadImageFromFile'},
{'type': 'LoadAnnotations'},
{'type': 'RandomResize',
'scale': (2048, 1024),
'ratio_range': (0.5, 2.0),
'keep_ratio': True},
{'type': 'RandomCrop', 'crop_size': (512, 1024), 'cat_max_ratio': 0.75},
{'type': 'RandomFlip', 'prob': 0.5},
{'type': 'PhotoMetricDistortion'},
{'type': 'PackSegInputs'}]}}

cfg mmengine.config.Config 的一个实例。它的接口与dict对象相同,也允许将配置值作为属性访问。更多信息请参见MMEngine中的config tutorial

教程1:了解配置文件 — MMSegmentation 1.2.2 文档