注册机制(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中的注册流程,请先理解以下代码运行结果