【mmdetection实践】(四)datasets和model的构建过程

一直不理解mmdetection中datasets和model的构建过程,今天我们就详细看一下。这里拿test.py中的代码举例。datasets和model的构建过程其实是非常类似的,先详细解释datasets的构建过程,然后类比model的构建过程。

dataset的构建过程

要理解dataset的构建过程,必须搞清楚mmdetection是怎么把各种搞在一起的,有了统一的数据接口。这里,先看全局变量DATASETS,这个变量的定义如下,DATASETS看名字就是一个注册表。

注册表DATASETS

# mmdetection/mmdet/datasets/registry.py
from mmdet.utils import Registry
DATASETS = Registry('dataset')
PIPELINES = Registry('pipeline')

那么我们就需要了解一下Registry这个类:可以从下面代码看到Registry包括一个储存所有信息的self._module_dict,和一个注册函数register_module。

# mmdetection/mmdet/utils/registry.py
class Registry(object):
    def __init__(self, name):
        self._name = name
        self._module_dict = dict()
        
    def register_module(self, cls=None, force=False):

打开mmdetection/mmdet/datasets中的任意一个数据集的定义,这里以coco.py为例,可以看到,在定义CocoDataset时,用@DATASETS.register_module修饰了,这个具体过程可以看上面的register_module函数的代码,简单来说就是完成了把对应关系{‘CocoDataset’:CocoDataset}加入到了DATASETS._module_dict字典中了。

# mmdetection/mmdet/datasets/coco.py
@DATASETS.register_module
class CocoDataset(CustomDataset):

就重复这样,就把datasets文件夹下的所有类型的数据集的类型都加入到了DATASETS下了,DATASET[‘CocoDataset’]的类型就是CocoDataset这个类了。

看一下datasets这个包的__init__.py,就可以看到,一旦import这个包中任意一个文件,就会实例化DATASETS这个注册表,而且把所有的类都注册进去。

构建过程

了解了统一的接口,那么就开始从test.py中看dataset是如何构建的:

# tools/test.py
dataset = build_dataset(cfg.data.test)

然后再看build_dataset,这里会到从build_from_cfg,就是我们dataset的属性都定义在了config中。

# mmdetection/mmdet/datasets/builder.py
def build_dataset(cfg, default_args=None):
    ...
    dataset = build_from_cfg(cfg, DATASETS, default_args)

然后再看build_from_cfg,这个函数是datasets,model通用的

# mmdetection/mmdet/utils/registry.py
def build_from_cfg(cfg, registry, default_args=None):
    ...
    args = cfg.copy()
    obj_type = args.pop('type')
    if mmcv.is_str(obj_type):
        obj_cls = registry.get(obj_type)  # 将cfg中cfg中的'CocoDataset'变成CocoDataset这个类赋值给obj_cls
        ...
    ...
    return obj_cls(**args)  # 实例化CocoDataset并返回,一路返回给test.py中的dataset

model的构建过程

model的构建过程是一样的,也是构建一些注册表,只不过由于一个model是由backbone,head等构成,所以要构建一大堆注册表。

# mmdetection/mmdet/models/registry.py
from mmdet.utils import Registry
BACKBONES = Registry('backbone')
NECKS = Registry('neck')
ROI_EXTRACTORS = Registry('roi_extractor')
SHARED_HEADS = Registry('shared_head')
HEADS = Registry('head')
LOSSES = Registry('loss')
DETECTORS = Registry('detector')

具体的model的构建过程与dataset一样,都是通过build_from_cfg,然后先实例化backbone,head等,然后再组成model。

猜你喜欢

转载自blog.csdn.net/wqwqqwqw1231/article/details/104401529