From e6100eebac413bdd73251f63fe003dc00bd24fcd Mon Sep 17 00:00:00 2001 From: RangeKing Date: Mon, 12 Dec 2022 10:51:03 +0800 Subject: [PATCH 1/4] [Refactor] Refactor dataset metainfo to lowercase. --- .../yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py | 2 +- .../yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py | 4 ++-- demo/image_demo.py | 2 +- docs/en/user_guides/yolov5_tutorial.md | 4 ++-- docs/zh_cn/user_guides/yolov5_tutorial.md | 4 ++-- mmyolo/utils/boxam_utils.py | 12 ++++++------ tools/analysis_tools/dataset_analysis.py | 10 +++++----- 7 files changed, 19 insertions(+), 19 deletions(-) diff --git a/configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py b/configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py index 3793176fd..b70f3c780 100644 --- a/configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py +++ b/configs/yolov5/voc/yolov5_s-v61_fast_1xb64-50e_voc.py @@ -160,7 +160,7 @@ ], # Use ignore_keys to avoid judging metainfo is # not equal in `ConcatDataset`. - ignore_keys='DATASET_TYPE'), + ignore_keys='dataset_type'), collate_fn=dict(type='yolov5_collate')) test_pipeline = [ diff --git a/configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py b/configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py index c1c57b286..529702e20 100644 --- a/configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py +++ b/configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py @@ -6,8 +6,8 @@ train_num_workers = 2 metainfo = { - 'CLASSES': ('balloon', ), - 'PALETTE': [ + 'classes': ('balloon', ), + 'palette': [ (220, 20, 60), ] } diff --git a/demo/image_demo.py b/demo/image_demo.py index 81b41358d..28989bd1b 100644 --- a/demo/image_demo.py +++ b/demo/image_demo.py @@ -71,7 +71,7 @@ def main(): files, source_type = get_file_list(args.img) # get model class name - dataset_classes = model.dataset_meta.get('CLASSES') + dataset_classes = model.dataset_meta.get('classes') # ready for labelme format if it is needed to_label_format = LabelmeFormat(classes=dataset_classes) diff --git a/docs/en/user_guides/yolov5_tutorial.md b/docs/en/user_guides/yolov5_tutorial.md index 492c145db..c225757ff 100644 --- a/docs/en/user_guides/yolov5_tutorial.md +++ b/docs/en/user_guides/yolov5_tutorial.md @@ -53,8 +53,8 @@ train_batch_size_per_gpu = 4 train_num_workers = 2 metainfo = { - 'CLASSES': ('balloon', ), - 'PALETTE': [ + 'classes': ('balloon', ), + 'palette': [ (220, 20, 60), ] } diff --git a/docs/zh_cn/user_guides/yolov5_tutorial.md b/docs/zh_cn/user_guides/yolov5_tutorial.md index 20a24cbd9..200498995 100644 --- a/docs/zh_cn/user_guides/yolov5_tutorial.md +++ b/docs/zh_cn/user_guides/yolov5_tutorial.md @@ -53,8 +53,8 @@ train_batch_size_per_gpu = 4 train_num_workers = 2 metainfo = { - 'CLASSES': ('balloon', ), - 'PALETTE': [ + 'classes': ('balloon', ), + 'palette': [ (220, 20, 60), ] } diff --git a/mmyolo/utils/boxam_utils.py b/mmyolo/utils/boxam_utils.py index 23d7bd3c5..5d5f8278f 100644 --- a/mmyolo/utils/boxam_utils.py +++ b/mmyolo/utils/boxam_utils.py @@ -81,18 +81,18 @@ def init_detector( if 'dataset_meta' in checkpoint_meta: # mmdet 3.x model.dataset_meta = checkpoint_meta['dataset_meta'] - elif 'CLASSES' in checkpoint_meta: + elif 'classes' in checkpoint_meta: # < mmdet 3.x - classes = checkpoint_meta['CLASSES'] - model.dataset_meta = {'CLASSES': classes, 'PALETTE': palette} + classes = checkpoint_meta['classes'] + model.dataset_meta = {'classes': classes, 'palette': palette} else: warnings.simplefilter('once') warnings.warn( 'dataset_meta or class names are not saved in the ' 'checkpoint\'s meta data, use COCO classes by default.') model.dataset_meta = { - 'CLASSES': get_classes('coco'), - 'PALETTE': palette + 'classes': get_classes('coco'), + 'palette': palette } model.cfg = config # save the config in the model for convenience @@ -254,7 +254,7 @@ def __init__(self, if self.is_need_grad: self.cam.activations_and_grads.release() - self.classes = model.detector.dataset_meta['CLASSES'] + self.classes = model.detector.dataset_meta['classes'] self.COLORS = np.random.uniform(0, 255, size=(len(self.classes), 3)) def switch_activations_and_grads(self, model) -> None: diff --git a/tools/analysis_tools/dataset_analysis.py b/tools/analysis_tools/dataset_analysis.py index 6e6668e7a..a1fad78ea 100644 --- a/tools/analysis_tools/dataset_analysis.py +++ b/tools/analysis_tools/dataset_analysis.py @@ -383,7 +383,7 @@ def replace_pipeline_to_none(cfg): # Drawing settings fig_all_set = { 'figsize': [35, 18], - 'fontsize': int(10 - 0.08 * len(dataset.metainfo['CLASSES'])), + 'fontsize': int(10 - 0.08 * len(dataset.metainfo['classes'])), 'xticks_angle': 70, 'out_name': cfg.dataset_type } @@ -396,15 +396,15 @@ def replace_pipeline_to_none(cfg): # Call the category name and save address if args.class_name is None: - classes = dataset.metainfo['CLASSES'] + classes = dataset.metainfo['classes'] classes_idx = [i for i in range(len(classes))] fig_set = fig_all_set - elif args.class_name in dataset.metainfo['CLASSES']: + elif args.class_name in dataset.metainfo['classes']: classes = [args.class_name] - classes_idx = [dataset.metainfo['CLASSES'].index(args.class_name)] + classes_idx = [dataset.metainfo['classes'].index(args.class_name)] fig_set = fig_one_set else: - data_classes = dataset.metainfo['CLASSES'] + data_classes = dataset.metainfo['classes'] show_data_classes(data_classes) raise RuntimeError(f'Expected args.class_name to be one of the list,' f'but got "{args.class_name}"') From cbb91e0fe4f01cfe6ec5ccc73e7d5bf4ad07f1ac Mon Sep 17 00:00:00 2001 From: RangeKing Date: Mon, 12 Dec 2022 16:24:09 +0800 Subject: [PATCH 2/4] Add docs --- docs/en/index.rst | 1 + docs/en/notes/compatibility.md | 11 +++++++++++ docs/zh_cn/index.rst | 1 + docs/zh_cn/notes/compatibility.md | 11 +++++++++++ 4 files changed, 24 insertions(+) create mode 100644 docs/en/notes/compatibility.md create mode 100644 docs/zh_cn/notes/compatibility.md diff --git a/docs/en/index.rst b/docs/en/index.rst index 5082b8427..7e29af975 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -50,6 +50,7 @@ Welcome to MMYOLO's documentation! notes/changelog.md notes/faq.md + notes/compatibility.md .. toctree:: :maxdepth: 2 diff --git a/docs/en/notes/compatibility.md b/docs/en/notes/compatibility.md new file mode 100644 index 000000000..336a0fac9 --- /dev/null +++ b/docs/en/notes/compatibility.md @@ -0,0 +1,11 @@ +# Compatibility of MMYOLO + +## MMYOLO 0.3.0 + +To unify with other OpenMMLab repositories, change all keys of `METAINFO` in Dataset from upper case to lower case. + +| Before v0.3.0 | after v0.3.0 | +| :-----------: | :----------: | +| CLASSES | classes | +| PALETTE | palette | +| DATASET_TYPE | dataset_type | diff --git a/docs/zh_cn/index.rst b/docs/zh_cn/index.rst index 8d3372115..15bcae2a2 100644 --- a/docs/zh_cn/index.rst +++ b/docs/zh_cn/index.rst @@ -56,6 +56,7 @@ notes/faq.md notes/changelog.md + notes/compatibility.md .. toctree:: :maxdepth: 2 diff --git a/docs/zh_cn/notes/compatibility.md b/docs/zh_cn/notes/compatibility.md new file mode 100644 index 000000000..a3ad54d2d --- /dev/null +++ b/docs/zh_cn/notes/compatibility.md @@ -0,0 +1,11 @@ +# MMYOLO 兼容性说明 + +## MMYOLO v0.3.0 + +为了和 OpenMMLab 其他仓库统一,将 Dataset 里 `METAINFO` 的所有键从大写改为小写。 + +| 在 v0.3.0 之前 | v0.3.0 及之后 | +| :------------: | :-----------: | +| CLASSES | classes | +| PALETTE | palette | +| DATASET_TYPE | dataset_type | From 22c5a2f0f200e980de4ba47b4409f38aa67f2bc3 Mon Sep 17 00:00:00 2001 From: RangeKing Date: Mon, 12 Dec 2022 17:52:26 +0800 Subject: [PATCH 3/4] Refactor metainfo to lowercase in new files --- docs/zh_cn/user_guides/custom_dataset.md | 4 ++-- .../custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py | 4 ++-- .../custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/zh_cn/user_guides/custom_dataset.md b/docs/zh_cn/user_guides/custom_dataset.md index 65e08bd14..ce12de5f6 100644 --- a/docs/zh_cn/user_guides/custom_dataset.md +++ b/docs/zh_cn/user_guides/custom_dataset.md @@ -801,8 +801,8 @@ base_lr = _base_.base_lr / 8 class_name = ('cat', ) # 根据 class_with_id.txt 类别信息,设置 class_name num_classes = len(class_name) metainfo = dict( - CLASSES=class_name, - PALETTE=[(220, 20, 60)] # 画图时候的颜色,随便设置即可 + classes=class_name, + palette=[(220, 20, 60)] # 画图时候的颜色,随便设置即可 ) train_cfg = dict( diff --git a/projects/misc/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py b/projects/misc/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py index 757ba225f..ae156d587 100644 --- a/projects/misc/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py +++ b/projects/misc/custom_dataset/yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py @@ -30,8 +30,8 @@ class_name = ('cat', ) # 根据 class_with_id.txt 类别信息,设置 class_name num_classes = len(class_name) metainfo = dict( - CLASSES=class_name, - PALETTE=[(220, 20, 60)] # 画图时候的颜色,随便设置即可 + classes=class_name, + palette=[(220, 20, 60)] # 画图时候的颜色,随便设置即可 ) train_cfg = dict( diff --git a/projects/misc/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py b/projects/misc/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py index b9666dfb0..bd738bdd6 100644 --- a/projects/misc/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py +++ b/projects/misc/custom_dataset/yolov6_s_syncbn_fast_1xb32-100e_cat.py @@ -23,8 +23,8 @@ class_name = ('cat', ) # 根据 class_with_id.txt 类别信息,设置 class_name num_classes = len(class_name) metainfo = dict( - CLASSES=class_name, - PALETTE=[(220, 20, 60)] # 画图时候的颜色,随便设置即可 + classes=class_name, + palette=[(220, 20, 60)] # 画图时候的颜色,随便设置即可 ) train_cfg = dict( From 6611a29e7caebfea1b5903e6cb35b8031ad26f53 Mon Sep 17 00:00:00 2001 From: RangeKing Date: Tue, 27 Dec 2022 20:48:38 +0800 Subject: [PATCH 4/4] Fix dataset meta compatibility --- mmyolo/utils/boxam_utils.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/mmyolo/utils/boxam_utils.py b/mmyolo/utils/boxam_utils.py index 5d5f8278f..a0168b663 100644 --- a/mmyolo/utils/boxam_utils.py +++ b/mmyolo/utils/boxam_utils.py @@ -79,11 +79,14 @@ def init_detector( checkpoint_meta = checkpoint.get('meta', {}) # save the dataset_meta in the model for convenience if 'dataset_meta' in checkpoint_meta: - # mmdet 3.x - model.dataset_meta = checkpoint_meta['dataset_meta'] - elif 'classes' in checkpoint_meta: + # mmdet 3.x, all keys should be lowercase + model.dataset_meta = { + k.lower(): v + for k, v in checkpoint_meta['dataset_meta'].items() + } + elif 'CLASSES' in checkpoint_meta: # < mmdet 3.x - classes = checkpoint_meta['classes'] + classes = checkpoint_meta['CLASSES'] model.dataset_meta = {'classes': classes, 'palette': palette} else: warnings.simplefilter('once')