builder.py 1.46 KB
Newer Older
Kai Chen's avatar
Kai Chen committed
1
import mmcv
Kai Chen's avatar
Kai Chen committed
2
3
from torch import nn

Kai Chen's avatar
Kai Chen committed
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from .registry import BACKBONES, NECKS, ROI_EXTRACTORS, HEADS, DETECTORS


def _build_module(cfg, registry, default_args):
    assert isinstance(cfg, dict) and 'type' in cfg
    assert isinstance(default_args, dict) or default_args is None
    args = cfg.copy()
    obj_type = args.pop('type')
    if mmcv.is_str(obj_type):
        if obj_type not in registry.module_dict:
            raise KeyError('{} is not in the {} registry'.format(
                obj_type, registry.name))
        obj_type = registry.module_dict[obj_type]
    elif not isinstance(obj_type, type):
        raise TypeError('type must be a str or valid type, but got {}'.format(
            type(obj_type)))
    if default_args is not None:
        for name, value in default_args.items():
            args.setdefault(name, value)
    return obj_type(**args)


def build(cfg, registry, default_args=None):
Kai Chen's avatar
Kai Chen committed
27
    if isinstance(cfg, list):
Kai Chen's avatar
Kai Chen committed
28
        modules = [_build_module(cfg_, registry, default_args) for cfg_ in cfg]
Kai Chen's avatar
Kai Chen committed
29
30
        return nn.Sequential(*modules)
    else:
Kai Chen's avatar
Kai Chen committed
31
        return _build_module(cfg, registry, default_args)
Kai Chen's avatar
Kai Chen committed
32
33
34


def build_backbone(cfg):
Kai Chen's avatar
Kai Chen committed
35
    return build(cfg, BACKBONES)
Kai Chen's avatar
Kai Chen committed
36
37
38


def build_neck(cfg):
Kai Chen's avatar
Kai Chen committed
39
    return build(cfg, NECKS)
Kai Chen's avatar
Kai Chen committed
40
41
42


def build_roi_extractor(cfg):
Kai Chen's avatar
Kai Chen committed
43
    return build(cfg, ROI_EXTRACTORS)
Kai Chen's avatar
Kai Chen committed
44
45


Kai Chen's avatar
Kai Chen committed
46
47
def build_head(cfg):
    return build(cfg, HEADS)
Kai Chen's avatar
Kai Chen committed
48
49
50


def build_detector(cfg, train_cfg=None, test_cfg=None):
Kai Chen's avatar
Kai Chen committed
51
    return build(cfg, DETECTORS, dict(train_cfg=train_cfg, test_cfg=test_cfg))