閱讀從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函數。這裏的加載形式與加載數據集相同,不再贅述。