MMCV
Registry
registry可以认为就是一个普通的字典,用于函数或者类的映射,简单的实现如下:
class Registry:
def __init__(self, name):
self.name = name
self.module_dict = {} # 记录一个名字->类的字典
def _register_module(self, module_class):
module_name = module_class.__name__
self.module_dict[module_name] = module_class
def register_module(self):
def _register(cls):
print(f'cls = {cls}')
self._register_module(module_class=cls)
return cls
return _register
# 定义一个根据参数实例化对象的方法,这含义就是说配置文件里的Type字段需要和你实际的类名对应上。然后实例化出一个对象。
def build_from_cfg(cfg, registry):
obj_type = cfg.pop('type')
obj_cls = registry.module_dict[obj_type]
return obj_cls(**cfg)
# 生成BACKBONE和HEAD组件
BACKBONE = Registry('backbone')
HEAD = Registry('head')
def build_backbone(cfg):
return build_from_cfg(cfg, BACKBONE)
def build_head(cfg):
return build_from_cfg(cfg, HEAD)
def myhook():
def wrap():
print('wrap !!!!')
return wrap
@BACKBONE.register_module()
# @ myhookh
class ResNet(object):
def __init__(self, new_name):
self.new_name = new_name
@HEAD.register_module()
class NewHead(object):
def __init__(self, new_name):
self.new_name = new_name
for k, v in BACKBONE.module_dict.items():
print(k, v)
# 输出:ResNet <class '__main__.ResNet'>
for k, v in HEAD.module_dict.items():
print(k, v)
# 输出:NewHead <class '__main__.NewHead'>
HOOK
import sys
class HOOK:
def before_breakfast(self, runner):
print('{}:吃早饭之前晨练30分钟'.format(sys._getframe().f_code.co_name))
def after_breakfast(self, runner):
print('{}:吃早饭之前晨练30分钟'.format(sys._getframe().f_code.co_name))
def before_lunch(self, runner):
print('{}:吃午饭之前跑上实验'.format(sys._getframe().f_code.co_name))
def after_lunch(self, runner):
print('{}:吃完午饭午休30分钟'.format(sys._getframe().f_code.co_name))
def before_dinner(self, runner):
print('{}: 没想好做什么'.format(sys._getframe().f_code.co_name))
def after_dinner(self, runner):
print('{}: 没想好做什么'.format(sys._getframe().f_code.co_name))
def after_finish_work(self, runner, are_you_busy=False):
if are_you_busy:
print('{}:今天事贼多,还是加班吧'.format(sys._getframe().f_code.co_name))
else:
print('{}:今天没啥事,去锻炼30分钟'.format(sys._getframe().f_code.co_name))
class Runner(object):
def __init__(self, ):
pass
self._hooks = []
def register_hook(self, hook):
# 这里不做优先级判断,直接在头部插入HOOK
self._hooks.insert(0, hook)
def call_hook(self, hook_name):
for hook in self._hooks:
getattr(hook, hook_name)(self)
def run(self):
print('开始启动我的一天')
self.call_hook('before_breakfast')
self.call_hook('after_breakfast')
self.call_hook('before_lunch')
self.call_hook('after_lunch')
self.call_hook('before_dinner')
self.call_hook('after_dinner')
self.call_hook('after_finish_work')
print('~~睡觉~~')
runner = Runner()
hook = HOOK()
runner.register_hook(hook)
runner.run()