mirror of https://github.com/open-mmlab/mmcv.git
201 lines
4.4 KiB
Markdown
201 lines
4.4 KiB
Markdown
## Config
|
|
|
|
`Config` class is used for manipulating config and config files. It supports
|
|
loading configs from multiple file formats including **python**, **json** and **yaml**.
|
|
It provides dict-like apis to get and set values.
|
|
|
|
Here is an example of the config file `test.py`.
|
|
|
|
```python
|
|
a = 1
|
|
b = dict(b1=[0, 1, 2], b2=None)
|
|
c = (1, 2)
|
|
d = 'string'
|
|
```
|
|
|
|
To load and use configs
|
|
|
|
```python
|
|
>>> cfg = Config.fromfile('test.py')
|
|
>>> print(cfg)
|
|
>>> dict(a=1,
|
|
... b=dict(b1=[0, 1, 2], b2=None),
|
|
... c=(1, 2),
|
|
... d='string')
|
|
```
|
|
|
|
For all format configs, some predefined variables are supported. It will convert the variable in `{{ var }}` with its real value.
|
|
|
|
Currently, it supports four predefined variables:
|
|
|
|
`{{ fileDirname }}` - the current opened file's dirname, e.g. /home/your-username/your-project/folder
|
|
|
|
`{{ fileBasename }}` - the current opened file's basename, e.g. file.ext
|
|
|
|
`{{ fileBasenameNoExtension }}` - the current opened file's basename with no file extension, e.g. file
|
|
|
|
`{{ fileExtname }}` - the current opened file's extension, e.g. .ext
|
|
|
|
These variable names are referred from [VS Code](https://code.visualstudio.com/docs/editor/variables-reference).
|
|
|
|
Here is one examples of config with predefined variables.
|
|
|
|
`config_a.py`
|
|
|
|
```python
|
|
a = 1
|
|
b = './work_dir/{{ fileBasenameNoExtension }}'
|
|
c = '{{ fileExtname }}'
|
|
```
|
|
|
|
```python
|
|
>>> cfg = Config.fromfile('./config_a.py')
|
|
>>> print(cfg)
|
|
>>> dict(a=1,
|
|
... b='./work_dir/config_a',
|
|
... c='.py')
|
|
```
|
|
|
|
For all format configs, inheritance is supported. To reuse fields in other config files,
|
|
specify `_base_='./config_a.py'` or a list of configs `_base_=['./config_a.py', './config_b.py']`.
|
|
Here are 4 examples of config inheritance.
|
|
|
|
`config_a.py`
|
|
|
|
```python
|
|
a = 1
|
|
b = dict(b1=[0, 1, 2], b2=None)
|
|
```
|
|
|
|
### Inherit from base config without overlapped keys
|
|
|
|
`config_b.py`
|
|
|
|
```python
|
|
_base_ = './config_a.py'
|
|
c = (1, 2)
|
|
d = 'string'
|
|
```
|
|
|
|
```python
|
|
>>> cfg = Config.fromfile('./config_b.py')
|
|
>>> print(cfg)
|
|
>>> dict(a=1,
|
|
... b=dict(b1=[0, 1, 2], b2=None),
|
|
... c=(1, 2),
|
|
... d='string')
|
|
```
|
|
|
|
New fields in `config_b.py` are combined with old fields in `config_a.py`
|
|
|
|
### Inherit from base config with overlapped keys
|
|
|
|
`config_c.py`
|
|
|
|
```python
|
|
_base_ = './config_a.py'
|
|
b = dict(b2=1)
|
|
c = (1, 2)
|
|
```
|
|
|
|
```python
|
|
>>> cfg = Config.fromfile('./config_c.py')
|
|
>>> print(cfg)
|
|
>>> dict(a=1,
|
|
... b=dict(b1=[0, 1, 2], b2=1),
|
|
... c=(1, 2))
|
|
```
|
|
|
|
`b.b2=None` in `config_a` is replaced with `b.b2=1` in `config_c.py`.
|
|
|
|
### Inherit from base config with ignored fields
|
|
|
|
`config_d.py`
|
|
|
|
```python
|
|
_base_ = './config_a.py'
|
|
b = dict(_delete_=True, b2=None, b3=0.1)
|
|
c = (1, 2)
|
|
```
|
|
|
|
```python
|
|
>>> cfg = Config.fromfile('./config_d.py')
|
|
>>> print(cfg)
|
|
>>> dict(a=1,
|
|
... b=dict(b2=None, b3=0.1),
|
|
... c=(1, 2))
|
|
```
|
|
|
|
You may also set `_delete_=True` to ignore some fields in base configs. All old keys `b1, b2, b3` in `b` are replaced with new keys `b2, b3`.
|
|
|
|
### Inherit from multiple base configs (the base configs should not contain the same keys)
|
|
|
|
`config_e.py`
|
|
|
|
```python
|
|
c = (1, 2)
|
|
d = 'string'
|
|
```
|
|
|
|
`config_f.py`
|
|
|
|
```python
|
|
_base_ = ['./config_a.py', './config_e.py']
|
|
```
|
|
|
|
```python
|
|
>>> cfg = Config.fromfile('./config_f.py')
|
|
>>> print(cfg)
|
|
>>> dict(a=1,
|
|
... b=dict(b1=[0, 1, 2], b2=None),
|
|
... c=(1, 2),
|
|
... d='string')
|
|
```
|
|
|
|
### Reference variables from base
|
|
|
|
You can reference variables defined in base using the following grammar.
|
|
|
|
`base.py`
|
|
|
|
```python
|
|
item1 = 'a'
|
|
item2 = dict(item3 = 'b')
|
|
```
|
|
|
|
`config_g.py`
|
|
|
|
```python
|
|
_base_ = ['./base.py']
|
|
item = dict(a = {{ _base_.item1 }}, b = {{ _base_.item2.item3 }})
|
|
```
|
|
|
|
```python
|
|
>>> cfg = Config.fromfile('./config_g.py')
|
|
>>> print(cfg.pretty_text)
|
|
item1 = 'a'
|
|
item2 = dict(item3='b')
|
|
item = dict(a='a', b='b')
|
|
```
|
|
|
|
### Add deprecation information in configs
|
|
|
|
Deprecation information can be added in a config file, which will trigger a `UserWarning` when this config file is loaded.
|
|
|
|
`deprecated_cfg.py`
|
|
|
|
```python
|
|
_base_ = 'expected_cfg.py'
|
|
|
|
_deprecation_ = dict(
|
|
expected = 'expected_cfg.py', # optional to show expected config path in the warning information
|
|
reference = 'url to related PR' # optional to show reference link in the warning information
|
|
)
|
|
```
|
|
|
|
```python
|
|
>>> cfg = Config.fromfile('./deprecated_cfg.py')
|
|
|
|
UserWarning: The config file deprecated.py will be deprecated in the future. Please use expected_cfg.py instead. More information can be found at https://github.com/open-mmlab/mmcv/pull/1275
|
|
```
|