mmdetection源碼閱讀

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

發佈了18 篇原創文章 · 獲贊 16 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章