当前位置:网站首页>mmcv之Registry类解读
mmcv之Registry类解读
2022-06-10 16:53:00 【武乐乐~】
前言
本文主要介绍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,拉你进群探讨交流。
边栏推荐
- Thread interview related questions
- Web3最全搞钱秘籍,看这一篇就够了
- 期货账户资金安全吗?
- Web3 is the most complete money making secret script. Just read this one
- Fabric. JSON for JS compact output
- 【报表工具的第二次革命】基于SPL语言优化报表结构、提升报表运算性能
- C# 根据EXCEL自动生成oracle建表语句
- Snabbdom 虚拟 dom(一)
- Fabric. Keep the original level when JS element is selected
- The children in the deep mountains are seeing the stars farther away
猜你喜欢

Only three steps are needed to learn how to use low code thingjs to connect with Sen data Dix data

Take you to a preliminary understanding of the basic mechanism of classes and objects

基于PHP+Web+Mysql的在线问卷调查系统

How will you integrate into the $20trillion "project economy" in five years

See how advanced technology changes human life

丢失的遗传力--Missing heritability

线上交流丨技能网络:解决多任务多模态问题的稀疏模型(青源Talk第19期 唐都钰)

Numpy np set_ Usage of printoptions () -- control output mode

Numpy numpy中np.set_printoptions()的用法——控制输出方式

大山深处的孩子,正在看见更远的星空
随机推荐
二十多年了,安全套市场还只有杜蕾斯、冈本、杰士邦
Redis通用指令
[play with Huawei cloud] Kunpeng devkit migration practice
淘宝短视频避坑指南系列之一--彻底了解淘宝短视频
Gateway服务网关
品牌难立,IPO难行,中国茶企困于“传统”?
Importerror: libgl. so. 1: cannot open shared object file: no such file or directory
Photoshop如何打开、编辑和导出Webp格式图片的方法
Chongqing's first sci tech Innovation Board IPO is coming
树、森林和二叉树的关系
SVN中的回退操作
Nacos注册中心
mapbox-gl开发教程(十一):加载线图层
Nacos配置管理
Gateway service gateway
IIS安装 部署网站
Designing drugs with code: are we here yet?
【抬杠C#】如何实现接口的base调用
训练时添加进度条的库--tqdm
Online communication skill network: a sparse model for solving multi task and multi-modal problems (Qingyuan talk, issue 19, tangduyu)