Registry注册机制

2023-05-16

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

首先看Registry代码:

# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved

from typing import Dict, Optional, Iterable, Tuple, Iterator

from tabulate import tabulate


class Registry(Iterable[Tuple[str, object]]):
    """
    The registry that provides name -> object mapping, to support third-party
    users' custom modules.

    To create a registry (e.g. a backbone registry):

    .. code-block:: python

        BACKBONE_REGISTRY = Registry('BACKBONE')

    To register an object:

    .. code-block:: python

        @BACKBONE_REGISTRY.register()
        class MyBackbone():
            ...

    Or:

    .. code-block:: python

        BACKBONE_REGISTRY.register(MyBackbone)
    """

    def __init__(self, name: str) -> None:
        """
        Args:
            name (str): the name of this registry
        """
        self._name: str = name
        self._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] = obj

    def 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 decorator
            def deco(func_or_class: object) -> object:
                name = func_or_class.__name__  # pyre-ignore
                self._do_register(name, func_or_class)
                return func_or_class

            return deco

        # used as a function call
        name = obj.__name__  # pyre-ignore
        self._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 ret

    def __contains__(self, name: str) -> bool:
        return name in self._obj_map

    def __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) + table

    def __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 Registry

BACKBONE_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 mmcv

def 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_type
    else:
        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 = a
        self.b = b


a_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方法获取类功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Registry注册机制 的相关文章

  • 如果没有管理员权限,您可以获得哪些注册表访问权限?

    我知道我们不应该再使用注册表来存储应用程序数据 但是在更新旧版应用程序 并希望进行最少的更改 时 非管理员可以使用哪些注册表配置单元 我可以访问所有HKEY CURRENT USER 应用程序当前访问HKEY LOCAL MACHINE 没
  • 遍历注册表子文件夹

    我想获取注册表路径的所有值 包括其子文件夹的值 现在我通过以下方式读取单个文件夹的值 const HKEY LOCAL MACHINE H80000002 strComputer Set oReg GetObject winmgmts im
  • 在 C# 中以编程方式添加没有管理员权限的文件关联

    其他人也问过类似的问题 但我想澄清一下 我想在安装时构建我的应用程序而不需要管理权限 对于文件关联 我知道我需要在注册表中写入 但到目前为止我在 stackoverflow 文章中找到了两个不同的位置 HKEY CURRENT USER S
  • 使用 C# .net 挂载其他用户 hive

    我正在编写一个应用程序 它将为每个选定的用户写入一些注册表项 我想知道是否有正确的方法来安装另一个用户的配置单元以在其中写入 目前 我正在使用 REG LOAD 来安装每个配置单元 它很实用 但很混乱 任何想法 预先感谢您的回答 Cheer
  • 通过Java获取Windows文件关联

    我以为这会是一件容易的事 但是 我希望我的 Java 程序能够获取用户的 Windows 文件关联 换句话说 我想知道用户使用什么来打开 txt文件 cvs文件等 assoc 和 ftype 命令提供该信息 但不提供给用户 换句话说 如果我
  • 从 PowerShell 调用 Windows Shell 函数?

    所以我正在遵循这个教程 https msdn microsoft com en us library windows desktop hh127427 v vs 85 aspx https msdn microsoft com en us
  • 使用 Process、RegistryKey 将 .NET Framework 代码移植到 .NET Standard

    我有一个来自现有 NET Framework 项目的方法 该方法从注册表获取 Windows 中默认浏览器的路径 并使用Process call string browser RegistryKey regKey null try regK
  • 无法为 32 位 HKLM 设置注册表插入

    我想在 Inno setup 中创建一个带有子菜单项的上下文菜单 问题是 它在 64 位注册表 WoW6432Node 部分插入 HKLM 密钥 The 文档 http www jrsoftware org ishelp index php
  • 在 C++ 中从 HKEY 句柄确定注册表项的路径

    给定 Windows 注册表项的句柄 例如由 RegOpenKeyEx 设置的句柄 是否可以确定该注册表项的完整路径 我意识到在一个简单的应用程序中 您所要做的就是查找 5 或 10 行并阅读 但是在像我正在调试的复杂应用程序中 我感兴趣的
  • HKEY_CURRENT_USER\Software\Wow6432Node\Classes 与 HKEY_CURRENT_USER\Software\Classes\Wow6432Node

    问题很简单 HKEY CURRENT USER Software Wow6432Node Classes 和 HKEY CURRENT USER Software Classes Wow6432Node 有什么区别 有点晚了 但我走了 科林
  • 读取所有注册表值的快速方法

    我正在编写一个实用程序 需要创建 HKCR 中所有注册表值的列表 我使用递归函数来执行此操作 var list new Dictionary
  • 如何在 C# 注册表类中使用 REG_OPTION_OPEN_LINK

    我想打开一个符号链接的注册表项 据微软称 https learn microsoft com en us windows win32 api winreg nf winreg regopenkeyexw parameters我需要使用REG
  • 编辑注册表值

    我想更改 PocketPC 上的注册表值 我运行了以下代码 if enabled dwData 120 if RegSetValueEx HKEY LOCAL MACHINE T System CurrentControlSet Contr
  • 如何从 64 位 .NET 应用程序打开 WOW64 注册表项

    我的 NET 应用程序 任何 CPU 需要读取 32 位程序创建的注册表值 在 64 位 Windows 上 它位于注册表中的 Wow6432Node 项下 我读到您不应该对 Wow6432Node 进行硬编码 那么使用 NET 访问它的正
  • 如何向 Visual Studio 2017 或 Visual Studio 2019 注册“自定义工具”以使其正常工作?

    背景 我们有一个定制工具 https msdn microsoft com en us library bb166817 aspx它接受 xml 输入并生成 cs 输出 自定义工具需要注册 https learn microsoft com
  • delphi中枚举注册表子项

    我试图根据服务器上安装的 MySQL 版本在客户端计算机上安装驱动程序 为此我想通过注册表项检查服务器上的版本 也就是说 我需要枚举的子项HKEY LOCAL MACHINE SOFTWARE MySQL AB 该键下通常只有一个键 其形式
  • 如何获取 DLL 或 EXE 的文件描述

    我正在创建一个程序 其中之一是控制服务 我正在尝试以类似于中列出的方式列出服务msconfig 下面第一个窗口 我找到了注册表中列出的服务的位置 在 Vista 和 Win7 中 DisplayName 和 Description 通常是引
  • Python - 检查用户是否具有管理员权限

    我正在用 Python 3 x 编写一个小程序作为自学项目 我的想法是让程序允许用户输入两个文本字段 然后将用户的输入插入到两个特定注册表项的值中 有没有一种简单的方法来检查当前用户是否可以访问注册表 我宁愿它清楚地告诉用户他 她需要管理员
  • 在文件夹的上下文菜单中运行批处理文件

    当我右键单击任何文件夹时 我想运行此批处理文件 setenv cmd echo off SET CPLUS INCLUDE PATH C mingw32 include C mingw32 lib gcc mingw32 4 9 2 inc
  • 如何“安装”自定义 Windows 驱动程序?

    我计划用 C 语言编写一个基本的 Windows 注册表过滤器 该过滤器的目的是挂钩所有 用户和内核特权 注册表调用 以便我可以在我的程序中使用它们 我基本上是复制 Mark Rusinovich 的 regmon 进程监视器 但更基本 我

随机推荐

  • Delphi 回调函数及例子

    Delphi回调函数 1 回调函数的概述 回调函数是这样一种机制 xff1a 调用者在初始化一个对象 xff08 这里的对象是泛指 xff0c 包括OOP中的对象 全局函数等 xff09 时 xff0c 将一些参数传递给对象 xff0c 同
  • 解决Window10连接共享目录 登录失败:未知的用户名或错误密码 的解决方法

    关于未知的用户名或错误密码 win10共享这个很多人还不知道 xff0c 今天菲菲来为大家解答以上的问题 xff0c 现在让我们一起来看看吧 xff01 1 按 Win 43 R 运行 执行 窗口 xff0c 输入 gpedit msc 命
  • 教您电脑电源短接哪两根线风扇转

    如果哦我们没有接电脑主板 xff0c 如何让电脑电源风扇转动 我们只有通过电脑电源线的短接来解决这个问题 xff0c 但是电脑电源线哪两跟线使风扇转动呢 一起跟小编来看看吧 电脑电源短接哪两根线风扇转 xff1a 1 电脑电源本身是一个供电
  • 编译PX4固件

    PX4编译 文章目录 PX4编译疑难杂症bug1bug2catkin build isolated 官方脚本Step1Step2 安装常用依赖Step3 创建并运行脚本Step4 补全代码子模块Step5 验证仿真 官方offboard 例
  • ubuntu18.04安装mavros并读取pixhawk飞控数据

    Mavros源码安装 最新mavros详细安装教程 xff08 亲测可行 xff09 启动mavros 上述步骤完成后 xff0c 启动px4 launch roslaunch mavros px4 launch 此时rostopic li
  • 相机标定:相机模型和畸变模型

    一 相机标定方案 相机内参标定是确定内参和畸变参数 equidistqant畸变模型 或者 radial tangential模型 的过程 本文首先介绍SLAM中常用的相机模型和畸变模型 xff0c 随后介绍我们采用的两种内参标定方案 xf
  • 新手入门Docker之Windows下如何使用Docker

    Docker是什么 xff1f Docker 将应用程序与该程序的依赖 xff0c 打包在一个文件里面 运行这个文件 xff0c 就会生成一个虚拟容器 程序在这个虚拟容器里运行 xff0c 就好像在真实的物理机上运行一样 有了 Docker
  • C/C++服务器开发常见面试题(一)

    C C 43 43 服务器开发常见面试题 转自 xff1a LinuxC C 43 43 服务器开发面试题 一 编程语言 1 根据熟悉的语言 xff0c 谈谈两种语言的区别 xff1f 主要浅谈下C C 43 43 和JAVA语言的区别 1
  • Realsense D455/435内参标定以及手眼标定

    相机的内外参 内参数 与相机自身特性有关的参数 xff0c 焦距 xff0c 像素大小外参数 xff0c 相机的位置 xff0c 旋转方向 为什么要内参标定 理想情况下 xff0c 镜头会将一个三维空间中的直线也映射成直线 xff08 即射
  • 最新Ubuntu20.04安装指南(防踩坑版)

    文章目录 最新Ubuntu20 04安装 配置指南 防踩坑版 一 备份 1 Windows系统镜像 2 个人资料 3 一些杂项 二 启动盘UEFI引导1 启动盘制作2 设置以U盘方式启动 三 Ubuntu安装 最新Ubuntu20 04安装
  • 18.Python爬虫之Scrapy框架

    scrapy 框架 01 Scrapy 链接02 Scrapy 的爬虫流程03 Scrapy入门04 setting py文件中的常用设置4 1 logging模块的使用4 2 61 61 scrapy项目中的setting py常用配置内
  • 树莓派上手实战之SSH下配置VNC服务器实现远程桌面(可以实现开机自启动vncserver)

    VNC是linux下面常用的远程桌面 xff0c 用它可以在windows或者unix主机上方便的通过网络操作远程主机而不需要一个额外的显示器 xff0c 非常实用 这篇教程将会详细讲解安装配置VNC服务器开启远程桌面服务的全部过程 首先
  • N2N(docker方式安装)实现远程访问家里群晖

    N2N xff08 docker 安装 xff09 实现远程访问家里群晖 前言部署阿里云ECS安装n2n supernode 及 edge 节点在黑群晖上安装 edge节点windows 安装edge节点 测试遇到的问题检查tun模块状态测
  • 深入浅出话事件(下)

    深入浅出话事件 xff08 下 xff09 二 xff0e 事件的由来 在传统的面向对象的概念中是没有 事件 这个概念的 传统的面向对象概念中只有数据 xff08 Data xff0c 也称为 field 域 成员变量 xff09 和方法
  • 凤凰涅槃

    涅槃 xff0c 涅槃 xff0c 太阳般灿烂 xff0c 黑色的凤凰飞入烈火 xff0c 一切腐朽烧干 涅槃 xff0c 涅槃 xff0c 大海般坦然 xff0c 红色的凤凰浴火重生 xff0c 一切希望复燃 涅槃 xff0c 涅槃 xf
  • 转:make cmake和catkin_make的区别

    程序在cmake编译是这样的流程 cmake指令依据你的CMakeLists txt 文件 生成makefiles文件 make再依据此makefiles文件编译链接生成可执行文件 catkin make是将cmake与make的编译方式做
  • 前端开发踩坑-npm install 时报错---持续更新

    1 npm ERR fatal unable to access https github com adobe webplatform eve git Failed to connect to github com port 443 Ope
  • μC/OS II 任务调度详解(一)

    UC OS II 是一个多任务操作系统 xff0c 从宏观角度来看 xff0c 当前系统中可以有多个任务同时运行 xff1b 但从微观角度来看 xff0c 某一个时刻只能有一个任务处于运行状态 xff08 单CPU情况 xff0c 事实上在
  • IMU参数详解

    1 加速度计 1 1Full Scale Range 1 指加速度计能测量到的正反方向最大加速度的额定值范围 常见有 xff08 2g 4g 8g 16g up to 400g 2 地球重力加速度为1g 61 9 8m s 2 16g 61
  • Registry注册机制

    前言 不管是Detectron还是mmdetection xff0c 都有用到这个register机制 xff0c 特意去弄明白 xff0c 记录一下 首先看Registry代码 Copyright c Facebook Inc and i