前言:不管是Detectron还是mmdetection,都有用到这个register机制,特意去弄明白,记录一下。

首先看Registry代码:

# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reservedfrom typing import Dict, Optional, Iterable, Tuple, Iteratorfrom tabulate import tabulateclass Registry(Iterable[Tuple[str, object]]):"""The registry that provides name -> object mapping, to support third-partyusers' custom modules.To create a registry (e.g. a backbone registry):.. code-block:: pythonBACKBONE_REGISTRY = Registry('BACKBONE')To register an object:.. code-block:: python@BACKBONE_REGISTRY.register()class MyBackbone():...Or:.. code-block:: pythonBACKBONE_REGISTRY.register(MyBackbone)"""def __init__(self, name: str) -> None:"""Args:name (str): the name of this registry"""self._name: str = nameself._obj_map: Dict[str, object] = {}def _do_register(self, name: str, obj: object) -> None:assert (name not in self._obj_map), "An object named '{}' was already registered in '{}' registry!".format(name, self._name)self._obj_map[name] = objdef register(self, obj: object = None) -> Optional[object]:"""Register the given object under the the name `obj.__name__`.Can be used as either a decorator or not. See docstring of this class for usage."""if obj is None:# used as a decoratordef deco(func_or_class: object) -> object:name = func_or_class.__name__  # pyre-ignoreself._do_register(name, func_or_class)return func_or_classreturn deco# used as a function callname = obj.__name__  # pyre-ignoreself._do_register(name, obj)def get(self, name: str) -> object:ret = self._obj_map.get(name)if ret is None:raise KeyError("No object named '{}' found in '{}' registry!".format(name, self._name))return retdef __contains__(self, name: str) -> bool:return name in self._obj_mapdef __repr__(self) -> str:table_headers = ["Names", "Objects"]table = tabulate(self._obj_map.items(), headers=table_headers, tablefmt="fancy_grid")return "Registry of {}:\n".format(self._name) + tabledef __iter__(self) -> Iterator[Tuple[str, object]]:return iter(self._obj_map.items())# pyre-fixme[4]: Attribute must be annotated.__str__ = __repr__

可看出register方法就是通过调用_do_register将函数名称或者类名称,函数地址或者类地址做成一个字典,在通过get方法获取函数或者类功能。

示例代码调用:


from fvcore.common.registry import RegistryBACKBONE_REGISTRY = Registry("BACKBONE")@BACKBONE_REGISTRY.register()
def test_register(cfg):print('==cfg:', cfg)return '==test_register is called'def debug_register():cfg = 'hahahah'print(BACKBONE_REGISTRY.get('test_register'))##返回函数或者类对象res = BACKBONE_REGISTRY.get('test_register')(cfg)#调用函数或者类功能print('==res:', res)if __name__ == '__main__':debug_register()

而对于mmcv:


import mmcvdef build_from_cfg(cfg, registry, default_args=None):args = cfg.copy()print('==cfg:', cfg)print('==registry:', registry)print('==default_args:', default_args)if default_args is not None:for name, value in default_args.items():args.setdefault(name, value)obj_type = args.pop('type')  # 注册 str 类名if isinstance(obj_type, str):# 相当于 self._module_dict[obj_type]obj_cls = registry.get(obj_type)print('==obj_cls:', obj_cls)if obj_cls is None:raise KeyError(f'{obj_type} is not in the {registry.name} registry')# 如果已经实例化了,那就直接返回elif inspect.isclass(obj_type):obj_cls = obj_typeelse:raise TypeError(f'type must be a str or valid type, but got {type(obj_type)}')# 最终初始化对于类,并且返回,就完成了一个类的实例化过程return obj_cls(**args)ANYNAMES = mmcv.Registry('convert')#其实就是将Converter1 和 类实例化做成字典
@ANYNAMES.register_module()
class Converter1(object):def __init__(self, a, b):self.a = aself.b = ba_value = 10
b_value = 20
converter_cfg = dict(type='Converter1', a=a_value, b=b_value)
print('==converter_cfg:', converter_cfg)
converter = build_from_cfg(converter_cfg, ANYNAMES)
print('==converter:', converter)
print('==converter.a:', converter.a)
print('==converter.b:', converter.b)

上述例子就是将Converter1 和 类实例化做成字典,然后再通过build_from_cfg经过get方法获取类功能。

Registry注册机制相关推荐

  1. Python中的Register(注册器)模块,Registry(注册机制)的讲解及示例

    文章目录 前言 为什么使用`Register`或`Registry`? `Register`机制怎么用? 定义`Register` 使用`Register` 使用装饰器注册模块 将Register实例 ...

  2. C#实现软件授权,限定MAC运行(软件license管理,简单软件注册机制)

    一个绿色免安装软件,领导临时要求加个注册机制,不能让现场工程师随意复制.事出突然,只能在现场开发(离开现场软件就不受我们控了).花了不到两个小时实现了简单的注册机制,稍作整理.  基本原理:1.软件一 ...

  3. C#软件license管理(简单软件注册机制)

    最近做了一个绿色免安装软件,领导临时要求加个注册机制,不能让现场工程师随意复制.事出突然,只能在现场开发(离开现场软件就不受我们控了).花了不到两个小时实现了简单的注册机制,稍作整理.         ...

  4. Citrix XenDesktop 中VDA向DDC注册机制解析

    直接切入正题吧,至于什么是VDA?什么是DDC之类的我就不用做过多介绍了. 众所周知用户如果需要使用虚拟桌面,那么必须将虚拟桌面部署在DDC的交付组中并将虚拟桌面交付给用户.而且虚拟桌面在DDC中是已 ...

  5. 【金猿技术展】模块注册机制——打造AI算法流水线

    上海人工智能实验室&商汤科技技术 本项目由上海人工智能实验室&商汤科技投递并参与"数据猿年度金猿策划活动--2021大数据产业创新技术突破榜榜单及奖项"评选. 数据 ...

  6. MIDP2.0引入了Push注册机制

    Push MIDP2.0引入了Push注册机制,作为一种允许应用被自动启动的方法,由预先设置的警告或者经inbound连接收到的消息. 通过这种方法,MIDlets可以用来设置处理规则事件,如定时从服 ...

  7. TensorFlow中的设备管理——Device的创建与注册机制

    背景 [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] 作为一款优秀的异构深度学习算法框架,TensorFlow可以在多种设备上运行算 ...

  8. 软件加密技术和注册机制加密基础(转)

    软件加密技术和注册机制加密基础 本文是一篇软件加密技术的基础性文章,简要介绍了软件加密的一些基本常识和一些加密产品,适用于国内软件开发商或者个人共享软件开发者阅读参考. 1.加密技术概述 一个密码系统 ...

  9. Android逆向移花接木之添加注册机制

    前言 我们知道借助apktool对apk的反编译几乎是无损源码级别的,所以要想在无源码的情况下,让某个软件实现想要的显示或者功能,只需要先写个简单的具有该显示和功能的DEMO,然后将关键的代码镶嵌到目 ...

最新文章

  1. Windows Server 2008与2012建立林信任关系
  2. 点击量终于突破十万大关,以示庆贺,耶!!!
  3. asp.net程序调用NTFS分区下Oracle客户端
  4. BFS简单搜索--POJ 2243
  5. 牛客 XOR和(找规律)
  6. Telephone Wire(POJ-3612)
  7. linux分配权限o w,O-LinuxShell-W14 Linux权限练习(共50分)
  8. iOS语言中的KVO机制
  9. 【MATLAB】基本绘图 ( 绘图基本步骤 | plot 函数 | 多曲线绘制 | hold on / off )
  10. C语言面试题大汇总之华为面试题
  11. Visual studio 2022 常用快捷键
  12. 改变PS1变量的颜色
  13. 16个最佳WordPress登录页面插件
  14. 2010新浪笔试---数据挖掘
  15. esxi 内核 linux,大娃套小娃系列-ESXI虚拟机安装Debian系统实现Docker容器
  16. 在linux中使用vi 打开文件时,能显示行号
  17. 贝叶斯决策理论和概率密度估计方法
  18. javaweb第三版课后答案,干货满满
  19. 【CSS】通过定位修改 display 显示模式 ( Display 显示模式转换 | inline-block 改块元素为行内块元素示例 | 为块元素设置浮动 | 为块元素设置定位 )
  20. 学习笔记 | mac下查看mysql的端口号

热门文章

  1. 校验json格式_格式化展示,校验错误,编辑JSON,这几个JSON工具一定不能错过
  2. 快手搜索技术部招聘NLP算法工程师!
  3. python定时任务,隔月执行,隔定时执行
  4. 从GAN到WGAN到LipschitzGA
  5. Android官方开发文档Training系列课程中文版:OpenGL绘图之环境配置
  6. python - 输出最大/最小的 k 个元素的索引
  7. Java基础:数组的声明,循环,赋值,拷贝。
  8. ansible配置zabbix自动化安装和配置
  9. js 控制页面跳转的5种方法
  10. 你必须搞清楚的String,StringBuilder,StringBuffer