Registry注册机制

前言:不管是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方法获取类功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Volley 库通过网络获取 JSON 数据

本文内容 什么是 Volley 库 Volley 能做什么 Volley 架构 环境 演示 Volley 库通过网络获取 JSON 数据 参考资料 Android 关于网络操作一般都会介绍 HttpClient 以及 HttpConnection 这两个包。前者是 Apache 开源库,后者是 Android 自带 API。企业级应用&#xff0…

python刷题+leetcode(第二部分)

100. 简化路径 思路:栈 class Solution:def simplifyPath(self, path: str) -> str:stack []for path_ in path.split(/):if path_ not in [, ., ..]:stack.append(path_)elif path_ .. and stack:stack.pop()return / /.join(stack) c实现: class Solution { public:s…

这一年,信息技术领域上演的“断舍离”

来源:中国科学报摘要:刚刚踏入2018年,信息技术产业领域就被“熔断”“幽灵”这两个几乎波及全行业的芯片漏洞所笼罩。孰料,该领域接下来上演的剧情——从美国断然发布对中兴通讯的出售禁令,到Uber无人驾驶汽车撞人致死…

利用JasperReport+iReport进行Web报表开发

用JasperReportiReport进行Web报表开发 序言在非常多实际的项目里,报表都是当中十分重要的组成部分,比如把查询结果以报表的形式呈现出来。这里所提到的报表可不是简单的二维表,而是拥有复杂表头的、多维的、能够在执行期从数据库中自己主动读…

AN IMAGE IS WORTH 16X16 WORDS :TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE(VIT)

最近看transformer用于CV比较热门,特意去进行了解,这里用分类的一篇文章进行讲解。 NLP中的transformer和代码讲解参考我另一篇文章。 论文链接:AN IMAGE IS WORTH 16X16 WORDS :TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 一.思想 其…

人工智能领域的未来和挑战

来源:创新研究摘要:人工智能是一门综合了计算机科学、生理学、哲学的交叉学科。凡是使用机器代替人类实现认知、识别、分析、决策等功能,均可认为使用了人工智能技术。作为一种基础技术,人工智能在很多行业都有广泛应用。五道集团…

2018年科技公司融资纪录十大排行榜!中国四家公司上榜

来源:网易智能摘要:国外媒体近日盘点了2018年全球融资最多的十家机器人技术公司,中国有四家公司上榜,包括商汤科技、优必选、京东和依图科技。获得融资并不能保证取得成功,这是机器人行业在2018年学到的艰难的一课。今…

tensorrt基础知识+torch版lenet转c++ trt

官网文档 API文档 Docker镜像 自定义Plugin仓库 0.安装 1.安装tensorrt 从官网下载.deb包,要注意的是cuda版本 sudo dpkg -i nv-tensorrt-repo-ubuntu1604-cuda10.0-trt7.0.0.11-ga-20191216_1-1_amd64.deb sudo apt update sudo apt install tensorrt Engine plan 的兼…

《自然》预测2019年重大科学事件

携带传感器的象海豹将帮助研究人员收集海洋数据,这是研究南极洲思韦茨冰川任务的一部分。来源:科技日报新年的钟声即将响起,在此辞旧迎新之际,除了埋头总结过去一年的得失,回味一下往事的喜乐,也应该抬头展…

python刷题+leetcode(第三部分)

200.最大正方形 思路:与岛屿,水塘不同的是这个相对要规则得多,而不是求连通域,所以动态规划构造出状态转移方程即可 动态规划 if 0, dp[i][j] 0 if 1, dp[i][j] min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])1 class Solution:def maximalSqu…

在ubuntu 12.04 x64下编译hadoop2.4

自己编译hadoop:x64 1.安装依赖包 sudo apt-get install g autoconf automake libtool cmake zlib1g-dev pkg-config libssl-dev openssh-server maven openssh-client 2.下载hadoop源码 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.4.0/hadoop…

中科院脑科学与智能技术卓越创新中心:在“脑海”中突破进取

来源:中国科学报 2017年底,“中中”和“华华”两个可爱的小猴子降临人世,标志着中国率先开启了以体细胞克隆猴作为实验动物模型的新时代。这是继2016年建立食蟹猴自闭症模型后,中科院脑科学与智能技术卓越创新中心再一次取得非人灵…

python(c++)刷题+剑指offer

03. 数组中重复的数字 思路:hash class Solution:def findRepeatNumber(self, nums: List[int]) -> int:dict_ dict()for i in range(len(nums)):if nums[i] in dict_:return nums[i]else:dict_[nums[i]] i class Solution { public:int findRepeatNumber(vector<int…

erlang开发环境配置

第一步 从源码安装erlang git clone https://github.com/erlang/otp 目前最新版本为17.X cd otp/ ./configer 检查编译环境 sudo make & make install 编译并安装 我是在ubuntu 系统下配置的 其余的linux 环境我是直接切换到root用户操作 这样安装需要自己一个一个解决…

美国免费为全世界提供GPS服务,为什么中国还要搞“北斗”?

来源&#xff1a;雷锋网摘要&#xff1a;12月27日&#xff0c;在国务院新闻办公室新闻发布会上&#xff0c;中国卫星导航系统管理办公室主任、北斗卫星导航系统新闻发言人冉承其宣布——北斗三号基本系统完成建设&#xff0c;于今日开始提供全球服务。这标志着北斗系统服务范围…

IDC与百度联合发报告:预测2019年人工智能十大趋势

来源&#xff1a;网络大数据12月20日&#xff0c;国际数据公司(IDC)与百度AI产业研究中心(BACC)联合发布《百度大脑领导力白皮书》&#xff0c;白皮书预测了2019年中国人工智能市场发展趋势&#xff0c;通过实际案例解析人工智能如何从技术到落地&#xff0c;并提出“100天AI部…

链表的一些leetcode题目+python(c++)

主要常见下面几个知识点: 1-1.请编写一个函数&#xff0c;使其可以删除某个链表中给定的&#xff08;非末尾&#xff09;节点&#xff0c;你将只被给定要求被删除的节点。 python: # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # …

暑训day1解题报告

A - Painting the sticks因为不能覆盖涂/涂两次&#xff0c;所以就数数有几个三个一块儿就行了。#include<cstdio> int a[100],ans ; int main() {int n , t 0 ;while (scanf("%d",&n)!EOF) {for (int i1; i<n; i) scanf("%d",ai);ans 0 ; …

2019展望:超级智能崛起,人类智慧与机器智能将深度融合

作者&#xff1a;刘锋 计算机博士 互联网进化论作者摘要&#xff1a;在2019年到来的脚步声中&#xff0c;感觉要写点文字&#xff0c;对2019年的科技趋势进行展望&#xff0c;也算是对2018年思考的总结&#xff0c;这篇展望的文章主要表达经过50年的科技和商业拉动&#xff0c;…

二叉树的一些leetcode题目+python(c++)

二叉树考点主要有: 1.三种遍历方式,以及构造二叉树等&#xff1b; 2.求深度,最长直径&#xff0c;最长路径,公共祖先等等; 3.合并二叉树&#xff0c;翻转二叉树&#xff0c;判断平衡性,对称性等; 4.从前序与中序构造二叉树&#xff0c;中序与后序构造二叉树&#xff0c;二叉…