注册机制(Registry)

1. 概述

在Detectron2 中,经常对一个类或函数进行注册,这里举个例子方便大家理解注册机制。

from fvcore.common.registry import Registry
# 创建一个Registry对象
registry_machine = Registry('registry_machine')
# 注册
@registry_machine.register()
def print_hello_world(word):
    print(word)
# 其中cfg为所调用的函数名/类名
cfg = "print_hello_world"
# 相当与调用print_hello_world('hello world')
registry_machine.get(cfg)('hello world')

如果创建了一个Registry的对象,并在方法/类定义的时候用装饰器装饰它,则可以通过 registry_machine.get(方法名) 来间接调用被注册的函数

2. 注册机制的好处

使用注册机制的好处:代码的可扩展性变强
对于detectron2这种,需要支持许多不同模型的大型框架,理想情况下所有的模型的参数都希望写在配置文件中,那问题来了,如果我希望根据我的配置文件,决定我是需要用VGG还是用ResNet ,我要怎么写?
如果是我,我可能会写出这种可扩展性超级低的暴搓的代码:

if class_name == 'VGG':
    model = build_VGG(args)
elif class_name == 'ResNet':
    model = build_ResNet(args)

但是如果用了注册类,代码就是这样的:

model = model_registry(class_name)(args)

3. 作业

要看懂detectron2中的注册流程,请先理解以下代码运行结果

原文链接

https://zhuanlan.zhihu.com/p/93835858

posted @ 2021-06-29 15:53  MorStar  阅读(1455)  评论(0编辑  收藏  举报