阅读从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 -> VOCDatasettorch.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 dataXMLDataset中实现了两个函数,分别是load_annotations,get_ann_info,用于读取xml内容。VOCDataset中增加了self.year属性。
模型加载build_detector用于加载模型,调用了models/builder.py中的build_detector函数。这里的加载形式与加载数据集相同,不再赘述。
来源:CSDN
作者:开心的火龙果
链接:https://blog.csdn.net/weixin_40683960/article/details/103770087