配置文件分析 & 注册器模式

UP通过设置流程参数来设置配置文件。 考虑到便利性和可延展性,UP为所有组建提供通常接口,包括:数据库(dataset),存储器(saver),和骨干网络(backbone)等。 可以通过调用注册器来使用这些接口。

配置文件

标准的配置信息包括: num_classes, runtime, dataset, trainer, saver, hooks and net. 标准的形式如下所示:

num_classes: &num_classes xx

runtime:

flip:  # transformer: flip, resize, normalize ...
......

dataset:
......

trainer:
......

saver:
......

hooks:
......

net:
......

注册器模式

UP 支持对每个模块注册来灵活的构建实验。

如何注册

所有的有名称的对象(函数和类等)都是可以被注册的,但结果应当是对应的实例。 比如,CocoDataset 将返回数据集而 resnet50 返回模块(ResNet instance)。

注册的形式是: REGISTRY.register(alias).

注册体是相应的实例,比如:DATASET_REGISTRY,AUGMENTATION_REGISTRY 等。

下面分别有注册 CocoDataset 和 resnet50 的例子。

# register a dataset
@DATASET_REGISTRY.register('coco')
class CocoDataset(BaseDataset):
    """COCO Dataset"""
    _loader = COCO

    def __init__():
        pass

# register a backbone
@MODULE_ZOO_REGISTRY.register('resnet50')
def resnet50(pretrained=False, **kwargs):
    """
    Constructs a ResNet-50 model.

    Arguments:
        pretrained (bool): If True, returns a model pre-trained on ImageNet
    """
    model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs)
    if pretrained:
        model.load_state_dict(model_zoo.load_url(model_urls['resnet50']))
    return model

怎么使用注册体

UP 通过对应的配置文件使用注册体。定位注册体则需要使用别名。 例如,CocoDataset 可以通过别名 coco 和参数 “kwargs” 来使用。

dataset: # Required.
train:
    dataset:
    type: coco  # <------------ alias for COCO
    kwargs:
        meta_file: instances_train2017.json
        image_reader:
        type: fs_opencv
        kwargs:
            image_dir: mscoco2017/train2017
            color_mode: RGB
        transformer: [*flip, *resize, *to_tensor, *normalize]

UP 开发模式

我们强烈推荐一种新的开发模式: Public UP + 插件(Plugins),包含以下两部分:

  • Public UP: 完整的检测框架。

  • 插件: 经过注册的自定义模块。

用户代码仓库

你可以开发一个由注册过的多模块组成的用户代码仓库,比如数据集、模型、损失函数等。 以 Face package 为例,结构如下所示。

face
├── datasets
|   └── face_dataset.py
├── __init__.py
└── models
    ├── facenet.py
    └── __init__.py

package 中的 FaceDataset 和 FaceNet 应当分别由 DATASET_REGISTRY 和 MODULE_ZOO_REGISTRY 注册。

然后你需要将 package 加入 PLUGINPATH 的路径:

export PLUGINPATH='path to father_dir_of_face'
这种模式有以下的优势:
  • 灵活导入: 在开发了一个插件后,您仅需要将路径加入 PLUGINPATH。

  • 使用方便: 您可以仅通过将别名加入配置文件的方式来构建调用路径。

  • 维护友好: Public UP 是和Plugin完全独立的,您可以仅需要花费少量精力来维护您的代码。