mmcv之Config类介绍

准备资料

 本系列文章主要介绍mmcv及mmdetection源码解读。因此,建议读者首先在本地装好mmdetection环境。安装教程:mmdet2.8最新版安装教程!


前言

  本篇是mmcv源码解读的Config类介绍。代码地址在mmcv/utils/config.py文件中。


1、FasterRcnn为例

  网上大多数Config类讲解是特别干的代码介绍,缺乏一个具像的例子来深刻理解。因此,本文以mmdetection中的FasterRcnn网络为例来介绍Config类。(当然,Config类还有好多功能)。
 贴下FasterRcnn的配置文件mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py):

_base_ = [
    '../_base_/models/faster_rcnn_r50_fpn.py',
    '../_base_/datasets/coco_detection.py',
    '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py'
]

  上述配置文件中,_base_是个长度为4的list:模型,数据集,优化器,训练方式。这里说下Config类作用:“将配置文件中的字段转成字典的形式”。举个简单例子:以coco_detection.py部分文件字段为例:

dataset_type = 'CocoDataset'
data_root = 'data/coco/'
img_norm_cfg = dict(
    mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)

 感性上来说:就是将 上述 “=”左边的视为字典的key;“=”右边的内容视为value。我把其成为“等号规则”。最终经过Config类返回的就是一个实例化的cfg对象,用_cfg_dict初始化Config类,变成一个属性。实际上_cfg_dict依旧是一个字典。
在这里插入图片描述

2、实现流程

 从第一部分可以看出:Config类实际上完成两部分工作:
 (1)将配置文件按照“等号规则“将配置文件的内容放入一个字典_cfg_dict。
 (2)用字典_cfg_dict完成Config类的初始化,使其成为Config类的一个属性。
  因此,对于第一部分工作实际上属于Config类的一个公用方法。因此,可以用Python中的静态方法 @staticmethod完成。第二部分则直接init类即可。接下来我会用两部分分别介绍。流程见下图:

在这里插入图片描述

2.1. 配置文件转入字典(_file2dict函数)

 从faster_rcnn的配置文件中看出:其实一个以 _base_字段开头的列表。而列表中元素是四个路径。因此,函数程序需要遍历4个路径,然后添加进一个字典中。函数整体逻辑如下(用ppt画的,见谅~):
在这里插入图片描述
 整体逻辑厘清之后,看代码就容易多了。我这里仅贴部分核心的(很多细节我也看不懂,大佬写的太牛了)。

    @staticmethod
    def _file2dict(filename, use_predefined_variables=True):
        filename = osp.abspath(osp.expanduser(filename))      # filename: py文件的绝对路径
                # 将file转入一个字典
                cfg_dict = {
                    name: value
                    for name, value in mod.__dict__.items()
                    if not name.startswith('__')
                }
        if BASE_KEY in cfg_dict:   # 判断是否有_base_字段
            base_filename = cfg_dict.pop(BASE_KEY)      # base_filename = ['../_base_/models/faster_rcnn_r50_fpn.py','../_base_/datasets/coco_detection.py','','']
            cfg_dict_list = list()                      # 存储最终结果
            cfg_text_list = list()
            for f in base_filename:
                _cfg_dict, _cfg_text = Config._file2dict(osp.join(cfg_dir, f))  # 遍历递归调用file2path
                cfg_dict_list.append(_cfg_dict)
                cfg_text_list.append(_cfg_text)
            # 遍历结束后,cfg_dict_list=[{},{},{},{}] , cfg_text_list = ['','','',''] 里面存储的是 四个配置文件中内容
            base_cfg_dict = dict()
            for c in cfg_dict_list:
                if len(base_cfg_dict.keys() & c.keys()) > 0:
                    raise KeyError('Duplicate key is not allowed among bases')
                base_cfg_dict.update(c)
        return cfg_dict, cfg_text

 大致应该没问题。比较容易理解。

2.2. Config类初始化

 2.1得到了cfg_dict,然后就可以用其完成初始化了。

   def __init__(self, cfg_dict=None, cfg_text=None, filename=None):
        super(Config, self).__setattr__('_cfg_dict', ConfigDict(cfg_dict))# Config类设置一个_cfg_dict属性,并将cfg_dict实例为ConfigDict类。
        super(Config, self).__setattr__('_filename', filename)            # Config类设置一个_filename属性。
        super(Config, self).__setattr__('_text', text)                    # Config在添加一个'_text'属性
    def __setattr__(self, name, value):
        if isinstance(value, dict):
            value = ConfigDict(value)
        self._cfg_dict.__setattr__(name, value)

  代码中重写了__setattr__方法。简单就是将cfg_dict变成了一个ConfigDict类。实质还是一个字典,只不过重写了__getattr__方法,在根据key索引时加入了一些逻辑判断(keyerror啥的),这里将其依旧理解成一个普通字典就行。

class ConfigDict(Dict):

    def __missing__(self, name):
        raise KeyError(name)

    def __getattr__(self, name):
        try:
            value = super(ConfigDict, self).__getattr__(name)
        except KeyError:
            ex = AttributeError(f"'{self.__class__.__name__}' object has no "
                                f"attribute '{name}'")
        except Exception as e:
            ex = e
        else:
            return value
        raise ex

总结

 本篇主要介绍的是Config类的设计理念把。实际上Config类还有好多方法,比如_merge_a_to_b等。不过都逃不过那两部分:根据等号规则将字段变成dict,然后利用dict初始化Config类。
 若有问题欢迎+vx:wulele2541612007,拉你进群探讨交流。

  • 11
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: mmcv config是一个用于管理深度学习模型配置文件的工具。它是开源项目MMCV(OpenMMLab Computer Vision Foundation)中的一个重要组件。 在深度学习中,模型的配置是一项非常关键的工作。通常一个深度学习模型包含了很多超参数和配置选项,这些参数和选项的设置会直接影响到模型的性能和训练结果。而mmcv config就是为了更好地管理和调整这些配置而设计的。 mmcv config采用了Python语言来编写配置文件。它提供了一个统一的配置语法和结构,让用户可以方便地定义和修改模型的各种参数和选项。使用mmcv config,用户只需要简单地编辑一个Python,就可以完成对模型配置的定义。 mmcv config还提供了一系列的配置选项和默认值,可以大大简化模型配置的工作。用户只需要根据自己的需求修改相关的参数和选项,就可以快速地完成一个基础模型的配置。此外,mmcv config还支持继承和覆盖,用户可以基于已有的配置文件,灵活地建立自己的配置文件。 使用mmcv config,用户可以更加高效地管理和调整模型的参数和选项。这不仅有助于快速开发和迭代模型,也方便了模型的复现和共享。同时,mmcv config还提供了丰富的文档和示例,帮助用户更好地理解和使用这个工具。 总而言之,mmcv config是一个强大而灵活的深度学习模型配置工具,它提供了统一的配置语法和结构,简化了模型配置的工作,帮助用户更高效地管理和调整模型参数和选项。 ### 回答2: mmcv config是一个用于配置模型和训练过程的工具包。它是开源计算机视觉框架mmdetection中的重要组成部分。mmcv config提供了一种灵活而简洁的方式来定义模型架构、数据增强、优化器设置等,并且可以通过配置文件轻松修改这些设置。 通过mmcv config,我们可以通过简单地修改一个或多个配置文件来实现不同的训练和测试设置。例如,我们可以轻松地更改模型的深度和宽度,调整训练周期和学习率,选择适合的数据增强策略等。 mmcv config使用了Python的配置文件格式,通过嵌套的字典和列表来定义各种模型和训练参数的设置。配置文件包括了多个部分,如模型、数据集、训练器和优化器等。 使用mmcv config的过程很简单。首先,我们需要创建一个配置文件,并根据需求修改其中的参数。然后,我们可以使用mmcv的工具函数来加载配置文件。加载后的配置文件可以作为训练或测试的输入,以实现我们定义的模型和训练设置。 mmcv config的优势之一是它的可扩展性和灵活性。我们可以根据需要添加自定义模型、损失函数、数据增强策略等,并用它们来扩展现有的配置文件。此外,mmcv config还可以与其他计算机视觉库和工具无缝集成,如PyTorch、TensorFlow等。 总之,mmcv config是一个强大的用于配置模型和训练过程的工具包。它提供了简单易用的接口,使得配置和修改模型变得更加方便和高效。使用mmcv config,我们可以轻松地定制符合自己需求的计算机视觉模型。 ### 回答3: mmcv config是一个用于配置和管理深度学习模型的库。mmcv是开源的,并且被广泛用于各种计算机视觉领域的项目中。 mmcv config提供了一个灵活的配置文件格式,以便用户可以方便地定义和调整模型的各种参数。通过配置文件,用户可以定义模型的结构、损失函数、优化器、学习率策略等等。这使得用户能够轻松地根据需要进行模型调整和实验。 使用mmcv config进行模型配置有以下几个主要步骤: 1. 创建一个配置文件:用户需要创建一个新的配置文件,以便定义模型的各个参数。配置文件可以使用YAML格式,这样它既易于阅读又易于书写。 2. 定义模型结构:在配置文件中,用户可以指定模型的结构,定义层、卷积核大小、激活函数等等。 3. 配置数据预处理:配置文件还可以定义数据预处理的方法,比如数据增强、归一化、裁剪等等。这些预处理方法将在训练和推理过程中应用到输入数据上。 4. 设定超参数:用户可以在配置文件中设定模型的超参数,比如学习率、训练轮数、batch size等等。这些超参数会影响模型的训练和性能。 5. 运行训练或推理代码:一旦配置文件准备好,用户可以将其传递给mmcv库中的相应函数,从而开始训练或推理过程。 总的来说,mmcv config是一个强大的工具,使得模型配置变得简单和可维护。它支持各种常见的模型和任务,如目标检测、图像分割和姿态估计等等。无论是学术界还是工业界,mmcv config都是一个不可或缺的工具,用于快速构建和调整深度学习模型。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值