註冊機制(Registry)
阿新 • • 發佈:2021-06-29
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)