阅读从tools/train.py
开始。
功能模块
-
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
实例中去了。
-
build_from_cfg
函数
位置:utils/registry.py
输入:cfg, registry, default_args=None
其中cfg
是字典类型,一般为config文件的一部分内容;registry
是Register
类的一个实例。该函数主要使用registry
的get
功能,来得到cfg所指定的模型或数据集所对应的类(事先registry
已经加载过了),然后将default_args作为该类的参数进行输出。
数据集加载
- tain中的
build_dataset
用于加载数据集类(如coco、voc等)。首先调用了datasets/builder.py
中build_dataset
函数。在调用datasets/builder.py
时,在import时对coco、voc、pipelines等都通过Register
类进行了注册。 build_dataset
函数则调用了build_from_cfg
函数。
- 以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函数。这里的加载形式与加载数据集相同,不再赘述。