阅读mmdetection代码

喜夏-厌秋 提交于 2020-01-07 21:45:43

阅读从tools/train.py开始。

功能模块

  1. Register
    位置:utils/registry.py
    用于注册起到相同作用的(例如coco/voc数据类、模型类、数据处理流程类)类别。具体功能是这样的。
    Register__init__加载了两个属性,分别是name,module_dict.
    Register有两个主要功能函数,分别是register_module,get.
    假设我们要生成一个实例,用于注册一些数据集类。我们记这个实例为DATASET.DATASET=Register('dataset'),也就是name属性为dataset。通过使用register_module函数能够向module_dict中添加模块。例如我们可以向该实例中添加coco,voc。则module_dict={‘coco’:coco_class,'voc':voc_class}
    在mmdetection里,主要通过@修饰符的方法来使用这个类。例如在coco.py文件中首先加载DATASET实例,在coco类定义时添加@DATASETS.register_module,则coco类别被注册到DATASET实例中去了。
  2. build_from_cfg函数
    位置:utils/registry.py
    输入:cfg, registry, default_args=None
    其中cfg是字典类型,一般为config文件的一部分内容;registryRegister类的一个实例。该函数主要使用registryget功能,来得到cfg所指定的模型或数据集所对应的类(事先registry已经加载过了),然后将default_args作为该类的参数进行输出。

数据集加载

  1. tain中的build_dataset用于加载数据集类(如coco、voc等)。首先调用了datasets/builder.pybuild_dataset函数。在调用datasets/builder.py时,在import时对coco、voc、pipelines等都通过Register类进行了注册。 build_dataset函数则调用了build_from_cfg函数。
  2. 以voc数据集为例讲一下数据集类的实现。
    # 类的构成
    torch.utils.data.Dataset -> CustomDataset -> XMLDataset -> VOCDataset
    
    查看torch.utils.data.Dataset的代码,其中提到,所有基于Dataset的类,都必须实现__getitem__方法,该方法根据给定的key能够给出相应的数据。那么在CustomDataset类中,可以看到该方法的实现:
        def __getitem__(self, idx):
            if self.test_mode:
                return self.prepare_test_img(idx)
            while True:
                data = self.prepare_train_img(idx)
                if data is None:
                    idx = self._rand_another(idx)
                    continue
                return data
    
    XMLDataset中实现了两个函数,分别是load_annotations,get_ann_info,用于读取xml内容。VOCDataset中增加了self.year属性。

模型加载
build_detector用于加载模型,调用了models/builder.py中的build_detector函数。这里的加载形式与加载数据集相同,不再赘述。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!