【MMCV】让你在10分钟了解mmcv注册器(registry)

文章目录

  • 前言
  • 一、注册器是什么?
  • 二、使用步骤
    • 一个简单的例子
    • 自定义构建
    • MMCV实例说明
    • 三.注册器的层次
  • 总结


前言

MMCV 使用 注册器 来管理具有相似功能的不同模块, 例如, 检测器中的主干网络、头部、和模型颈部。 在 OpenMMLab 家族中的绝大部分开源项目使用注册器去管理数据集和模型的模块,例如 MMDetection。
官方指南


一、注册器是什么?

在MMCV中,注册器可以看作类到字符串的映射。 一个注册器中的类通常有相似的接口,但是可以实现不同的算法或支持不同的数据集。 借助注册器,用户可以通过使用相应的字符串查找并实例化该类,并根据他们的需要实例化对应模块。

二、使用步骤

1.创建一个构建方法(可选,在大多数情况下您可以只使用默认方法)
2.创建注册器
3.使用此注册器来管理模块

一个简单的例子

file1:
	from mmcv.utils import Registry
	# 创建转换器(converter)的注册器(registry)
	CONVERTERS = Registry('converter')
	
file2:
	from .builder import CONVERTERS
	
	# 使用注册器管理模块
	@CONVERTERS.register_module()
	class Converter1(object):
	    def __init__(self, a, b):
	        self.a = a
	        self.b = b
file3:   
	converter_cfg = dict(type='Converter1', a=a_value, b=b_value)
	converter = CONVERTERS.build(converter_cfg)

在这里就实现了字符串到类的 对应转化——‘Converter1’ ->
通过XXX.build( )函数来实例化

自定义构建

我们可以实现一个自定义的 build_func (构建函数)并将其传递到注册器中。

from mmcv.utils import Registry

# 创建一个构建函数
def build_converter(cfg, registry, *args, **kwargs):
    cfg_ = cfg.copy()
    converter_type = cfg_.pop('type')
    if converter_type not in registry:
        raise KeyError(f'Unrecognized converter type {converter_type}')
    else:
        converter_cls = registry.get(converter_type)

    converter = converter_cls(*args, **kwargs, **cfg_)
    return converter

# 创建一个用于转换器(converters)的注册器,并传递(registry)``build_converter`` 函数
CONVERTERS = Registry('converter', build_func=build_converter)

MMCV实例说明

在mmcv/cnn/builder.py 中自定义了build_func( )

def build_model_from_cfg(cfg, registry, default_args=None):
    """Build a PyTorch model from config dict(s). Different from
    ``build_from_cfg``, if cfg is a list, a ``nn.Sequential`` will be built.

    Args:
        cfg (dict, list[dict]): The config of modules, is is either a config
            dict or a list of config dicts. If cfg is a list, a
            the built modules will be wrapped with ``nn.Sequential``.
        registry (:obj:`Registry`): A registry the module belongs to.
        default_args (dict, optional): Default arguments to build the module.
            Defaults to None.

    Returns:
        nn.Module: A built nn module.
    """
    if isinstance(cfg, list):
        modules = [
            build_from_cfg(cfg_, registry, default_args) for cfg_ in cfg
        ]
        return Sequential(*modules)
    else:
        return build_from_cfg(cfg, registry, default_args)


MODELS = Registry('model', build_func=build_model_from_cfg)

其中就包含了自定义函数的注册器的用法
上述函数实现了——如果config类型是一个list,构建一个modules,其类型为‘ nn.Sequential ’

三.注册器的层次

可以通过父类注册器来构建子类注册器

from mmcv.cnn import MODELS as MMCV_MODELS

MODELS = Registry('models', parent=MMCV_MODELS)

总结

注册器是理解mmcv的重要内容,作者也是通过这篇文章来,记下相关内容,供自己学习使用!

你可能感兴趣的:(python,cv)