mmcv之Registry类解读


前言

 本文主要介绍mmcv的Registry类。建议读者先配置下mmcv环境:mmcv源码安装。我相信读者大多数对于Registry类有点儿迷,主要涉及python中装饰器的知识。因此,本文尽量做到面面俱到,会简要介绍一部分装饰器的用法。

1、Registry作用

 Registry类可以简单理解为一个字典,举个例子,在mmdetection中,比如说创建了名为dataset的注册器对象,则注册器dataset中包含(CocoDataset类,VOCDataset类,Lvis类);同理,detector注册器对象中包含(FasterRcnn类,SSD类,YOLO类等)。因此,Registry对象完全可以理解为一个字典,里面存储着同系列的类

2、源码分析

 Registry虽说是一个字典,但是得实现增删改查的功能。即往字典中添加新的类;即查询字典中是否有这个类。那么在Registry类中如何实现这些功能呢?

2.1.初始化部分

class Registry:
    """A registry to map strings to classes.

    Args:
        name (str): Registry name.
    """

    def __init__(self, name):
        self._name = name
        self._module_dict = dict()

    def __len__(self):
        return len(self._module_dict)

    def __contains__(self, key):
        return self.get(key) is not None

    def __repr__(self):
        format_str = self.__class__.__name__ + \
                     f'(name={self._name}, ' \
                     f'items={self._module_dict})'
        return format_str

 这部分比较简单,就是传入了一个name并内部定义了一个self._module_dict字典

2.2.查

 查找self._module_dict存在一个某个类 实现也比较简单:

    def get(self, key):
        return self._module_dict.get(key, None)

 主要借助get方法,若有key则返回对应的value;若无key则返回None。

2.3.增

 增的方法mmdetection中提供了两种方式,区别是方法_register_module()是否指定了module参数:
在这里插入图片描述

 该函数主要往self._module_dict中添加。注意,往字典里面添加的是类。以下代码包含了上图中两种方式。这里我截取了核心代码:

    def _register_module(self, module_class, module_name=None, force=False):

        if module_name is None:
            module_name = module_class.__name__
        if isinstance(module_name, str):
            module_name = [module_name]
            
        self._module_dict[name] = module_class

    def register_module(self, name=None, force=False, module=None):
		# 若指定module,则执行if语句,执行完后完成module类添加
        if module is not None:
            self._register_module(
                module_class=module, module_name=name, force=force)
            return module

        # 若没有指定module,则执行_register函数。
        def _register(cls):
            self._register_module(
                module_class=cls, module_name=name, force=force)
            return cls

        return _register

 我将分两小节来介绍这两种方式。

2.3.1 指定module参数

  现在我们想往字典self._module_dict字典中添加新类。最容易想到方法就是下面这样:

if __name__ == '__main__':
    backbones = Registry('backbone')
    class MobileNet:
        pass
    backbones.register_module(module=MobileNet)
    print(backbones)

 即直接指定参数module=MobileNet。内部通过self._module_dict[name]=module_class完成注册。

2.3.2 不指定module参数

 上节提供方法完全可以,但是在利用mmdetection拓展新模型的时候,如果每次创建完一个类之后,然后通过上述方法注册,着实不方便。势必会影响mmdetection拓展性。而装饰器可以很方便给类拓展新功能,装饰器有机会我会单独出一篇文章,
 这里简单记住装饰器用法:funB = funA(funB),即被装饰函数funB,经过装饰器funA的装饰,中间可能发生了一些其他事情,最终funA的return funB。
 首先看用法:比如我想注册ResNet。

if __name__ == '__main__':
    backbones = Registry('backbone')
    @backbones.register_module()
    class ResNet:
        pass
    print(backbones)

 这里内部实质上经过了下面函数:

        def _register(cls):
            self._register_module(
                module_class=cls, module_name=name, force=force)
            return cls

在这个过程中,funB相当于cls。而_register函数相当于funA。中间往self._module_dict字典中注册了类cls。然后return cls。即funB

总结

 本文主要介绍了Registry类的增查功能。若有问题欢迎+vx:wulele2541612007,拉你进群探讨交流。

  • 22
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: Registry指的是镜像仓库,也叫镜像注册表,它是存储和管理Docker镜像的地方。镜像仓库充当了一个集中存储和分发镜像的中心服务器。镜像仓库可以存在于本地或云端,可以被公开访问,也可以设为私有,只能被权限控制的用户访问。 Docker镜像仓库通常使用Registry作为默认名称。这个概念可以比为一个代码库,而镜像就相当于代码。在Registry中,用户可以上传、下载、搜索和分享Docker镜像。Registry还提供了对镜像的版本控制、权限管理等功能,使得Docker镜像的使用更加便捷和安全。 而Registry mirrors是一种加速Registry访问速度的解决方案。由于镜像仓库可能位于国外服务器,距离较远,因此拉取镜像速度可能较慢。为了解决这个问题,使用Registry mirrors可以将镜像仓库的内容镜像到本地或者其他地理位置较近的服务器上,从而提高访问速度。 Registry mirrors可以分为公共和私有两种型。公共的Registry mirrors由Docker官方或其他第三方提供,用户可以直接使用,只需要在配置中指定镜像地址即可。私有的Registry mirrors则是企业或个人自行搭建的,可以更好地适应本地环境和需求。 总的来说,Registry是存储和管理Docker镜像的地方,而Registry mirrors则是为了加速访问Registry而设立的镜像服务器。使用Registry mirrors可以提高拉取镜像的速度和性能。 ### 回答2: Registry是指存储和管理docker镜像的资源库,它允许用户上传、下载和管理docker镜像。Docker官方提供了一个公共的Registry,也叫做Docker Hub,用户可以在其中找到各种各样的镜像供使用。 Registry mirrors是指从Registry复制(镜像化)到另外一台或者多台机器上的镜像资源库,目的是为了提供更快的下载速度和更好的可靠性。Registry mirrors通常位于不同的地理区域,提供了更快的响应时间和更好的网络连接。它们通过进行同步复制来保持与Registry的一致性,并确保用户能够根据其位置更快地获取所需的镜像。 使用Registry mirrors的好处是: 1. 提高下载速度:当用户从Registry镜像下载时,它可以从最近和最快的镜像服务器下载,而不需要从远程的Registry下载,从而加快下载速度。 2. 改善可靠性:如果Registry不可用,用户仍然可以从Registry mirrors获取所需的镜像。 3. 增加可访问性:Registry mirrors通常位于不同的地理区域,用户可以根据自己的位置选择最近的镜像服务器,从而提高访问速度和可用性。 要使用Registry mirrors,用户需要在Docker配置文件中指定所需的镜像地址,Docker会自动从相应的镜像服务器获取镜像。用户还可以根据需要添加多个Registry mirrors,确保高速下载和高可靠性。 总之,Registry是存储和管理docker镜像的资源库,而Registry mirrors是为了提供更快的下载速度和更好的可靠性而将Registry镜像化的镜像资源库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值