builder.py 1.57 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

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


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
28
    if isinstance(cfg, list):
Kai Chen's avatar
Kai Chen committed
29
        modules = [_build_module(cfg_, registry, default_args) for cfg_ in cfg]
Kai Chen's avatar
Kai Chen committed
30
31
        return nn.Sequential(*modules)
    else:
Kai Chen's avatar
Kai Chen committed
32
        return _build_module(cfg, registry, default_args)
Kai Chen's avatar
Kai Chen committed
33
34
35


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


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


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


myownskyW7's avatar
myownskyW7 committed
47
48
49
50
def build_shared_head(cfg):
    return build(cfg, SHARED_HEADS)


Kai Chen's avatar
Kai Chen committed
51
52
def build_head(cfg):
    return build(cfg, HEADS)
Kai Chen's avatar
Kai Chen committed
53
54
55


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