MMCV相关

本文介绍了MMCV中的Registry机制,它是一个类字典,用于函数和类的映射。通过Registry,可以方便地注册和构建模块,如BACKBONE和HEAD。同时展示了HOOK类,用于在特定时间点执行某些操作。通过Runner类,可以注册并按顺序调用HOOK的方法。示例中,创建了ResNet和NewHead类,并在BACKBONE和HEAD Registry中注册。
摘要由CSDN通过智能技术生成

文章目录

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值