diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..151e8173546e20f6f29678034dad00b69c999778 --- /dev/null +++ b/.gitignore @@ -0,0 +1,179 @@ +data +work_dirs + +# Created by https://www.toptal.com/developers/gitignore/api/python +# Edit at https://www.toptal.com/developers/gitignore?templates=python + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +### Python Patch ### +# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration +poetry.toml + +# ruff +.ruff_cache/ + +# LSP config files +pyrightconfig.json + +# End of https://www.toptal.com/developers/gitignore/api/python diff --git a/configs/_base_/datasets/cifar100_bs16.py b/configs/_base_/datasets/cifar100_bs16.py new file mode 100644 index 0000000000000000000000000000000000000000..3744ac6d2fa391b77254769f6e8416bf74838338 --- /dev/null +++ b/configs/_base_/datasets/cifar100_bs16.py @@ -0,0 +1,45 @@ +# dataset settings +dataset_type = 'CIFAR100' +data_preprocessor = dict( + num_classes=100, + # RGB format normalization parameters + mean=[129.304, 124.070, 112.434], + std=[68.170, 65.392, 70.418], + # loaded images are already RGB format + to_rgb=False) + +train_pipeline = [ + dict(type='RandomCrop', crop_size=32, padding=4), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=16, + num_workers=2, + dataset=dict( + type=dataset_type, + data_prefix='data/cifar100', + test_mode=False, + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=16, + num_workers=2, + dataset=dict( + type=dataset_type, + data_prefix='data/cifar100/', + test_mode=True, + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, )) + +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/cifar10_bs16.py b/configs/_base_/datasets/cifar10_bs16.py new file mode 100644 index 0000000000000000000000000000000000000000..8d8023e76e3f88325043dd3a06a37cbe6dc193cc --- /dev/null +++ b/configs/_base_/datasets/cifar10_bs16.py @@ -0,0 +1,45 @@ +# dataset settings +dataset_type = 'CIFAR10' +data_preprocessor = dict( + num_classes=10, + # RGB format normalization parameters + mean=[125.307, 122.961, 113.8575], + std=[51.5865, 50.847, 51.255], + # loaded images are already RGB format + to_rgb=False) + +train_pipeline = [ + dict(type='RandomCrop', crop_size=32, padding=4), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=16, + num_workers=2, + dataset=dict( + type=dataset_type, + data_prefix='data/cifar10', + test_mode=False, + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=16, + num_workers=2, + dataset=dict( + type=dataset_type, + data_prefix='data/cifar10/', + test_mode=True, + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, )) + +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/cub_bs8_384.py b/configs/_base_/datasets/cub_bs8_384.py new file mode 100644 index 0000000000000000000000000000000000000000..15f8e15fd35a59ca30e7f551a42f2204a10c51ad --- /dev/null +++ b/configs/_base_/datasets/cub_bs8_384.py @@ -0,0 +1,51 @@ +# dataset settings +dataset_type = 'CUB' +data_preprocessor = dict( + num_classes=200, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=510), + dict(type='RandomCrop', crop_size=384), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=510), + dict(type='CenterCrop', crop_size=384), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=8, + num_workers=2, + dataset=dict( + type=dataset_type, + data_root='data/CUB_200_2011', + test_mode=False, + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=8, + num_workers=2, + dataset=dict( + type=dataset_type, + data_root='data/CUB_200_2011', + test_mode=True, + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, )) + +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/cub_bs8_448.py b/configs/_base_/datasets/cub_bs8_448.py new file mode 100644 index 0000000000000000000000000000000000000000..9ff335bf12af8cebff49ca23968f6e54bd56e15d --- /dev/null +++ b/configs/_base_/datasets/cub_bs8_448.py @@ -0,0 +1,50 @@ +# dataset settings +dataset_type = 'CUB' +data_preprocessor = dict( + num_classes=200, + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=600), + dict(type='RandomCrop', crop_size=448), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=600), + dict(type='CenterCrop', crop_size=448), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=8, + num_workers=2, + dataset=dict( + type=dataset_type, + data_root='data/CUB_200_2011', + test_mode=False, + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=8, + num_workers=2, + dataset=dict( + type=dataset_type, + data_root='data/CUB_200_2011', + test_mode=True, + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, )) + +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/fungi_bs16_swin_384.py b/configs/_base_/datasets/fungi_bs16_swin_384.py new file mode 100644 index 0000000000000000000000000000000000000000..a71417839dc652087e10f3f39fcece79033987bd --- /dev/null +++ b/configs/_base_/datasets/fungi_bs16_swin_384.py @@ -0,0 +1,93 @@ +_base_ = ['./pipelines/rand_aug.py'] + +# dataset settings +dataset_type = 'Fungi' +data_preprocessor = dict( + num_classes=1604, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFileFungi'), + dict( + type='RandomResizedCrop', + scale=384, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=bgr_mean, + fill_std=bgr_std), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFileFungi'), + dict( + type='ResizeEdge', + scale=438, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=384), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=16, + num_workers=8, + dataset=dict( + type=dataset_type, + data_root='data/fungi2023/', + ann_file='FungiCLEF2023_train_metadata_PRODUCTION.csv', + data_prefix='DF20/', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=64, + num_workers=8, + dataset=dict( + type=dataset_type, + data_root='data/fungi2023/', + ann_file='FungiCLEF2023_val_metadata_PRODUCTION.csv', + data_prefix='DF21/', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='SingleLabelMetric', items=['precision', 'recall', 'f1-score']) + +test_dataloader = dict( + batch_size=64, + num_workers=8, + dataset=dict( + type=dataset_type, + data_root='data/fungi2023/', + ann_file='FungiCLEF2023_val_metadata_PRODUCTION.csv', + data_prefix='DF21/', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/fungi_bs16_swin_384_class-balanced.py b/configs/_base_/datasets/fungi_bs16_swin_384_class-balanced.py new file mode 100644 index 0000000000000000000000000000000000000000..ff3b91446dd561ddd3ad14f324873120fe664450 --- /dev/null +++ b/configs/_base_/datasets/fungi_bs16_swin_384_class-balanced.py @@ -0,0 +1,96 @@ +_base_ = ['./pipelines/rand_aug.py'] + +# dataset settings +dataset_type = 'Fungi' +data_preprocessor = dict( + num_classes=1604, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFileFungi'), + dict( + type='RandomResizedCrop', + scale=384, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=bgr_mean, + fill_std=bgr_std), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFileFungi'), + dict( + type='ResizeEdge', + scale=438, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=384), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=16, + num_workers=8, + dataset=dict( + type='ClassBalancedDataset', + oversample_thr=1e-2, + dataset=dict( + type=dataset_type, + data_root='data/fungi2023/', + ann_file='FungiCLEF2023_train_metadata_PRODUCTION.csv', + data_prefix='DF20/', + pipeline=train_pipeline)), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=64, + num_workers=8, + dataset=dict( + type=dataset_type, + data_root='data/fungi2023/', + ann_file='FungiCLEF2023_val_metadata_PRODUCTION.csv', + data_prefix='DF21/', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='SingleLabelMetric', items=['precision', 'recall', 'f1-score']) + +test_dataloader = dict( + batch_size=64, + num_workers=8, + dataset=dict( + type=dataset_type, + data_root='data/fungi2023/', + ann_file='FungiCLEF2023_val_metadata_PRODUCTION.csv', + data_prefix='DF21/', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet21k_bs128.py b/configs/_base_/datasets/imagenet21k_bs128.py new file mode 100644 index 0000000000000000000000000000000000000000..1a727ff4d6fd8f5c6e79971b5f6d4433906fdf8e --- /dev/null +++ b/configs/_base_/datasets/imagenet21k_bs128.py @@ -0,0 +1,53 @@ +# dataset settings +dataset_type = 'ImageNet21k' +data_preprocessor = dict( + num_classes=21842, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', scale=224), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='ResizeEdge', scale=256, edge='short'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=128, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet21k', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=128, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet21k', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs128_mbv3.py b/configs/_base_/datasets/imagenet_bs128_mbv3.py new file mode 100644 index 0000000000000000000000000000000000000000..abc67b0b0382c631ee7a0f8d2b9db0bc2c1f9a8b --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs128_mbv3.py @@ -0,0 +1,68 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', scale=224, backend='pillow'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='AutoAugment', + policies='imagenet', + hparams=dict(pad_val=[round(x) for x in bgr_mean])), + dict( + type='RandomErasing', + erase_prob=0.2, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=bgr_mean, + fill_std=bgr_std), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='ResizeEdge', scale=256, edge='short', backend='pillow'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=128, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=128, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs128_poolformer_medium_224.py b/configs/_base_/datasets/imagenet_bs128_poolformer_medium_224.py new file mode 100644 index 0000000000000000000000000000000000000000..05afae4fb5c65364020e828600b9fcfa5cc25bdb --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs128_poolformer_medium_224.py @@ -0,0 +1,82 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=bgr_mean, + fill_std=bgr_std), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=236, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=128, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=128, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs128_poolformer_small_224.py b/configs/_base_/datasets/imagenet_bs128_poolformer_small_224.py new file mode 100644 index 0000000000000000000000000000000000000000..8a4b63d758022b670c4f597756c44bc417b91418 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs128_poolformer_small_224.py @@ -0,0 +1,82 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=bgr_mean, + fill_std=bgr_std), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=248, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=128, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=128, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs128_revvit_224.py b/configs/_base_/datasets/imagenet_bs128_revvit_224.py new file mode 100644 index 0000000000000000000000000000000000000000..1b5ad7c88d877cd91f2974a4e08026d8adb695ab --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs128_revvit_224.py @@ -0,0 +1,85 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=7, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict(type='ColorJitter', brightness=0.4, contrast=0.4, saturation=0.4), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', # should be 'pixel', but currently not supported + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=bgr_mean, + fill_std=bgr_std), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=256, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=256, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), + persistent_workers=True, +) + +val_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), + persistent_workers=True, +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs128_riformer_medium_384.py b/configs/_base_/datasets/imagenet_bs128_riformer_medium_384.py new file mode 100644 index 0000000000000000000000000000000000000000..0263ad24f8e4368c0c8cc835eb9677470bb3c0bf --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs128_riformer_medium_384.py @@ -0,0 +1,82 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=384, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=bgr_mean, + fill_std=bgr_std), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=404, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=384), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=128, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=16, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs128_riformer_small_384.py b/configs/_base_/datasets/imagenet_bs128_riformer_small_384.py new file mode 100644 index 0000000000000000000000000000000000000000..564012467c07c2413237b30a813ce3f4755b7b10 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs128_riformer_small_384.py @@ -0,0 +1,82 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=384, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=bgr_mean, + fill_std=bgr_std), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=426, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=384), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=128, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=32, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs128_vig_224.py b/configs/_base_/datasets/imagenet_bs128_vig_224.py new file mode 100644 index 0000000000000000000000000000000000000000..2633778266713514db08909f06e06fc5057a6916 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs128_vig_224.py @@ -0,0 +1,82 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[127.5, 127.5, 127.5], + std=[127.5, 127.5, 127.5], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=bgr_mean, + fill_std=bgr_std), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=248, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=128, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=128, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs16_eva_196.py b/configs/_base_/datasets/imagenet_bs16_eva_196.py new file mode 100644 index 0000000000000000000000000000000000000000..f5be7c5a8bce8c49a38cf2cfea15d796e5f706d5 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs16_eva_196.py @@ -0,0 +1,62 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[0.48145466 * 255, 0.4578275 * 255, 0.40821073 * 255], + std=[0.26862954 * 255, 0.26130258 * 255, 0.27577711 * 255], + # convert image from BGR to RGB + to_rgb=True, +) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=196, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=196, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=196), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=16, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=16, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs16_eva_336.py b/configs/_base_/datasets/imagenet_bs16_eva_336.py new file mode 100644 index 0000000000000000000000000000000000000000..5e2a9cff2494368357ff8213b4712f74fe9a0676 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs16_eva_336.py @@ -0,0 +1,62 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[0.48145466 * 255, 0.4578275 * 255, 0.40821073 * 255], + std=[0.26862954 * 255, 0.26130258 * 255, 0.27577711 * 255], + # convert image from BGR to RGB + to_rgb=True, +) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=336, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=336, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=336), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=16, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=16, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs16_eva_560.py b/configs/_base_/datasets/imagenet_bs16_eva_560.py new file mode 100644 index 0000000000000000000000000000000000000000..c324e2418a0cbabeb37520f42653d9e2f7fafc0b --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs16_eva_560.py @@ -0,0 +1,62 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[0.48145466 * 255, 0.4578275 * 255, 0.40821073 * 255], + std=[0.26862954 * 255, 0.26130258 * 255, 0.27577711 * 255], + # convert image from BGR to RGB + to_rgb=True, +) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=560, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=560, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=560), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=16, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=16, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs16_pil_bicubic_384.py b/configs/_base_/datasets/imagenet_bs16_pil_bicubic_384.py new file mode 100644 index 0000000000000000000000000000000000000000..e3f6775f09a023203ffdfe736acd7af17baef12e --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs16_pil_bicubic_384.py @@ -0,0 +1,55 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=384, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=384, backend='pillow', interpolation='bicubic'), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=16, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=16, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs256_beitv2.py b/configs/_base_/datasets/imagenet_bs256_beitv2.py new file mode 100644 index 0000000000000000000000000000000000000000..ec914f8d335651fe85cfbc4742d3396b145476da --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs256_beitv2.py @@ -0,0 +1,48 @@ +# dataset settings +dataset_type = 'ImageNet' +data_root = 'data/imagenet/' +data_preprocessor = dict( + type='TwoNormDataPreprocessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + second_mean=[127.5, 127.5, 127.5], + second_std=[127.5, 127.5, 127.5], + to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ColorJitter', + brightness=0.4, + contrast=0.4, + saturation=0.4, + hue=0.), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandomResizedCropAndInterpolationWithTwoPic', + size=224, + second_size=224, + interpolation='bicubic', + second_interpolation='bicubic', + scale=(0.2, 1.0)), + dict( + type='BEiTMaskGenerator', + input_size=(14, 14), + num_masking_patches=75, + max_num_patches=75, + min_num_patches=16), + dict(type='PackInputs') +] + +train_dataloader = dict( + batch_size=256, + num_workers=8, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=True), + collate_fn=dict(type='default_collate'), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='meta/train.txt', + data_prefix=dict(img_path='train/'), + pipeline=train_pipeline)) diff --git a/configs/_base_/datasets/imagenet_bs256_davit_224.py b/configs/_base_/datasets/imagenet_bs256_davit_224.py new file mode 100644 index 0000000000000000000000000000000000000000..b35fc9dae863add8cb31421f73e9a01ab89cbd02 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs256_davit_224.py @@ -0,0 +1,82 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=bgr_mean, + fill_std=bgr_std), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=236, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs256_levit_224.py b/configs/_base_/datasets/imagenet_bs256_levit_224.py new file mode 100644 index 0000000000000000000000000000000000000000..d030e7a536756804b8d626df07399eba49c7051b --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs256_levit_224.py @@ -0,0 +1,82 @@ +dataset_type = 'ImageNet' + +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=bgr_mean, + fill_std=bgr_std), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=256, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=256, + num_workers=4, + dataset=dict( + type=dataset_type, + data_root=r'E:\imagenet', + ann_file='meta/val.txt', + data_prefix='ILSVRC2012_img_val', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=256, + num_workers=4, + dataset=dict( + type=dataset_type, + data_root=r'E:\imagenet', + ann_file='meta/val.txt', + data_prefix='ILSVRC2012_img_val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs256_rsb_a12.py b/configs/_base_/datasets/imagenet_bs256_rsb_a12.py new file mode 100644 index 0000000000000000000000000000000000000000..8a6f50f75574af9eef2869089f5da59f0b43f177 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs256_rsb_a12.py @@ -0,0 +1,74 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=7, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=236, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs') +] + +train_dataloader = dict( + batch_size=256, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=256, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs256_rsb_a3.py b/configs/_base_/datasets/imagenet_bs256_rsb_a3.py new file mode 100644 index 0000000000000000000000000000000000000000..1979b837169f07ce7f53335ffde8d4dd7c12c477 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs256_rsb_a3.py @@ -0,0 +1,74 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=6, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=236, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs') +] + +train_dataloader = dict( + batch_size=256, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=256, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs256_simmim_192.py b/configs/_base_/datasets/imagenet_bs256_simmim_192.py new file mode 100644 index 0000000000000000000000000000000000000000..be87e12ad1aa9c478f6c8f3bdd39f8214abf00a5 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs256_simmim_192.py @@ -0,0 +1,34 @@ +# dataset settings +dataset_type = 'ImageNet' +data_root = 'data/imagenet/' +data_preprocessor = dict( + type='SelfSupDataPreprocessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', scale=192, crop_ratio_range=(0.67, 1.0)), + dict(type='RandomFlip', prob=0.5), + dict( + type='SimMIMMaskGenerator', + input_size=192, + mask_patch_size=32, + model_patch_size=4, + mask_ratio=0.6), + dict(type='PackInputs') +] + +train_dataloader = dict( + batch_size=256, + num_workers=8, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=True), + collate_fn=dict(type='default_collate'), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='meta/train.txt', + data_prefix=dict(img_path='train/'), + pipeline=train_pipeline)) diff --git a/configs/_base_/datasets/imagenet_bs256_swin_192.py b/configs/_base_/datasets/imagenet_bs256_swin_192.py new file mode 100644 index 0000000000000000000000000000000000000000..a29a344f52676c526deab92d412fdc649f6eae3c --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs256_swin_192.py @@ -0,0 +1,83 @@ +# dataset settings +dataset_type = 'ImageNet' +data_root = 'data/imagenet/' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=192, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict(pad_val=[104, 116, 124], interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=[103.53, 116.28, 123.675], + fill_std=[57.375, 57.12, 58.395]), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=219, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=192), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=256, + num_workers=8, + collate_fn=dict(type='default_collate'), + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), +) + +val_dataloader = dict( + batch_size=64, + num_workers=5, + collate_fn=dict(type='default_collate'), + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs32.py b/configs/_base_/datasets/imagenet_bs32.py new file mode 100644 index 0000000000000000000000000000000000000000..40bc2ee126a604ca30702b73870a679691b68803 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs32.py @@ -0,0 +1,53 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', scale=224), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='ResizeEdge', scale=256, edge='short'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=32, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=32, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs32_byol.py b/configs/_base_/datasets/imagenet_bs32_byol.py new file mode 100644 index 0000000000000000000000000000000000000000..d5c18f5a903d525c4670519d1673622b7fc65960 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs32_byol.py @@ -0,0 +1,90 @@ +# dataset settings +dataset_type = 'ImageNet' +data_root = 'data/imagenet/' +data_preprocessor = dict( + type='SelfSupDataPreprocessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True) + +view_pipeline1 = [ + dict( + type='RandomResizedCrop', + scale=224, + interpolation='bicubic', + backend='pillow'), + dict(type='RandomFlip', prob=0.5), + dict( + type='RandomApply', + transforms=[ + dict( + type='ColorJitter', + brightness=0.4, + contrast=0.4, + saturation=0.2, + hue=0.1) + ], + prob=0.8), + dict( + type='RandomGrayscale', + prob=0.2, + keep_channels=True, + channel_weights=(0.114, 0.587, 0.2989)), + dict( + type='GaussianBlur', + magnitude_range=(0.1, 2.0), + magnitude_std='inf', + prob=1.), + dict(type='Solarize', thr=128, prob=0.), +] +view_pipeline2 = [ + dict( + type='RandomResizedCrop', + scale=224, + interpolation='bicubic', + backend='pillow'), + dict(type='RandomFlip', prob=0.5), + dict( + type='RandomApply', + transforms=[ + dict( + type='ColorJitter', + brightness=0.4, + contrast=0.4, + saturation=0.2, + hue=0.1) + ], + prob=0.8), + dict( + type='RandomGrayscale', + prob=0.2, + keep_channels=True, + channel_weights=(0.114, 0.587, 0.2989)), + dict( + type='GaussianBlur', + magnitude_range=(0.1, 2.0), + magnitude_std='inf', + prob=0.1), + dict(type='Solarize', thr=128, prob=0.2) +] +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiView', + num_views=[1, 1], + transforms=[view_pipeline1, view_pipeline2]), + dict(type='PackInputs') +] + +train_dataloader = dict( + batch_size=32, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=True), + collate_fn=dict(type='default_collate'), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='meta/train.txt', + data_prefix=dict(img_path='train/'), + pipeline=train_pipeline)) diff --git a/configs/_base_/datasets/imagenet_bs32_mocov2.py b/configs/_base_/datasets/imagenet_bs32_mocov2.py new file mode 100644 index 0000000000000000000000000000000000000000..ef048039334d7ce03a54ae7ebd7457556854aeac --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs32_mocov2.py @@ -0,0 +1,59 @@ +# dataset settings +dataset_type = 'ImageNet' +data_root = 'data/imagenet/' +data_preprocessor = dict( + type='SelfSupDataPreprocessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True) + +# The difference between mocov2 and mocov1 is the transforms in the pipeline +view_pipeline = [ + dict( + type='RandomResizedCrop', + scale=224, + crop_ratio_range=(0.2, 1.), + backend='pillow'), + dict( + type='RandomApply', + transforms=[ + dict( + type='ColorJitter', + brightness=0.4, + contrast=0.4, + saturation=0.4, + hue=0.1) + ], + prob=0.8), + dict( + type='RandomGrayscale', + prob=0.2, + keep_channels=True, + channel_weights=(0.114, 0.587, 0.2989)), + dict( + type='GaussianBlur', + magnitude_range=(0.1, 2.0), + magnitude_std='inf', + prob=0.5), + dict(type='RandomFlip', prob=0.5), +] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='MultiView', num_views=2, transforms=[view_pipeline]), + dict(type='PackInputs') +] + +train_dataloader = dict( + batch_size=32, + num_workers=8, + drop_last=True, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=True), + collate_fn=dict(type='default_collate'), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='meta/train.txt', + data_prefix=dict(img_path='train/'), + pipeline=train_pipeline)) diff --git a/configs/_base_/datasets/imagenet_bs32_pil_bicubic.py b/configs/_base_/datasets/imagenet_bs32_pil_bicubic.py new file mode 100644 index 0000000000000000000000000000000000000000..08f52576a656386641ab70db71e984529b9ce312 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs32_pil_bicubic.py @@ -0,0 +1,62 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=256, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=32, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=32, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs32_pil_resize.py b/configs/_base_/datasets/imagenet_bs32_pil_resize.py new file mode 100644 index 0000000000000000000000000000000000000000..ad5c3895e29c2f7d90f959c95e4b9013ef1eead6 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs32_pil_resize.py @@ -0,0 +1,53 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', scale=224, backend='pillow'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='ResizeEdge', scale=256, edge='short', backend='pillow'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=32, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=32, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs32_simclr.py b/configs/_base_/datasets/imagenet_bs32_simclr.py new file mode 100644 index 0000000000000000000000000000000000000000..9270810ad04b08c9f1aea3b6995df347d7944f2a --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs32_simclr.py @@ -0,0 +1,53 @@ +# dataset settings +dataset_type = 'ImageNet' +data_root = 'data/imagenet/' +data_preprocessor = dict( + type='SelfSupDataPreprocessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True) + +view_pipeline = [ + dict(type='RandomResizedCrop', scale=224, backend='pillow'), + dict(type='RandomFlip', prob=0.5), + dict( + type='RandomApply', + transforms=[ + dict( + type='ColorJitter', + brightness=0.8, + contrast=0.8, + saturation=0.8, + hue=0.2) + ], + prob=0.8), + dict( + type='RandomGrayscale', + prob=0.2, + keep_channels=True, + channel_weights=(0.114, 0.587, 0.2989)), + dict( + type='GaussianBlur', + magnitude_range=(0.1, 2.0), + magnitude_std='inf', + prob=0.5), +] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='MultiView', num_views=2, transforms=[view_pipeline]), + dict(type='PackInputs') +] + +train_dataloader = dict( + batch_size=32, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=True), + collate_fn=dict(type='default_collate'), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='meta/train.txt', + data_prefix=dict(img_path='train/'), + pipeline=train_pipeline)) diff --git a/configs/_base_/datasets/imagenet_bs512_mae.py b/configs/_base_/datasets/imagenet_bs512_mae.py new file mode 100644 index 0000000000000000000000000000000000000000..dcf0b365fba36f24da933be46afb76641b70455e --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs512_mae.py @@ -0,0 +1,33 @@ +# dataset settings +dataset_type = 'ImageNet' +data_root = 'data/imagenet/' +data_preprocessor = dict( + type='SelfSupDataPreprocessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=224, + crop_ratio_range=(0.2, 1.0), + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5), + dict(type='PackInputs') +] + +train_dataloader = dict( + batch_size=512, + num_workers=8, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=True), + collate_fn=dict(type='default_collate'), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='meta/train.txt', + data_prefix=dict(img_path='train/'), + pipeline=train_pipeline)) diff --git a/configs/_base_/datasets/imagenet_bs512_mocov3.py b/configs/_base_/datasets/imagenet_bs512_mocov3.py new file mode 100644 index 0000000000000000000000000000000000000000..87cd5a8431224913fea5c7a1d7cd1e237c4b428a --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs512_mocov3.py @@ -0,0 +1,91 @@ +# dataset settings +dataset_type = 'ImageNet' +data_root = 'data/imagenet/' +data_preprocessor = dict( + type='SelfSupDataPreprocessor', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True) + +view_pipeline1 = [ + dict( + type='RandomResizedCrop', + scale=224, + crop_ratio_range=(0.2, 1.), + backend='pillow'), + dict( + type='RandomApply', + transforms=[ + dict( + type='ColorJitter', + brightness=0.4, + contrast=0.4, + saturation=0.2, + hue=0.1) + ], + prob=0.8), + dict( + type='RandomGrayscale', + prob=0.2, + keep_channels=True, + channel_weights=(0.114, 0.587, 0.2989)), + dict( + type='GaussianBlur', + magnitude_range=(0.1, 2.0), + magnitude_std='inf', + prob=1.), + dict(type='Solarize', thr=128, prob=0.), + dict(type='RandomFlip', prob=0.5), +] +view_pipeline2 = [ + dict( + type='RandomResizedCrop', + scale=224, + crop_ratio_range=(0.2, 1.), + backend='pillow'), + dict( + type='RandomApply', + transforms=[ + dict( + type='ColorJitter', + brightness=0.4, + contrast=0.4, + saturation=0.2, + hue=0.1) + ], + prob=0.8), + dict( + type='RandomGrayscale', + prob=0.2, + keep_channels=True, + channel_weights=(0.114, 0.587, 0.2989)), + dict( + type='GaussianBlur', + magnitude_range=(0.1, 2.0), + magnitude_std='inf', + prob=0.1), + dict(type='Solarize', thr=128, prob=0.2), + dict(type='RandomFlip', prob=0.5), +] +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiView', + num_views=[1, 1], + transforms=[view_pipeline1, view_pipeline2]), + dict(type='PackInputs') +] + +train_dataloader = dict( + batch_size=512, + num_workers=8, + persistent_workers=True, + pin_memory=True, + sampler=dict(type='DefaultSampler', shuffle=True), + collate_fn=dict(type='default_collate'), + dataset=dict( + type=dataset_type, + data_root=data_root, + ann_file='meta/train.txt', + data_prefix=dict(img_path='train/'), + pipeline=train_pipeline)) diff --git a/configs/_base_/datasets/imagenet_bs64.py b/configs/_base_/datasets/imagenet_bs64.py new file mode 100644 index 0000000000000000000000000000000000000000..fc8fb340e13d69a4e8fcea28d10866d1e7e20a0c --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64.py @@ -0,0 +1,53 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', scale=224), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='ResizeEdge', scale=256, edge='short'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs64_autoaug.py b/configs/_base_/datasets/imagenet_bs64_autoaug.py new file mode 100644 index 0000000000000000000000000000000000000000..ec92c79ca6ec8140f4452ef00e7d01a2da5ef23c --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_autoaug.py @@ -0,0 +1,61 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', scale=224), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='AutoAugment', + policies='imagenet', + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='ResizeEdge', scale=256, edge='short'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs64_clip_224.py b/configs/_base_/datasets/imagenet_bs64_clip_224.py new file mode 100644 index 0000000000000000000000000000000000000000..f3149d44ef6bd574dbc3e0ac373e5cc610a9754b --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_clip_224.py @@ -0,0 +1,72 @@ +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[0.48145466 * 255, 0.4578275 * 255, 0.40821073 * 255], + std=[0.26862954 * 255, 0.26130258 * 255, 0.27577711 * 255], + to_rgb=True) +image_size = 224 +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=image_size, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + # dict( + # type='RandAugment', + # policies={{_base_.rand_increasing_policies}}, + # num_policies=2, + # total_level=10, + # magnitude_level=9, + # magnitude_std=0.5, + # hparams=dict( + # pad_val=[round(x) for x in img_norm_cfg['mean'][::-1]], + # interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=img_norm_cfg['mean'][::-1], + fill_std=img_norm_cfg['std'][::-1]), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(image_size, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=image_size), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] + +data = dict( + samples_per_gpu=64, + workers_per_gpu=8, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) + +evaluation = dict(interval=10, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs64_clip_384.py b/configs/_base_/datasets/imagenet_bs64_clip_384.py new file mode 100644 index 0000000000000000000000000000000000000000..2a57a8923fa2e6e7ad6386f9b1903eff934ccad2 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_clip_384.py @@ -0,0 +1,72 @@ +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[0.48145466 * 255, 0.4578275 * 255, 0.40821073 * 255], + std=[0.26862954 * 255, 0.26130258 * 255, 0.27577711 * 255], + to_rgb=True) +image_size = 384 +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=image_size, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + # dict( + # type='RandAugment', + # policies={{_base_.rand_increasing_policies}}, + # num_policies=2, + # total_level=10, + # magnitude_level=9, + # magnitude_std=0.5, + # hparams=dict( + # pad_val=[round(x) for x in img_norm_cfg['mean'][::-1]], + # interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=img_norm_cfg['mean'][::-1], + fill_std=img_norm_cfg['std'][::-1]), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(image_size, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=image_size), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] + +data = dict( + samples_per_gpu=64, + workers_per_gpu=8, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) + +evaluation = dict(interval=10, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs64_clip_448.py b/configs/_base_/datasets/imagenet_bs64_clip_448.py new file mode 100644 index 0000000000000000000000000000000000000000..d4fe2a98627016bfafd275711a5986c51458b60e --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_clip_448.py @@ -0,0 +1,73 @@ +# dataset settings +dataset_type = 'ImageNet' +img_norm_cfg = dict( + mean=[0.48145466 * 255, 0.4578275 * 255, 0.40821073 * 255], + std=[0.26862954 * 255, 0.26130258 * 255, 0.27577711 * 255], + to_rgb=True) +image_size = 448 + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + size=image_size, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', flip_prob=0.5, direction='horizontal'), + # dict( + # type='RandAugment', + # policies={{_base_.rand_increasing_policies}}, + # num_policies=2, + # total_level=10, + # magnitude_level=9, + # magnitude_std=0.5, + # hparams=dict( + # pad_val=[round(x) for x in img_norm_cfg['mean'][::-1]], + # interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=img_norm_cfg['mean'][::-1], + fill_std=img_norm_cfg['std'][::-1]), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['gt_label']), + dict(type='Collect', keys=['img', 'gt_label']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='Resize', + size=(image_size, -1), + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=image_size), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) +] + +data = dict( + samples_per_gpu=64, + workers_per_gpu=8, + train=dict( + type=dataset_type, + data_prefix='data/imagenet/train', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline), + test=dict( + # replace `data/val` with `data/test` for standard test + type=dataset_type, + data_prefix='data/imagenet/val', + ann_file='data/imagenet/meta/val.txt', + pipeline=test_pipeline)) + +evaluation = dict(interval=10, metric='accuracy') diff --git a/configs/_base_/datasets/imagenet_bs64_convmixer_224.py b/configs/_base_/datasets/imagenet_bs64_convmixer_224.py new file mode 100644 index 0000000000000000000000000000000000000000..f42c8b77aa45732cbd7744671e4b50fd222a866b --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_convmixer_224.py @@ -0,0 +1,82 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=bgr_mean, + fill_std=bgr_std), + dict(type='PackInputs') +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=233, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs') +] + +train_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs64_deit3_224.py b/configs/_base_/datasets/imagenet_bs64_deit3_224.py new file mode 100644 index 0000000000000000000000000000000000000000..6b0ae8c670ab029d73e60ac8b53b3ae125e124f0 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_deit3_224.py @@ -0,0 +1,82 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=bgr_mean, + fill_std=bgr_std), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=224, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs64_deit3_384.py b/configs/_base_/datasets/imagenet_bs64_deit3_384.py new file mode 100644 index 0000000000000000000000000000000000000000..9760c9ff848710d66fc4447b17a2a830f5f0d919 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_deit3_384.py @@ -0,0 +1,62 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=384, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=384, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=384), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs64_edgenext_256.py b/configs/_base_/datasets/imagenet_bs64_edgenext_256.py new file mode 100644 index 0000000000000000000000000000000000000000..d3517256e55f65e0fb1ac022678fbd1ef7981e31 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_edgenext_256.py @@ -0,0 +1,82 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=256, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=bgr_mean, + fill_std=bgr_std), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=292, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=256), + dict(type='PackInputs') +] + +train_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs64_mixer_224.py b/configs/_base_/datasets/imagenet_bs64_mixer_224.py new file mode 100644 index 0000000000000000000000000000000000000000..f1478d49776144bfa12d2f16330e4bae454bd836 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_mixer_224.py @@ -0,0 +1,54 @@ +# dataset settings +dataset_type = 'ImageNet' + +# Google research usually use the below normalization setting. +data_preprocessor = dict( + num_classes=1000, + mean=[127.5, 127.5, 127.5], + std=[127.5, 127.5, 127.5], + # convert image from BGR to RGB + to_rgb=True, +) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', scale=224), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='ResizeEdge', scale=256, edge='short', interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs64_pil_resize.py b/configs/_base_/datasets/imagenet_bs64_pil_resize.py new file mode 100644 index 0000000000000000000000000000000000000000..5d535b4a8ec4f00d40e68e51dc6f4fa79bab6e6c --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_pil_resize.py @@ -0,0 +1,53 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', scale=224, backend='pillow'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='ResizeEdge', scale=256, edge='short', backend='pillow'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs64_pil_resize_autoaug.py b/configs/_base_/datasets/imagenet_bs64_pil_resize_autoaug.py new file mode 100644 index 0000000000000000000000000000000000000000..246268f8124dc016dd53562a7fb8032336a67153 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_pil_resize_autoaug.py @@ -0,0 +1,70 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='AutoAugment', + policies='imagenet', + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=256, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs64_swin_224.py b/configs/_base_/datasets/imagenet_bs64_swin_224.py new file mode 100644 index 0000000000000000000000000000000000000000..12dd8a835331acfc7486b30595695a5146082e67 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_swin_224.py @@ -0,0 +1,82 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=bgr_mean, + fill_std=bgr_std), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=256, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs64_swin_256.py b/configs/_base_/datasets/imagenet_bs64_swin_256.py new file mode 100644 index 0000000000000000000000000000000000000000..09f997746060e73a1598a44f24fafdadb62bb616 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_swin_256.py @@ -0,0 +1,82 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=256, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=bgr_mean, + fill_std=bgr_std), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=292, # ( 256 / 224 * 256 ) + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=256), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs64_swin_384.py b/configs/_base_/datasets/imagenet_bs64_swin_384.py new file mode 100644 index 0000000000000000000000000000000000000000..9bcef5100980589c06910962c6301a3cce9f066a --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_swin_384.py @@ -0,0 +1,56 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=384, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=384, backend='pillow', interpolation='bicubic'), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs64_t2t_224.py b/configs/_base_/datasets/imagenet_bs64_t2t_224.py new file mode 100644 index 0000000000000000000000000000000000000000..c95625e92177879b096f781e17ff1e1427a60cc6 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs64_t2t_224.py @@ -0,0 +1,82 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + num_classes=1000, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, +) + +bgr_mean = data_preprocessor['mean'][::-1] +bgr_std = data_preprocessor['std'][::-1] + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=224, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict( + type='RandAugment', + policies='timm_increasing', + num_policies=2, + total_level=10, + magnitude_level=9, + magnitude_std=0.5, + hparams=dict( + pad_val=[round(x) for x in bgr_mean], interpolation='bicubic')), + dict( + type='RandomErasing', + erase_prob=0.25, + mode='rand', + min_area_ratio=0.02, + max_area_ratio=1 / 3, + fill_color=bgr_mean, + fill_std=bgr_std), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=248, + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=64, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/imagenet_bs8_pil_bicubic_320.py b/configs/_base_/datasets/imagenet_bs8_pil_bicubic_320.py new file mode 100644 index 0000000000000000000000000000000000000000..71f412412ca572b6fa8d428ddaab5313b4185920 --- /dev/null +++ b/configs/_base_/datasets/imagenet_bs8_pil_bicubic_320.py @@ -0,0 +1,61 @@ +# dataset settings +dataset_type = 'ImageNet' +data_preprocessor = dict( + # RGB format normalization parameters + mean=[122.5, 122.5, 122.5], + std=[122.5, 122.5, 122.5], + # convert image from BGR to RGB + to_rgb=True, +) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='RandomResizedCrop', + scale=320, + backend='pillow', + interpolation='bicubic'), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='ResizeEdge', + scale=int(320 / 224 * 256), + edge='short', + backend='pillow', + interpolation='bicubic'), + dict(type='CenterCrop', crop_size=320), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=8, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=8, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/imagenet', + ann_file='meta/val.txt', + data_prefix='val', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_evaluator = dict(type='Accuracy', topk=(1, 5)) + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/inshop_bs32_448.py b/configs/_base_/datasets/inshop_bs32_448.py new file mode 100644 index 0000000000000000000000000000000000000000..585f301d96f38d64b3cbc705fa265ffc84c34b17 --- /dev/null +++ b/configs/_base_/datasets/inshop_bs32_448.py @@ -0,0 +1,61 @@ +# dataset settings +dataset_type = 'InShop' +data_preprocessor = dict( + num_classes=3997, + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=512), + dict(type='RandomCrop', crop_size=448), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=512), + dict(type='CenterCrop', crop_size=448), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=32, + num_workers=4, + dataset=dict( + type=dataset_type, + data_root='data/inshop', + split='train', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +query_dataloader = dict( + batch_size=32, + num_workers=4, + dataset=dict( + type=dataset_type, + data_root='data/inshop', + split='query', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) + +gallery_dataloader = dict( + batch_size=32, + num_workers=4, + dataset=dict( + type=dataset_type, + data_root='data/inshop', + split='gallery', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) +val_dataloader = query_dataloader +val_evaluator = dict(type='RetrievalRecall', topk=1) + +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/datasets/pipelines/auto_aug.py b/configs/_base_/datasets/pipelines/auto_aug.py new file mode 100644 index 0000000000000000000000000000000000000000..5a10f7eec61ea40336698118342939470f73d052 --- /dev/null +++ b/configs/_base_/datasets/pipelines/auto_aug.py @@ -0,0 +1,96 @@ +# Policy for ImageNet, refers to +# https://github.com/DeepVoltaire/AutoAugment/blame/master/autoaugment.py +policy_imagenet = [ + [ + dict(type='Posterize', bits=4, prob=0.4), + dict(type='Rotate', angle=30., prob=0.6) + ], + [ + dict(type='Solarize', thr=256 / 9 * 4, prob=0.6), + dict(type='AutoContrast', prob=0.6) + ], + [dict(type='Equalize', prob=0.8), + dict(type='Equalize', prob=0.6)], + [ + dict(type='Posterize', bits=5, prob=0.6), + dict(type='Posterize', bits=5, prob=0.6) + ], + [ + dict(type='Equalize', prob=0.4), + dict(type='Solarize', thr=256 / 9 * 5, prob=0.2) + ], + [ + dict(type='Equalize', prob=0.4), + dict(type='Rotate', angle=30 / 9 * 8, prob=0.8) + ], + [ + dict(type='Solarize', thr=256 / 9 * 6, prob=0.6), + dict(type='Equalize', prob=0.6) + ], + [dict(type='Posterize', bits=6, prob=0.8), + dict(type='Equalize', prob=1.)], + [ + dict(type='Rotate', angle=10., prob=0.2), + dict(type='Solarize', thr=256 / 9, prob=0.6) + ], + [ + dict(type='Equalize', prob=0.6), + dict(type='Posterize', bits=5, prob=0.4) + ], + [ + dict(type='Rotate', angle=30 / 9 * 8, prob=0.8), + dict(type='ColorTransform', magnitude=0., prob=0.4) + ], + [ + dict(type='Rotate', angle=30., prob=0.4), + dict(type='Equalize', prob=0.6) + ], + [dict(type='Equalize', prob=0.0), + dict(type='Equalize', prob=0.8)], + [dict(type='Invert', prob=0.6), + dict(type='Equalize', prob=1.)], + [ + dict(type='ColorTransform', magnitude=0.4, prob=0.6), + dict(type='Contrast', magnitude=0.8, prob=1.) + ], + [ + dict(type='Rotate', angle=30 / 9 * 8, prob=0.8), + dict(type='ColorTransform', magnitude=0.2, prob=1.) + ], + [ + dict(type='ColorTransform', magnitude=0.8, prob=0.8), + dict(type='Solarize', thr=256 / 9 * 2, prob=0.8) + ], + [ + dict(type='Sharpness', magnitude=0.7, prob=0.4), + dict(type='Invert', prob=0.6) + ], + [ + dict( + type='Shear', + magnitude=0.3 / 9 * 5, + prob=0.6, + direction='horizontal'), + dict(type='Equalize', prob=1.) + ], + [ + dict(type='ColorTransform', magnitude=0., prob=0.4), + dict(type='Equalize', prob=0.6) + ], + [ + dict(type='Equalize', prob=0.4), + dict(type='Solarize', thr=256 / 9 * 5, prob=0.2) + ], + [ + dict(type='Solarize', thr=256 / 9 * 4, prob=0.6), + dict(type='AutoContrast', prob=0.6) + ], + [dict(type='Invert', prob=0.6), + dict(type='Equalize', prob=1.)], + [ + dict(type='ColorTransform', magnitude=0.4, prob=0.6), + dict(type='Contrast', magnitude=0.8, prob=1.) + ], + [dict(type='Equalize', prob=0.8), + dict(type='Equalize', prob=0.6)], +] diff --git a/configs/_base_/datasets/pipelines/rand_aug.py b/configs/_base_/datasets/pipelines/rand_aug.py new file mode 100644 index 0000000000000000000000000000000000000000..f2bab3c364f0d0223f2c972673da3abb6ac21bc6 --- /dev/null +++ b/configs/_base_/datasets/pipelines/rand_aug.py @@ -0,0 +1,43 @@ +# Refers to `_RAND_INCREASING_TRANSFORMS` in pytorch-image-models +rand_increasing_policies = [ + dict(type='AutoContrast'), + dict(type='Equalize'), + dict(type='Invert'), + dict(type='Rotate', magnitude_key='angle', magnitude_range=(0, 30)), + dict(type='Posterize', magnitude_key='bits', magnitude_range=(4, 0)), + dict(type='Solarize', magnitude_key='thr', magnitude_range=(256, 0)), + dict( + type='SolarizeAdd', + magnitude_key='magnitude', + magnitude_range=(0, 110)), + dict( + type='ColorTransform', + magnitude_key='magnitude', + magnitude_range=(0, 0.9)), + dict(type='Contrast', magnitude_key='magnitude', magnitude_range=(0, 0.9)), + dict( + type='Brightness', magnitude_key='magnitude', + magnitude_range=(0, 0.9)), + dict( + type='Sharpness', magnitude_key='magnitude', magnitude_range=(0, 0.9)), + dict( + type='Shear', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + direction='horizontal'), + dict( + type='Shear', + magnitude_key='magnitude', + magnitude_range=(0, 0.3), + direction='vertical'), + dict( + type='Translate', + magnitude_key='magnitude', + magnitude_range=(0, 0.45), + direction='horizontal'), + dict( + type='Translate', + magnitude_key='magnitude', + magnitude_range=(0, 0.45), + direction='vertical') +] diff --git a/configs/_base_/datasets/voc_bs16.py b/configs/_base_/datasets/voc_bs16.py new file mode 100644 index 0000000000000000000000000000000000000000..eca41345dc4b27be6d1ccced5b32a880604d0c8f --- /dev/null +++ b/configs/_base_/datasets/voc_bs16.py @@ -0,0 +1,70 @@ +# dataset settings +dataset_type = 'VOC' +data_preprocessor = dict( + num_classes=20, + # RGB format normalization parameters + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + # convert image from BGR to RGB + to_rgb=True, + # generate onehot-format labels for multi-label classification. + to_onehot=True, +) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='RandomResizedCrop', scale=224), + dict(type='RandomFlip', prob=0.5, direction='horizontal'), + dict(type='PackInputs'), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='ResizeEdge', scale=256, edge='short'), + dict(type='CenterCrop', crop_size=224), + dict(type='PackInputs'), +] + +train_dataloader = dict( + batch_size=16, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/VOCdevkit/VOC2007', + image_set_path='ImageSets/Layout/val.txt', + pipeline=train_pipeline), + sampler=dict(type='DefaultSampler', shuffle=True), +) + +val_dataloader = dict( + batch_size=16, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/VOCdevkit/VOC2007', + image_set_path='ImageSets/Layout/val.txt', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) + +test_dataloader = dict( + batch_size=16, + num_workers=5, + dataset=dict( + type=dataset_type, + data_root='data/VOCdevkit/VOC2007', + image_set_path='ImageSets/Layout/val.txt', + pipeline=test_pipeline), + sampler=dict(type='DefaultSampler', shuffle=False), +) + +# calculate precision_recall_f1 and mAP +val_evaluator = [ + dict(type='VOCMultiLabelMetric'), + dict(type='VOCMultiLabelMetric', average='micro'), + dict(type='VOCAveragePrecision') +] + +# If you want standard test, please manually configure the test dataset +test_dataloader = val_dataloader +test_evaluator = val_evaluator diff --git a/configs/_base_/default_runtime.py b/configs/_base_/default_runtime.py new file mode 100644 index 0000000000000000000000000000000000000000..f669d0b313b51e593ce5e61765823d95ae12180e --- /dev/null +++ b/configs/_base_/default_runtime.py @@ -0,0 +1,51 @@ +# defaults to use registries in mmpretrain +default_scope = 'mmpretrain' + +# configure default hooks +default_hooks = dict( + # record the time of every iteration. + timer=dict(type='IterTimerHook'), + + # print log every 100 iterations. + logger=dict(type='LoggerHook', interval=100), + + # enable the parameter scheduler. + param_scheduler=dict(type='ParamSchedulerHook'), + + # save checkpoint per epoch. + checkpoint=dict(type='CheckpointHook', interval=1), + + # set sampler seed in distributed evrionment. + sampler_seed=dict(type='DistSamplerSeedHook'), + + # validation results visualization, set True to enable it. + visualization=dict(type='VisualizationHook', enable=False), +) + +# configure environment +env_cfg = dict( + # whether to enable cudnn benchmark + cudnn_benchmark=False, + + # set multi process parameters + mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0), + + # set distributed parameters + dist_cfg=dict(backend='nccl'), +) + +# set visualizer +vis_backends = [dict(type='LocalVisBackend'), dict(type='TensorboardVisBackend')] +visualizer = dict(type='UniversalVisualizer', vis_backends=vis_backends) + +# set log level +log_level = 'INFO' + +# load from which checkpoint +load_from = None + +# whether to resume training from the loaded checkpoint +resume = False + +# Defaults to use random seed and disable `deterministic` +randomness = dict(seed=None, deterministic=False) diff --git a/configs/_base_/models/conformer/base-p16.py b/configs/_base_/models/conformer/base-p16.py new file mode 100644 index 0000000000000000000000000000000000000000..959da5059a8f36c1076bf9875c51fd466fc96fa4 --- /dev/null +++ b/configs/_base_/models/conformer/base-p16.py @@ -0,0 +1,23 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='Conformer', arch='base', drop_path_rate=0.1, init_cfg=None), + neck=None, + head=dict( + type='ConformerHead', + num_classes=1000, + in_channels=[1536, 576], + init_cfg=None, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/conformer/small-p16.py b/configs/_base_/models/conformer/small-p16.py new file mode 100644 index 0000000000000000000000000000000000000000..2e4f9f80745af51538306bd8928082f3fd2e9997 --- /dev/null +++ b/configs/_base_/models/conformer/small-p16.py @@ -0,0 +1,23 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='Conformer', arch='small', drop_path_rate=0.1, init_cfg=None), + neck=None, + head=dict( + type='ConformerHead', + num_classes=1000, + in_channels=[1024, 384], + init_cfg=None, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/conformer/small-p32.py b/configs/_base_/models/conformer/small-p32.py new file mode 100644 index 0000000000000000000000000000000000000000..f73811fff492f3e1770e514335ccc71b2bd3caf6 --- /dev/null +++ b/configs/_base_/models/conformer/small-p32.py @@ -0,0 +1,27 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='Conformer', + arch='small', + patch_size=32, + drop_path_rate=0.1, + init_cfg=None), + neck=None, + head=dict( + type='ConformerHead', + num_classes=1000, + in_channels=[1024, 384], + init_cfg=None, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/conformer/tiny-p16.py b/configs/_base_/models/conformer/tiny-p16.py new file mode 100644 index 0000000000000000000000000000000000000000..fa9753b6fac957a0c8f9612bd0b9a693a3ecbf4e --- /dev/null +++ b/configs/_base_/models/conformer/tiny-p16.py @@ -0,0 +1,23 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='Conformer', arch='tiny', drop_path_rate=0.1, init_cfg=None), + neck=None, + head=dict( + type='ConformerHead', + num_classes=1000, + in_channels=[256, 384], + init_cfg=None, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/convmixer/convmixer-1024-20.py b/configs/_base_/models/convmixer/convmixer-1024-20.py new file mode 100644 index 0000000000000000000000000000000000000000..a8f4d517e0d5e74c0d0412bb6e4f43b244761c03 --- /dev/null +++ b/configs/_base_/models/convmixer/convmixer-1024-20.py @@ -0,0 +1,11 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='ConvMixer', arch='1024/20'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/convmixer/convmixer-1536-20.py b/configs/_base_/models/convmixer/convmixer-1536-20.py new file mode 100644 index 0000000000000000000000000000000000000000..9ad8209bb4fc55665be36cdcd8102d854c533951 --- /dev/null +++ b/configs/_base_/models/convmixer/convmixer-1536-20.py @@ -0,0 +1,11 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='ConvMixer', arch='1536/20'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/convmixer/convmixer-768-32.py b/configs/_base_/models/convmixer/convmixer-768-32.py new file mode 100644 index 0000000000000000000000000000000000000000..1cba528b0edf9d394ae9730ecd51d41bbd314b38 --- /dev/null +++ b/configs/_base_/models/convmixer/convmixer-768-32.py @@ -0,0 +1,11 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='ConvMixer', arch='768/32', act_cfg=dict(type='ReLU')), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/convnext/convnext-base.py b/configs/_base_/models/convnext/convnext-base.py new file mode 100644 index 0000000000000000000000000000000000000000..aba6c19d1ac5039bab2363f80d500c81d4bb809b --- /dev/null +++ b/configs/_base_/models/convnext/convnext-base.py @@ -0,0 +1,19 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='ConvNeXt', arch='base', drop_path_rate=0.5), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + init_cfg=None, + ), + init_cfg=dict( + type='TruncNormal', layer=['Conv2d', 'Linear'], std=.02, bias=0.), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0), + ]), +) diff --git a/configs/_base_/models/convnext/convnext-large.py b/configs/_base_/models/convnext/convnext-large.py new file mode 100644 index 0000000000000000000000000000000000000000..9bd4d9f68bd47b207de129ab169c2366156199b3 --- /dev/null +++ b/configs/_base_/models/convnext/convnext-large.py @@ -0,0 +1,19 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='ConvNeXt', arch='large', drop_path_rate=0.5), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + init_cfg=None, + ), + init_cfg=dict( + type='TruncNormal', layer=['Conv2d', 'Linear'], std=.02, bias=0.), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0), + ]), +) diff --git a/configs/_base_/models/convnext/convnext-small.py b/configs/_base_/models/convnext/convnext-small.py new file mode 100644 index 0000000000000000000000000000000000000000..aeedb6d22fc8f80fe6c5fb246df44c8a28c41854 --- /dev/null +++ b/configs/_base_/models/convnext/convnext-small.py @@ -0,0 +1,19 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='ConvNeXt', arch='small', drop_path_rate=0.4), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + init_cfg=None, + ), + init_cfg=dict( + type='TruncNormal', layer=['Conv2d', 'Linear'], std=.02, bias=0.), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0), + ]), +) diff --git a/configs/_base_/models/convnext/convnext-tiny.py b/configs/_base_/models/convnext/convnext-tiny.py new file mode 100644 index 0000000000000000000000000000000000000000..05baba09eefe44196a54c112c5c785ff79a1b52b --- /dev/null +++ b/configs/_base_/models/convnext/convnext-tiny.py @@ -0,0 +1,19 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='ConvNeXt', arch='tiny', drop_path_rate=0.1), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + init_cfg=None, + ), + init_cfg=dict( + type='TruncNormal', layer=['Conv2d', 'Linear'], std=.02, bias=0.), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0), + ]), +) diff --git a/configs/_base_/models/convnext/convnext-xlarge.py b/configs/_base_/models/convnext/convnext-xlarge.py new file mode 100644 index 0000000000000000000000000000000000000000..7211b94f6cebe4c93d150dec276291f725f9f513 --- /dev/null +++ b/configs/_base_/models/convnext/convnext-xlarge.py @@ -0,0 +1,19 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='ConvNeXt', arch='xlarge', drop_path_rate=0.5), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + init_cfg=None, + ), + init_cfg=dict( + type='TruncNormal', layer=['Conv2d', 'Linear'], std=.02, bias=0.), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0), + ]), +) diff --git a/configs/_base_/models/convnext_v2/atto.py b/configs/_base_/models/convnext_v2/atto.py new file mode 100644 index 0000000000000000000000000000000000000000..557ce93fce2572fe2fd95db80da4556e0dd7810d --- /dev/null +++ b/configs/_base_/models/convnext_v2/atto.py @@ -0,0 +1,20 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ConvNeXt', + arch='atto', + drop_path_rate=0.1, + layer_scale_init_value=0., + use_grn=True, + ), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=320, + loss=dict(type='LabelSmoothLoss', label_smooth_val=0.2), + init_cfg=None, + ), + init_cfg=dict( + type='TruncNormal', layer=['Conv2d', 'Linear'], std=.02, bias=0.), +) diff --git a/configs/_base_/models/convnext_v2/base.py b/configs/_base_/models/convnext_v2/base.py new file mode 100644 index 0000000000000000000000000000000000000000..1401ef75f96814d5db1f6a37aa8d8761ccfe1e39 --- /dev/null +++ b/configs/_base_/models/convnext_v2/base.py @@ -0,0 +1,24 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ConvNeXt', + arch='base', + drop_path_rate=0.1, + layer_scale_init_value=0., + use_grn=True, + ), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='LabelSmoothLoss', label_smooth_val=0.1), + init_cfg=None, + ), + init_cfg=dict( + type='TruncNormal', layer=['Conv2d', 'Linear'], std=.02, bias=0.), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0), + ]), +) diff --git a/configs/_base_/models/convnext_v2/femto.py b/configs/_base_/models/convnext_v2/femto.py new file mode 100644 index 0000000000000000000000000000000000000000..d56a241a97820713618480bec0fe09f94ecb1cea --- /dev/null +++ b/configs/_base_/models/convnext_v2/femto.py @@ -0,0 +1,20 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ConvNeXt', + arch='femto', + drop_path_rate=0.1, + layer_scale_init_value=0., + use_grn=True, + ), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=384, + loss=dict(type='LabelSmoothLoss', label_smooth_val=0.1), + init_cfg=None, + ), + init_cfg=dict( + type='TruncNormal', layer=['Conv2d', 'Linear'], std=.02, bias=0.), +) diff --git a/configs/_base_/models/convnext_v2/huge.py b/configs/_base_/models/convnext_v2/huge.py new file mode 100644 index 0000000000000000000000000000000000000000..54141dd5220fdd0f40ce21054890e86b19597aff --- /dev/null +++ b/configs/_base_/models/convnext_v2/huge.py @@ -0,0 +1,24 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ConvNeXt', + arch='huge', + drop_path_rate=0.1, + layer_scale_init_value=0., + use_grn=True, + ), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2816, + loss=dict(type='LabelSmoothLoss', label_smooth_val=0.1), + init_cfg=None, + ), + init_cfg=dict( + type='TruncNormal', layer=['Conv2d', 'Linear'], std=.02, bias=0.), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0), + ]), +) diff --git a/configs/_base_/models/convnext_v2/large.py b/configs/_base_/models/convnext_v2/large.py new file mode 100644 index 0000000000000000000000000000000000000000..20237de2baaccd2779bcec45549ec5a294d8ba6b --- /dev/null +++ b/configs/_base_/models/convnext_v2/large.py @@ -0,0 +1,24 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ConvNeXt', + arch='large', + drop_path_rate=0.1, + layer_scale_init_value=0., + use_grn=True, + ), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + loss=dict(type='LabelSmoothLoss', label_smooth_val=0.1), + init_cfg=None, + ), + init_cfg=dict( + type='TruncNormal', layer=['Conv2d', 'Linear'], std=.02, bias=0.), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0), + ]), +) diff --git a/configs/_base_/models/convnext_v2/nano.py b/configs/_base_/models/convnext_v2/nano.py new file mode 100644 index 0000000000000000000000000000000000000000..05575d0e105da6880beafa08d1bdb0c608261a51 --- /dev/null +++ b/configs/_base_/models/convnext_v2/nano.py @@ -0,0 +1,20 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ConvNeXt', + arch='nano', + drop_path_rate=0.1, + layer_scale_init_value=0., + use_grn=True, + ), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=640, + loss=dict(type='LabelSmoothLoss', label_smooth_val=0.2), + init_cfg=None, + ), + init_cfg=dict( + type='TruncNormal', layer=['Conv2d', 'Linear'], std=.02, bias=0.), +) diff --git a/configs/_base_/models/convnext_v2/pico.py b/configs/_base_/models/convnext_v2/pico.py new file mode 100644 index 0000000000000000000000000000000000000000..6d50ba890069457bc512ac2d2da1038ee73cd065 --- /dev/null +++ b/configs/_base_/models/convnext_v2/pico.py @@ -0,0 +1,20 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ConvNeXt', + arch='pico', + drop_path_rate=0.1, + layer_scale_init_value=0., + use_grn=True, + ), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + loss=dict(type='LabelSmoothLoss', label_smooth_val=0.1), + init_cfg=None, + ), + init_cfg=dict( + type='TruncNormal', layer=['Conv2d', 'Linear'], std=.02, bias=0.), +) diff --git a/configs/_base_/models/convnext_v2/tiny.py b/configs/_base_/models/convnext_v2/tiny.py new file mode 100644 index 0000000000000000000000000000000000000000..c9835ccdb47f8c976be9519160ba13f6f4a168f9 --- /dev/null +++ b/configs/_base_/models/convnext_v2/tiny.py @@ -0,0 +1,24 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ConvNeXt', + arch='tiny', + drop_path_rate=0.2, + layer_scale_init_value=0., + use_grn=True, + ), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict(type='LabelSmoothLoss', label_smooth_val=0.2), + init_cfg=None, + ), + init_cfg=dict( + type='TruncNormal', layer=['Conv2d', 'Linear'], std=.02, bias=0.), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0), + ]), +) diff --git a/configs/_base_/models/davit/davit-base.py b/configs/_base_/models/davit/davit-base.py new file mode 100644 index 0000000000000000000000000000000000000000..0dbf07739ecc907e4a77d0cdbd9c21f4c8fbecf1 --- /dev/null +++ b/configs/_base_/models/davit/davit-base.py @@ -0,0 +1,16 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='DaViT', arch='base', out_indices=(3, ), drop_path_rate=0.4), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/davit/davit-small.py b/configs/_base_/models/davit/davit-small.py new file mode 100644 index 0000000000000000000000000000000000000000..2fa0325552c2bc28f69263ba42547090b7a521fb --- /dev/null +++ b/configs/_base_/models/davit/davit-small.py @@ -0,0 +1,16 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='DaViT', arch='small', out_indices=(3, ), drop_path_rate=0.2), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/davit/davit-tiny.py b/configs/_base_/models/davit/davit-tiny.py new file mode 100644 index 0000000000000000000000000000000000000000..29432d28bd09a613bf4eaabe4f8ef4d0d763a49d --- /dev/null +++ b/configs/_base_/models/davit/davit-tiny.py @@ -0,0 +1,16 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='DaViT', arch='t', out_indices=(3, ), drop_path_rate=0.1), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/deit3/deit3-base-p16-224.py b/configs/_base_/models/deit3/deit3-base-p16-224.py new file mode 100644 index 0000000000000000000000000000000000000000..84cba1afadbf13ed78e5f3c2be112a70b5ba8be1 --- /dev/null +++ b/configs/_base_/models/deit3/deit3-base-p16-224.py @@ -0,0 +1,24 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='DeiT3', + arch='b', + img_size=224, + patch_size=16, + drop_path_rate=0.2), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=1000, + in_channels=768, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/deit3/deit3-base-p16-384.py b/configs/_base_/models/deit3/deit3-base-p16-384.py new file mode 100644 index 0000000000000000000000000000000000000000..1c9f42bc3a3b69c5091c5a31c0d7a137fb944cf5 --- /dev/null +++ b/configs/_base_/models/deit3/deit3-base-p16-384.py @@ -0,0 +1,24 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='DeiT3', + arch='b', + img_size=384, + patch_size=16, + drop_path_rate=0.15), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=1000, + in_channels=768, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/deit3/deit3-huge-p14-224.py b/configs/_base_/models/deit3/deit3-huge-p14-224.py new file mode 100644 index 0000000000000000000000000000000000000000..b7a69ce914fbc32b029cb1a891fb1cf49d4bfce0 --- /dev/null +++ b/configs/_base_/models/deit3/deit3-huge-p14-224.py @@ -0,0 +1,24 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='DeiT3', + arch='h', + img_size=224, + patch_size=14, + drop_path_rate=0.55), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=1000, + in_channels=1280, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/deit3/deit3-large-p16-224.py b/configs/_base_/models/deit3/deit3-large-p16-224.py new file mode 100644 index 0000000000000000000000000000000000000000..96135c57879715a1de50efd8e6c28fc635eae1ff --- /dev/null +++ b/configs/_base_/models/deit3/deit3-large-p16-224.py @@ -0,0 +1,24 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='DeiT3', + arch='l', + img_size=224, + patch_size=16, + drop_path_rate=0.45), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=1000, + in_channels=1024, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/deit3/deit3-large-p16-384.py b/configs/_base_/models/deit3/deit3-large-p16-384.py new file mode 100644 index 0000000000000000000000000000000000000000..aa9326c17cd0b0e1d625270140a80f1bb92fc0bf --- /dev/null +++ b/configs/_base_/models/deit3/deit3-large-p16-384.py @@ -0,0 +1,24 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='DeiT3', + arch='l', + img_size=384, + patch_size=16, + drop_path_rate=0.4), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=1000, + in_channels=1024, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/deit3/deit3-medium-p16-224.py b/configs/_base_/models/deit3/deit3-medium-p16-224.py new file mode 100644 index 0000000000000000000000000000000000000000..84233e5cfde13cd0f142b49f64c3b3ec65ff4f68 --- /dev/null +++ b/configs/_base_/models/deit3/deit3-medium-p16-224.py @@ -0,0 +1,24 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='DeiT3', + arch='m', + img_size=224, + patch_size=16, + drop_path_rate=0.2), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=1000, + in_channels=512, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/deit3/deit3-small-p16-224.py b/configs/_base_/models/deit3/deit3-small-p16-224.py new file mode 100644 index 0000000000000000000000000000000000000000..af29d32bc799ebdff5a9724fe5555261ba0b584c --- /dev/null +++ b/configs/_base_/models/deit3/deit3-small-p16-224.py @@ -0,0 +1,24 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='DeiT3', + arch='s', + img_size=224, + patch_size=16, + drop_path_rate=0.05), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=1000, + in_channels=384, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/deit3/deit3-small-p16-384.py b/configs/_base_/models/deit3/deit3-small-p16-384.py new file mode 100644 index 0000000000000000000000000000000000000000..bebb4845e8c3a47e1d944702c49357d6d8aa4cd6 --- /dev/null +++ b/configs/_base_/models/deit3/deit3-small-p16-384.py @@ -0,0 +1,24 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='DeiT3', + arch='s', + img_size=384, + patch_size=16, + drop_path_rate=0.0), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=1000, + in_channels=384, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/densenet/densenet121.py b/configs/_base_/models/densenet/densenet121.py new file mode 100644 index 0000000000000000000000000000000000000000..0a14d302584a910e87ccf598e9434bd0685207aa --- /dev/null +++ b/configs/_base_/models/densenet/densenet121.py @@ -0,0 +1,11 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='DenseNet', arch='121'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/densenet/densenet161.py b/configs/_base_/models/densenet/densenet161.py new file mode 100644 index 0000000000000000000000000000000000000000..61a0d838806267a5c987fa30eeb6363f23387ef3 --- /dev/null +++ b/configs/_base_/models/densenet/densenet161.py @@ -0,0 +1,11 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='DenseNet', arch='161'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2208, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/densenet/densenet169.py b/configs/_base_/models/densenet/densenet169.py new file mode 100644 index 0000000000000000000000000000000000000000..779ea1709256f8c001adaa3c73155c36d3363d71 --- /dev/null +++ b/configs/_base_/models/densenet/densenet169.py @@ -0,0 +1,11 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='DenseNet', arch='169'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1664, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/densenet/densenet201.py b/configs/_base_/models/densenet/densenet201.py new file mode 100644 index 0000000000000000000000000000000000000000..2909af0d36c656c1868ff38e72981dc9dafeaa2f --- /dev/null +++ b/configs/_base_/models/densenet/densenet201.py @@ -0,0 +1,11 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='DenseNet', arch='201'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1920, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/edgenext/edgenext-base.py b/configs/_base_/models/edgenext/edgenext-base.py new file mode 100644 index 0000000000000000000000000000000000000000..378397298ed9d51241ad737d65b05f151ac69393 --- /dev/null +++ b/configs/_base_/models/edgenext/edgenext-base.py @@ -0,0 +1,23 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='EdgeNeXt', + arch='base', + out_indices=(3, ), + drop_path_rate=0.1, + gap_before_final_norm=True, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['LayerNorm'], val=1., bias=0.), + ]), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=584, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/edgenext/edgenext-small.py b/configs/_base_/models/edgenext/edgenext-small.py new file mode 100644 index 0000000000000000000000000000000000000000..e1f7e1728a2f5cb895600aa0d81eeb5734dffec0 --- /dev/null +++ b/configs/_base_/models/edgenext/edgenext-small.py @@ -0,0 +1,23 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='EdgeNeXt', + arch='small', + out_indices=(3, ), + drop_path_rate=0.1, + gap_before_final_norm=True, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['LayerNorm'], val=1., bias=0.), + ]), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=304, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/edgenext/edgenext-xsmall.py b/configs/_base_/models/edgenext/edgenext-xsmall.py new file mode 100644 index 0000000000000000000000000000000000000000..69c7d0d6a6ec9d09df03c007cd3fffa93165f5cb --- /dev/null +++ b/configs/_base_/models/edgenext/edgenext-xsmall.py @@ -0,0 +1,23 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='EdgeNeXt', + arch='xsmall', + out_indices=(3, ), + drop_path_rate=0.1, + gap_before_final_norm=True, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['LayerNorm'], val=1., bias=0.), + ]), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=192, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/edgenext/edgenext-xxsmall.py b/configs/_base_/models/edgenext/edgenext-xxsmall.py new file mode 100644 index 0000000000000000000000000000000000000000..fb6881951fae8c01c2a4ea78c3d61e7c6a900f24 --- /dev/null +++ b/configs/_base_/models/edgenext/edgenext-xxsmall.py @@ -0,0 +1,23 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='EdgeNeXt', + arch='xxsmall', + out_indices=(3, ), + drop_path_rate=0.1, + gap_before_final_norm=True, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['LayerNorm'], val=1., bias=0.), + ]), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=168, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/efficientformer-l1.py b/configs/_base_/models/efficientformer-l1.py new file mode 100644 index 0000000000000000000000000000000000000000..37dc62cd235ee5a3f0257a24c54c8eb4fc797159 --- /dev/null +++ b/configs/_base_/models/efficientformer-l1.py @@ -0,0 +1,18 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='EfficientFormer', + arch='l1', + drop_path_rate=0, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['GroupNorm'], val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-5) + ]), + neck=dict(type='GlobalAveragePooling', dim=1), + head=dict( + type='EfficientFormerClsHead', in_channels=448, num_classes=1000)) diff --git a/configs/_base_/models/efficientnet_b0.py b/configs/_base_/models/efficientnet_b0.py new file mode 100644 index 0000000000000000000000000000000000000000..d9ba685306c9e411a69887a2a301808cbaa104cb --- /dev/null +++ b/configs/_base_/models/efficientnet_b0.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='b0'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_b1.py b/configs/_base_/models/efficientnet_b1.py new file mode 100644 index 0000000000000000000000000000000000000000..63e15c88b2f7e1d1c788811741ff26bf5f35601f --- /dev/null +++ b/configs/_base_/models/efficientnet_b1.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='b1'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_b2.py b/configs/_base_/models/efficientnet_b2.py new file mode 100644 index 0000000000000000000000000000000000000000..5edcfa5d5b680ec41567e531e0b7a587e160c8af --- /dev/null +++ b/configs/_base_/models/efficientnet_b2.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='b2'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1408, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_b3.py b/configs/_base_/models/efficientnet_b3.py new file mode 100644 index 0000000000000000000000000000000000000000..c7c6d6d899ecb910a37cbd3818f8c79c27db87e9 --- /dev/null +++ b/configs/_base_/models/efficientnet_b3.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='b3'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_b4.py b/configs/_base_/models/efficientnet_b4.py new file mode 100644 index 0000000000000000000000000000000000000000..06840ed559cc14ae47919f7cce67d635173e841d --- /dev/null +++ b/configs/_base_/models/efficientnet_b4.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='b4'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1792, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_b5.py b/configs/_base_/models/efficientnet_b5.py new file mode 100644 index 0000000000000000000000000000000000000000..a86eebd19042eb36534ef3f42cc16bb32e88fb66 --- /dev/null +++ b/configs/_base_/models/efficientnet_b5.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='b5'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_b6.py b/configs/_base_/models/efficientnet_b6.py new file mode 100644 index 0000000000000000000000000000000000000000..4eada1d32511371bcb11c636b3aae9dc4733d379 --- /dev/null +++ b/configs/_base_/models/efficientnet_b6.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='b6'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2304, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_b7.py b/configs/_base_/models/efficientnet_b7.py new file mode 100644 index 0000000000000000000000000000000000000000..1d84ba427f42a186f376d829189461536e7ee383 --- /dev/null +++ b/configs/_base_/models/efficientnet_b7.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='b7'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2560, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_b8.py b/configs/_base_/models/efficientnet_b8.py new file mode 100644 index 0000000000000000000000000000000000000000..c9500644dae4a3240c5ecfa02f90deb8fde4e3de --- /dev/null +++ b/configs/_base_/models/efficientnet_b8.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='b8'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2816, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_em.py b/configs/_base_/models/efficientnet_em.py new file mode 100644 index 0000000000000000000000000000000000000000..abecdbeef6c3791f902b6bd13fbceb28c3ac8942 --- /dev/null +++ b/configs/_base_/models/efficientnet_em.py @@ -0,0 +1,13 @@ +# model settings +model = dict( + type='ImageClassifier', + # `em` means EfficientNet-EdgeTPU-M arch + backbone=dict(type='EfficientNet', arch='em', act_cfg=dict(type='ReLU')), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_es.py b/configs/_base_/models/efficientnet_es.py new file mode 100644 index 0000000000000000000000000000000000000000..911ba4a18261decd3d17e8962501083e1f1ea550 --- /dev/null +++ b/configs/_base_/models/efficientnet_es.py @@ -0,0 +1,13 @@ +# model settings +model = dict( + type='ImageClassifier', + # `es` means EfficientNet-EdgeTPU-S arch + backbone=dict(type='EfficientNet', arch='es', act_cfg=dict(type='ReLU')), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_l2.py b/configs/_base_/models/efficientnet_l2.py new file mode 100644 index 0000000000000000000000000000000000000000..4219c87a81a93c50296cfebed8f20b9bbd2a4c13 --- /dev/null +++ b/configs/_base_/models/efficientnet_l2.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNet', arch='l2'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=5504, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_v2/efficientnetv2_b0.py b/configs/_base_/models/efficientnet_v2/efficientnetv2_b0.py new file mode 100644 index 0000000000000000000000000000000000000000..d42e32905ed9d18ab572bfe1e90c7161f941a34f --- /dev/null +++ b/configs/_base_/models/efficientnet_v2/efficientnetv2_b0.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNetV2', arch='b0'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_v2/efficientnetv2_b1.py b/configs/_base_/models/efficientnet_v2/efficientnetv2_b1.py new file mode 100644 index 0000000000000000000000000000000000000000..10736fc504637b07fe362e27c5e86ea73990217a --- /dev/null +++ b/configs/_base_/models/efficientnet_v2/efficientnetv2_b1.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNetV2', arch='b1'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_v2/efficientnetv2_b2.py b/configs/_base_/models/efficientnet_v2/efficientnetv2_b2.py new file mode 100644 index 0000000000000000000000000000000000000000..61f477120e031cd8cf46340bdbd3c687ade2a035 --- /dev/null +++ b/configs/_base_/models/efficientnet_v2/efficientnetv2_b2.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNetV2', arch='b2'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1408, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_v2/efficientnetv2_b3.py b/configs/_base_/models/efficientnet_v2/efficientnetv2_b3.py new file mode 100644 index 0000000000000000000000000000000000000000..14e523fd2e4180e960aa8a3282e56f6604c38a47 --- /dev/null +++ b/configs/_base_/models/efficientnet_v2/efficientnetv2_b3.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNetV2', arch='b3'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_v2/efficientnetv2_l.py b/configs/_base_/models/efficientnet_v2/efficientnetv2_l.py new file mode 100644 index 0000000000000000000000000000000000000000..456467d6fa076db11b009fca875e231569e05288 --- /dev/null +++ b/configs/_base_/models/efficientnet_v2/efficientnetv2_l.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNetV2', arch='l'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_v2/efficientnetv2_m.py b/configs/_base_/models/efficientnet_v2/efficientnetv2_m.py new file mode 100644 index 0000000000000000000000000000000000000000..8e4d303f624d3375416b7c41c59a68a1a64e4a19 --- /dev/null +++ b/configs/_base_/models/efficientnet_v2/efficientnetv2_m.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNetV2', arch='m'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_v2/efficientnetv2_s.py b/configs/_base_/models/efficientnet_v2/efficientnetv2_s.py new file mode 100644 index 0000000000000000000000000000000000000000..866648223c79aac1ca8519a1d18b167b7ac474ec --- /dev/null +++ b/configs/_base_/models/efficientnet_v2/efficientnetv2_s.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNetV2', arch='s'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/efficientnet_v2/efficientnetv2_xl.py b/configs/_base_/models/efficientnet_v2/efficientnetv2_xl.py new file mode 100644 index 0000000000000000000000000000000000000000..2216c9daa7d5e5e11084320b3aeab6a388588f40 --- /dev/null +++ b/configs/_base_/models/efficientnet_v2/efficientnetv2_xl.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='EfficientNetV2', arch='xl'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/eva/eva-g.py b/configs/_base_/models/eva/eva-g.py new file mode 100644 index 0000000000000000000000000000000000000000..17bc84ad8bd2ac5599f26351b5fb5ca3fb8ec8bc --- /dev/null +++ b/configs/_base_/models/eva/eva-g.py @@ -0,0 +1,29 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='BEiTViT', + arch='eva-g', + img_size=224, + patch_size=14, + layer_scale_init_value=0.0, + out_type='avg_featmap', + use_abs_pos_emb=True, + use_rel_pos_bias=False, + use_shared_rel_pos_bias=False, + ), + neck=None, + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1408, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/eva/eva-l.py b/configs/_base_/models/eva/eva-l.py new file mode 100644 index 0000000000000000000000000000000000000000..9b08e4b1e1881b706848c121ceb3b4d23cfae34a --- /dev/null +++ b/configs/_base_/models/eva/eva-l.py @@ -0,0 +1,30 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='BEiTViT', + arch='l', + img_size=224, + patch_size=14, + layer_scale_init_value=0.0, + out_type='avg_featmap', + use_abs_pos_emb=True, + use_rel_pos_bias=False, + use_shared_rel_pos_bias=False, + layer_cfgs=dict(bias=True), + ), + neck=None, + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/hornet/hornet-base-gf.py b/configs/_base_/models/hornet/hornet-base-gf.py new file mode 100644 index 0000000000000000000000000000000000000000..b6924f96265cda310a38765fa460ad685d9d01b7 --- /dev/null +++ b/configs/_base_/models/hornet/hornet-base-gf.py @@ -0,0 +1,20 @@ +model = dict( + type='ImageClassifier', + backbone=dict(type='HorNet', arch='base-gf', drop_path_rate=0.5), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-6) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/hornet/hornet-base.py b/configs/_base_/models/hornet/hornet-base.py new file mode 100644 index 0000000000000000000000000000000000000000..904379ab5f258fa366d75166e7446fccecf0bc2c --- /dev/null +++ b/configs/_base_/models/hornet/hornet-base.py @@ -0,0 +1,21 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HorNet', arch='base', drop_path_rate=0.5), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-6) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/hornet/hornet-large-gf.py b/configs/_base_/models/hornet/hornet-large-gf.py new file mode 100644 index 0000000000000000000000000000000000000000..1607ba2208415699697f8ada17941cc75a6270a9 --- /dev/null +++ b/configs/_base_/models/hornet/hornet-large-gf.py @@ -0,0 +1,21 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HorNet', arch='large-gf', drop_path_rate=0.2), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-6) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/hornet/hornet-large-gf384.py b/configs/_base_/models/hornet/hornet-large-gf384.py new file mode 100644 index 0000000000000000000000000000000000000000..fbb547873ed047adaed448fb1d443b4de8750ea4 --- /dev/null +++ b/configs/_base_/models/hornet/hornet-large-gf384.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HorNet', arch='large-gf384', drop_path_rate=0.4), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-6) + ]) diff --git a/configs/_base_/models/hornet/hornet-large.py b/configs/_base_/models/hornet/hornet-large.py new file mode 100644 index 0000000000000000000000000000000000000000..b5494fd8985970c2a60424ab6b6e07cd8965a6ed --- /dev/null +++ b/configs/_base_/models/hornet/hornet-large.py @@ -0,0 +1,21 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HorNet', arch='large', drop_path_rate=0.2), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-6) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/hornet/hornet-small-gf.py b/configs/_base_/models/hornet/hornet-small-gf.py new file mode 100644 index 0000000000000000000000000000000000000000..42e26d3a4bf75aab77a3fbdda2135bed98223476 --- /dev/null +++ b/configs/_base_/models/hornet/hornet-small-gf.py @@ -0,0 +1,21 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HorNet', arch='small-gf', drop_path_rate=0.4), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-6) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/hornet/hornet-small.py b/configs/_base_/models/hornet/hornet-small.py new file mode 100644 index 0000000000000000000000000000000000000000..d59184d40ab2f8a5c03c82caeade85dcd32c9180 --- /dev/null +++ b/configs/_base_/models/hornet/hornet-small.py @@ -0,0 +1,21 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HorNet', arch='small', drop_path_rate=0.4), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-6) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/hornet/hornet-tiny-gf.py b/configs/_base_/models/hornet/hornet-tiny-gf.py new file mode 100644 index 0000000000000000000000000000000000000000..6b06f5b121f18f26c5a3a3442f3bbf8842bdd206 --- /dev/null +++ b/configs/_base_/models/hornet/hornet-tiny-gf.py @@ -0,0 +1,21 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HorNet', arch='tiny-gf', drop_path_rate=0.2), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-6) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/hornet/hornet-tiny.py b/configs/_base_/models/hornet/hornet-tiny.py new file mode 100644 index 0000000000000000000000000000000000000000..aed710eb862467da4d39c13a4fad41e7e6b76f29 --- /dev/null +++ b/configs/_base_/models/hornet/hornet-tiny.py @@ -0,0 +1,21 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HorNet', arch='tiny', drop_path_rate=0.2), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + dict(type='Constant', layer=['LayerScale'], val=1e-6) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/hrnet/hrnet-w18.py b/configs/_base_/models/hrnet/hrnet-w18.py new file mode 100644 index 0000000000000000000000000000000000000000..f7fbf298d5b64ba1cefa46a4a5d2823c2fa8cf17 --- /dev/null +++ b/configs/_base_/models/hrnet/hrnet-w18.py @@ -0,0 +1,15 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HRNet', arch='w18'), + neck=[ + dict(type='HRFuseScales', in_channels=(18, 36, 72, 144)), + dict(type='GlobalAveragePooling'), + ], + head=dict( + type='LinearClsHead', + in_channels=2048, + num_classes=1000, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/hrnet/hrnet-w30.py b/configs/_base_/models/hrnet/hrnet-w30.py new file mode 100644 index 0000000000000000000000000000000000000000..babcacac59af0ff92802a71f48b249b29a760acb --- /dev/null +++ b/configs/_base_/models/hrnet/hrnet-w30.py @@ -0,0 +1,15 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HRNet', arch='w30'), + neck=[ + dict(type='HRFuseScales', in_channels=(30, 60, 120, 240)), + dict(type='GlobalAveragePooling'), + ], + head=dict( + type='LinearClsHead', + in_channels=2048, + num_classes=1000, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/hrnet/hrnet-w32.py b/configs/_base_/models/hrnet/hrnet-w32.py new file mode 100644 index 0000000000000000000000000000000000000000..2c1e980048d6bb855b94e0bb3027941d07513c05 --- /dev/null +++ b/configs/_base_/models/hrnet/hrnet-w32.py @@ -0,0 +1,15 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HRNet', arch='w32'), + neck=[ + dict(type='HRFuseScales', in_channels=(32, 64, 128, 256)), + dict(type='GlobalAveragePooling'), + ], + head=dict( + type='LinearClsHead', + in_channels=2048, + num_classes=1000, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/hrnet/hrnet-w40.py b/configs/_base_/models/hrnet/hrnet-w40.py new file mode 100644 index 0000000000000000000000000000000000000000..83f65d864679297b25b39438d49eb491c92c33a1 --- /dev/null +++ b/configs/_base_/models/hrnet/hrnet-w40.py @@ -0,0 +1,15 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HRNet', arch='w40'), + neck=[ + dict(type='HRFuseScales', in_channels=(40, 80, 160, 320)), + dict(type='GlobalAveragePooling'), + ], + head=dict( + type='LinearClsHead', + in_channels=2048, + num_classes=1000, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/hrnet/hrnet-w44.py b/configs/_base_/models/hrnet/hrnet-w44.py new file mode 100644 index 0000000000000000000000000000000000000000..e75dc0f891f6f9dd14ba31b865fd29afd622f4db --- /dev/null +++ b/configs/_base_/models/hrnet/hrnet-w44.py @@ -0,0 +1,15 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HRNet', arch='w44'), + neck=[ + dict(type='HRFuseScales', in_channels=(44, 88, 176, 352)), + dict(type='GlobalAveragePooling'), + ], + head=dict( + type='LinearClsHead', + in_channels=2048, + num_classes=1000, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/hrnet/hrnet-w48.py b/configs/_base_/models/hrnet/hrnet-w48.py new file mode 100644 index 0000000000000000000000000000000000000000..f0604958481ba2af277e3a0f9515dc1423def6c6 --- /dev/null +++ b/configs/_base_/models/hrnet/hrnet-w48.py @@ -0,0 +1,15 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HRNet', arch='w48'), + neck=[ + dict(type='HRFuseScales', in_channels=(48, 96, 192, 384)), + dict(type='GlobalAveragePooling'), + ], + head=dict( + type='LinearClsHead', + in_channels=2048, + num_classes=1000, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/hrnet/hrnet-w64.py b/configs/_base_/models/hrnet/hrnet-w64.py new file mode 100644 index 0000000000000000000000000000000000000000..844c3fe9413f624dd374ceb1a9c3bbc185a20a3e --- /dev/null +++ b/configs/_base_/models/hrnet/hrnet-w64.py @@ -0,0 +1,15 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='HRNet', arch='w64'), + neck=[ + dict(type='HRFuseScales', in_channels=(64, 128, 256, 512)), + dict(type='GlobalAveragePooling'), + ], + head=dict( + type='LinearClsHead', + in_channels=2048, + num_classes=1000, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/inception_v3.py b/configs/_base_/models/inception_v3.py new file mode 100644 index 0000000000000000000000000000000000000000..3f6a8305efe2ef87cfd0d2676056a07595831c6b --- /dev/null +++ b/configs/_base_/models/inception_v3.py @@ -0,0 +1,10 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='InceptionV3', num_classes=1000, aux_logits=False), + neck=None, + head=dict( + type='ClsHead', + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5)), +) diff --git a/configs/_base_/models/levit-256-p16.py b/configs/_base_/models/levit-256-p16.py new file mode 100644 index 0000000000000000000000000000000000000000..936305bd254cb0c46f1bd0e8d0698f76b9a765c4 --- /dev/null +++ b/configs/_base_/models/levit-256-p16.py @@ -0,0 +1,26 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='LeViT', + arch='256', + img_size=224, + patch_size=16, + drop_path_rate=0, + attn_ratio=2, + mlp_ratio=2, + out_indices=(2, )), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LeViTClsHead', + num_classes=1000, + in_channels=512, + distillation=True, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, loss_weight=1.0), + topk=(1, 5), + ), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0), + ])) diff --git a/configs/_base_/models/mae_vit-base-p16.py b/configs/_base_/models/mae_vit-base-p16.py new file mode 100644 index 0000000000000000000000000000000000000000..8cde8cb7c775d82941324f1abfa3432727b08a07 --- /dev/null +++ b/configs/_base_/models/mae_vit-base-p16.py @@ -0,0 +1,23 @@ +# model settings +model = dict( + type='MAE', + backbone=dict(type='MAEViT', arch='b', patch_size=16, mask_ratio=0.75), + neck=dict( + type='MAEPretrainDecoder', + patch_size=16, + in_chans=3, + embed_dim=768, + decoder_embed_dim=512, + decoder_depth=8, + decoder_num_heads=16, + mlp_ratio=4., + ), + head=dict( + type='MAEPretrainHead', + norm_pix=True, + patch_size=16, + loss=dict(type='PixelReconstructionLoss', criterion='L2')), + init_cfg=[ + dict(type='Xavier', layer='Linear', distribution='uniform'), + dict(type='Constant', layer='LayerNorm', val=1.0, bias=0.0) + ]) diff --git a/configs/_base_/models/mixmim/mixmim_base.py b/configs/_base_/models/mixmim/mixmim_base.py new file mode 100644 index 0000000000000000000000000000000000000000..ccde357570d22d3e1147b14ec480fd6b31f6a4cf --- /dev/null +++ b/configs/_base_/models/mixmim/mixmim_base.py @@ -0,0 +1,20 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='MixMIMTransformer', arch='B', drop_rate=0.0, drop_path_rate=0.1), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + init_cfg=None, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/mlp_mixer_base_patch16.py b/configs/_base_/models/mlp_mixer_base_patch16.py new file mode 100644 index 0000000000000000000000000000000000000000..5ebd17f337bb3d6f14e0a45b40ef6f3342477090 --- /dev/null +++ b/configs/_base_/models/mlp_mixer_base_patch16.py @@ -0,0 +1,25 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='MlpMixer', + arch='b', + img_size=224, + patch_size=16, + drop_rate=0.1, + init_cfg=[ + dict( + type='Kaiming', + layer='Conv2d', + mode='fan_in', + nonlinearity='linear') + ]), + neck=dict(type='GlobalAveragePooling', dim=1), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + ), +) diff --git a/configs/_base_/models/mlp_mixer_large_patch16.py b/configs/_base_/models/mlp_mixer_large_patch16.py new file mode 100644 index 0000000000000000000000000000000000000000..ff107139bc9aa202b5b60696761f4167c25b5be3 --- /dev/null +++ b/configs/_base_/models/mlp_mixer_large_patch16.py @@ -0,0 +1,25 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='MlpMixer', + arch='l', + img_size=224, + patch_size=16, + drop_rate=0.1, + init_cfg=[ + dict( + type='Kaiming', + layer='Conv2d', + mode='fan_in', + nonlinearity='linear') + ]), + neck=dict(type='GlobalAveragePooling', dim=1), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + ), +) diff --git a/configs/_base_/models/mobilenet_v2_1x.py b/configs/_base_/models/mobilenet_v2_1x.py new file mode 100644 index 0000000000000000000000000000000000000000..6ebff1eff937a1390f23567c37debd164aeb8c9e --- /dev/null +++ b/configs/_base_/models/mobilenet_v2_1x.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='MobileNetV2', widen_factor=1.0), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/mobilenet_v3/mobilenet_v3_large_imagenet.py b/configs/_base_/models/mobilenet_v3/mobilenet_v3_large_imagenet.py new file mode 100644 index 0000000000000000000000000000000000000000..5318f50feeb7d0d3f54bd70e6f854d1a74fb0743 --- /dev/null +++ b/configs/_base_/models/mobilenet_v3/mobilenet_v3_large_imagenet.py @@ -0,0 +1,16 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='MobileNetV3', arch='large'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='StackedLinearClsHead', + num_classes=1000, + in_channels=960, + mid_channels=[1280], + dropout_rate=0.2, + act_cfg=dict(type='HSwish'), + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + init_cfg=dict( + type='Normal', layer='Linear', mean=0., std=0.01, bias=0.), + topk=(1, 5))) diff --git a/configs/_base_/models/mobilenet_v3/mobilenet_v3_small_050_imagenet.py b/configs/_base_/models/mobilenet_v3/mobilenet_v3_small_050_imagenet.py new file mode 100644 index 0000000000000000000000000000000000000000..6356efcd1bf4beacb200f9bb4a3780963c68a302 --- /dev/null +++ b/configs/_base_/models/mobilenet_v3/mobilenet_v3_small_050_imagenet.py @@ -0,0 +1,16 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='MobileNetV3', arch='small_050'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='StackedLinearClsHead', + num_classes=1000, + in_channels=288, + mid_channels=[1024], + dropout_rate=0.2, + act_cfg=dict(type='HSwish'), + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + init_cfg=dict( + type='Normal', layer='Linear', mean=0., std=0.01, bias=0.), + topk=(1, 5))) diff --git a/configs/_base_/models/mobilenet_v3/mobilenet_v3_small_075_imagenet.py b/configs/_base_/models/mobilenet_v3/mobilenet_v3_small_075_imagenet.py new file mode 100644 index 0000000000000000000000000000000000000000..19391ec26a2b1d86d0707a780e60033db166149c --- /dev/null +++ b/configs/_base_/models/mobilenet_v3/mobilenet_v3_small_075_imagenet.py @@ -0,0 +1,16 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='MobileNetV3', arch='small_075'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='StackedLinearClsHead', + num_classes=1000, + in_channels=432, + mid_channels=[1024], + dropout_rate=0.2, + act_cfg=dict(type='HSwish'), + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + init_cfg=dict( + type='Normal', layer='Linear', mean=0., std=0.01, bias=0.), + topk=(1, 5))) diff --git a/configs/_base_/models/mobilenet_v3/mobilenet_v3_small_cifar.py b/configs/_base_/models/mobilenet_v3/mobilenet_v3_small_cifar.py new file mode 100644 index 0000000000000000000000000000000000000000..5dbe980c47c83733b94a7cfe5b5ae44b3dd15729 --- /dev/null +++ b/configs/_base_/models/mobilenet_v3/mobilenet_v3_small_cifar.py @@ -0,0 +1,13 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='MobileNetV3', arch='small'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='StackedLinearClsHead', + num_classes=10, + in_channels=576, + mid_channels=[1280], + act_cfg=dict(type='HSwish'), + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5))) diff --git a/configs/_base_/models/mobilenet_v3/mobilenet_v3_small_imagenet.py b/configs/_base_/models/mobilenet_v3/mobilenet_v3_small_imagenet.py new file mode 100644 index 0000000000000000000000000000000000000000..af6cc1b8d9dcb5b0ec21b38317950149a8a61a10 --- /dev/null +++ b/configs/_base_/models/mobilenet_v3/mobilenet_v3_small_imagenet.py @@ -0,0 +1,16 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='MobileNetV3', arch='small'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='StackedLinearClsHead', + num_classes=1000, + in_channels=576, + mid_channels=[1024], + dropout_rate=0.2, + act_cfg=dict(type='HSwish'), + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + init_cfg=dict( + type='Normal', layer='Linear', mean=0., std=0.01, bias=0.), + topk=(1, 5))) diff --git a/configs/_base_/models/mobileone/mobileone_s0.py b/configs/_base_/models/mobileone/mobileone_s0.py new file mode 100644 index 0000000000000000000000000000000000000000..39624e5594e5270376a3e08719831f5e84ff234a --- /dev/null +++ b/configs/_base_/models/mobileone/mobileone_s0.py @@ -0,0 +1,19 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='MobileOne', + arch='s0', + out_indices=(3, ), + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + mode='original', + ), + topk=(1, 5), + )) diff --git a/configs/_base_/models/mobileone/mobileone_s1.py b/configs/_base_/models/mobileone/mobileone_s1.py new file mode 100644 index 0000000000000000000000000000000000000000..cea7762e4b93d6fde21901dbcdb9593209439a5f --- /dev/null +++ b/configs/_base_/models/mobileone/mobileone_s1.py @@ -0,0 +1,19 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='MobileOne', + arch='s1', + out_indices=(3, ), + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + mode='original', + ), + topk=(1, 5), + )) diff --git a/configs/_base_/models/mobileone/mobileone_s2.py b/configs/_base_/models/mobileone/mobileone_s2.py new file mode 100644 index 0000000000000000000000000000000000000000..dfae0e1f1a896830d0fde43fdada9f84c3fd3e30 --- /dev/null +++ b/configs/_base_/models/mobileone/mobileone_s2.py @@ -0,0 +1,19 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='MobileOne', + arch='s2', + out_indices=(3, ), + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + mode='original', + ), + topk=(1, 5), + )) diff --git a/configs/_base_/models/mobileone/mobileone_s3.py b/configs/_base_/models/mobileone/mobileone_s3.py new file mode 100644 index 0000000000000000000000000000000000000000..813567530413cc4b73a3aef08a8b58dc9fca47e1 --- /dev/null +++ b/configs/_base_/models/mobileone/mobileone_s3.py @@ -0,0 +1,19 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='MobileOne', + arch='s3', + out_indices=(3, ), + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + mode='original', + ), + topk=(1, 5), + )) diff --git a/configs/_base_/models/mobileone/mobileone_s4.py b/configs/_base_/models/mobileone/mobileone_s4.py new file mode 100644 index 0000000000000000000000000000000000000000..282eec8bcf1ce3adf2bfc3861734f1a5b65ea7bf --- /dev/null +++ b/configs/_base_/models/mobileone/mobileone_s4.py @@ -0,0 +1,19 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='MobileOne', + arch='s4', + out_indices=(3, ), + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + mode='original', + ), + topk=(1, 5), + )) diff --git a/configs/_base_/models/mobilevit/mobilevit_s.py b/configs/_base_/models/mobilevit/mobilevit_s.py new file mode 100644 index 0000000000000000000000000000000000000000..f6a4e05d2c8f1fc4f7b6a6b5953ff52cdfc7a2c6 --- /dev/null +++ b/configs/_base_/models/mobilevit/mobilevit_s.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='MobileViT', arch='small'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=640, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/mobilevit/mobilevit_xs.py b/configs/_base_/models/mobilevit/mobilevit_xs.py new file mode 100644 index 0000000000000000000000000000000000000000..f8c6ef08eb0876bd70508fe72fd81e45470ffbf8 --- /dev/null +++ b/configs/_base_/models/mobilevit/mobilevit_xs.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='MobileViT', arch='x_small'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=384, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/mobilevit/mobilevit_xxs.py b/configs/_base_/models/mobilevit/mobilevit_xxs.py new file mode 100644 index 0000000000000000000000000000000000000000..e1c26e6f3e9f559b2599589b7de690ef45ea5611 --- /dev/null +++ b/configs/_base_/models/mobilevit/mobilevit_xxs.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='MobileViT', arch='xx_small'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=320, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/mvit/mvitv2-base.py b/configs/_base_/models/mvit/mvitv2-base.py new file mode 100644 index 0000000000000000000000000000000000000000..0cb6064f627bb9ec8e80295623be6c734d1c03c9 --- /dev/null +++ b/configs/_base_/models/mvit/mvitv2-base.py @@ -0,0 +1,19 @@ +model = dict( + type='ImageClassifier', + backbone=dict(type='MViT', arch='base', drop_path_rate=0.3), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + in_channels=768, + num_classes=1000, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/mvit/mvitv2-large.py b/configs/_base_/models/mvit/mvitv2-large.py new file mode 100644 index 0000000000000000000000000000000000000000..2c84424311334030010f4b0651876ee8c3bc57cc --- /dev/null +++ b/configs/_base_/models/mvit/mvitv2-large.py @@ -0,0 +1,23 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='MViT', + arch='large', + drop_path_rate=0.5, + dim_mul_in_attention=False), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + in_channels=1152, + num_classes=1000, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/mvit/mvitv2-small.py b/configs/_base_/models/mvit/mvitv2-small.py new file mode 100644 index 0000000000000000000000000000000000000000..df895f2950cbf7aa009c308a86352147e427e309 --- /dev/null +++ b/configs/_base_/models/mvit/mvitv2-small.py @@ -0,0 +1,19 @@ +model = dict( + type='ImageClassifier', + backbone=dict(type='MViT', arch='small', drop_path_rate=0.1), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + in_channels=768, + num_classes=1000, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/mvit/mvitv2-tiny.py b/configs/_base_/models/mvit/mvitv2-tiny.py new file mode 100644 index 0000000000000000000000000000000000000000..836f04bfce975487ccb05d38f47150e128313918 --- /dev/null +++ b/configs/_base_/models/mvit/mvitv2-tiny.py @@ -0,0 +1,19 @@ +model = dict( + type='ImageClassifier', + backbone=dict(type='MViT', arch='tiny', drop_path_rate=0.1), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + in_channels=768, + num_classes=1000, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/poolformer/poolformer_m36.py b/configs/_base_/models/poolformer/poolformer_m36.py new file mode 100644 index 0000000000000000000000000000000000000000..276a72122b18f0731aded4c7652897d92814d53d --- /dev/null +++ b/configs/_base_/models/poolformer/poolformer_m36.py @@ -0,0 +1,22 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='PoolFormer', + arch='m36', + drop_path_rate=0.1, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['GroupNorm'], val=1., bias=0.), + ]), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/poolformer/poolformer_m48.py b/configs/_base_/models/poolformer/poolformer_m48.py new file mode 100644 index 0000000000000000000000000000000000000000..8c006acbc0d01caa8ecc66b26a3d7b0e75725dab --- /dev/null +++ b/configs/_base_/models/poolformer/poolformer_m48.py @@ -0,0 +1,22 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='PoolFormer', + arch='m48', + drop_path_rate=0.1, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['GroupNorm'], val=1., bias=0.), + ]), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/poolformer/poolformer_s12.py b/configs/_base_/models/poolformer/poolformer_s12.py new file mode 100644 index 0000000000000000000000000000000000000000..b7b3600f35813acc633845050b1280873ac7ee47 --- /dev/null +++ b/configs/_base_/models/poolformer/poolformer_s12.py @@ -0,0 +1,22 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='PoolFormer', + arch='s12', + drop_path_rate=0.1, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['GroupNorm'], val=1., bias=0.), + ]), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/poolformer/poolformer_s24.py b/configs/_base_/models/poolformer/poolformer_s24.py new file mode 100644 index 0000000000000000000000000000000000000000..822ab5b309c043569cfff4f124680906e9593a5b --- /dev/null +++ b/configs/_base_/models/poolformer/poolformer_s24.py @@ -0,0 +1,22 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='PoolFormer', + arch='s24', + drop_path_rate=0.1, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['GroupNorm'], val=1., bias=0.), + ]), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/poolformer/poolformer_s36.py b/configs/_base_/models/poolformer/poolformer_s36.py new file mode 100644 index 0000000000000000000000000000000000000000..489f2223c0dbfe25d02dc804843ff8ce379639d2 --- /dev/null +++ b/configs/_base_/models/poolformer/poolformer_s36.py @@ -0,0 +1,22 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='PoolFormer', + arch='s36', + drop_path_rate=0.1, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['GroupNorm'], val=1., bias=0.), + ]), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/regnet/regnetx_1.6gf.py b/configs/_base_/models/regnet/regnetx_1.6gf.py new file mode 100644 index 0000000000000000000000000000000000000000..b81f0ad25bc5c6ccf1775e580f59b86a851fb950 --- /dev/null +++ b/configs/_base_/models/regnet/regnetx_1.6gf.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='RegNet', arch='regnetx_1.6gf'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=912, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/regnet/regnetx_12gf.py b/configs/_base_/models/regnet/regnetx_12gf.py new file mode 100644 index 0000000000000000000000000000000000000000..383d4f87992d3d7cb6b9de35e2a82e371a46b12c --- /dev/null +++ b/configs/_base_/models/regnet/regnetx_12gf.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='RegNet', arch='regnetx_12gf'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2240, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/regnet/regnetx_3.2gf.py b/configs/_base_/models/regnet/regnetx_3.2gf.py new file mode 100644 index 0000000000000000000000000000000000000000..67d454139586d60c17f5468807f761f7835fd0f7 --- /dev/null +++ b/configs/_base_/models/regnet/regnetx_3.2gf.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='RegNet', arch='regnetx_3.2gf'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1008, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/regnet/regnetx_4.0gf.py b/configs/_base_/models/regnet/regnetx_4.0gf.py new file mode 100644 index 0000000000000000000000000000000000000000..01419c64bd18a5a1f9a0c9606209726b957f24ea --- /dev/null +++ b/configs/_base_/models/regnet/regnetx_4.0gf.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='RegNet', arch='regnetx_4.0gf'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1360, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/regnet/regnetx_400mf.py b/configs/_base_/models/regnet/regnetx_400mf.py new file mode 100644 index 0000000000000000000000000000000000000000..ef518b9f7df4484c158d24e9522a61e41cca3f15 --- /dev/null +++ b/configs/_base_/models/regnet/regnetx_400mf.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='RegNet', arch='regnetx_400mf'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=384, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/regnet/regnetx_6.4gf.py b/configs/_base_/models/regnet/regnetx_6.4gf.py new file mode 100644 index 0000000000000000000000000000000000000000..44e6222af015cd5a93e5feccdb98348f1da3991a --- /dev/null +++ b/configs/_base_/models/regnet/regnetx_6.4gf.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='RegNet', arch='regnetx_6.4gf'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1624, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/regnet/regnetx_8.0gf.py b/configs/_base_/models/regnet/regnetx_8.0gf.py new file mode 100644 index 0000000000000000000000000000000000000000..29298268d767b45d3d5dcde4dd72663b1c407525 --- /dev/null +++ b/configs/_base_/models/regnet/regnetx_8.0gf.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='RegNet', arch='regnetx_8.0gf'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1920, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/regnet/regnetx_800mf.py b/configs/_base_/models/regnet/regnetx_800mf.py new file mode 100644 index 0000000000000000000000000000000000000000..210f760fe29c104c662123af4cecef143ddc9ec3 --- /dev/null +++ b/configs/_base_/models/regnet/regnetx_800mf.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='RegNet', arch='regnetx_800mf'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=672, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/replknet-31B_in1k.py b/configs/_base_/models/replknet-31B_in1k.py new file mode 100644 index 0000000000000000000000000000000000000000..0cc50959d4bfc4597269de078ecabe5c663963b2 --- /dev/null +++ b/configs/_base_/models/replknet-31B_in1k.py @@ -0,0 +1,25 @@ +from mmpretrain.models import build_classifier + +model = dict( + type='ImageClassifier', + backbone=dict( + type='RepLKNet', + arch='31B', + out_indices=(3, ), + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) + +if __name__ == '__main__': + # model.pop('type') + model = build_classifier(model) + model.eval() + print('------------------- training-time model -------------') + for i in model.state_dict().keys(): + print(i) diff --git a/configs/_base_/models/replknet-31L_in1k.py b/configs/_base_/models/replknet-31L_in1k.py new file mode 100644 index 0000000000000000000000000000000000000000..7830fb06f74a1ba2d7d437cc7733f446ecb12872 --- /dev/null +++ b/configs/_base_/models/replknet-31L_in1k.py @@ -0,0 +1,15 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='RepLKNet', + arch='31L', + out_indices=(3, ), + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/replknet-XL_in1k.py b/configs/_base_/models/replknet-XL_in1k.py new file mode 100644 index 0000000000000000000000000000000000000000..b63f3459c9914a247e8373e1fba4cbd8b4a5a81a --- /dev/null +++ b/configs/_base_/models/replknet-XL_in1k.py @@ -0,0 +1,15 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='RepLKNet', + arch='XL', + out_indices=(3, ), + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/repmlp-base_224.py b/configs/_base_/models/repmlp-base_224.py new file mode 100644 index 0000000000000000000000000000000000000000..7db0077882168d1466fede11243f70837df29395 --- /dev/null +++ b/configs/_base_/models/repmlp-base_224.py @@ -0,0 +1,18 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='RepMLPNet', + arch='B', + img_size=224, + out_indices=(3, ), + reparam_conv_kernels=(1, 3), + deploy=False), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/repvgg-A0_in1k.py b/configs/_base_/models/repvgg-A0_in1k.py new file mode 100644 index 0000000000000000000000000000000000000000..093ffb7eea9f6af6a17e6fe766ba1f1a6160b28d --- /dev/null +++ b/configs/_base_/models/repvgg-A0_in1k.py @@ -0,0 +1,15 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='RepVGG', + arch='A0', + out_indices=(3, ), + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1280, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/repvgg-B3_lbs-mixup_in1k.py b/configs/_base_/models/repvgg-B3_lbs-mixup_in1k.py new file mode 100644 index 0000000000000000000000000000000000000000..d88e687b35df35cd5993d24d929a686bf0af6f8b --- /dev/null +++ b/configs/_base_/models/repvgg-B3_lbs-mixup_in1k.py @@ -0,0 +1,22 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='RepVGG', + arch='B3', + out_indices=(3, ), + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2560, + loss=dict( + type='LabelSmoothLoss', + loss_weight=1.0, + label_smooth_val=0.1, + mode='classy_vision', + num_classes=1000), + topk=(1, 5), + ), + train_cfg=dict(augments=dict(type='Mixup', alpha=0.2)), +) diff --git a/configs/_base_/models/res2net101-w26-s4.py b/configs/_base_/models/res2net101-w26-s4.py new file mode 100644 index 0000000000000000000000000000000000000000..3bf64c508f95f8f3d2eb14afbe85799a49ee69aa --- /dev/null +++ b/configs/_base_/models/res2net101-w26-s4.py @@ -0,0 +1,18 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='Res2Net', + depth=101, + scales=4, + base_width=26, + deep_stem=False, + avg_down=False, + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/res2net50-w14-s8.py b/configs/_base_/models/res2net50-w14-s8.py new file mode 100644 index 0000000000000000000000000000000000000000..5875142c34d64f8414929bd43ccf37971bc97df8 --- /dev/null +++ b/configs/_base_/models/res2net50-w14-s8.py @@ -0,0 +1,18 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='Res2Net', + depth=50, + scales=8, + base_width=14, + deep_stem=False, + avg_down=False, + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/res2net50-w26-s4.py b/configs/_base_/models/res2net50-w26-s4.py new file mode 100644 index 0000000000000000000000000000000000000000..be8fdb585903564a9572b575b48967dd1a12c3f4 --- /dev/null +++ b/configs/_base_/models/res2net50-w26-s4.py @@ -0,0 +1,18 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='Res2Net', + depth=50, + scales=4, + base_width=26, + deep_stem=False, + avg_down=False, + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/res2net50-w26-s6.py b/configs/_base_/models/res2net50-w26-s6.py new file mode 100644 index 0000000000000000000000000000000000000000..281b136a67e245ee90e94bd1495b449af39118e3 --- /dev/null +++ b/configs/_base_/models/res2net50-w26-s6.py @@ -0,0 +1,18 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='Res2Net', + depth=50, + scales=6, + base_width=26, + deep_stem=False, + avg_down=False, + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/res2net50-w26-s8.py b/configs/_base_/models/res2net50-w26-s8.py new file mode 100644 index 0000000000000000000000000000000000000000..b4f62f3ed19e4ba1f833a23cb5c8d434456b5b07 --- /dev/null +++ b/configs/_base_/models/res2net50-w26-s8.py @@ -0,0 +1,18 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='Res2Net', + depth=50, + scales=8, + base_width=26, + deep_stem=False, + avg_down=False, + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/res2net50-w48-s2.py b/configs/_base_/models/res2net50-w48-s2.py new file mode 100644 index 0000000000000000000000000000000000000000..8675c91fa008f72ddcaa10f11b91e1f6feb79953 --- /dev/null +++ b/configs/_base_/models/res2net50-w48-s2.py @@ -0,0 +1,18 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='Res2Net', + depth=50, + scales=2, + base_width=48, + deep_stem=False, + avg_down=False, + ), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnest101.py b/configs/_base_/models/resnest101.py new file mode 100644 index 0000000000000000000000000000000000000000..3780c1549359ec1850ce1db546d23a667e699d4f --- /dev/null +++ b/configs/_base_/models/resnest101.py @@ -0,0 +1,25 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNeSt', + depth=101, + num_stages=4, + stem_channels=128, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + num_classes=1000, + reduction='mean', + loss_weight=1.0), + topk=(1, 5), + cal_acc=False), + train_cfg=dict(augments=dict(type='Mixup', alpha=0.2)), +) diff --git a/configs/_base_/models/resnest200.py b/configs/_base_/models/resnest200.py new file mode 100644 index 0000000000000000000000000000000000000000..40d8f03e7f528f8c0132bd2c19515460fd47fe70 --- /dev/null +++ b/configs/_base_/models/resnest200.py @@ -0,0 +1,25 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNeSt', + depth=200, + num_stages=4, + stem_channels=128, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + num_classes=1000, + reduction='mean', + loss_weight=1.0), + topk=(1, 5), + cal_acc=False), + train_cfg=dict(augments=dict(type='Mixup', alpha=0.2)), +) diff --git a/configs/_base_/models/resnest269.py b/configs/_base_/models/resnest269.py new file mode 100644 index 0000000000000000000000000000000000000000..c37626f5678630383693d784d2590f27caa11de2 --- /dev/null +++ b/configs/_base_/models/resnest269.py @@ -0,0 +1,25 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNeSt', + depth=269, + num_stages=4, + stem_channels=128, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + num_classes=1000, + reduction='mean', + loss_weight=1.0), + topk=(1, 5), + cal_acc=False), + train_cfg=dict(augments=dict(type='Mixup', alpha=0.2)), +) diff --git a/configs/_base_/models/resnest50.py b/configs/_base_/models/resnest50.py new file mode 100644 index 0000000000000000000000000000000000000000..51c90e86f468edccc3de3b0e7cd783548d220db4 --- /dev/null +++ b/configs/_base_/models/resnest50.py @@ -0,0 +1,24 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNeSt', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + num_classes=1000, + reduction='mean', + loss_weight=1.0), + topk=(1, 5), + cal_acc=False), + train_cfg=dict(augments=dict(type='Mixup', alpha=0.2)), +) diff --git a/configs/_base_/models/resnet101.py b/configs/_base_/models/resnet101.py new file mode 100644 index 0000000000000000000000000000000000000000..1147cd4be9aff00ad6ce66c31e2839c1a94f9ca3 --- /dev/null +++ b/configs/_base_/models/resnet101.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=101, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnet101_cifar.py b/configs/_base_/models/resnet101_cifar.py new file mode 100644 index 0000000000000000000000000000000000000000..a84d470e3a9828532e5cddcb1a3f7aa4fcae9f68 --- /dev/null +++ b/configs/_base_/models/resnet101_cifar.py @@ -0,0 +1,16 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet_CIFAR', + depth=101, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=10, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/resnet152.py b/configs/_base_/models/resnet152.py new file mode 100644 index 0000000000000000000000000000000000000000..94a718c3cec213727a7a2f11baeb3594fd37532e --- /dev/null +++ b/configs/_base_/models/resnet152.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=152, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnet152_cifar.py b/configs/_base_/models/resnet152_cifar.py new file mode 100644 index 0000000000000000000000000000000000000000..55c0cc6c66dbde26bebe6d99d791c3e3f28e4e27 --- /dev/null +++ b/configs/_base_/models/resnet152_cifar.py @@ -0,0 +1,16 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet_CIFAR', + depth=152, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=10, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/resnet18.py b/configs/_base_/models/resnet18.py new file mode 100644 index 0000000000000000000000000000000000000000..7c66758ee4aadced38c815e98af68b74aa310a2e --- /dev/null +++ b/configs/_base_/models/resnet18.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=18, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnet18_cifar.py b/configs/_base_/models/resnet18_cifar.py new file mode 100644 index 0000000000000000000000000000000000000000..7b9cf1e7337de73aa21515547b6c3d16e2b178ea --- /dev/null +++ b/configs/_base_/models/resnet18_cifar.py @@ -0,0 +1,16 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet_CIFAR', + depth=18, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=10, + in_channels=512, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/resnet34.py b/configs/_base_/models/resnet34.py new file mode 100644 index 0000000000000000000000000000000000000000..100ee286bead6b5dd88f1752660e8ab9d0498e37 --- /dev/null +++ b/configs/_base_/models/resnet34.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=34, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnet34_cifar.py b/configs/_base_/models/resnet34_cifar.py new file mode 100644 index 0000000000000000000000000000000000000000..55d033bc30bcbde7aef8e57ad950f59c248ad74b --- /dev/null +++ b/configs/_base_/models/resnet34_cifar.py @@ -0,0 +1,16 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet_CIFAR', + depth=34, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=10, + in_channels=512, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/resnet34_gem.py b/configs/_base_/models/resnet34_gem.py new file mode 100644 index 0000000000000000000000000000000000000000..5c0e0d3e8dc5d7a0b259f1624ee2402af8a401cd --- /dev/null +++ b/configs/_base_/models/resnet34_gem.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=34, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GeneralizedMeanPooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnet50.py b/configs/_base_/models/resnet50.py new file mode 100644 index 0000000000000000000000000000000000000000..129a2bb50c91f3034997d216f3a9efb743d9cc40 --- /dev/null +++ b/configs/_base_/models/resnet50.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnet50_cifar.py b/configs/_base_/models/resnet50_cifar.py new file mode 100644 index 0000000000000000000000000000000000000000..33b66d526482245237faa2862d376797c21a8ee4 --- /dev/null +++ b/configs/_base_/models/resnet50_cifar.py @@ -0,0 +1,16 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet_CIFAR', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=10, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/resnet50_cifar_cutmix.py b/configs/_base_/models/resnet50_cifar_cutmix.py new file mode 100644 index 0000000000000000000000000000000000000000..73c38be271a90b1655ae63e4f36cf6c3a3c5fdc4 --- /dev/null +++ b/configs/_base_/models/resnet50_cifar_cutmix.py @@ -0,0 +1,18 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet_CIFAR', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='MultiLabelLinearClsHead', + num_classes=10, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0, use_soft=True)), + train_cfg=dict( + augments=dict(type='BatchCutMix', alpha=1.0, num_classes=10, + prob=1.0))) diff --git a/configs/_base_/models/resnet50_cifar_mixup.py b/configs/_base_/models/resnet50_cifar_mixup.py new file mode 100644 index 0000000000000000000000000000000000000000..f165c2466bd8a67cbfadd5f3a388d4fe03e6d446 --- /dev/null +++ b/configs/_base_/models/resnet50_cifar_mixup.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet_CIFAR', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='MultiLabelLinearClsHead', + num_classes=10, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0, use_soft=True)), + train_cfg=dict(augments=dict(type='Mixup', alpha=1.)), +) diff --git a/configs/_base_/models/resnet50_cutmix.py b/configs/_base_/models/resnet50_cutmix.py new file mode 100644 index 0000000000000000000000000000000000000000..fb79088b798d1c16eb6c336006143c2fe288e6a2 --- /dev/null +++ b/configs/_base_/models/resnet50_cutmix.py @@ -0,0 +1,18 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='MultiLabelLinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0, use_soft=True)), + train_cfg=dict( + augments=dict( + type='BatchCutMix', alpha=1.0, num_classes=1000, prob=1.0))) diff --git a/configs/_base_/models/resnet50_label_smooth.py b/configs/_base_/models/resnet50_label_smooth.py new file mode 100644 index 0000000000000000000000000000000000000000..b6f793751904658b3e7e01a5ffdaa6b86e156e66 --- /dev/null +++ b/configs/_base_/models/resnet50_label_smooth.py @@ -0,0 +1,18 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnet50_mixup.py b/configs/_base_/models/resnet50_mixup.py new file mode 100644 index 0000000000000000000000000000000000000000..23130a69c98823a6979dcd7ee7441746753a9865 --- /dev/null +++ b/configs/_base_/models/resnet50_mixup.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='MultiLabelLinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0, use_soft=True)), + train_cfg=dict(augments=dict(type='Mixup', alpha=0.2)), +) diff --git a/configs/_base_/models/resnetv1c50.py b/configs/_base_/models/resnetv1c50.py new file mode 100644 index 0000000000000000000000000000000000000000..3b973e20181cd3cf1c470db84abf97aeaa0549c1 --- /dev/null +++ b/configs/_base_/models/resnetv1c50.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnetv1d101.py b/configs/_base_/models/resnetv1d101.py new file mode 100644 index 0000000000000000000000000000000000000000..1e56223121fb22ac089800ebeb69310758d0f2e7 --- /dev/null +++ b/configs/_base_/models/resnetv1d101.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNetV1d', + depth=101, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnetv1d152.py b/configs/_base_/models/resnetv1d152.py new file mode 100644 index 0000000000000000000000000000000000000000..58cc73beb318e38f9ce79154a1265be1a7dba17b --- /dev/null +++ b/configs/_base_/models/resnetv1d152.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNetV1d', + depth=152, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnetv1d50.py b/configs/_base_/models/resnetv1d50.py new file mode 100644 index 0000000000000000000000000000000000000000..015aaa3d8182cae50f392d7103e24e8ac8a188aa --- /dev/null +++ b/configs/_base_/models/resnetv1d50.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNetV1d', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnext101_32x4d.py b/configs/_base_/models/resnext101_32x4d.py new file mode 100644 index 0000000000000000000000000000000000000000..1c89fb6488701c83f12e623ae606abbe3b78799f --- /dev/null +++ b/configs/_base_/models/resnext101_32x4d.py @@ -0,0 +1,19 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNeXt', + depth=101, + num_stages=4, + out_indices=(3, ), + groups=32, + width_per_group=4, + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnext101_32x8d.py b/configs/_base_/models/resnext101_32x8d.py new file mode 100644 index 0000000000000000000000000000000000000000..2bb63f3aeb8b37eb701135ed1c6bf2d15869fae3 --- /dev/null +++ b/configs/_base_/models/resnext101_32x8d.py @@ -0,0 +1,19 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNeXt', + depth=101, + num_stages=4, + out_indices=(3, ), + groups=32, + width_per_group=8, + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnext152_32x4d.py b/configs/_base_/models/resnext152_32x4d.py new file mode 100644 index 0000000000000000000000000000000000000000..d392eff3dc673b0b74ed013c030152a0107799a2 --- /dev/null +++ b/configs/_base_/models/resnext152_32x4d.py @@ -0,0 +1,19 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNeXt', + depth=152, + num_stages=4, + out_indices=(3, ), + groups=32, + width_per_group=4, + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/resnext50_32x4d.py b/configs/_base_/models/resnext50_32x4d.py new file mode 100644 index 0000000000000000000000000000000000000000..060426231e8cd845fda17ea053478cf7f57b940a --- /dev/null +++ b/configs/_base_/models/resnext50_32x4d.py @@ -0,0 +1,19 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNeXt', + depth=50, + num_stages=4, + out_indices=(3, ), + groups=32, + width_per_group=4, + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/revvit/revvit-base.py b/configs/_base_/models/revvit/revvit-base.py new file mode 100644 index 0000000000000000000000000000000000000000..85b7af42ea7fd6856fd81bc99ee829fb40bce435 --- /dev/null +++ b/configs/_base_/models/revvit/revvit-base.py @@ -0,0 +1,27 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='RevVisionTransformer', + arch='deit-base', + img_size=224, + patch_size=16, + out_type='avg_featmap', + ), + neck=None, + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/revvit/revvit-small.py b/configs/_base_/models/revvit/revvit-small.py new file mode 100644 index 0000000000000000000000000000000000000000..dd1a0b2661ac2cf54554c06bd729477b94dad908 --- /dev/null +++ b/configs/_base_/models/revvit/revvit-small.py @@ -0,0 +1,27 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='RevVisionTransformer', + arch='deit-small', + img_size=224, + patch_size=16, + out_type='avg_featmap', + ), + neck=None, + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + ), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/seresnet101.py b/configs/_base_/models/seresnet101.py new file mode 100644 index 0000000000000000000000000000000000000000..137a6f90f6bca160a073877fc43ea6398fa1d0b4 --- /dev/null +++ b/configs/_base_/models/seresnet101.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SEResNet', + depth=101, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/seresnet50.py b/configs/_base_/models/seresnet50.py new file mode 100644 index 0000000000000000000000000000000000000000..e5f6bfce8db9ed75936229bf57992a0211a95b7d --- /dev/null +++ b/configs/_base_/models/seresnet50.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SEResNet', + depth=50, + num_stages=4, + out_indices=(3, ), + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/seresnext101_32x4d.py b/configs/_base_/models/seresnext101_32x4d.py new file mode 100644 index 0000000000000000000000000000000000000000..cc8a62c39305993bf9b717edf980a1546de12a2b --- /dev/null +++ b/configs/_base_/models/seresnext101_32x4d.py @@ -0,0 +1,20 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SEResNeXt', + depth=101, + num_stages=4, + out_indices=(3, ), + groups=32, + width_per_group=4, + se_ratio=16, + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/seresnext50_32x4d.py b/configs/_base_/models/seresnext50_32x4d.py new file mode 100644 index 0000000000000000000000000000000000000000..0cdf7cb696be22d3a5fa5829162052c8b9b7e7a8 --- /dev/null +++ b/configs/_base_/models/seresnext50_32x4d.py @@ -0,0 +1,20 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SEResNeXt', + depth=50, + num_stages=4, + out_indices=(3, ), + groups=32, + width_per_group=4, + se_ratio=16, + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/shufflenet_v1_1x.py b/configs/_base_/models/shufflenet_v1_1x.py new file mode 100644 index 0000000000000000000000000000000000000000..f0f9d1fbdde759e6c13d9a02705072b3f11faf02 --- /dev/null +++ b/configs/_base_/models/shufflenet_v1_1x.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='ShuffleNetV1', groups=3), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=960, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/shufflenet_v2_1x.py b/configs/_base_/models/shufflenet_v2_1x.py new file mode 100644 index 0000000000000000000000000000000000000000..190800e343d75a89ffb67a1f7dd33db04d26429d --- /dev/null +++ b/configs/_base_/models/shufflenet_v2_1x.py @@ -0,0 +1,12 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='ShuffleNetV2', widen_factor=1.0), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/swin_transformer/base_224.py b/configs/_base_/models/swin_transformer/base_224.py new file mode 100644 index 0000000000000000000000000000000000000000..b7c277f2d6494a6d069bcf053349d8c5df2a0bc3 --- /dev/null +++ b/configs/_base_/models/swin_transformer/base_224.py @@ -0,0 +1,23 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformer', arch='base', img_size=224, drop_path_rate=0.5), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/swin_transformer/base_384.py b/configs/_base_/models/swin_transformer/base_384.py new file mode 100644 index 0000000000000000000000000000000000000000..ce78981fb0775bdb4048522f32e25c58e2159160 --- /dev/null +++ b/configs/_base_/models/swin_transformer/base_384.py @@ -0,0 +1,16 @@ +# model settings +# Only for evaluation +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformer', + arch='base', + img_size=384, + stage_cfgs=dict(block_cfgs=dict(window_size=12))), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5))) diff --git a/configs/_base_/models/swin_transformer/base_384_aug.py b/configs/_base_/models/swin_transformer/base_384_aug.py new file mode 100644 index 0000000000000000000000000000000000000000..5d56a339054eba5b9fb1f3948aa03041023ac68b --- /dev/null +++ b/configs/_base_/models/swin_transformer/base_384_aug.py @@ -0,0 +1,26 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformer', + arch='base', + img_size=384, + stage_cfgs=dict(block_cfgs=dict(window_size=12)), + drop_path_rate=0.5), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/swin_transformer/large_224.py b/configs/_base_/models/swin_transformer/large_224.py new file mode 100644 index 0000000000000000000000000000000000000000..747d00e44d4b81383998d7f18b7ae8668bf41c5f --- /dev/null +++ b/configs/_base_/models/swin_transformer/large_224.py @@ -0,0 +1,12 @@ +# model settings +# Only for evaluation +model = dict( + type='ImageClassifier', + backbone=dict(type='SwinTransformer', arch='large', img_size=224), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5))) diff --git a/configs/_base_/models/swin_transformer/large_384.py b/configs/_base_/models/swin_transformer/large_384.py new file mode 100644 index 0000000000000000000000000000000000000000..7026f81a31de2adc445b8ce45520904205f72cee --- /dev/null +++ b/configs/_base_/models/swin_transformer/large_384.py @@ -0,0 +1,16 @@ +# model settings +# Only for evaluation +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformer', + arch='large', + img_size=384, + stage_cfgs=dict(block_cfgs=dict(window_size=12))), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5))) diff --git a/configs/_base_/models/swin_transformer/small_224.py b/configs/_base_/models/swin_transformer/small_224.py new file mode 100644 index 0000000000000000000000000000000000000000..d87d9d9af6ce9c80581dc03925ed13b4b36893fc --- /dev/null +++ b/configs/_base_/models/swin_transformer/small_224.py @@ -0,0 +1,24 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformer', arch='small', img_size=224, + drop_path_rate=0.3), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/swin_transformer/tiny_224.py b/configs/_base_/models/swin_transformer/tiny_224.py new file mode 100644 index 0000000000000000000000000000000000000000..f1781cf5f84fe9dd8386b29337a9fe4f6d717784 --- /dev/null +++ b/configs/_base_/models/swin_transformer/tiny_224.py @@ -0,0 +1,23 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformer', arch='tiny', img_size=224, drop_path_rate=0.2), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/swin_transformer_v2/base_256.py b/configs/_base_/models/swin_transformer_v2/base_256.py new file mode 100644 index 0000000000000000000000000000000000000000..66594db25b17a20a346fcff944f2d37d8ff860f7 --- /dev/null +++ b/configs/_base_/models/swin_transformer_v2/base_256.py @@ -0,0 +1,26 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformerV2', + arch='base', + img_size=256, + drop_path_rate=0.5), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/swin_transformer_v2/base_384.py b/configs/_base_/models/swin_transformer_v2/base_384.py new file mode 100644 index 0000000000000000000000000000000000000000..5fb9aead2e98bba3f9277a02024981a1e22b6046 --- /dev/null +++ b/configs/_base_/models/swin_transformer_v2/base_384.py @@ -0,0 +1,17 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformerV2', + arch='base', + img_size=384, + drop_path_rate=0.2), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False)) diff --git a/configs/_base_/models/swin_transformer_v2/base_384_aug.py b/configs/_base_/models/swin_transformer_v2/base_384_aug.py new file mode 100644 index 0000000000000000000000000000000000000000..d7ec54eefa419dc57b4f25df32eee8b5caf02787 --- /dev/null +++ b/configs/_base_/models/swin_transformer_v2/base_384_aug.py @@ -0,0 +1,25 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformerV2', + arch='base', + img_size=384, + drop_path_rate=0.2), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1024, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/swin_transformer_v2/large_256.py b/configs/_base_/models/swin_transformer_v2/large_256.py new file mode 100644 index 0000000000000000000000000000000000000000..fe557c32058be1563ed50696b9f44b95b3bb3bed --- /dev/null +++ b/configs/_base_/models/swin_transformer_v2/large_256.py @@ -0,0 +1,16 @@ +# model settings +# Only for evaluation +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformerV2', + arch='large', + img_size=256, + drop_path_rate=0.2), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5))) diff --git a/configs/_base_/models/swin_transformer_v2/large_384.py b/configs/_base_/models/swin_transformer_v2/large_384.py new file mode 100644 index 0000000000000000000000000000000000000000..a626c40715d1ea2cb1fb0cda0a249d1df01544dc --- /dev/null +++ b/configs/_base_/models/swin_transformer_v2/large_384.py @@ -0,0 +1,16 @@ +# model settings +# Only for evaluation +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformerV2', + arch='large', + img_size=384, + drop_path_rate=0.2), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5))) diff --git a/configs/_base_/models/swin_transformer_v2/large_384_aug.py b/configs/_base_/models/swin_transformer_v2/large_384_aug.py new file mode 100644 index 0000000000000000000000000000000000000000..0119d183884c593384040be6fd370a41edf78840 --- /dev/null +++ b/configs/_base_/models/swin_transformer_v2/large_384_aug.py @@ -0,0 +1,26 @@ +# model settings +# Only for evaluation +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformerV2', + arch='large', + img_size=384, + drop_path_rate=0.2), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=1536, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ])) diff --git a/configs/_base_/models/swin_transformer_v2/small_256.py b/configs/_base_/models/swin_transformer_v2/small_256.py new file mode 100644 index 0000000000000000000000000000000000000000..0ec706ff0e16e44027fad3ee54e93280018d76bd --- /dev/null +++ b/configs/_base_/models/swin_transformer_v2/small_256.py @@ -0,0 +1,26 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformerV2', + arch='small', + img_size=256, + drop_path_rate=0.3), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/swin_transformer_v2/tiny_256.py b/configs/_base_/models/swin_transformer_v2/tiny_256.py new file mode 100644 index 0000000000000000000000000000000000000000..61055a1310ab86bea26d427fe445bc4cfe7bf89e --- /dev/null +++ b/configs/_base_/models/swin_transformer_v2/tiny_256.py @@ -0,0 +1,26 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SwinTransformerV2', + arch='tiny', + img_size=256, + drop_path_rate=0.2), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/t2t-vit-t-14.py b/configs/_base_/models/t2t-vit-t-14.py new file mode 100644 index 0000000000000000000000000000000000000000..58ea660e742b1ef8edf93fb10ac1331734a4dbe5 --- /dev/null +++ b/configs/_base_/models/t2t-vit-t-14.py @@ -0,0 +1,42 @@ +# model settings +embed_dims = 384 +num_classes = 1000 + +model = dict( + type='ImageClassifier', + backbone=dict( + type='T2T_ViT', + img_size=224, + in_channels=3, + embed_dims=embed_dims, + t2t_cfg=dict( + token_dims=64, + use_performer=False, + ), + num_layers=14, + layer_cfgs=dict( + num_heads=6, + feedforward_channels=3 * embed_dims, # mlp_ratio = 3 + ), + drop_path_rate=0.1, + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ]), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=num_classes, + in_channels=embed_dims, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + mode='original', + ), + topk=(1, 5), + init_cfg=dict(type='TruncNormal', layer='Linear', std=.02)), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0), + ]), +) diff --git a/configs/_base_/models/t2t-vit-t-19.py b/configs/_base_/models/t2t-vit-t-19.py new file mode 100644 index 0000000000000000000000000000000000000000..51741c7a7cbcfd8f13fb1574f831978a144ca1a4 --- /dev/null +++ b/configs/_base_/models/t2t-vit-t-19.py @@ -0,0 +1,42 @@ +# model settings +embed_dims = 448 +num_classes = 1000 + +model = dict( + type='ImageClassifier', + backbone=dict( + type='T2T_ViT', + img_size=224, + in_channels=3, + embed_dims=embed_dims, + t2t_cfg=dict( + token_dims=64, + use_performer=False, + ), + num_layers=19, + layer_cfgs=dict( + num_heads=7, + feedforward_channels=3 * embed_dims, # mlp_ratio = 3 + ), + drop_path_rate=0.1, + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ]), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=num_classes, + in_channels=embed_dims, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + mode='original', + ), + topk=(1, 5), + init_cfg=dict(type='TruncNormal', layer='Linear', std=.02)), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0), + ]), +) diff --git a/configs/_base_/models/t2t-vit-t-24.py b/configs/_base_/models/t2t-vit-t-24.py new file mode 100644 index 0000000000000000000000000000000000000000..ad772cf6e614bbca630ffad75393614415102bb9 --- /dev/null +++ b/configs/_base_/models/t2t-vit-t-24.py @@ -0,0 +1,42 @@ +# model settings +embed_dims = 512 +num_classes = 1000 + +model = dict( + type='ImageClassifier', + backbone=dict( + type='T2T_ViT', + img_size=224, + in_channels=3, + embed_dims=embed_dims, + t2t_cfg=dict( + token_dims=64, + use_performer=False, + ), + num_layers=24, + layer_cfgs=dict( + num_heads=8, + feedforward_channels=3 * embed_dims, # mlp_ratio = 3 + ), + drop_path_rate=0.1, + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.), + ]), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=num_classes, + in_channels=embed_dims, + loss=dict( + type='LabelSmoothLoss', + label_smooth_val=0.1, + mode='original', + ), + topk=(1, 5), + init_cfg=dict(type='TruncNormal', layer='Linear', std=.02)), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0), + ]), +) diff --git a/configs/_base_/models/tinyvit/tinyvit-11m.py b/configs/_base_/models/tinyvit/tinyvit-11m.py new file mode 100644 index 0000000000000000000000000000000000000000..6c046e35a0fe11aaa679300d3a2d3be59ff1051b --- /dev/null +++ b/configs/_base_/models/tinyvit/tinyvit-11m.py @@ -0,0 +1,25 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='TinyViT', + arch='11m', + img_size=(224, 224), + window_size=[7, 7, 14, 7], + out_indices=(3, ), + drop_path_rate=0.1, + gap_before_final_norm=True, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['LayerNorm'], val=1., bias=0.), + ]), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=448, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/tinyvit/tinyvit-21m.py b/configs/_base_/models/tinyvit/tinyvit-21m.py new file mode 100644 index 0000000000000000000000000000000000000000..7f362f8f62789f6442e33a5a000ce8d9a458a597 --- /dev/null +++ b/configs/_base_/models/tinyvit/tinyvit-21m.py @@ -0,0 +1,25 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='TinyViT', + arch='21m', + img_size=(224, 224), + window_size=[7, 7, 14, 7], + out_indices=(3, ), + drop_path_rate=0.2, + gap_before_final_norm=True, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['LayerNorm'], val=1., bias=0.), + ]), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=576, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/tinyvit/tinyvit-5m.py b/configs/_base_/models/tinyvit/tinyvit-5m.py new file mode 100644 index 0000000000000000000000000000000000000000..923ebd918f82f40537e0f40f550c3cd264d7e389 --- /dev/null +++ b/configs/_base_/models/tinyvit/tinyvit-5m.py @@ -0,0 +1,25 @@ +# Model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='TinyViT', + arch='5m', + img_size=(224, 224), + window_size=[7, 7, 14, 7], + out_indices=(3, ), + drop_path_rate=0.0, + gap_before_final_norm=True, + init_cfg=[ + dict( + type='TruncNormal', + layer=['Conv2d', 'Linear'], + std=.02, + bias=0.), + dict(type='Constant', layer=['LayerNorm'], val=1., bias=0.), + ]), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=320, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + )) diff --git a/configs/_base_/models/tnt_s_patch16_224.py b/configs/_base_/models/tnt_s_patch16_224.py new file mode 100644 index 0000000000000000000000000000000000000000..5e13d07828c5d89d0e9ce4fc1a29fe7a6a4875d4 --- /dev/null +++ b/configs/_base_/models/tnt_s_patch16_224.py @@ -0,0 +1,29 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='TNT', + arch='s', + img_size=224, + patch_size=16, + in_channels=3, + ffn_ratio=4, + qkv_bias=False, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.1, + first_stride=4, + num_fcs=2, + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=.02), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ]), + neck=None, + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=384, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + topk=(1, 5), + init_cfg=dict(type='TruncNormal', layer='Linear', std=.02))) diff --git a/configs/_base_/models/twins_pcpvt_base.py b/configs/_base_/models/twins_pcpvt_base.py new file mode 100644 index 0000000000000000000000000000000000000000..14e46baedd273bd3baef163e2966653626170a1c --- /dev/null +++ b/configs/_base_/models/twins_pcpvt_base.py @@ -0,0 +1,31 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='PCPVT', + arch='base', + in_channels=3, + out_indices=(3, ), + qkv_bias=True, + norm_cfg=dict(type='LN', eps=1e-06), + norm_after_stage=[False, False, False, True], + drop_rate=0.0, + attn_drop_rate=0., + drop_path_rate=0.3), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/twins_svt_base.py b/configs/_base_/models/twins_svt_base.py new file mode 100644 index 0000000000000000000000000000000000000000..a37385b018f9b345ebcd3a9aaad575cd98e8b8f3 --- /dev/null +++ b/configs/_base_/models/twins_svt_base.py @@ -0,0 +1,31 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='SVT', + arch='base', + in_channels=3, + out_indices=(3, ), + qkv_bias=True, + norm_cfg=dict(type='LN'), + norm_after_stage=[False, False, False, True], + drop_rate=0.0, + attn_drop_rate=0., + drop_path_rate=0.3), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=768, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/van/van_base.py b/configs/_base_/models/van/van_base.py new file mode 100644 index 0000000000000000000000000000000000000000..006459255f82f4ad4250ee01f1d9d25605beb5d1 --- /dev/null +++ b/configs/_base_/models/van/van_base.py @@ -0,0 +1,13 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VAN', arch='base', drop_path_rate=0.1), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False)) diff --git a/configs/_base_/models/van/van_large.py b/configs/_base_/models/van/van_large.py new file mode 100644 index 0000000000000000000000000000000000000000..4ebafabdaaf7a4b828919e61e980e423385897e6 --- /dev/null +++ b/configs/_base_/models/van/van_large.py @@ -0,0 +1,13 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VAN', arch='large', drop_path_rate=0.2), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False)) diff --git a/configs/_base_/models/van/van_small.py b/configs/_base_/models/van/van_small.py new file mode 100644 index 0000000000000000000000000000000000000000..29393c6308af0732f4757d1ef4bd98d7b3cddcf1 --- /dev/null +++ b/configs/_base_/models/van/van_small.py @@ -0,0 +1,22 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VAN', arch='small', drop_path_rate=0.1), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=512, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/van/van_tiny.py b/configs/_base_/models/van/van_tiny.py new file mode 100644 index 0000000000000000000000000000000000000000..9cf5b28836f9216c642dfdfb62f37f3066a7ad09 --- /dev/null +++ b/configs/_base_/models/van/van_tiny.py @@ -0,0 +1,22 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VAN', arch='tiny', drop_path_rate=0.1), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=256, + init_cfg=None, # suppress the default init_cfg of LinearClsHead. + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, mode='original'), + cal_acc=False), + init_cfg=[ + dict(type='TruncNormal', layer='Linear', std=0.02, bias=0.), + dict(type='Constant', layer='LayerNorm', val=1., bias=0.) + ], + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/vgg11.py b/configs/_base_/models/vgg11.py new file mode 100644 index 0000000000000000000000000000000000000000..2b6ee1426aae383b1db5c4451e37caec5eafdcfa --- /dev/null +++ b/configs/_base_/models/vgg11.py @@ -0,0 +1,10 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VGG', depth=11, num_classes=1000), + neck=None, + head=dict( + type='ClsHead', + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vgg11bn.py b/configs/_base_/models/vgg11bn.py new file mode 100644 index 0000000000000000000000000000000000000000..cb4c64e95a85367841615fd52af7af50b5b1e9fb --- /dev/null +++ b/configs/_base_/models/vgg11bn.py @@ -0,0 +1,11 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='VGG', depth=11, norm_cfg=dict(type='BN'), num_classes=1000), + neck=None, + head=dict( + type='ClsHead', + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vgg13.py b/configs/_base_/models/vgg13.py new file mode 100644 index 0000000000000000000000000000000000000000..a9389100a61514043bbe7426b93cfd257df5cd26 --- /dev/null +++ b/configs/_base_/models/vgg13.py @@ -0,0 +1,10 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VGG', depth=13, num_classes=1000), + neck=None, + head=dict( + type='ClsHead', + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vgg13bn.py b/configs/_base_/models/vgg13bn.py new file mode 100644 index 0000000000000000000000000000000000000000..b12173b51b80b671fd85c9fa8ececd75881d4bd2 --- /dev/null +++ b/configs/_base_/models/vgg13bn.py @@ -0,0 +1,11 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='VGG', depth=13, norm_cfg=dict(type='BN'), num_classes=1000), + neck=None, + head=dict( + type='ClsHead', + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vgg16.py b/configs/_base_/models/vgg16.py new file mode 100644 index 0000000000000000000000000000000000000000..93ce864fac29a7c4adf4df12e5653f97ce09d7be --- /dev/null +++ b/configs/_base_/models/vgg16.py @@ -0,0 +1,10 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VGG', depth=16, num_classes=1000), + neck=None, + head=dict( + type='ClsHead', + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vgg16bn.py b/configs/_base_/models/vgg16bn.py new file mode 100644 index 0000000000000000000000000000000000000000..765e34f6367bc52e10322692a849d1003d57dfd2 --- /dev/null +++ b/configs/_base_/models/vgg16bn.py @@ -0,0 +1,11 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='VGG', depth=16, norm_cfg=dict(type='BN'), num_classes=1000), + neck=None, + head=dict( + type='ClsHead', + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vgg19.py b/configs/_base_/models/vgg19.py new file mode 100644 index 0000000000000000000000000000000000000000..6f4ab061b2c7a87d86aaebcf78aaf84abd2bb0cc --- /dev/null +++ b/configs/_base_/models/vgg19.py @@ -0,0 +1,10 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict(type='VGG', depth=19, num_classes=1000), + neck=None, + head=dict( + type='ClsHead', + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vgg19bn.py b/configs/_base_/models/vgg19bn.py new file mode 100644 index 0000000000000000000000000000000000000000..c468b5dea2cc5503ca2b266c57d163b2308b7dd3 --- /dev/null +++ b/configs/_base_/models/vgg19bn.py @@ -0,0 +1,11 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='VGG', depth=19, norm_cfg=dict(type='BN'), num_classes=1000), + neck=None, + head=dict( + type='ClsHead', + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vig/pyramid_vig_base.py b/configs/_base_/models/vig/pyramid_vig_base.py new file mode 100644 index 0000000000000000000000000000000000000000..a258457c84aecc2f1cdf29131f60b522526dbdd8 --- /dev/null +++ b/configs/_base_/models/vig/pyramid_vig_base.py @@ -0,0 +1,32 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='PyramidVig', + arch='base', + k=9, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='BN'), + graph_conv_type='mr', + graph_conv_bias=True, + epsilon=0.2, + use_stochastic=False, + drop_path=0.1, + norm_eval=False, + frozen_stages=0), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='VigClsHead', + num_classes=1000, + in_channels=1024, + hidden_dim=1024, + act_cfg=dict(type='GELU'), + dropout=0., + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + ), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/vig/pyramid_vig_medium.py b/configs/_base_/models/vig/pyramid_vig_medium.py new file mode 100644 index 0000000000000000000000000000000000000000..a551aba3e079576e13f5db3a77d5e6622079e497 --- /dev/null +++ b/configs/_base_/models/vig/pyramid_vig_medium.py @@ -0,0 +1,32 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='PyramidVig', + arch='medium', + k=9, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='BN'), + graph_conv_type='mr', + graph_conv_bias=True, + epsilon=0.2, + use_stochastic=False, + drop_path=0.1, + norm_eval=False, + frozen_stages=0), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='VigClsHead', + num_classes=1000, + in_channels=768, + hidden_dim=1024, + act_cfg=dict(type='GELU'), + dropout=0., + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + ), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/vig/pyramid_vig_small.py b/configs/_base_/models/vig/pyramid_vig_small.py new file mode 100644 index 0000000000000000000000000000000000000000..940275e6cf941ce0d6a7f7dc3e4a1b867cf88309 --- /dev/null +++ b/configs/_base_/models/vig/pyramid_vig_small.py @@ -0,0 +1,32 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='PyramidVig', + arch='small', + k=9, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='BN'), + graph_conv_type='mr', + graph_conv_bias=True, + epsilon=0.2, + use_stochastic=False, + drop_path=0.1, + norm_eval=False, + frozen_stages=0), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='VigClsHead', + num_classes=1000, + in_channels=640, + hidden_dim=1024, + act_cfg=dict(type='GELU'), + dropout=0., + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + ), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/vig/pyramid_vig_tiny.py b/configs/_base_/models/vig/pyramid_vig_tiny.py new file mode 100644 index 0000000000000000000000000000000000000000..fea0734fe9ab2e962e51b819c467ad965b88a958 --- /dev/null +++ b/configs/_base_/models/vig/pyramid_vig_tiny.py @@ -0,0 +1,32 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='PyramidVig', + arch='tiny', + k=9, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='BN'), + graph_conv_type='mr', + graph_conv_bias=True, + epsilon=0.2, + use_stochastic=False, + drop_path=0.1, + norm_eval=False, + frozen_stages=0), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='VigClsHead', + num_classes=1000, + in_channels=384, + hidden_dim=1024, + act_cfg=dict(type='GELU'), + dropout=0., + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + ), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/vig/vig_base.py b/configs/_base_/models/vig/vig_base.py new file mode 100644 index 0000000000000000000000000000000000000000..6c5f293ddfab1e8712c90f96aaa62acf62159e65 --- /dev/null +++ b/configs/_base_/models/vig/vig_base.py @@ -0,0 +1,33 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='Vig', + arch='base', + k=9, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='BN'), + graph_conv_type='mr', + graph_conv_bias=True, + epsilon=0.2, + use_dilation=True, + use_stochastic=False, + drop_path=0.1, + relative_pos=False, + norm_eval=False, + frozen_stages=0), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='VigClsHead', + num_classes=1000, + in_channels=640, + hidden_dim=1024, + act_cfg=dict(type='GELU'), + dropout=0., + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + ), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/vig/vig_small.py b/configs/_base_/models/vig/vig_small.py new file mode 100644 index 0000000000000000000000000000000000000000..93587ffba628d8900b17a537eed1406c7af57e9a --- /dev/null +++ b/configs/_base_/models/vig/vig_small.py @@ -0,0 +1,33 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='Vig', + arch='small', + k=9, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='BN'), + graph_conv_type='mr', + graph_conv_bias=True, + epsilon=0.2, + use_dilation=True, + use_stochastic=False, + drop_path=0.1, + relative_pos=False, + norm_eval=False, + frozen_stages=0), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='VigClsHead', + num_classes=1000, + in_channels=320, + hidden_dim=1024, + act_cfg=dict(type='GELU'), + dropout=0., + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + ), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/vig/vig_tiny.py b/configs/_base_/models/vig/vig_tiny.py new file mode 100644 index 0000000000000000000000000000000000000000..c50bac222a88a665a1b7adc8398f805ff10be7f1 --- /dev/null +++ b/configs/_base_/models/vig/vig_tiny.py @@ -0,0 +1,33 @@ +model = dict( + type='ImageClassifier', + backbone=dict( + type='Vig', + arch='tiny', + k=9, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='BN'), + graph_conv_type='mr', + graph_conv_bias=True, + epsilon=0.2, + use_dilation=True, + use_stochastic=False, + drop_path=0.1, + relative_pos=False, + norm_eval=False, + frozen_stages=0), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='VigClsHead', + num_classes=1000, + in_channels=192, + hidden_dim=1024, + act_cfg=dict(type='GELU'), + dropout=0., + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + ), + train_cfg=dict(augments=[ + dict(type='Mixup', alpha=0.8), + dict(type='CutMix', alpha=1.0) + ]), +) diff --git a/configs/_base_/models/vit-base-p16.py b/configs/_base_/models/vit-base-p16.py new file mode 100644 index 0000000000000000000000000000000000000000..bb42bed5fa5ecedf9aa94c82ee63462181df0605 --- /dev/null +++ b/configs/_base_/models/vit-base-p16.py @@ -0,0 +1,25 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='VisionTransformer', + arch='b', + img_size=224, + patch_size=16, + drop_rate=0.1, + init_cfg=[ + dict( + type='Kaiming', + layer='Conv2d', + mode='fan_in', + nonlinearity='linear') + ]), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=1000, + in_channels=768, + loss=dict( + type='LabelSmoothLoss', label_smooth_val=0.1, + mode='classy_vision'), + )) diff --git a/configs/_base_/models/vit-base-p32.py b/configs/_base_/models/vit-base-p32.py new file mode 100644 index 0000000000000000000000000000000000000000..ad550ef9b9bdbb218e6743ccf37e7929e5758865 --- /dev/null +++ b/configs/_base_/models/vit-base-p32.py @@ -0,0 +1,24 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='VisionTransformer', + arch='b', + img_size=224, + patch_size=32, + drop_rate=0.1, + init_cfg=[ + dict( + type='Kaiming', + layer='Conv2d', + mode='fan_in', + nonlinearity='linear') + ]), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=1000, + in_channels=768, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vit-large-p16.py b/configs/_base_/models/vit-large-p16.py new file mode 100644 index 0000000000000000000000000000000000000000..97162304563827716366d20bd29a11fed542be62 --- /dev/null +++ b/configs/_base_/models/vit-large-p16.py @@ -0,0 +1,24 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='VisionTransformer', + arch='l', + img_size=224, + patch_size=16, + drop_rate=0.1, + init_cfg=[ + dict( + type='Kaiming', + layer='Conv2d', + mode='fan_in', + nonlinearity='linear') + ]), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/vit-large-p32.py b/configs/_base_/models/vit-large-p32.py new file mode 100644 index 0000000000000000000000000000000000000000..f9491bb561433ff01f60a8aa7a4993c28c8b9b02 --- /dev/null +++ b/configs/_base_/models/vit-large-p32.py @@ -0,0 +1,24 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='VisionTransformer', + arch='l', + img_size=224, + patch_size=32, + drop_rate=0.1, + init_cfg=[ + dict( + type='Kaiming', + layer='Conv2d', + mode='fan_in', + nonlinearity='linear') + ]), + neck=None, + head=dict( + type='VisionTransformerClsHead', + num_classes=1000, + in_channels=1024, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/models/wide-resnet50.py b/configs/_base_/models/wide-resnet50.py new file mode 100644 index 0000000000000000000000000000000000000000..a2913b9aa6afb10c36199530441ab39348650bc7 --- /dev/null +++ b/configs/_base_/models/wide-resnet50.py @@ -0,0 +1,20 @@ +# model settings +model = dict( + type='ImageClassifier', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(3, ), + stem_channels=64, + base_channels=128, + expansion=2, + style='pytorch'), + neck=dict(type='GlobalAveragePooling'), + head=dict( + type='LinearClsHead', + num_classes=1000, + in_channels=2048, + loss=dict(type='CrossEntropyLoss', loss_weight=1.0), + topk=(1, 5), + )) diff --git a/configs/_base_/schedules/cifar10_bs128.py b/configs/_base_/schedules/cifar10_bs128.py new file mode 100644 index 0000000000000000000000000000000000000000..fadb6c1285515b0d0ee7c2c17c3a9d19f4a63713 --- /dev/null +++ b/configs/_base_/schedules/cifar10_bs128.py @@ -0,0 +1,15 @@ +# optimizer +optim_wrapper = dict( + optimizer=dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001)) +# learning policy +param_scheduler = dict( + type='MultiStepLR', by_epoch=True, milestones=[100, 150], gamma=0.1) + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=200, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=128) diff --git a/configs/_base_/schedules/cub_bs64.py b/configs/_base_/schedules/cub_bs64.py new file mode 100644 index 0000000000000000000000000000000000000000..1d0b4be7bd7b7043636fb2356b76512281a37e2b --- /dev/null +++ b/configs/_base_/schedules/cub_bs64.py @@ -0,0 +1,34 @@ +# optimizer +optim_wrapper = dict( + optimizer=dict( + type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005, nesterov=True)) + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=0.01, + by_epoch=True, + begin=0, + end=5, + # update by iter + convert_to_iter_based=True), + # main learning rate scheduler + dict( + type='CosineAnnealingLR', + T_max=95, + by_epoch=True, + begin=5, + end=100, + ) +] + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=100, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/_base_/schedules/fungi_bs64_adamw_swin.py b/configs/_base_/schedules/fungi_bs64_adamw_swin.py new file mode 100644 index 0000000000000000000000000000000000000000..b37647a3a693c1edd87e7ae5f31fb2affc7739e1 --- /dev/null +++ b/configs/_base_/schedules/fungi_bs64_adamw_swin.py @@ -0,0 +1,42 @@ +# for batch in each gpu is 16, 4 gpu +# lr = 5e-4 * 16 * 4 / 512 = 0.001 +optim_wrapper = dict( + optimizer=dict( + type='AdamW', + lr=5e-4 * 64 / 512, + weight_decay=0.05, + eps=1e-8, + betas=(0.9, 0.999)), + paramwise_cfg=dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + flat_decay_mult=0.0, + custom_keys={ + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0) + }), + clip_grad=dict(max_norm=5) +) + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=0.01, + by_epoch=True, + end=5, + # update by iter + convert_to_iter_based=True), + # main learning rate scheduler + dict(type='CosineAnnealingLR', eta_min=0, by_epoch=True, begin=5) +] + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=100, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/_base_/schedules/imagenet_bs1024_adamw_conformer.py b/configs/_base_/schedules/imagenet_bs1024_adamw_conformer.py new file mode 100644 index 0000000000000000000000000000000000000000..2285d0ea6c70de222a76d6b7404fc16e5fd28e0e --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs1024_adamw_conformer.py @@ -0,0 +1,43 @@ +optim_wrapper = dict( + optimizer=dict( + type='AdamW', + # for batch in each gpu is 128, 8 gpu + # lr = 5e-4 * 128 * 8 / 512 = 0.001 + lr=5e-4 * 128 * 8 / 512, + weight_decay=0.05, + eps=1e-8, + betas=(0.9, 0.999)), + paramwise_cfg=dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + custom_keys={ + '.cls_token': dict(decay_mult=0.0), + }), +) + +# learning policy +param_scheduler = [ + dict( + type='LinearLR', + start_factor=1e-3, + by_epoch=True, + begin=0, + end=5, + convert_to_iter_based=True), + dict( + type='CosineAnnealingLR', + T_max=295, + eta_min=1e-5, + by_epoch=True, + begin=5, + end=300) +] + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=300, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=1024) diff --git a/configs/_base_/schedules/imagenet_bs1024_adamw_revvit.py b/configs/_base_/schedules/imagenet_bs1024_adamw_revvit.py new file mode 100644 index 0000000000000000000000000000000000000000..87fd202ce4076a69cae63f0d9d3f6b860639ff49 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs1024_adamw_revvit.py @@ -0,0 +1,41 @@ +# for batch in each gpu is 128, 8 gpu +# lr = 5e-4 * 128 * 8 / 512 = 0.001 +# schedule settings +optim_wrapper = dict( + optimizer=dict( + type='AdamW', + lr=5e-4 * 2048 / 512, + weight_decay=0.05, + eps=1e-8, + betas=(0.9, 0.999)), + paramwise_cfg=dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + custom_keys={ + '.cls_token': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0) + }), + clip_grad=dict(max_norm=1.0), +) +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=1e-8 / 2e-3, + by_epoch=True, + end=70, + # update by iter + convert_to_iter_based=True), + # main learning rate scheduler + dict(type='CosineAnnealingLR', eta_min=1e-5, by_epoch=True, begin=70) +] + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=300, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=1024) diff --git a/configs/_base_/schedules/imagenet_bs1024_adamw_swin.py b/configs/_base_/schedules/imagenet_bs1024_adamw_swin.py new file mode 100644 index 0000000000000000000000000000000000000000..fd06cc115a7ab4cbaa7ef7fa1d9366bdd5db878f --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs1024_adamw_swin.py @@ -0,0 +1,41 @@ +# for batch in each gpu is 128, 8 gpu +# lr = 5e-4 * 128 * 8 / 512 = 0.001 +optim_wrapper = dict( + optimizer=dict( + type='AdamW', + lr=5e-4 * 1024 / 512, + weight_decay=0.05, + eps=1e-8, + betas=(0.9, 0.999)), + paramwise_cfg=dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + flat_decay_mult=0.0, + custom_keys={ + '.absolute_pos_embed': dict(decay_mult=0.0), + '.relative_position_bias_table': dict(decay_mult=0.0) + }), +) + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=1e-3, + by_epoch=True, + end=20, + # update by iter + convert_to_iter_based=True), + # main learning rate scheduler + dict(type='CosineAnnealingLR', eta_min=1e-5, by_epoch=True, begin=20) +] + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=300, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=1024) diff --git a/configs/_base_/schedules/imagenet_bs1024_coslr.py b/configs/_base_/schedules/imagenet_bs1024_coslr.py new file mode 100644 index 0000000000000000000000000000000000000000..285884d0b2b132329bab682f4418d891d7378ec1 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs1024_coslr.py @@ -0,0 +1,18 @@ +# optimizer +optim_wrapper = dict( + optimizer=dict(type='SGD', lr=0.8, momentum=0.9, weight_decay=5e-5)) + +# learning policy +param_scheduler = [ + dict(type='LinearLR', start_factor=0.1, by_epoch=True, begin=0, end=5), + dict(type='CosineAnnealingLR', T_max=95, by_epoch=True, begin=5, end=100) +] + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=100, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=1024) diff --git a/configs/_base_/schedules/imagenet_bs1024_linearlr_bn_nowd.py b/configs/_base_/schedules/imagenet_bs1024_linearlr_bn_nowd.py new file mode 100644 index 0000000000000000000000000000000000000000..cf38d4731c867ac381ff0420b0063f8a7e7dfe2e --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs1024_linearlr_bn_nowd.py @@ -0,0 +1,20 @@ +# optimizer +optim_wrapper = dict( + optimizer=dict(type='SGD', lr=0.5, momentum=0.9, weight_decay=0.00004), + paramwise_cfg=dict(norm_decay_mult=0), +) + +# learning policy +param_scheduler = [ + dict(type='ConstantLR', factor=0.1, by_epoch=False, begin=0, end=5000), + dict(type='PolyLR', eta_min=0, by_epoch=False, begin=5000) +] + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=300, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=1024) diff --git a/configs/_base_/schedules/imagenet_bs2048.py b/configs/_base_/schedules/imagenet_bs2048.py new file mode 100644 index 0000000000000000000000000000000000000000..1cfbfbe6752d923c248b92f3c7b7ace817bad9a4 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs2048.py @@ -0,0 +1,21 @@ +# optimizer +optim_wrapper = dict( + optimizer=dict( + type='SGD', lr=0.8, momentum=0.9, weight_decay=0.0001, nesterov=True)) + +# learning policy +param_scheduler = [ + dict( + type='LinearLR', start_factor=0.25, by_epoch=False, begin=0, end=2500), + dict( + type='MultiStepLR', by_epoch=True, milestones=[30, 60, 90], gamma=0.1) +] + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=100, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=2048) diff --git a/configs/_base_/schedules/imagenet_bs2048_AdamW.py b/configs/_base_/schedules/imagenet_bs2048_AdamW.py new file mode 100644 index 0000000000000000000000000000000000000000..bbfae8ef222b10663e1313000d05290d729ca5c8 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs2048_AdamW.py @@ -0,0 +1,39 @@ +# optimizer +# In ClassyVision, the lr is set to 0.003 for bs4096. +# In this implementation(bs2048), lr = 0.003 / 4096 * (32bs * 64gpus) = 0.0015 +optim_wrapper = dict( + optimizer=dict(type='AdamW', lr=0.0015, weight_decay=0.3), + # specific to vit pretrain + paramwise_cfg=dict(custom_keys={ + '.cls_token': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0) + }), +) + +# learning policy +warmup_epochs = 15 # about 10000 iterations for ImageNet-1k +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=1e-3, + by_epoch=True, + end=warmup_epochs, + # update by iter + convert_to_iter_based=True), + # main learning rate scheduler + dict( + type='CosineAnnealingLR', + eta_min=1e-5, + by_epoch=True, + begin=warmup_epochs) +] + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=300, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=2048) diff --git a/configs/_base_/schedules/imagenet_bs2048_adamw_levit.py b/configs/_base_/schedules/imagenet_bs2048_adamw_levit.py new file mode 100644 index 0000000000000000000000000000000000000000..25a536eaac52f1c42b37e0d0b102da252deebd67 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs2048_adamw_levit.py @@ -0,0 +1,40 @@ +# for batch in each gpu is 256, 8 gpu +# lr = 5e-4 * 256 * 8 / 512 = 0.002 +optim_wrapper = dict( + optimizer=dict( + type='AdamW', + lr=0.002, + weight_decay=0.025, + eps=1e-8, + betas=(0.9, 0.999)), + paramwise_cfg=dict( + norm_decay_mult=0.0, + bias_decay_mult=0.0, + custom_keys={ + '.attention_biases': dict(decay_mult=0.0), + }), +) + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=1e-6 / 0.002, + by_epoch=True, + end=5, + # update by iter + convert_to_iter_based=True, + ), + # main learning rate scheduler + dict(type='CosineAnnealingLR', eta_min=1e-5, by_epoch=True, begin=5) +] + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=1000) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=2048) diff --git a/configs/_base_/schedules/imagenet_bs2048_coslr.py b/configs/_base_/schedules/imagenet_bs2048_coslr.py new file mode 100644 index 0000000000000000000000000000000000000000..b8551f55c8082ba07c084324c2bf1fbb9f26ea56 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs2048_coslr.py @@ -0,0 +1,35 @@ +# optimizer +optim_wrapper = dict( + optimizer=dict( + type='SGD', lr=0.8, momentum=0.9, weight_decay=0.0001, nesterov=True)) + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=0.25, + by_epoch=True, + begin=0, + # about 2500 iterations for ImageNet-1k + end=5, + # update by iter + convert_to_iter_based=True), + # main learning rate scheduler + dict( + type='CosineAnnealingLR', + T_max=95, + by_epoch=True, + begin=5, + end=100, + ) +] + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=100, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=2048) diff --git a/configs/_base_/schedules/imagenet_bs2048_rsb.py b/configs/_base_/schedules/imagenet_bs2048_rsb.py new file mode 100644 index 0000000000000000000000000000000000000000..f0d2d7994293afdc43b906c918d486397dc53206 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs2048_rsb.py @@ -0,0 +1,32 @@ +# optimizer +optim_wrapper = dict(optimizer=dict(type='Lamb', lr=0.005, weight_decay=0.02)) + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=0.0001, + by_epoch=True, + begin=0, + end=5, + # update by iter + convert_to_iter_based=True), + # main learning rate scheduler + dict( + type='CosineAnnealingLR', + T_max=95, + eta_min=1.0e-6, + by_epoch=True, + begin=5, + end=100) +] + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=100, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=2048) diff --git a/configs/_base_/schedules/imagenet_bs256.py b/configs/_base_/schedules/imagenet_bs256.py new file mode 100644 index 0000000000000000000000000000000000000000..3f92273d1b831ae5cd6663cfe65b1f0d8f01e630 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs256.py @@ -0,0 +1,16 @@ +# optimizer +optim_wrapper = dict( + optimizer=dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001)) + +# learning policy +param_scheduler = dict( + type='MultiStepLR', by_epoch=True, milestones=[30, 60, 90], gamma=0.1) + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=100, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=256) diff --git a/configs/_base_/schedules/imagenet_bs256_140e.py b/configs/_base_/schedules/imagenet_bs256_140e.py new file mode 100644 index 0000000000000000000000000000000000000000..e65bf522d9739073baf38db7f10e6b27d7cd4f31 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs256_140e.py @@ -0,0 +1,16 @@ +# optimizer +optim_wrapper = dict( + optimizer=dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001)) + +# learning policy +param_scheduler = dict( + type='MultiStepLR', by_epoch=True, milestones=[40, 80, 120], gamma=0.1) + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=140, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=256) diff --git a/configs/_base_/schedules/imagenet_bs256_200e_coslr_warmup.py b/configs/_base_/schedules/imagenet_bs256_200e_coslr_warmup.py new file mode 100644 index 0000000000000000000000000000000000000000..c8d94a7606aead6d4142bf8a61228eb6475eb5c6 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs256_200e_coslr_warmup.py @@ -0,0 +1,34 @@ +# optimizer +optim_wrapper = dict( + optimizer=dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001)) + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=0.25, + by_epoch=True, + begin=0, + end=5, + # update by iter + convert_to_iter_based=True, + ), + # main learning rate scheduler + dict( + type='CosineAnnealingLR', + T_max=195, + by_epoch=True, + begin=5, + end=200, + ) +] + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=200, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=256) diff --git a/configs/_base_/schedules/imagenet_bs256_coslr.py b/configs/_base_/schedules/imagenet_bs256_coslr.py new file mode 100644 index 0000000000000000000000000000000000000000..44e2c8bb5d0800568bb3c7079b9e0c3e1322711c --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs256_coslr.py @@ -0,0 +1,16 @@ +# optimizer +optim_wrapper = dict( + optimizer=dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001)) + +# learning policy +param_scheduler = dict( + type='CosineAnnealingLR', T_max=100, by_epoch=True, begin=0, end=100) + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=100, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=256) diff --git a/configs/_base_/schedules/imagenet_bs256_coslr_coswd_300e.py b/configs/_base_/schedules/imagenet_bs256_coslr_coswd_300e.py new file mode 100644 index 0000000000000000000000000000000000000000..318e031574367aa9d34ec28453deccc60377372f --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs256_coslr_coswd_300e.py @@ -0,0 +1,40 @@ +# optimizer +optim_wrapper = dict( + optimizer=dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001)) + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=0.001, + by_epoch=True, + begin=0, + end=5, + # update by iter + convert_to_iter_based=True), + # main learning rate scheduler + dict( + type='CosineAnnealingLR', + T_max=295, + eta_min=1.0e-6, + by_epoch=True, + begin=5, + end=300), + dict( + type='CosineAnnealingParamScheduler', + param_name='weight_decay', + eta_min=0.00001, + by_epoch=True, + begin=0, + end=300) +] + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=300, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=256) diff --git a/configs/_base_/schedules/imagenet_bs256_epochstep.py b/configs/_base_/schedules/imagenet_bs256_epochstep.py new file mode 100644 index 0000000000000000000000000000000000000000..b8c2b905bf362022d07d452df76c10cccfb6565e --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs256_epochstep.py @@ -0,0 +1,15 @@ +# optimizer +optim_wrapper = dict( + optimizer=dict(type='SGD', lr=0.045, momentum=0.9, weight_decay=0.00004)) + +# learning policy +param_scheduler = dict(type='StepLR', by_epoch=True, step_size=1, gamma=0.98) + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=300, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=256) diff --git a/configs/_base_/schedules/imagenet_bs4096_AdamW.py b/configs/_base_/schedules/imagenet_bs4096_AdamW.py new file mode 100644 index 0000000000000000000000000000000000000000..84b1f39beaef86b412c159a54d74c4f09458dc57 --- /dev/null +++ b/configs/_base_/schedules/imagenet_bs4096_AdamW.py @@ -0,0 +1,39 @@ +# optimizer +optim_wrapper = dict( + optimizer=dict(type='AdamW', lr=0.003, weight_decay=0.3), + # specific to vit pretrain + paramwise_cfg=dict(custom_keys={ + '.cls_token': dict(decay_mult=0.0), + '.pos_embed': dict(decay_mult=0.0) + }), +) + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=1e-4, + by_epoch=True, + begin=0, + end=30, + # update by iter + convert_to_iter_based=True), + # main learning rate scheduler + dict( + type='CosineAnnealingLR', + T_max=270, + by_epoch=True, + begin=30, + end=300, + ) +] + +# train, val, test setting +train_cfg = dict(by_epoch=True, max_epochs=300, val_interval=1) +val_cfg = dict() +test_cfg = dict() + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# based on the actual training batch size. +auto_scale_lr = dict(base_batch_size=4096) diff --git a/configs/_base_/schedules/imagenet_lars_coslr_200e.py b/configs/_base_/schedules/imagenet_lars_coslr_200e.py new file mode 100644 index 0000000000000000000000000000000000000000..baba55c4f43b60620a646c812b24e6ffcbd7860a --- /dev/null +++ b/configs/_base_/schedules/imagenet_lars_coslr_200e.py @@ -0,0 +1,20 @@ +# optimizer wrapper +optim_wrapper = dict( + type='OptimWrapper', + optimizer=dict(type='LARS', lr=4.8, weight_decay=1e-6, momentum=0.9)) + +# learning rate scheduler +param_scheduler = [ + dict( + type='LinearLR', + start_factor=1e-4, + by_epoch=True, + begin=0, + end=10, + convert_to_iter_based=True), + dict( + type='CosineAnnealingLR', T_max=190, by_epoch=True, begin=10, end=200) +] + +# runtime settings +train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=200) diff --git a/configs/_base_/schedules/imagenet_lars_coslr_90e.py b/configs/_base_/schedules/imagenet_lars_coslr_90e.py new file mode 100644 index 0000000000000000000000000000000000000000..6e7875a36e76eccefbf752d704fcb12beb6c6506 --- /dev/null +++ b/configs/_base_/schedules/imagenet_lars_coslr_90e.py @@ -0,0 +1,14 @@ +# optimizer wrapper +optim_wrapper = dict( + type='OptimWrapper', + optimizer=dict(type='LARS', lr=1.6, momentum=0.9, weight_decay=0.)) + +# learning rate scheduler +param_scheduler = [ + dict(type='CosineAnnealingLR', T_max=90, by_epoch=True, begin=0, end=90) +] + +# runtime settings +train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=90) +val_cfg = dict() +test_cfg = dict() diff --git a/configs/_base_/schedules/imagenet_sgd_coslr_100e.py b/configs/_base_/schedules/imagenet_sgd_coslr_100e.py new file mode 100644 index 0000000000000000000000000000000000000000..08e9a3e71fc0d8c186b8fdeb5bb59fd3a1d5148e --- /dev/null +++ b/configs/_base_/schedules/imagenet_sgd_coslr_100e.py @@ -0,0 +1,14 @@ +# optimizer wrapper +optim_wrapper = dict( + type='OptimWrapper', + optimizer=dict(type='SGD', lr=0.3, momentum=0.9, weight_decay=1e-6)) + +# learning rate scheduler +param_scheduler = [ + dict(type='CosineAnnealingLR', T_max=100, by_epoch=True, begin=0, end=100) +] + +# runtime settings +train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=100) +val_cfg = dict() +test_cfg = dict() diff --git a/configs/_base_/schedules/imagenet_sgd_coslr_200e.py b/configs/_base_/schedules/imagenet_sgd_coslr_200e.py new file mode 100644 index 0000000000000000000000000000000000000000..f38e4983038031c9178813297dc744195e855680 --- /dev/null +++ b/configs/_base_/schedules/imagenet_sgd_coslr_200e.py @@ -0,0 +1,12 @@ +# optimizer wrapper +optim_wrapper = dict( + type='OptimWrapper', + optimizer=dict(type='SGD', lr=0.03, weight_decay=1e-4, momentum=0.9)) + +# learning rate scheduler +param_scheduler = [ + dict(type='CosineAnnealingLR', T_max=200, by_epoch=True, begin=0, end=200) +] + +# runtime settings +train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=200) diff --git a/configs/_base_/schedules/imagenet_sgd_steplr_100e.py b/configs/_base_/schedules/imagenet_sgd_steplr_100e.py new file mode 100644 index 0000000000000000000000000000000000000000..75b725c7dfb074c3ebe5c7536752eb32c45b89cc --- /dev/null +++ b/configs/_base_/schedules/imagenet_sgd_steplr_100e.py @@ -0,0 +1,14 @@ +# optimizer wrapper +optim_wrapper = dict( + type='OptimWrapper', + optimizer=dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=1e-4)) + +# learning rate scheduler +param_scheduler = [ + dict(type='MultiStepLR', by_epoch=True, milestones=[60, 80], gamma=0.1) +] + +# runtime settings +train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=100) +val_cfg = dict() +test_cfg = dict() diff --git a/configs/fungi2023/convnextv2_base_b32x4-fp16_fungi+val_res_384_cb_epochs_6.py b/configs/fungi2023/convnextv2_base_b32x4-fp16_fungi+val_res_384_cb_epochs_6.py new file mode 100644 index 0000000000000000000000000000000000000000..fbc014c961991f14c27141ae18c919bb65272d31 --- /dev/null +++ b/configs/fungi2023/convnextv2_base_b32x4-fp16_fungi+val_res_384_cb_epochs_6.py @@ -0,0 +1,43 @@ +_base_ = [ + '../_base_/models/convnext_v2/base.py', '../_base_/datasets/fungi_bs16_swin_384_class-balanced.py', + '../_base_/schedules/fungi_bs64_adamw_swin.py', '../_base_/default_runtime.py' +] + +# model settings +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/convnext-v2/convnext-v2-base_3rdparty-fcmae_in1k_20230104-8a798eaf.pth' # noqa +model = dict( + backbone=dict( + init_cfg=dict( + type='Pretrained', + checkpoint=checkpoint, + prefix='backbone', + )), + head=dict(num_classes=1604), + train_cfg=dict(_delete_=True), +) + +train_dataloader = dict( + batch_size=32, + num_workers=14) + +val_dataloader = dict( + batch_size=64, + num_workers=12) + +train_cfg = dict(max_epochs=6) + +optim_wrapper = dict(type='AmpOptimWrapper') + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=0.01, + by_epoch=False, + end=4200), + # main learning rate scheduler + dict(type='CosineAnnealingLR', eta_min=0, by_epoch=False, begin=4200) +] + +custom_imports = dict(imports=['mmpretrain_custom'], allow_failed_imports=False) diff --git a/configs/fungi2023/swin_base_b16x4-fp16_fungi+val_res_384_cb_epochs_6.py b/configs/fungi2023/swin_base_b16x4-fp16_fungi+val_res_384_cb_epochs_6.py new file mode 100644 index 0000000000000000000000000000000000000000..42a3673b38854e1b286ac1af2f41e9e46f06616d --- /dev/null +++ b/configs/fungi2023/swin_base_b16x4-fp16_fungi+val_res_384_cb_epochs_6.py @@ -0,0 +1,35 @@ +_base_ = [ + '../_base_/models/swin_transformer/base_384_aug.py', '../_base_/datasets/fungi_bs16_swin_384_class-balanced.py', + '../_base_/schedules/fungi_bs64_adamw_swin.py', '../_base_/default_runtime.py' +] + +# model settings +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin-base_3rdparty_in21k-384px.pth' # noqa +model = dict( + backbone=dict( + init_cfg=dict( + type='Pretrained', + checkpoint=checkpoint, + prefix='backbone', + )), + head=dict(num_classes=1604), + train_cfg=dict(_delete_=True), +) + +train_cfg = dict(max_epochs=6) + +optim_wrapper = dict(type='AmpOptimWrapper') + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=0.01, + by_epoch=False, + end=4200), + # main learning rate scheduler + dict(type='CosineAnnealingLR', eta_min=0, by_epoch=False, begin=4200) +] + +custom_imports = dict(imports=['mmpretrain_custom'], allow_failed_imports=False) diff --git a/configs/fungi2023/swin_base_b32x4-fp16_fungi+val_res_384.py b/configs/fungi2023/swin_base_b32x4-fp16_fungi+val_res_384.py new file mode 100644 index 0000000000000000000000000000000000000000..134e13405da0a0a309f700c5d8a43bcf5f8bebf5 --- /dev/null +++ b/configs/fungi2023/swin_base_b32x4-fp16_fungi+val_res_384.py @@ -0,0 +1,43 @@ +_base_ = [ + '../_base_/models/swin_transformer/base_384_aug.py', '../_base_/datasets/fungi_bs16_swin_384.py', + '../_base_/schedules/fungi_bs64_adamw_swin.py', '../_base_/default_runtime.py' +] + +# model settings +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin-base_3rdparty_in21k-384px.pth' # noqa +model = dict( + backbone=dict( + init_cfg=dict( + type='Pretrained', + checkpoint=checkpoint, + prefix='backbone', + )), + head=dict(num_classes=1604), + train_cfg=dict(_delete_=True), +) + +train_dataloader = dict( + batch_size=32, + num_workers=14) + +val_dataloader = dict( + batch_size=64, + num_workers=12) + +train_cfg = dict(max_epochs=24) + +optim_wrapper = dict(type='AmpOptimWrapper') + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=0.01, + by_epoch=False, + end=4200), + # main learning rate scheduler + dict(type='CosineAnnealingLR', eta_min=0, by_epoch=False, begin=4200) +] + +custom_imports = dict(imports=['mmpretrain_custom'], allow_failed_imports=False) diff --git a/configs/fungi2023/swin_base_b32x4-fp16_fungi+val_res_384_cb_epochs_6.py b/configs/fungi2023/swin_base_b32x4-fp16_fungi+val_res_384_cb_epochs_6.py new file mode 100644 index 0000000000000000000000000000000000000000..0939bc425b4ab9d1c98c36b25174d68787ae17e6 --- /dev/null +++ b/configs/fungi2023/swin_base_b32x4-fp16_fungi+val_res_384_cb_epochs_6.py @@ -0,0 +1,43 @@ +_base_ = [ + '../_base_/models/swin_transformer/base_384_aug.py', '../_base_/datasets/fungi_bs16_swin_384_class-balanced.py', + '../_base_/schedules/fungi_bs64_adamw_swin.py', '../_base_/default_runtime.py' +] + +# model settings +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/swin-transformer/convert/swin-base_3rdparty_in21k-384px.pth' # noqa +model = dict( + backbone=dict( + init_cfg=dict( + type='Pretrained', + checkpoint=checkpoint, + prefix='backbone', + )), + head=dict(num_classes=1604), + train_cfg=dict(_delete_=True), +) + +train_dataloader = dict( + batch_size=32, + num_workers=14) + +val_dataloader = dict( + batch_size=64, + num_workers=12) + +train_cfg = dict(max_epochs=6) + +optim_wrapper = dict(type='AmpOptimWrapper') + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=0.01, + by_epoch=False, + end=4200), + # main learning rate scheduler + dict(type='CosineAnnealingLR', eta_min=0, by_epoch=False, begin=4200) +] + +custom_imports = dict(imports=['mmpretrain_custom'], allow_failed_imports=False) diff --git a/configs/fungi2023/swinv2_base_w12_b32x4-fp16_fungi+val_res_384_cb_epochs_6.py b/configs/fungi2023/swinv2_base_w12_b32x4-fp16_fungi+val_res_384_cb_epochs_6.py new file mode 100644 index 0000000000000000000000000000000000000000..9c7cfa10ebbbf6e46a7a081fcc79b0dc716208f9 --- /dev/null +++ b/configs/fungi2023/swinv2_base_w12_b32x4-fp16_fungi+val_res_384_cb_epochs_6.py @@ -0,0 +1,45 @@ +_base_ = [ + '../_base_/models/swin_transformer_v2/base_384_aug.py', '../_base_/datasets/fungi_bs16_swin_384_class-balanced.py', + '../_base_/schedules/fungi_bs64_adamw_swin.py', '../_base_/default_runtime.py' +] + +# model settings +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/swin-v2/pretrain/swinv2-base-w12_3rdparty_in21k-192px_20220803-f7dc9763.pth' # noqa +model = dict( + backbone=dict( + window_size=[12, 12, 12, 6], + pretrained_window_sizes=[12, 12, 12, 6], + init_cfg=dict( + type='Pretrained', + checkpoint=checkpoint, + prefix='backbone', + )), + head=dict(num_classes=1604), + train_cfg=dict(_delete_=True), +) + +train_dataloader = dict( + batch_size=32, + num_workers=14) + +val_dataloader = dict( + batch_size=64, + num_workers=12) + +train_cfg = dict(max_epochs=6) + +optim_wrapper = dict(type='AmpOptimWrapper') + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=0.01, + by_epoch=False, + end=4200), + # main learning rate scheduler + dict(type='CosineAnnealingLR', eta_min=0, by_epoch=False, begin=4200) +] + +custom_imports = dict(imports=['mmpretrain_custom'], allow_failed_imports=False) diff --git a/configs/fungi2023/swinv2_base_w12_b32x8-fp16_fungi+val_res_384_cb_epochs_6.py b/configs/fungi2023/swinv2_base_w12_b32x8-fp16_fungi+val_res_384_cb_epochs_6.py new file mode 100644 index 0000000000000000000000000000000000000000..af55814bf44fb26b655ac436d14365564e497f05 --- /dev/null +++ b/configs/fungi2023/swinv2_base_w12_b32x8-fp16_fungi+val_res_384_cb_epochs_6.py @@ -0,0 +1,45 @@ +_base_ = [ + '../_base_/models/swin_transformer_v2/base_384_aug.py', '../_base_/datasets/fungi_bs16_swin_384_class-balanced.py', + '../_base_/schedules/fungi_bs64_adamw_swin.py', '../_base_/default_runtime.py' +] + +# model settings +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/swin-v2/pretrain/swinv2-base-w12_3rdparty_in21k-192px_20220803-f7dc9763.pth' # noqa +model = dict( + backbone=dict( + window_size=[12, 12, 12, 6], + pretrained_window_sizes=[12, 12, 12, 6], + init_cfg=dict( + type='Pretrained', + checkpoint=checkpoint, + prefix='backbone', + )), + head=dict(num_classes=1604), + train_cfg=dict(_delete_=True), +) + +train_dataloader = dict( + batch_size=32, + num_workers=9) + +val_dataloader = dict( + batch_size=64, + num_workers=9) + +train_cfg = dict(max_epochs=6) + +optim_wrapper = dict(type='AmpOptimWrapper') + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=0.01, + by_epoch=False, + end=2100), + # main learning rate scheduler + dict(type='CosineAnnealingLR', eta_min=0, by_epoch=False, begin=2100) +] + +custom_imports = dict(imports=['mmpretrain_custom'], allow_failed_imports=False) diff --git a/configs/fungi2023/swinv2_base_w12_b64x4-fp16_fungi+val_res_384_cb_epochs_6.py b/configs/fungi2023/swinv2_base_w12_b64x4-fp16_fungi+val_res_384_cb_epochs_6.py new file mode 100644 index 0000000000000000000000000000000000000000..5f4d1535e4a78897d577f2ed87d0bf80f6c53c8e --- /dev/null +++ b/configs/fungi2023/swinv2_base_w12_b64x4-fp16_fungi+val_res_384_cb_epochs_6.py @@ -0,0 +1,45 @@ +_base_ = [ + '../_base_/models/swin_transformer_v2/base_384_aug.py', '../_base_/datasets/fungi_bs16_swin_384_class-balanced.py', + '../_base_/schedules/fungi_bs64_adamw_swin.py', '../_base_/default_runtime.py' +] + +# model settings +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/swin-v2/pretrain/swinv2-base-w12_3rdparty_in21k-192px_20220803-f7dc9763.pth' # noqa +model = dict( + backbone=dict( + window_size=[12, 12, 12, 6], + pretrained_window_sizes=[12, 12, 12, 6], + init_cfg=dict( + type='Pretrained', + checkpoint=checkpoint, + prefix='backbone', + )), + head=dict(num_classes=1604), + train_cfg=dict(_delete_=True), +) + +train_dataloader = dict( + batch_size=64, + num_workers=14) + +val_dataloader = dict( + batch_size=256, + num_workers=14) + +train_cfg = dict(max_epochs=6) + +optim_wrapper = dict(type='AmpOptimWrapper') + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=0.01, + by_epoch=False, + end=2100), + # main learning rate scheduler + dict(type='CosineAnnealingLR', eta_min=0, by_epoch=False, begin=2100) +] + +custom_imports = dict(imports=['mmpretrain_custom'], allow_failed_imports=False) diff --git a/configs/fungi2023/swinv2_base_w16_b32x4-fp16_fungi+val_res_384_cb_epochs_6.py b/configs/fungi2023/swinv2_base_w16_b32x4-fp16_fungi+val_res_384_cb_epochs_6.py new file mode 100644 index 0000000000000000000000000000000000000000..1b2e42eea65a7fc3d6f2fd26a94bb79c638468b4 --- /dev/null +++ b/configs/fungi2023/swinv2_base_w16_b32x4-fp16_fungi+val_res_384_cb_epochs_6.py @@ -0,0 +1,45 @@ +_base_ = [ + '../_base_/models/swin_transformer_v2/base_384_aug.py', '../_base_/datasets/fungi_bs16_swin_384_class-balanced.py', + '../_base_/schedules/fungi_bs64_adamw_swin.py', '../_base_/default_runtime.py' +] + +# model settings +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/swin-v2/pretrain/swinv2-base-w12_3rdparty_in21k-192px_20220803-f7dc9763.pth' # noqa +model = dict( + backbone=dict( + window_size=[16, 16, 16, 8], + pretrained_window_sizes=[12, 12, 12, 6], + init_cfg=dict( + type='Pretrained', + checkpoint=checkpoint, + prefix='backbone', + )), + head=dict(num_classes=1604), + train_cfg=dict(_delete_=True), +) + +train_dataloader = dict( + batch_size=32, + num_workers=14) + +val_dataloader = dict( + batch_size=64, + num_workers=12) + +train_cfg = dict(max_epochs=6) + +optim_wrapper = dict(type='AmpOptimWrapper') + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=0.01, + by_epoch=False, + end=4200), + # main learning rate scheduler + dict(type='CosineAnnealingLR', eta_min=0, by_epoch=False, begin=4200) +] + +custom_imports = dict(imports=['mmpretrain_custom'], allow_failed_imports=False) diff --git a/configs/fungi2023/swinv2_base_w16_b32x4-fp16_fungi+val_res_384_cb_epochs_6_lr_2e-4.py b/configs/fungi2023/swinv2_base_w16_b32x4-fp16_fungi+val_res_384_cb_epochs_6_lr_2e-4.py new file mode 100644 index 0000000000000000000000000000000000000000..188d01852da0861e20139752b0d6b6bb7ee02577 --- /dev/null +++ b/configs/fungi2023/swinv2_base_w16_b32x4-fp16_fungi+val_res_384_cb_epochs_6_lr_2e-4.py @@ -0,0 +1,51 @@ +_base_ = [ + '../_base_/models/swin_transformer_v2/base_384_aug.py', '../_base_/datasets/fungi_bs16_swin_384_class-balanced.py', + '../_base_/schedules/fungi_bs64_adamw_swin.py', '../_base_/default_runtime.py' +] + +# model settings +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/swin-v2/pretrain/swinv2-base-w12_3rdparty_in21k-192px_20220803-f7dc9763.pth' # noqa +model = dict( + backbone=dict( + window_size=[16, 16, 16, 8], + pretrained_window_sizes=[12, 12, 12, 6], + init_cfg=dict( + type='Pretrained', + checkpoint=checkpoint, + prefix='backbone', + )), + head=dict(num_classes=1604), + train_cfg=dict(_delete_=True), +) + +train_dataloader = dict( + batch_size=32, + num_workers=14) + +val_dataloader = dict( + batch_size=64, + num_workers=12) + +train_cfg = dict(max_epochs=6) + +optim_wrapper = dict( + type='AmpOptimWrapper', + # for batch in each gpu is 16, 4 gpu + # lr = 1e-4 * 16 * 4 / 512 = 0.0002 + optimizer=dict( + type='AdamW', + lr=1e-4 * 64 / 512)) + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=0.01, + by_epoch=False, + end=4200), + # main learning rate scheduler + dict(type='CosineAnnealingLR', eta_min=0, by_epoch=False, begin=4200) +] + +custom_imports = dict(imports=['mmpretrain_custom'], allow_failed_imports=False) diff --git a/configs/fungi2023/swinv2_base_w24_b32x4-fp16_fungi+val_res_384_cb_epochs_6.py b/configs/fungi2023/swinv2_base_w24_b32x4-fp16_fungi+val_res_384_cb_epochs_6.py new file mode 100644 index 0000000000000000000000000000000000000000..12dab1b52a4fb7c6a12e99636c4cc87aee6f476d --- /dev/null +++ b/configs/fungi2023/swinv2_base_w24_b32x4-fp16_fungi+val_res_384_cb_epochs_6.py @@ -0,0 +1,45 @@ +_base_ = [ + '../_base_/models/swin_transformer_v2/base_384_aug.py', '../_base_/datasets/fungi_bs16_swin_384_class-balanced.py', + '../_base_/schedules/fungi_bs64_adamw_swin.py', '../_base_/default_runtime.py' +] + +# model settings +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/swin-v2/pretrain/swinv2-base-w12_3rdparty_in21k-192px_20220803-f7dc9763.pth' # noqa +model = dict( + backbone=dict( + window_size=[24, 24, 24, 12], + pretrained_window_sizes=[12, 12, 12, 6], + init_cfg=dict( + type='Pretrained', + checkpoint=checkpoint, + prefix='backbone', + )), + head=dict(num_classes=1604), + train_cfg=dict(_delete_=True), +) + +train_dataloader = dict( + batch_size=32, + num_workers=14) + +val_dataloader = dict( + batch_size=64, + num_workers=12) + +train_cfg = dict(max_epochs=6) + +optim_wrapper = dict(type='AmpOptimWrapper') + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=0.01, + by_epoch=False, + end=4200), + # main learning rate scheduler + dict(type='CosineAnnealingLR', eta_min=0, by_epoch=False, begin=4200) +] + +custom_imports = dict(imports=['mmpretrain_custom'], allow_failed_imports=False) diff --git a/configs/fungi2023/swinv2_base_w24_b32x4-fp16_fungi+val_res_384_cb_epochs_9.py b/configs/fungi2023/swinv2_base_w24_b32x4-fp16_fungi+val_res_384_cb_epochs_9.py new file mode 100644 index 0000000000000000000000000000000000000000..72fe165332006be8a034b21a61c902cfde97d035 --- /dev/null +++ b/configs/fungi2023/swinv2_base_w24_b32x4-fp16_fungi+val_res_384_cb_epochs_9.py @@ -0,0 +1,45 @@ +_base_ = [ + '../_base_/models/swin_transformer_v2/base_384_aug.py', '../_base_/datasets/fungi_bs16_swin_384_class-balanced.py', + '../_base_/schedules/fungi_bs64_adamw_swin.py', '../_base_/default_runtime.py' +] + +# model settings +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/swin-v2/pretrain/swinv2-base-w12_3rdparty_in21k-192px_20220803-f7dc9763.pth' # noqa +model = dict( + backbone=dict( + window_size=[24, 24, 24, 12], + pretrained_window_sizes=[12, 12, 12, 6], + init_cfg=dict( + type='Pretrained', + checkpoint=checkpoint, + prefix='backbone', + )), + head=dict(num_classes=1604), + train_cfg=dict(_delete_=True), +) + +train_dataloader = dict( + batch_size=32, + num_workers=30) + +val_dataloader = dict( + batch_size=256, + num_workers=30) + +train_cfg = dict(max_epochs=9) + +optim_wrapper = dict(type='AmpOptimWrapper') + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=0.01, + by_epoch=False, + end=4200), + # main learning rate scheduler + dict(type='CosineAnnealingLR', eta_min=0, by_epoch=False, begin=4200) +] + +custom_imports = dict(imports=['mmpretrain_custom'], allow_failed_imports=False) diff --git a/configs/fungi2023/swinv2_large_w24_b32x8-fp16_fungi+val_res_384_cb_epochs_12.py b/configs/fungi2023/swinv2_large_w24_b32x8-fp16_fungi+val_res_384_cb_epochs_12.py new file mode 100644 index 0000000000000000000000000000000000000000..fd87b0107c8207e39406dda73090018523d6a9d4 --- /dev/null +++ b/configs/fungi2023/swinv2_large_w24_b32x8-fp16_fungi+val_res_384_cb_epochs_12.py @@ -0,0 +1,45 @@ +_base_ = [ + '../_base_/models/swin_transformer_v2/large_384_aug.py', '../_base_/datasets/fungi_bs16_swin_384_class-balanced.py', + '../_base_/schedules/fungi_bs64_adamw_swin.py', '../_base_/default_runtime.py' +] + +# model settings +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/swin-v2/pretrain/swinv2-large-w12_3rdparty_in21k-192px_20220803-d9073fee.pth' # noqa +model = dict( + backbone=dict( + window_size=[24, 24, 24, 12], + pretrained_window_sizes=[12, 12, 12, 6], + init_cfg=dict( + type='Pretrained', + checkpoint=checkpoint, + prefix='backbone', + )), + head=dict(num_classes=1604), + train_cfg=dict(_delete_=True), +) + +train_dataloader = dict( + batch_size=32, + num_workers=30) + +val_dataloader = dict( + batch_size=128, + num_workers=30) + +train_cfg = dict(max_epochs=12) + +optim_wrapper = dict(type='AmpOptimWrapper') + +# learning policy +param_scheduler = [ + # warm up learning rate scheduler + dict( + type='LinearLR', + start_factor=0.01, + by_epoch=False, + end=2100), + # main learning rate scheduler + dict(type='CosineAnnealingLR', eta_min=0, by_epoch=False, begin=2100) +] + +custom_imports = dict(imports=['mmpretrain_custom'], allow_failed_imports=False) diff --git a/mmpretrain_custom/__init__.py b/mmpretrain_custom/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..975d883b3551e3ab8a76306fb79d12e88d34c496 --- /dev/null +++ b/mmpretrain_custom/__init__.py @@ -0,0 +1 @@ +from .datasets import * diff --git a/mmpretrain_custom/datasets/__init__.py b/mmpretrain_custom/datasets/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..c491ccff227c413a44e0e293376562a3cfc6027b --- /dev/null +++ b/mmpretrain_custom/datasets/__init__.py @@ -0,0 +1,3 @@ +from .fungi import Fungi, FungiTest + +from .transforms import * diff --git a/mmpretrain_custom/datasets/fungi.py b/mmpretrain_custom/datasets/fungi.py new file mode 100644 index 0000000000000000000000000000000000000000..6e46d9f3709e6ee737b8674629786e81dc4f3b98 --- /dev/null +++ b/mmpretrain_custom/datasets/fungi.py @@ -0,0 +1,770 @@ +import numpy as np +import pandas as pd + +import mmcv + +from mmpretrain.datasets.base_dataset import BaseDataset +from mmpretrain.datasets.builder import DATASETS + + +@DATASETS.register_module() +class Fungi(BaseDataset): + CLASSES = [ + 'Abortiporus biennis (Bull.) Singer', 'Acarospora fuscata (Nyl.) Arnold', 'Achroomyces disciformis (Fr.) Donk', + 'Acrospermum compressum Tode', 'Agaricus arvensis Schaeff.', 'Agaricus augustus Fr.', + 'Agaricus bernardii (Quél.) Sacc.', 'Agaricus bisporus (J.E.Lange) Pilat', 'Agaricus bitorquis (Quél.) Sacc.', + 'Agaricus bohusii Bon', 'Agaricus brunneolus (J.E.Lange) Pilát', 'Agaricus campestris L.', + 'Agaricus crocodilinus Murrill', 'Agaricus cupreobrunneus (Jul.Schäff. & Steer) Pilát', + 'Agaricus dulcidulus Schulzer', 'Agaricus essettei Bon', 'Agaricus impudicus (Rea) Pilát', + 'Agaricus langei (F.H.Møller & Jul.Schäff.) Maire', 'Agaricus lanipes (F.H.Møller & Jul.Schäff.) Singer', + 'Agaricus litoralis (Wakef. & A.Pearson) Pilát', 'Agaricus moelleri Wasser', + 'Agaricus subfloccosus (J.E.Lange) Pilát', 'Agaricus subperonatus (J.E.Lange) Singer', + 'Agaricus sylvaticus Schaeff.', 'Agaricus sylvicola (Vittad.) Peck, 1872', 'Agaricus xanthodermus Genev.', + 'Agrocybe arvalis (Fr.) Singer', 'Agrocybe dura (Bolton) Singer', 'Agrocybe elatella (P.Karst.) Vesterh.', + 'Agrocybe pediades (Fr.) Fayod', 'Agrocybe praecox (Pers.) Fayod', 'Agrocybe rivulosa Nauta', + 'Aleuria aurantia (Pers.) Fuckel', 'Aleurodiscus amorphus (Pers.) J.Schröt., 1888', + 'Amanita ceciliae (Berk. & Broome) Bas', 'Amanita citrina Pers., 1797', 'Amanita crocea (Quél.) Singer', + 'Amanita excelsa Gonn. & Rabenh.', 'Amanita franchetii (Boud.) Fayod', 'Amanita fulva (Schaeff.) Fr.', + 'Amanita gemmata (Fr.) Bertill.', 'Amanita lividopallescens (Secr. ex Boud.) Kühner & Romagn.', + 'Amanita muscaria (L.) Lam., 1783', 'Amanita pantherina (DC.) Krombh.', + 'Amanita phalloides (Vaill. ex Fr.) Link', 'Amanita porphyria Alb. & Schwein.', + 'Amanita rubescens (Pers.) Gray', 'Amanita strobiliformis Gonn. & Rabenh.', + 'Amanita submembranacea (Bon) Gröger', 'Amanita vaginata (Bull.) Vittad.', 'Amanita virosa (Fr.) Bertill.', + 'Amphinema byssoides (Pers.) J.Erikss.', + 'Ampulloclitocybe clavipes (Pers.) Redhead, Lutzoni, Moncalvo & Vilgalys', + 'Amyloporia sinuosa (Fr.) Rajchenb., Gorjón & Pildain, 2011', 'Amyloporia xantha (Fr.) Bondartsev & Singer', + 'Amylostereum chailletii (Pers.) Boidin', 'Amylostereum laevigatum (Fr.) Boidin', + 'Antrodiella serpula (P.Karst.) Spirin & Niemelä', 'Aporhytisma urticae (Fr.) Höhn., 1917', + 'Arcyria cinerea Fr.', 'Arcyria denudata Fr.', 'Armillaria lutea Gillet', 'Armillaria mellea (Vahl) P.Kumm.', + 'Armillaria ostoyae (Romagn.) Herink', 'Arrhenia acerosa (Fr.) Kühner', + 'Arrhenia chlorocyanea (Pat.) Redhead, Lutzoni, Moncalvo & Vilgalys', + 'Arrhenia gerardiana (Peck) Elborne, 2008', 'Arrhenia lobata (Pers.) Kühner & Lamoure ex Redhead', + 'Arrhenia obscurata (D.A.Reid) Redhead, Lutzoni, Moncalvo & Vilgalys', + 'Arrhenia peltigerina (Peck) Redhead, Lutzoni, Moncalvo & Vilgalys', 'Arrhenia retiruga (Bull.) Redhead', + 'Arrhenia spathulata (Fr.) Redhead', 'Arthonia radiata (Pers.) Ach.', 'Ascocoryne albida (Berk.) Seifert, 2014', + 'Ascocoryne cylichnium (Tul.) Korf', 'Ascocoryne sarcoides (Jacq.) J.W.Groves & D.E.Wilson', + 'Ascodichaena rugosa Butin', 'Ascotremella faginea (Peck) Seaver', + 'Aspropaxillus giganteus (Sowerby) Kühner & Maire', 'Asterophora lycoperdoides (Bull.) Ditmar', + 'Asterophora parasitica (Bull. ex Pers.) Singer', 'Athelia epiphylla Pers.', + 'Atheniella adonis (Bull.) Redhead, Moncalvo, Vilgalys, Desjardin & B.A.Perry, 2012', + 'Atheniella flavoalba (Fr.) Redhead, Moncalvo, Vilgalys, Desjardin & B.A.Perry, 2012', + 'Aurantiporus croceus (Pers.) Murrill', 'Aurantiporus fissilis (Berk. & M.A.Curtis) H.Jahn', + 'Aureoboletus gentilis (Quél.) Pouzar', 'Aureoboletus projectellus (Murrill) Halling, 2015', + 'Auricularia auricula-judae (Fr.) J.Schröt.', 'Auricularia mesenterica (Dicks.) Pers.', + 'Auriscalpium vulgare Gray', 'Badhamia utricularis (Bull.) Berk., 1852', 'Baeomyces rufus (Huds.) Rebent.', + 'Baeospora myosura (Fr.) Singer', 'Basidioradulum radula (Fr.) Nobles, 1967', + 'Bertia moriformis (Tode) De Not.', 'Bispora antennata (Pers.) E.W.Mason', + 'Bisporella pallescens (Pers.) S.E.Carp. & Korf', 'Bisporella subpallida (Rehm) Dennis', + 'Bjerkandera adusta (Willd.) P.Karst.', 'Bjerkandera fumosa (Pers.) P.Karst.', 'Blumeria graminis (DC.) Speer', + 'Bolbitius coprophilus (Peck) Hongo', 'Bolbitius titubans (Bull.) Fr., 1838', 'Boletus aereus Secr.', + 'Boletus edulis Bull.', 'Boletus pinophilus Pilát & Dermek', 'Boletus reticulatus Schaeff.', + 'Botryobasidium aureum Parmasto', 'Botryobasidium subcoronatum (Höhn. & Litsch.) Donk', + 'Botryobasidium vagum (Berk. & M.A.Curtis) D.P.Rogers', 'Bovista nigrescens Pers.', 'Bovista plumbea Pers.', + 'Brefeldia maxima (Fr.) Rostaf.', 'Brevicellicium olivascens (Bres.) K.H.Larss. & Hjortstam', + 'Brunneoporus kuzyanus (Pilát) Audet, 2017', 'Buchwaldoboletus lignicola (Kallenb.) Pilát', + 'Buglossoporus quercinus (Schrad.) Kotl. & Pouzar, 1966', 'Bulbillomyces farinosus (Bres.) Jülich', + 'Bulgaria inquinans (Pers.) Fr.', 'Butyriboletus appendiculatus (Schaeff.) D.Arora & J.L.Frank, 2014', + 'Butyriboletus fechtneri (Velen.) D.Arora & J.L.Frank, 2014', + 'Butyriboletus fuscoroseus (Smotl.) Vizzini & Gelardi, 2014', + 'Byssocorticium atrovirens (Fr.) Bondartsev & Singer', 'Byssomerulius corium (Pers.) Parmasto', + 'Byssonectria terrestris (Alb. & Schwein.) Pfister, 1994', 'Calloria neglecta (Lib.) B.Hein', + 'Caloboletus calopus (Pers.) Vizzini, 2014', 'Caloboletus radicans (Pers.) Vizzini, 2014', + 'Calocera cornea (Batsch) Fr.', 'Calocera furcata (Fr.) Fr.', 'Calocera viscosa (Pers.) Fr.', + 'Calocybe carnea (Bull.) Donk, 1962', 'Calocybe gambosa (Fr.) Singer', + 'Calogaya decipiens (Arnold) Arup, Frödén & Søchting', 'Caloscypha fulgens (Pers.) Boud.', + 'Calycina citrina (Hedw.) Gray', 'Calyptella campanula (Nees) W.B.Cooke', 'Calyptella capula (Holmsk.) Quél.', + 'Camarophyllopsis schulzeri (Bres.) Herink', 'Camarops polysperma (Mont.) J.H.Mill.', + 'Candelariella aurella (Hoffm.) Zahlbr.', 'Candelariella vitellina (Ehrh.) Müll.Arg.', + 'Cantharellus amethysteus (Quél.) Sacc.', 'Cantharellus cibarius Fr.', 'Cantharellus pallens Pilát', + 'Capitotricha bicolor (Bull.) Baral, 1985', 'Cartilosoma ramentaceum (Berk. & Broome) Teixeira', + 'Ceraceomyces serpens (Tode) Ginns', 'Ceratiomyxa fruticulosa (O.F.Müll.) T.Macbr., 1899', + 'Cerioporus squamosus (Huds.) Quél., 1886', 'Cerioporus varius (Pers.) Zmitr. & Kovalenko, 2016', + 'Ceriporia excelsa S.Lundell ex Parmasto', 'Ceriporia purpurea (Fr.) Komarova', + 'Ceriporia reticulata (Hoffm.) Domanski', 'Ceriporiopsis gilvescens (Bres.) Domanski', + 'Ceriporiopsis resinascens (Romell) Domanski', 'Cerrena unicolor (Bull.) Murrill', + 'Cetraria aculeata (Schreb.) Fr.', 'Cetraria islandica (L.) Ach.', 'Cetraria muricata (Ach.) Eckfeldt', + 'Chaenotheca ferruginea (Turner ex Sm.) Mig.', + 'Chaetosphaerella phaeostroma (Durieu & Mont.) E.Müll. & C.Booth', 'Chalciporus piperatus (Bull.) Bataille', + 'Cheilymenia fimicola (De Not. & Bagl.) Dennis', 'Cheilymenia granulata (Bull.) J.Moravec', + 'Chlorociboria aeruginascens (Nyl.) Kanouse', 'Chlorophyllum brunneum (Farl. & Burt) Vellinga', + 'Chlorophyllum olivieri (Barla) Vellinga', 'Chlorophyllum rhacodes (Vittad.) Vellinga', + 'Chondrostereum purpureum (Pers.) Pouzar', 'Chromocyphella muscicola (Fr.) Donk', + 'Chroogomphus rutilus (Schaeff.) O.K.Mill.', 'Chrysomphalina grossula (Pers.) Norvell, Redhead & Ammirati', + 'Ciboria amentacea (Balb.) Fuckel', 'Ciboria rufofusca (O.Weberb.) Sacc.', + 'Cinereomyces lindbladii (Berk.) Jülich', 'Circinaria caesiocinerea (Nyl. ex Malbr.) A.Nordin, Savic & Tibell', + 'Circinaria contorta (L.) A.Nordin, Savic & Tibell', 'Cladomeris umbellata (Pers.) Quél.', + 'Cladonia chlorophaea (Flörke ex Sommerf.) Spreng.', 'Cladonia ciliata Stirt.', + 'Cladonia coniocraea (Flörke) Spreng.', 'Cladonia digitata (L.) Hoffm.', 'Cladonia diversa Asperges', + 'Cladonia fimbriata (L.) Fr.', 'Cladonia floerkeana (Fr.) Flörke', 'Cladonia foliacea (Huds.) Willd.', + 'Cladonia furcata (Huds.) Schrad., 1794', 'Cladonia glauca Flörke', 'Cladonia gracilis (L.) Willd.', + 'Cladonia humilis (With.) J.R.Laundon', 'Cladonia macilenta Hoffm.', 'Cladonia merochlorophaea Asahina', + 'Cladonia ochrochlora Flörke', 'Cladonia polydactyla (Flörke) Spreng.', 'Cladonia portentosa (Dufour) Coem.', + 'Cladonia pyxidata (L.) Hoffm.', 'Cladonia ramulosa (With.) J.R.Laundon', + 'Cladonia rangiferina (L.) Weber ex F.H.Wigg.', 'Cladonia rangiformis Hoffm.', + 'Cladonia scabriuscula (Delise) Leight.', 'Cladonia subulata (L.) Weber ex F.H.Wigg.', + 'Cladonia uncialis (L.) Weber ex F.H.Wigg.', 'Clathrus archeri (Berk.) Dring', 'Clavaria argillacea Fr.', + 'Clavaria falcata Pers.', 'Clavaria fragilis Holmsk.', 'Clavaria tenuipes Berk. & Broome', + 'Clavaria zollingeri Lév.', 'Clavariadelphus pistillaris (L.) Donk', 'Claviceps purpurea (Fr.) Tul.', + 'Clavulina cinerea (Bull.) J.Schröt.', 'Clavulina coralloides (L.) J.Schröt.', + 'Clavulina rugosa (Bull.) J.Schröt.', 'Clavulinopsis corniculata (Schaeff.) Corner', + 'Clavulinopsis helvola (Pers.) Corner', 'Clavulinopsis laeticolor (Berk. & M.A.Curtis) R.H.Petersen', + 'Clavulinopsis luteoalba (Rea) Corner', 'Clavulinopsis umbrinella (Sacc.) Corner', + 'Clitocella popinalis (Fr.) Kluting, T.J.Baroni & Bergemann, 2014', 'Clitocybe agrestis Harmaja', + 'Clitocybe diatreta (Fr.) P.Kumm.', 'Clitocybe fragrans Sowerby', 'Clitocybe metachroa (Fr.) P.Kumm.', + 'Clitocybe nebularis (Batsch) Quél.', 'Clitocybe nitrophila Bon', 'Clitocybe odora (Bull.) P.Kumm.', + 'Clitocybe phyllophila (Pers.) P.Kumm.', 'Clitocybe rivulosa (Pers.) P.Kumm.', + 'Clitocybe trulliformis (Fr.) P.Karst., 1879', 'Clitocybe vibecina (Fr.) Quél.', + 'Clitopilus hobsonii (Berk. & Broome) P.D.Orton', 'Clitopilus prunulus (Scop.) Fr.', + 'Coleosporium tussilaginis (Pers.) Lév.', 'Collybia cirrhata (Schumach.) P.Kumm.', + 'Collybia cookei (Bres.) J.D.Arnold', 'Colpoma quercinum (Pers.) Wallr.', 'Coltricia confluens P.-J.Keizer', + 'Coltricia perennis (L.) Murrill', 'Comatricha nigra (Pers.) J.Schröt.', 'Coniophora arida (Fr.) P.Karst.', + 'Coniophora puteana (Schumach.) P.Karst.', 'Conocybe albipes Hauskn.', 'Conocybe subpubescens P.D.Orton', + 'Coprinellus angulatus (Peck) Redhead, Vilgalys & Moncalvo', 'Coprinellus disseminatus (Pers.) J.E.Lange', + 'Coprinellus domesticus (Bolton) Vilgalys, Hopple & Jacq.Johnson', + 'Coprinellus flocculosus (DC.) Vilgalys, Hopple & Jacq.Johnson', + 'Coprinellus micaceus (Bull.) Vilgalys, Hopple & Jacq.Johnson', + 'Coprinellus radians (Desm.) Vilgalys, Hopple & Jacq.Johnson', + 'Coprinellus xanthothrix (Romagn.) Vilgalys, Hopple & Jacq.Johnson', + 'Coprinopsis atramentaria (Bull.) Redhead, Vilgalys & Moncalvo', + 'Coprinopsis candidata (Uljé) Gminder & T.Böhning, 2016', + 'Coprinopsis canoceps (Kauffman) Örstadius & E.Larss., 2015', + 'Coprinopsis cinerea (Schaeff.) Redhead, Vilgalys & Moncalvo', 'Coprinopsis ephemeroides (DC.) G.Moreno, 2010', + 'Coprinopsis insignis (Peck) Redhead, Vilgalys & Moncalvo', + 'Coprinopsis kubickae (Pilát & Svrcek) Redhead, Vilgalys & Moncalvo', + 'Coprinopsis lagopus (Fr.) Redhead, Vilgalys & Moncalvo, 2001', + 'Coprinopsis macrocephala (Berk.) Redhead, Vilgalys & Moncalvo', + 'Coprinopsis nivea (Pers.) Redhead, Vilgalys & Moncalvo', + 'Coprinopsis picacea (Bull.) Redhead, Vilgalys & Moncalvo', + 'Coprinopsis romagnesiana (Singer) Redhead, Vilgalys & Moncalvo', + 'Coprinopsis stercorea (Fr.) Redhead, Vilgalys & Moncalvo', + 'Coprinopsis urticicola (Berk. & Broome) Redhead, Vilgalys & Moncalvo', 'Coprinus comatus (O.F.Müll.) Gray', + 'Cordyceps militaris (L.) Link', 'Corticium roseum Pers., 1794', 'Cortinarius acetosus (Velen.) Melot', + 'Cortinarius acutus (Pers.) Fr.', 'Cortinarius alboviolaceus (Pers.) Fr.', + 'Cortinarius alcalinophilus Rob.Henry', 'Cortinarius anomalus (Pers.) Fr.', + 'Cortinarius anserinus (Velen.) Rob.Henry', 'Cortinarius aprinus Melot', + 'Cortinarius armillatus (Alb. & Schwein.) Fr.', 'Cortinarius balteatocumatilis Rob.Henry ex P.D.Orton', + 'Cortinarius barbatus (Batsch) Melot', 'Cortinarius bergeronii (Melot) Melot', 'Cortinarius biformis Fr.', + 'Cortinarius bolaris (Pers.) Fr.', 'Cortinarius caerulescens (Schaeff.) Fr.', + 'Cortinarius camphoratus (Fr.) Fr.', 'Cortinarius caninus (Fr.) Fr.', 'Cortinarius caperatus (Pers.) Fr.', + 'Cortinarius cinnabarinus Fr.', 'Cortinarius cinnamomeus (L.) Fr.', + 'Cortinarius citrinus (J.E.Lange) Rob.Henry', 'Cortinarius cliduchus Secr. ex Fr.', + 'Cortinarius collinitus (Pers.) Fr.', 'Cortinarius croceocaeruleus (Pers.) Fr.', + 'Cortinarius croceus (Schaeff.) Gray', 'Cortinarius decipiens (Pers.) Fr., 1838', 'Cortinarius delibutus Fr.', + 'Cortinarius elatior Fr., 1838', 'Cortinarius elegantissimus Rob.Henry', + 'Cortinarius emollitoides Bidaud, Moënne-Locc. & Reumaux', 'Cortinarius emollitus Fr.', + 'Cortinarius flexipes (Pers.) Fr.', 'Cortinarius foetens (M.M.Moser) M.M.Moser', + 'Cortinarius hemitrichus (Pers.) Fr.', 'Cortinarius hinnuleus Fr.', 'Cortinarius humolens Brandrud', + 'Cortinarius infractus (Pers.) Fr., 1838', 'Cortinarius largus Fr.', 'Cortinarius lepidopus Cooke', + 'Cortinarius limonius (Fr.) Fr.', 'Cortinarius luhmannii Münzmay, Saar & B.Oertel, 2004', + 'Cortinarius malicorius Fr.', 'Cortinarius mucosus (Bull.) Cooke', 'Cortinarius multiformis (Fr.) Fr.', + 'Cortinarius obtusus (Fr.) Fr.', 'Cortinarius olearioides Rob.Henry', 'Cortinarius olivaceofuscus Kühner', + 'Cortinarius phoeniceus (Vent.) Maire', 'Cortinarius puniceus P.D.Orton', 'Cortinarius purpurascens (Fr.) Fr.', + 'Cortinarius quercoconicus Liimat., Kytov. & Niskanen, 2017', + 'Cortinarius rhizophorus Bidaud & Consiglio, 2012', 'Cortinarius rubellus Cooke', + 'Cortinarius sanguineus (Wulfen) Fr.', 'Cortinarius saniosus (Fr.) Fr.', 'Cortinarius saturninus (Fr.) Fr.', + 'Cortinarius semisanguineus (Fr.) Gillet', 'Cortinarius sphagnophilus Peck', 'Cortinarius stillatitius Fr.', + 'Cortinarius subpurpurascens (Batsch) Fr.', 'Cortinarius subtortus (Pers.) Fr.', 'Cortinarius talus Fr.', + 'Cortinarius torvus (Fr.) Fr.', 'Cortinarius traganus (Fr.) Fr.', 'Cortinarius triumphans Fr.', + 'Cortinarius trivialis J.E.Lange', 'Cortinarius turgidus Fr.', 'Cortinarius uliginosus Berk.', + 'Cortinarius umbrinolens P.D.Orton', 'Cortinarius vernus H.Lindstr. & Melot', 'Cortinarius violaceus (L.) Gray', + 'Cortinarius vulpinus (Velen.) Rob.Henry, 1947', 'Cortinarius xantho-ochraceus P.D.Orton', + 'Cosmospora arxii (W.Gams) Gräfenhan & Schroers, 2011', 'Craterellus cinereus (Pers.) Pers., 1825', + 'Craterellus cornucopioides (L.) Pers.', 'Craterellus melanoxeros (Desm.) Pérez-De-Greg.', + 'Craterellus tubaeformis (Fr.) Quél.', 'Craterellus undulatus (Pers.) Redeuilh', + 'Craterium minutum (Leers) Fr.', 'Crepidotus autochthonus J.E.Lange', 'Crepidotus calolepis (Fr.) P.Karst.', + 'Crepidotus caspari Velen.', 'Crepidotus cesatii (Rabenh.) Sacc.', 'Crepidotus epibryus (Fr.) Quél.', + 'Crepidotus luteolus (Lambotte) Sacc.', 'Crepidotus mollis (Schaeff.) Staude', + 'Crepidotus variabilis (Pers.) P.Kumm.', 'Crinipellis scabella (Alb. & Schwein.) Murrill', + 'Crucibulum crucibuliforme (Scop.) V.S.White', 'Cudonia circinans (Pers.) Fr.', + 'Cudoniella acicularis (Bull.) J.Schröt.', 'Cumminsiella mirabilissima (Peck) Nannf.', + 'Cuphophyllus colemannianus (A.Bloxam) Bon, 1985', 'Cuphophyllus flavipes (Britzelm.) Bon, 1985', + 'Cuphophyllus fornicatus (Fr.) Lodge, Padamsee & Vizzini, 2013', 'Cuphophyllus fuscescens (Bres.) Bon', + 'Cuphophyllus ochraceopallidus (P.D.Orton) Bon, 1985', 'Cuphophyllus pratensis (Fr.) Bon, 1985', + 'Cuphophyllus russocoriaceus (Berk. & Jos.K.Mill.) Bon', 'Cuphophyllus virgineus (Wulfen) Kovalenko, 1989', + 'Cyanoboletus pulverulentus (Opat.) Gelardi, Vizzini & Simonini, 2014', + 'Cyathicula cyathoidea (Bull.) Thüm., 1874', 'Cyathus olla (Batsch) Pers.', 'Cyathus striatus (Huds.) Willd.', + 'Cyclocybe erebia (Fr.) Vizzini & Matheny, 2014', 'Cylindrobasidium evolvens (Fr.) Jülich', + 'Cystoderma amianthinum (Scop.) Fayod', 'Cystoderma carcharias (Pers.) Fayod', + 'Cystoderma jasonis (Cooke & Massee) Harmaja', 'Cystodermella cinnabarina (Alb. & Schwein.) Harmaja', + 'Cystodermella granulosa (Batsch) Harmaja', 'Cystolepiota bucknallii (Berk. & Broome) Singer & Clémençon', + 'Cystolepiota seminuda (Lasch) Bon', 'Dacrymyces capitatus Schwein.', 'Dacrymyces lacrymalis (Pers.) Sommerf.', + 'Dacrymyces stillatus Nees', 'Dacryobolus karstenii (Bres.) Oberw. ex Parmasto', 'Daedalea quercina (L.) Pers.', + 'Daedaleopsis confragosa (Bolton) J.Schröt.', 'Daldinia concentrica (Bolton) Ces. & De Not.', + 'Datronia mollis (Sommerf.) Donk, 1966', 'Deconica crobula (Fr.) Romagn., 1937', + 'Deconica horizontalis (Bull.) Noordel., 2009', 'Deconica inquilina (Fr.) Romagn., 1937', + 'Deconica merdaria (Fr.) Noordel., 2009', 'Deconica montana (Pers.) P.D.Orton, 1960', + 'Delicatula integrella (Pers.) Fayod', 'Dendrothele acerina (Pers.) P.A.Lemke', + 'Dermoloma cuneifolium (Fr.) Singer', 'Dialonectria episphaeria (Tode) Cooke, 1884', + 'Diatrype bullata (Hoffm.) Fr.', 'Diatrype decorticata (Pers.) Rappaz', 'Diatrype disciformis (Hoffm.) Fr.', + 'Diatrype quercina (Pers.) Fr., 1849', 'Diatrype undulata (Berk. & Broome) Berk. & Broome', + 'Diatrypella favacea (Fr.) Ces. & De Not.', 'Diatrypella verruciformis (Ehrh.) Nitschke', + 'Dichomitus campestris (Quél.) Domanski & Orlicz', 'Dictydiaethalium plumbeum (Schumach.) Rostaf. ex Lister', + 'Didymium squamulosum Fuckel', 'Disciotis venosa (Pers.) Arnould', + 'Dissingia leucomelaena (Pers.) K.Hansen & X.H.Wang', 'Dumontinia tuberosa (Bull.) L.M.Kohn', + 'Durella connivens (Fr.) Rehm', 'Echinoderma asperum (Pers.) Bon, 1991', + 'Echinoderma echinaceum (J.E.Lange) Bon, 1991', 'Echinoderma jacobi (Vellinga & Knudsen) Gminder, 2003', + 'Echinosphaeria canescens (Pers.) A.N.Mill. & Huhndorf', 'Elaphomyces granulatus Fr.', + 'Elaphomyces muricatus Fr.', 'Enchylium tenax (Sw.) Gray', 'Encoelia furfuracea (Roth) P.Karst.', + 'Entoloma araneosum (Quél.) M.M.Moser', 'Entoloma asprellum (Fr.) Fayod', 'Entoloma atrocoeruleum Noordel.', + 'Entoloma bloxamii (Berk. & Broome) Sacc.', 'Entoloma cetratum (Fr.) M.M.Moser', + 'Entoloma chalybaeum (Pers.) Zerova', 'Entoloma clypeatum (L.) P.Kumm., 1871', + 'Entoloma conferendum (Britzelm.) Noordel., 1980', 'Entoloma euchroum (Pers.) Donk', + 'Entoloma exile (Fr.) Hesler', 'Entoloma formosum (Fr.) Noordel.', 'Entoloma griseocyaneum (Fr.) P.Kumm.', + 'Entoloma hebes (Romagn.) Trimbach', 'Entoloma incanum (Fr.) Hesler', + 'Entoloma incarnatofuscescens (Britzelm.) Noordel.', 'Entoloma lanuginosipes Noordel.', + 'Entoloma lividoalbum (Kühner & Romagn.) M.M.Moser', 'Entoloma mougeotii (Fr.) Hesler, 1967', + 'Entoloma neglectum (Lasch) Arnolds', 'Entoloma nitidum Quél., 1883', 'Entoloma papillatum (Bres.) Dennis', + 'Entoloma pleopodium (Bull.) Noordel.', 'Entoloma prunuloides (Fr.) Quél.', + 'Entoloma rhodocylix (Lasch) M.M.Moser', 'Entoloma rhodopolium (Fr.) P.Kumm.', + 'Entoloma sepium (Noulet & Dass.) Richon & Roze, 1880', 'Entoloma sericatum (Britzelm.) Sacc.', + 'Entoloma sericellum (Fr.) P.Kumm., 1871', 'Entoloma sericeum Quél., 1872', 'Entoloma serrulatum (Fr.) Hesler', + 'Entoloma sinuatum (Bull.) P.Kumm.', 'Entoloma sordidulum (Kühner & Romagn.) P.D.Orton', + 'Entoloma turbidum (Fr.) Quél., 1872', 'Entoloma undatum (Fr.) M.M.Moser', 'Entoloma vernum S.Lundell', + 'Entyloma ficariae A.A.Fisch.Waldh.', 'Epichloe typhina (Pers.) Tul. & C.Tul.', 'Eriopezia caesia (Pers.) Rehm', + 'Erysiphe alphitoides (Griffon & Maubl.) U.Braun & S.Takam.', 'Erysiphe heraclei DC.', + 'Erythricium aurantiacum (Lasch) D.Hawksw. & A.Henrici, 2015', 'Eutypa flavovirens (Pers.) Tul. & C.Tul.', + 'Eutypa lata (Pers.) Tul. & C.Tul.', 'Eutypa maura (Fr.) Sacc.', 'Eutypa spinosa (Pers.) Tul. & C.Tul.', + 'Eutypella sorbi (Alb. & Schwein.) Sacc.', 'Evernia prunastri (L.) Ach.', 'Exidia glandulosa (Bull.) Fr.', + 'Exidia nigricans (With.) P.Roberts, 2009', 'Exidia pithya Fr.', 'Exidia recisa (Ditmar) Fr.', + 'Exidia saccharina Fr.', 'Exidia thuretiana (Lév.) Fr.', 'Exidiopsis effusa Bref.', + 'Exidiopsis grisea (Pers.) Bourdot & Maire', 'Exobasidium juelianum Nannf.', + 'Exobasidium vaccinii (Fuckel) Woronin', 'Fistulina hepatica (Schaeff.) With.', + 'Flagelloscypha minutissima (Burt) Donk', 'Flammula alnicola (Fr.) P.Kumm.', + 'Flammulaster carpophilus (Fr.) Earle', 'Flammulaster granulosus (J.E.Lange) Watling', + 'Flammulaster limulatus (Fr.) Watling, 1967', 'Flammulaster muricatus (Fr.) Watling', + 'Flammulaster subincarnatus (Joss. & Kühner) Watling', 'Flammulina elastica (Lasch) Redhead & R.H.Petersen', + 'Flammulina velutipes (Curtis) Singer, 1951', 'Flavoparmelia caperata (L.) Hale', + 'Fomes fomentarius (L.) Fr., 1849', 'Fomitiporia hippophaeicola (H.Jahn) Fiasson & Niemelä, 1984', + 'Fomitiporia punctata (Fr.) Murrill', 'Fomitopsis pinicola (Sw.) P.Karst.', + 'Frantisekia mentschulensis (Pilát ex Pilát) Spirin, 2007', 'Fuligo septica (L.) F.H.Wigg., 1780', + 'Fuscoporia contigua (Pers.) G.Cunn., 1948', 'Fuscoporia ferrea (Pers.) G.Cunn., 1948', + 'Fuscoporia ferruginosa (Schrad.) Murrill, 1907', 'Galerina ampullaceocystis P.D.Orton', + 'Galerina atkinsoniana A.H.Sm.', 'Galerina calyptrata P.D.Orton', 'Galerina clavata (Velen.) Kühner', + 'Galerina graminea (Velen.) Kühner, 1935', 'Galerina hybrida Kühner', 'Galerina hypnorum (Schrank) Kühner', + 'Galerina jaapii A.H.Sm. & Singer', 'Galerina marginata (Batsch) Kühner', 'Galerina mniophila (Lasch) Kühner', + 'Galerina paludosa (Fr.) Kühner', 'Galerina pumila (Pers.) M.Lange', 'Galerina sideroides (Bull.) Kühner', + 'Galerina uncialis (Britzelm.) Kühner', 'Galerina vittiformis (Fr.) Earle', + 'Gamundia striatula (Kühner) Raithelh.', 'Ganoderma adspersum (Schulzer) Donk', + 'Ganoderma applanatum (Pers.) Pat.', 'Ganoderma lucidum (Curtis) P.Karst.', 'Ganoderma pfeifferi Bres.', + 'Ganoderma resinaceum Boud.', 'Geastrum coronatum Pers.', 'Geastrum fimbriatum Fr.', + 'Geastrum melanocephalum (Czern.) V.J.Stanek', 'Geastrum michelianum Berk. & Broome', + 'Geastrum pectinatum Pers.', 'Geastrum rufescens Pers.', 'Geastrum schmidelii Vittad.', 'Geastrum striatum DC.', + 'Geoglossum cookeanum Nannf., 1942', 'Geoglossum elongatum Starbäck ex Nannf., 1942', + 'Geoglossum fallax E.J.Durand', 'Geoglossum starbaeckii Nannf.', 'Geoglossum umbratile Sacc.', + 'Geopora sumneriana (Cooke) M.Torre', 'Gliophorus irrigatus (Pers.) A.M.Ainsw. & P.M.Kirk, 2013', + 'Gliophorus laetus (Pers.) Herink, 1958', 'Gliophorus perplexus (A.H.Sm. & Hesler) Kovalenko', + 'Gliophorus psittacinus (Schaeff.) Herink, 1958', 'Gloeocystidiellum porosum (Berk. & M.A.Curtis) Donk', + 'Gloeophyllum sepiarium (Wulfen) P.Karst.', 'Gloeoporus dichrous (Fr.) Bres., 1913', + 'Gloeoporus pannocinctus (Romell) J.Erikss.', 'Gloiothele lactescens (Berk.) Hjortstam', + 'Gloioxanthomyces vitellinus (Fr.) Lodge, Vizzini, Ercole & Boertm., 2013', + 'Glutinoglossum glutinosum (Pers.) Hustad, A.N.Mill., Dentinger & P.F.Cannon, 2013', + 'Glyphium elatum (Grev.) H.Zogg', 'Godronia ribis (Fr.) Seaver', 'Gomphidius glutinosus (Schaeff.) Fr.', + 'Gomphidius maculatus (Scop.) Fr.', 'Gomphidius roseus (Fr.) Fr.', 'Gomphus clavatus (Pers.) Gray', + 'Granulobasidium vellereum (Ellis & Cragin) Jülich', 'Graphis scripta (L.) Ach.', + 'Grifola frondosa (Dicks.) Gray', 'Gymnopilus penetrans (Fr.) Murrill', 'Gymnopilus picreus (Pers.) P.Karst.', + 'Gymnopilus spectabilis (Fr.) Singer', 'Gymnopus acervatus (Fr.) Murrill, 1916', + 'Gymnopus androsaceus (L.) Della Maggiora & Trassin., 2014', 'Gymnopus aquosus (Bull.) Antonín & Noordel.', + 'Gymnopus confluens (Pers.) Antonín, Halling & Noordel.', 'Gymnopus dryophilus (Bull.) Murrill', + 'Gymnopus erythropus (Pers.) Antonín, Halling & Noordel.', + 'Gymnopus fagiphilus (Velen.) Antonín, Halling & Noordel.', 'Gymnopus foetidus (Sowerby) P.M.Kirk, 2014', + 'Gymnopus fuscopurpureus (Pers.) Antonín, Halling & Noordel.', 'Gymnopus fusipes (Bull.) Gray', + 'Gymnopus ocior (Pers.) Antonín & Noordel.', 'Gymnopus perforans (Hoffm.) Antonín & Noordel.', + 'Gymnopus peronatus (Bolton) Antonín, Halling & Noordel.', 'Gymnosporangium clavariiforme Dietel', + 'Gymnosporangium cornutum Arthur ex F.Kern', 'Gymnosporangium sabinae (Dicks.) G.Winter', + 'Gyrodon lividus (Bull.) Fr.', 'Gyromitra ancilis (Pers.) Kreisel', 'Gyromitra esculenta (Pers.) Fr.', + 'Gyromitra gigas (Krombh.) Cooke', 'Gyromitra infula (Schaeff.) Quél.', 'Gyroporus castaneus (Bull.) Quél.', + 'Gyroporus cyanescens (Bull.) Quél.', 'Haematomma ochroleucum (Neck.) J.R.Laundon', + 'Hapalopilus rutilans (Per.) P.Karst.', 'Hebeloma crustuliniforme (Bull.) Quél.', + 'Hebeloma laterinum (Batsch) Vesterh.', 'Hebeloma mesophaeum (Pers.) Quél.', 'Hebeloma radicosum (Bull.) Ricken', + 'Hebeloma sacchariolens Quél.', 'Hebeloma sinapizans (Fr.) Sacc.', 'Hebeloma theobrominum Quadr.', + 'Hebeloma velutipes Bruchet', 'Helminthosphaeria clavariarum (Desm.) Fuckel', 'Helvella acetabulum (L.) Quél.', + 'Helvella crispa (Scop.) Fr.', 'Helvella elastica Bull.', 'Helvella fibrosa (Wallr.) Korf', + 'Helvella lacunosa Afzel.', 'Helvella macropus (Pers.) P.Karst.', 'Helvella solitaria (P.Karst.) P.Karst.', + 'Hemileccinum impolitum (Fr.) Šutara, 2008', 'Hemimycena crispula (Quél.) Singer', + 'Hemimycena cucullata (Pers.) Singer', 'Hemimycena delectabilis (Peck) Singer', + 'Hemimycena lactea (Pers.) Singer', 'Hemipholiota populnea (Pers.) Bon, 1986', + 'Hemitrichia clavata (Pers.) Rostaf.', 'Henningsomyces candidus (Pers.) Kuntze', + 'Hericium cirrhatum (Pers.) Nikol.', 'Hericium coralloides (Scop.) Pers.', 'Hericium erinaceus (Bull.) Pers.', + 'Heterobasidion annosum (Fr.) Bref.', 'Heteroradulum deglubens (Berk. & Broome) Spirin & Malysheva, 2017', + 'Heterosphaeria patella Fr.', 'Hohenbuehelia auriscalpium (Maire) Singer', + 'Hohenbuehelia cyphelliformis (Berk.) O.K.Mill.', 'Hohenbuehelia fluxilis (Fr.) P.D.Orton', + 'Holwaya mucida (Schulzer) Korf & Abawi', 'Homophron cernuum (Vahl) Örstadius & E.Larss., 2015', + 'Homophron spadiceum (P.Kumm.) Örstadius & E.Larss., 2015', + 'Hortiboletus bubalinus (Oolbekk. & Duin) L.Albert & Dima, 2015', + 'Hortiboletus engelii (Hlaváček) Biketova & Wasser, 2015', + 'Hortiboletus rubellus (Krombh.) Simonini, Vizzini & Gelardi, 2015', 'Humaria hemisphaerica (F.H.Wigg.) Fuckel', + 'Hydnellum aurantiacum (Batsch) P.Karst.', 'Hydnellum caeruleum (Hornem.) P.Karst.', + 'Hydnellum concrescens (Pers.) Banker', 'Hydnellum cumulatum K.A.Harrison', + 'Hydnellum ferrugineum (Fr.) P.Karst.', 'Hydnellum lepidum', 'Hydnum ellipsosporum Ostrow & Beenken', + 'Hydnum repandum L.', 'Hydnum rufescens Pers.', 'Hydnum umbilicatum Peck', + 'Hydropisphaera peziza (Tode) Dumort.', 'Hydropus subalpinus (Höhn.) Singer', + 'Hygrocybe acutoconica (Clem.) Singer, 1951', 'Hygrocybe calciphila Arnolds', + 'Hygrocybe cantharellus (Schwein.) Murrill', 'Hygrocybe ceracea (Wulfen) P.Kumm.', + 'Hygrocybe chlorophana (Fr.) Wünsche', 'Hygrocybe citrinovirens (J.E.Lange) Jul.Schäff.', + 'Hygrocybe coccinea (Schaeff.) P.Kumm.', 'Hygrocybe coccineocrenata (P.D.Orton) M.M.Moser', + 'Hygrocybe conica (Schaeff.) P.Kumm.', 'Hygrocybe conicoides (P.D.Orton) P.D.Orton & Watling', + 'Hygrocybe glutinipes (J.E.Lange) R.Haller Aar., 1956', 'Hygrocybe helobia (Arnolds) Bon', + 'Hygrocybe insipida (J.E.Lange ex S.Lundell) M.M.Moser', 'Hygrocybe intermedia (Pass.) Fayod', + 'Hygrocybe konradii R.Haller Aar.', 'Hygrocybe miniata (Fr.) P.Kumm.', 'Hygrocybe mucronella (Fr.) P.Karst.', + 'Hygrocybe phaeococcinea (Arnolds) Bon', 'Hygrocybe punicea (Fr.) P.Kumm.', 'Hygrocybe quieta (Kühner) Singer', + 'Hygrocybe reidii Kühner', 'Hygrocybe spadicea (Scop.) P.Karst.', + 'Hygrocybe splendidissima (P.D.Orton) M.M.Moser', 'Hygrocybe substrangulata (Peck) M.M.Moser', + 'Hygrophoropsis aurantiaca (Wulfen) Maire', 'Hygrophoropsis pallida (Peck) Kreisel', + 'Hygrophoropsis rufa (D.A.Reid) Knudsen, 2008', 'Hygrophorus agathosmus (Fr.) Fr.', + 'Hygrophorus chrysodon (Batsch) Fr.', 'Hygrophorus discoxanthus Rea', 'Hygrophorus eburneus (Bull.) Fr.', + 'Hygrophorus hypothejus (Fr.) Fr.', 'Hygrophorus mesotephrus Berk.', 'Hygrophorus olivaceoalbus (Fr.) Fr.', + 'Hygrophorus penarius Fr.', 'Hygrophorus persoonii Arnolds', 'Hygrophorus pustulatus (Pers.) Fr.', + 'Hygrophorus unicolor Gröger', 'Hymenochaete rubiginosa (Dicks.) Lév.', + 'Hymenochaetopsis tabacina (Sowerby) S.H.He & Jiao Yang, 2016', + 'Hymenopellis radicata (Relhan) R.H.Petersen, 2010', 'Hymenoscyphus calyculus (Sowerby) W.Phillips', + 'Hymenoscyphus conscriptus (P.Karst.) Korf ex Kobayasi, Hirats.f., Aoshima, Korf, Soneda, Tubaki & Sugiy.', + 'Hymenoscyphus fagineus (Pers.) Dennis', 'Hymenoscyphus fraxineus (T.Kowalski) Baral, Queloz & Hosoya, 2014', + 'Hymenoscyphus fructigenus (Bull.) Gray', 'Hymenoscyphus scutula (Pers.) W.Phillips', + 'Hymenoscyphus serotinus (Pers.) W.Phillips', 'Hyphoderma setigerum (Fr.) Donk', + 'Hyphodontia alutaria (Burt) J.Erikss.', 'Hyphodontia arguta (Fr.) J.Erikss.', + 'Hyphodontia pallidula (Bres.) J.Erikss.', 'Hypholoma capnoides (Fr.) P.Kumm.', + 'Hypholoma elongatum (Pers.) Ricken', 'Hypholoma fasciculare (Huds.) P.Kumm., 1871', + 'Hypholoma lateritium (Schaeff.) P.Kumm.', 'Hypholoma marginatum J.Schröt.', + 'Hypholoma subericaeum (Fr.) Kühner', 'Hypholoma udum (Pers.) Kühner', + 'Hypocenomyce scalaris (Ach. ex Lilj.) M.Choisy', 'Hypocreopsis lichenoides (Tode) Seaver', + 'Hypogymnia physodes (L.) Nyl.', 'Hypogymnia tubulosa (Schaer.) Hav.', 'Hypomyces aurantius (Pers.) Fuckel', + 'Hypomyces chrysospermus Tul. & C.Tul.', 'Hypomyces microspermus Rogerson & Samuels', + 'Hypomyces papulasporae Rogerson & Samuels', 'Hypotrachyna afrorevoluta (Krog & Swinscow) Krog & Swinscow', + 'Hypotrachyna revoluta (Flörke) Hale', 'Hypoxylon fragiforme (Pers.) J.Kickx f.', 'Hypoxylon fuscum (Pers.) Fr.', + 'Hypoxylon howeanum Peck', 'Hypoxylon macrocarpum Pouzar', 'Hypoxylon petriniae M.Stadler & J.Fourn.', + 'Hypoxylon rubiginosum (Pers.) Fr., 1849', 'Hysterium acuminatum Fr.', 'Hysterium pulicare Corda', + 'Illosporiopsis christiansenii (B.L.Brady & D.Hawksw.) D.Hawksw.', 'Imleria badia (Fr.) Vizzini, 2014', + 'Infundibulicybe costata (Kühner & Romagn.) Harmaja', 'Infundibulicybe geotropa (Bull.) Harmaja', + 'Infundibulicybe gibba (Pers.) Harmaja', 'Infundibulicybe squamulosa (Pers.) Harmaja', + 'Inocutis rheades (Pers.) Fiasson & Niemelä, 1984', 'Inocybe appendiculata Kühner', 'Inocybe asterospora Quél.', + 'Inocybe cincinnata (Fr.) Quél., 1872', 'Inocybe corydalina Quél., 1875', 'Inocybe curvipes P.Karst.', + 'Inocybe flocculosa (Berk.) Sacc.', 'Inocybe fuscidula Velen., 1920', 'Inocybe geophylla (Bull.) P.Kumm., 1871', + 'Inocybe griseolilacina J.E.Lange', 'Inocybe lacera (Fr.) P.Kumm., 1871', + 'Inocybe lanuginosa (Bull.) P.Kumm., 1871', 'Inocybe lilacina (Peck) Kauffman', + 'Inocybe mixtilis (Britzelm.) Sacc.', 'Inocybe napipes J.E.Lange', 'Inocybe petiginosa (Fr.) Gillet', + 'Inocybe sindonia (Fr.) P.Karst.', 'Inocybe stellatospora (Peck) Massee, 1904', + 'Inocybe whitei (Berk. & Broome) Sacc.', 'Inonotus cuticularis (Bull.) P.Karst.', + 'Inonotus hispidus (Bull.) P.Karst.', 'Inonotus obliquus (Ach. ex Pers.) Pilát', + 'Ischnoderma benzoinum (Wahlenb.) P.Karst.', 'Ischnoderma resinosum (Schrad.) P.Karst.', + 'Jackrogersella cohaerens (Pers.) L.Wendt, Kuhnert & M.Stadler, 2017', + 'Jackrogersella multiformis (Fr.) L.Wendt, Kuhnert & M.Stadler, 2017', 'Junghuhnia nitida (Pers.) Ryvarden', + 'Kretzschmaria deusta (Hoffm.) P.M.D.Martin', 'Kuehneromyces mutabilis (Schaeff.) Singer & A.H.Sm.', + 'Laccaria amethystina (Huds.) Cooke', 'Laccaria bicolor (Maire) P.D.Orton', 'Laccaria laccata (Scop.) Fr.', + 'Laccaria proxima (Boud.) Pat.', 'Laccaria tortilis (Bolton) Cooke', + 'Lachnella alboviolascens (Alb. & Schwein.) Fr.', 'Lachnella villosa (Pers.) Gillet', + 'Lachnellula occidentalis (G.G.Hahn & Ayers) Dharne', 'Lachnellula subtilissima (Cooke) Dennis', + 'Lachnum impudicum Baral', 'Lachnum virgineum (Batsch) P.Karst.', 'Lacrymaria lacrymabunda (Bull.) Pat.', + 'Lacrymaria pyrotricha (Holmsk.) Konrad & Maubl.', 'Lactarius acerrimus Britzelm.', + 'Lactarius acris (Bolton) Gray', 'Lactarius albocarneus Britzelm.', 'Lactarius aspideus (Fr.) Fr.', + 'Lactarius aurantiacus (Pers.) Gray', 'Lactarius azonites (Bull.) Fr.', 'Lactarius blennius (Fr.) Fr.', + 'Lactarius camphoratus (Bull.) Fr.', 'Lactarius chrysorrheus Fr.', 'Lactarius circellatus Fr.', + 'Lactarius controversus (Pers.) Fr.', 'Lactarius deliciosus Fr.', 'Lactarius deterrimus Gröger', + 'Lactarius evosmus Kühner & Romagn.', 'Lactarius fluens Boud.', 'Lactarius fulvissimus Romagn.', + 'Lactarius glyciosmus (Fr.) Fr.', 'Lactarius helvus (Fr.) Fr.', 'Lactarius hepaticus Plowr.', + 'Lactarius lignyotus Fr.', 'Lactarius lilacinus (Lasch) Fr.', 'Lactarius necator (Bull.) Pers.', + 'Lactarius obscuratus (Lasch) Fr.', 'Lactarius pallidus (Pers.) Fr.', 'Lactarius porninsis Rolland', + 'Lactarius pterosporus Romagn.', 'Lactarius pubescens (Fr.) Fr.', 'Lactarius pyrogalus (Bull.) Fr.', + 'Lactarius quieticolor Romagn.', 'Lactarius quietus (Fr.) Fr.', 'Lactarius romagnesii Bon', + 'Lactarius rubrocinctus Fr.', 'Lactarius rufus (Scop.) Fr.', 'Lactarius ruginosus Romagn.', + 'Lactarius scoticus Berk. & Broome', 'Lactarius serifluus (DC.) Fr.', 'Lactarius subdulcis (Pers.) Gray', + 'Lactarius tabidus Fr.', 'Lactarius torminosus (Schaeff.) Gray', 'Lactarius trivialis (Fr.) Fr.', + 'Lactarius vietus (Fr.) Fr.', 'Lactifluus bertillonii (Neuhoff ex Z.Schaef.) Verbeken, 2011', + 'Lactifluus piperatus (L.) Roussel', 'Lactifluus vellereus (Fr.) Kuntze', 'Lactifluus volemus (Fr.) Kuntze', + 'Laetiporus sulphureus (Bull.) Murrill', 'Laetisaria fuciformis (McAlpine) Burds.', + 'Langermannia gigantea (Batsch) Rostk.', 'Lasiobelonium variegatum (Fuckel) Raitv.', + 'Lasiosphaeria ovina (Pers.) Ces. & De Not.', 'Lasiosphaeris hirsuta (Fr.) A.N.Mill. & Huhndorf', + 'Laxitextum bicolor (Pers.) Lentz', 'Lecanora campestris (Schaer.) Hue', 'Lecanora carpinea (L.) Vain.', + 'Lecanora chlarotera Nyl.', 'Lecanora polytropa (Ehrh.) Rabenh.', 'Lecanora rupicola (L.) Zahlbr.', + 'Lecanora sulphurea (Hoffm.) Ach.', 'Leccinellum crocipodium (Letell.) Della Maggiora & Trassin., 2014', + 'Leccinellum pseudoscabrum (Kallenb.) Mikšík, 2017', 'Leccinum albostipitatum den Bakker & Noordel.', + 'Leccinum aurantiacum Gray', 'Leccinum cyaneobasileucum Lannoy & Estadès, 1991', + 'Leccinum duriusculum (Schulzer ex Kalchbr.) Singer', 'Leccinum melaneum (Smotl.) Pilát & Dermek, 1974', + 'Leccinum niveum (Opat.) Rauschert, 1987', 'Leccinum scabrum (Bull.) Gray', 'Leccinum schistophilum Bon', + 'Leccinum variicolor Watling', 'Leccinum versipelle (Fr. & Hök) Snell', 'Leccinum vulpinum Watling', + 'Lecidea fuscoatra (L.) Ach.', 'Lecidella elaeochroma (Ach.) M.Choisy', 'Lecidella euphorea (Flörke) Hertel', + 'Lecidella scabra (Taylor) Hertel & Leuckert', 'Lemalis aurea (Lév.) Sacc.', + 'Lentinellus cochleatus (Pers.) P.Karst.', 'Lentinellus ursinus (Fr.) Kühner', + 'Lentinus brumalis (Pers.) Zmitr., 2010', 'Lentinus substrictus (Bolton) Zmitr. & Kovalenko, 2016', + 'Lentinus tigrinus (Bull.) Fr.', 'Leocarpus fragilis (Dicks.) Rostaf.', 'Leotia lubrica (Scop.) Pers.', + 'Lepiota boudieri Guég.', 'Lepiota brunneoincarnata Chodat & C.Martín', 'Lepiota castanea Quél.', + 'Lepiota clypeolaria (Bull.) Quél.', 'Lepiota cristata (Bolton) P.Kumm.', 'Lepiota erminea (Fr.) P.Kumm., 1871', + 'Lepiota felina (Pers.) P.Karst.', 'Lepiota grangei (Eyre) Kühner, 1934', 'Lepiota lilacea Bres.', + 'Lepiota magnispora Murrill', 'Lepiota pseudolilacea Huijsman', 'Lepiota subincarnata J.E.Lange', + 'Lepista irina (Fr.) H.E.Bigelow', 'Lepista nuda (Bull.) Cooke', 'Lepista panaeolus (Fr.) P.Karst.', + 'Lepista saeva (Fr.) P.D.Orton', 'Lepista sordida (Schumach.) Singer', 'Lepraria incana (L.) Ach.', + 'Leptosphaeria acuta (Moug. & Nestl.) P.Karst.', 'Leptosporomyces fuscostratus (Burt) Hjortstam', + 'Leratiomyces ceres (Cooke & Massee) Spooner & Bridge', + 'Leratiomyces percevalii (Berk. & Broome) Bridge & Spooner', + 'Leratiomyces squamosus (Pers.) Bridge & Spooner, 2008', 'Leucoagaricus leucothites (Vittad.) M.M.Moser ex Bon', + 'Leucoagaricus nympharum (Kalchbr.) Bon', 'Leucocoprinus brebissonii (Godey) Locq.', + 'Leucocybe candicans (Pers.) Vizzini, P.Alvarado, G.Moreno & Consiglio, 2015', + 'Leucocybe connata (Schumach.) Vizzini, P.Alvarado, G.Moreno & Consiglio, 2015', + 'Leucogyrophana mollusca (Fr.) Pouzar', 'Lichenomphalia umbellifera (L.) Redhead, Lutzoni, Moncalvo & Vilgalys', + 'Limacella guttata (Pers.) Konrad & Maubl.', 'Lindtneria panphyliensis Bernicchia & M.J.Larsen', + 'Lobaria pulmonaria (L.) Hoffm.', 'Lophodermium pinastri (Schrad.) Chevall.', + 'Loreleia marchantiae (Singer & Clémençon) Redhead, Moncalvo, Vilgalys & Lutzoni', + 'Loweomyces wynneae (Berk. & Broome) Jülich', 'Lycogala epidendrum (J.C.Buxb. ex L.) Fr.', + 'Lycogala flavofuscum (Ehrenb.) Rostaf.', 'Lycoperdon echinatum Pers.', 'Lycoperdon excipuliforme (Scop.) Pers.', + 'Lycoperdon lividum Pers.', 'Lycoperdon mammiforme Pers.', 'Lycoperdon molle Pers.', + 'Lycoperdon nigrescens Wahlenb.', 'Lycoperdon perlatum Pers.', 'Lycoperdon pratense Pers.', + 'Lycoperdon utriforme Bull.', 'Lyomyces crustosus (Pers.) P.Karst.', 'Lyomyces sambuci (Pers.) P.Karst.', + 'Lyophyllum decastes (Fr.) Singer', 'Lyophyllum fumosum (Pers.) P.D.Orton', 'Lyophyllum paelochroum Clémençon', + 'Macrocystidia cucumis (Pers.) Joss.', 'Macrolepiota excoriata (Schaeff.) M.M.Moser', + 'Macrolepiota fuliginosa (Barla) Bon', 'Macrolepiota mastoidea (Fr.) Singer', + 'Macrolepiota procera (Scop.) Singer, 1948', 'Macrotyphula contorta (Holmsk.) Rauschert', + 'Macrotyphula fistulosa (Holmsk.) R.H.Petersen', 'Macrotyphula juncea (Alb. & Schwein.) Berthier', + 'Marasmiellus ramealis (Bull.) Singer', 'Marasmiellus vaillantii (Pers.) Singer', 'Marasmius bulliardii Quél.', + 'Marasmius cohaerens (Alb. & Schwein.) Cooke & Quél.', 'Marasmius curreyi Berk. & Broome', + 'Marasmius epiphylloides (Rea) Sacc. & Trotter', 'Marasmius limosus Boud. & Quél.', + 'Marasmius oreades (Bolton) Fr.', 'Marasmius rotula (Scop.) Fr.', 'Marasmius torquescens Quél.', + 'Marasmius wynnei Berk. & Broome', 'Megacollybia platyphylla (Pers.) Kotl. & Pouzar', + 'Melampsora populnea (Pers.) P.Karst.', 'Melanamphora spinifera (Wallr.) Lafl.', + 'Melanelixia fuliginosa (Fr. ex Duby) O.Blanco, A.Crespo, Divakar, Essl., D.Hawksw. & Lumbsch', + 'Melanelixia glabratula (Lamy) Sandler & Arup', + 'Melanelixia subaurifera (Nyl.) O.Blanco, A.Crespo, Divakar, Essl., D.Hawksw. & Lumbsch', + 'Melanogaster ambiguus (Vittad.) Tul. & C.Tul.', + 'Melanohalea exasperatula (Nyl.) O.Blanco, A.Crespo, Divakar, Essl., D.Hawksw. & Lumbsch', + 'Melanoleuca cognata (Fr.) Konrad & Maubl., 1927', 'Melanoleuca friesii (Bres.) Bon', + 'Melanoleuca grammopodia (Bull.) Murrill', 'Melanoleuca polioleuca (Fr.) G.Moreno', + 'Melanoleuca verrucipes (Fr.) Singer', 'Melanomma pulvis-pyrius (Pers.) Fuckel', + 'Melanophyllum haematospermum (Bull.) Kreisel', 'Melastiza cornubiensis (Berk. & Broome) J.Moravec', + 'Mensularia nodulosa (Fr.) T.Wagner & M.Fisch., 2001', 'Mensularia radiata (Sowerby) Lázaro Ibiza', + 'Meottomyces dissimulans (Berk. & Broome) Vizzini, 2008', 'Meripilus giganteus (Pers.) P.Karst.', + 'Merismodes fasciculata (Schwein.) Earle, 1909', 'Meruliopsis taxicola (Pers.) Bondartsev', + 'Merulius tremellosus Schrad., 1794', 'Metatrichia floriformis (Schwein.) Nann.-Bremek.', + 'Metatrichia vesparium (Batsch) Nann.-Bremek.', 'Micarea lignaria (Ach.) Hedl.', + 'Microbotryum stellariae (Sowerby) G.Deml & Oberw.', + 'Microglossum griseoviride V.Kučera, Lizoň & Tomšovský, 2014', 'Microglossum olivaceum (Pers.) Gillet', + 'Mitrula paludosa Fr.', 'Mniaecia jungermanniae Boud.', 'Mollisia cinerea (Batsch) P.Karst., 1871', + 'Monilinia fructigena Honey', 'Morchella conica Krombh.', 'Morchella esculenta (L.) Pers.', + 'Morchella semilibera DC.', 'Morchella vulgaris (Pers.) Boud.', 'Mucidula mucida (Schrad.) Pat., 1887', + 'Mucilago crustacea P.Micheli ex F.H.Wigg.', 'Mucronella flava Corner', 'Mutinus caninus (Huds.) Fr.', + 'Mycena abramsii (Murrill) Murrill', 'Mycena acicula (Schaeff.) P.Kumm.', 'Mycena aetites (Fr.) Quél.', + 'Mycena amicta (Fr.) Quél.', 'Mycena arcangeliana Bres.', 'Mycena aurantiomarginata (Fr.) Quél.', + 'Mycena belliae (Johnst.) P.D.Orton', 'Mycena capillaripes Peck', 'Mycena capillaris P.Karst.', + 'Mycena chlorantha (Fr.) P.Kumm.', 'Mycena cinerella (P.Karst.) P.Karst.', 'Mycena citrinomarginata Gillet', + 'Mycena clavicularis (Fr.) Gillet', 'Mycena clavularis (Batsch) Sacc.', 'Mycena crocata (Schrad.) P.Kumm.', + 'Mycena diosma Krieglst. & Schwöbel', 'Mycena epipterygia (Scop.) Gray', 'Mycena erubescens Höhn.', + 'Mycena filopes (Bull.) P.Kumm.', 'Mycena flavescens Velen.', 'Mycena galericulata (Scop.) Gray', + 'Mycena galopus (Pers.) P.Kumm., 1871', 'Mycena haematopus (Pers.) P.Kumm.', 'Mycena inclinata (Fr.) Quél.', + 'Mycena juniperina Aronsen', 'Mycena leptocephala (Pers.) Gillet', + 'Mycena luteovariegata (Gillet) Harder & Laessøe, 2013', 'Mycena megaspora Kauffman', + 'Mycena meliigena (Berk. & Cooke) Sacc.', 'Mycena metata (Secr. ex Fr.) Quél.', 'Mycena olida Bres., 1887', + 'Mycena olivaceomarginata (Massee) Massee', 'Mycena pelianthina (Fr.) Quél.', 'Mycena polygramma (Bull.) Gray', + 'Mycena pseudocorticola Kühner', 'Mycena pterigena (Fr.) P.Kumm.', 'Mycena pura (Pers.) Sacc.', + 'Mycena purpureofusca (Peck) Sacc.', 'Mycena renati Quél.', 'Mycena rosea (Schumach.) Gramberg', + 'Mycena rosella (Fr.) P.Kumm.', 'Mycena rubromarginata (Fr.) P.Kumm.', + 'Mycena sanguinolenta (Alb. & Schwein.) P.Kumm.', 'Mycena silvae-nigrae Maas Geest. & Schwöbel', + 'Mycena stipata Maas Geest. & Schwöbel', 'Mycena stylobates (Pers.) P.Kumm.', 'Mycena tenerrima (Berk.) Sacc.', + 'Mycena tintinnabulum (Batsch) Quél.', 'Mycena vitilis (Fr.) Quél.', 'Mycena vulgaris (Pers.) P.Kumm.', + 'Mycenella salicina (Velen.) Singer', 'Mycenella trachyspora (Rea) Bon', 'Mycetinis alliaceus (Jacq.) Earle', + 'Mycetinis querceus (Britzelm.) Antonín & Noordel.', 'Mycetinis scorodonius (Fr.) A.W.Wilson', + 'Mycoacia fuscoatra (Fr.) Donk', 'Mycoacia uda (Fr.) Donk', + 'Mycoaciella bispora (Stalpers) J.Erikss. & Ryvarden', + 'Myochromella boudieri (Kühner & Romagn.) V.Hofst., Clémençon, Moncalvo & Redhead, 2015', + 'Myriolecis albescens (Hoffm.) Śliwa et al.', 'Myriolecis dispersa (Pers.) Śliwa et al.', + 'Myxarium nucleatum Wallr., 1833', 'Naematelia encephala (Willd.) Fr.', 'Naucoria bohemica Velen.', + 'Naucoria escharioides (Fr.) P.Kumm.', 'Naucoria salicis P.D.Orton', 'Naucoria scolecina (Fr.) Quél.', + 'Nectria cinnabarina (Tode) Fr.', 'Nemania serpens (Pers.) Gray, 1821', + 'Neoantrodia serialis (Fr.) Audet, 2017', 'Neoboletus luridiformis (Rostk.) Gelardi, Simonini & Vizzini, 2014', + 'Neoboletus xanthopus (Klofac & A.Urb.) Klofac & A.Urb., 2014', 'Neodasyscypha cerina (Pers.) Spooner', + 'Neofavolus suavissimus (Fr.) J.S.Seelan, Justo & Hibbett, 2016', + 'Neohygrocybe ingrata (J.P.Jensen & F.H.Møller) Herink', 'Neohygrocybe nitrata (Pers.) Herink', + 'Neohygrocybe ovina (Bull.) Herink', 'Neolentinus lepideus (Fr.) Redhead & Ginns', + 'Neonectria coccinea (Pers.) Rossman & Samuels, 1999', 'Neottiella rutilans (Fr.) Dennis', + 'Nodulisporium cecidiogenes Jørg.Koch', 'Ochrolechia frigida (Sw.) Lynge', 'Ochrolechia parella (L.) A.Massal.', + 'Ochropsora ariae (Fuckel) Ramsb.', 'Odoria alborubescens (Bourdot & Galzin) V.Papp & Dima', + 'Oligoporus ptychogaster (F.Ludw.) Falck & O.Falck', 'Ombrophila pura (Pers.) Quél.', + 'Omphalina pyxidata (Bull.) Quél.', 'Onygena corvina Alb. & Schwein.', 'Orbilia xanthostigma (Fr.) Fr.', + 'Osmoporus odoratus (Wulfen) Singer', 'Ossicaulis lignatilis (Pers.) Redhead & Ginns', + 'Otidea alutacea (Pers.) Massee', 'Otidea bufonia (Pers.) Boud.', 'Otidea onotica (Pers.) Fuckel', + 'Otidea phlebophora (Berk. & Broome) Sacc.', 'Panaeolus acuminatus (Schaeff.) Quél.', + 'Panaeolus cinctulus (Bolton) Sacc.', 'Panaeolus fimicola (Pers.) Gillet', + 'Panaeolus foenisecii (Pers.) J.Schröt.', 'Panaeolus olivaceus F.H.Møller', + 'Panaeolus papilionaceus (Bull.) Quél., 1872', 'Panaeolus reticulatus Overh.', + 'Panaeolus semiovatus (Sowerby) S.Lundell & Nannf., 1938', 'Panaeolus subfirmus P.Karst.', + 'Panellus mitis (Pers.) Singer', 'Panellus stipticus (Bull.) P.Karst.', 'Panus conchatus (Bull.) Fr.', + 'Paralepista flaccida (Sowerby) Vizzini, 2012', 'Paralepista gilva (Pers.) Raithelh., 1996', + 'Parasola auricoma (Pat.) Redhead, Vilgalys & Hopple', 'Parasola conopilea (Fr.) Örstadius & E.Larss., 2008', + 'Parasola kuehneri (Uljé & Bas) Redhead, Vilgalys & Hopple', + 'Parasola lactea (A.H.Sm.) Redhead, Vilgalys & Hopple', 'Parasola misera (P.Karst.) Redhead, Vilgalys & Hopple', + 'Parasola plicatilis (Curtis) Redhead, Vilgalys & Hopple', + 'Parasola schroeteri (P.Karst.) Redhead, Vilgalys & Hopple', 'Parmelia ernstiae Feuerer & A.Thell', + 'Parmelia saxatilis (L.) Ach.', 'Parmelia submontana Nádv. ex Hale', 'Parmelia sulcata Taylor', + 'Parmeliopsis ambigua (Wulfen) Nyl.', 'Parmotrema perlatum (Huds.) M.Choisy', 'Patellaria atrata Cooke', + 'Paxillus ammoniavirescens Contu & Dessì', 'Paxillus filamentosus Fr.', 'Paxillus involutus (Batsch) Fr.', + 'Paxillus obscurisporus C.Hahn', 'Peltigera canina (L.) Willd.', 'Peltigera didactyla (With.) J.R.Laundon', + 'Peltigera hymenina (Ach.) Delise ex Duby', 'Peltigera membranacea (Ach.) Nyl.', 'Peltigera neckeri Hepp', + 'Peltigera rufescens (Weiss) Humb.', 'Peniophora cinerea (Pers.) Cooke', 'Peniophora incarnata (Pers.) P.Karst.', + 'Peniophora limitata (Chaillet ex Fr.) Cooke', 'Peniophora lycii (Pers.) Höhn. & Litsch.', + 'Peniophora pini (Schleich.) Boidin', 'Peniophora polygonia (Pers.) Bourdot & Galzin', + 'Peniophora quercina (Pers.) Cooke', 'Peniophora rufomarginata (Pers.) Bourdot & Galzin', + 'Peniophorella pubera (Fr.) P.Karst.', 'Perenniporia fraxinea (Bull.) Ryvarden', + 'Peronospora crustosa (Fr.) Fr., 1849', 'Pertusaria hymenea (Ach.) Schaer.', 'Pertusaria pertusa (L.) Tuck.', + 'Peziza arvernensis Boud.', 'Peziza badia Pers.', 'Peziza fimeti (Fuckel) Seaver', + 'Peziza michelii (Boud.) Dennis', 'Peziza varia (Hedw.) Fr.', 'Peziza vesiculosa Bolton', + 'Phaeoclavulina abietina (Pers.) Giachini, 2011', 'Phaeoclavulina eumorpha (P.Karst.) Giachini, 2011', + 'Phaeolepiota aurea (Matt.) Maire', 'Phaeolus schweinitzii (Fr.) Pat.', + 'Phaeomarasmius erinaceus (Pers.) Scherff. ex Romagn.', 'Phaeonematoloma myosotis (Fr.) Bon', + 'Phaeophyscia orbicularis (Neck.) Moberg', 'Phaeotremella foliacea (Pers.) Wedin, J.C.Zamora & Millanes, 2016', + 'Phallus hadriani Vent.', 'Phallus impudicus L., 1753', 'Phanerochaete sordida (P.Karst.) J.Erikss. & Ryvarden', + 'Phanerochaete velutina (DC.) Parmasto', 'Phellinopsis conchata (Pers.) Y.C.Dai, 2010', + 'Phellinus igniarius (L.) Quél.', 'Phellinus laevigatus (Fr.) Bourdot & Galzin', + 'Phellinus pomaceus (Pers.) Maire', 'Phellinus populicola Niemelä', + 'Phellinus tremulae (Bondartsev) Bondartsev & P.N.Borisov', 'Phellodon confluens (Pers.) Pouzar', + 'Phellodon connatus (Schultz) P.Karst.', 'Phellodon niger (Fr.) P.Karst.', 'Phellodon tomentosus (L.) Banker', + 'Phlebia radiata Fr.', 'Phlebia rufa (Pers.) M.P.Christ.', + 'Phlebia subochracea (Alb. & Schwein.) J.Erikss. & Ryvarden', 'Phlebiopsis gigantea (Fr.) Jülich', + 'Phleogena faginea (Fr.) Link', 'Phloeomana clavata (Peck) Redhead, 2016', + 'Phloeomana hiemalis (Osbeck) Redhead, 2016', 'Phloeomana speirea (Fr.) Redhead, 2013', + 'Phlyctis argena (Ach.) Flot.', 'Pholiota adiposa (Batsch) P.Kumm.', 'Pholiota astragalina (Fr.) Singer', + 'Pholiota conissans (Fr.) M.M.Moser', 'Pholiota flammans (Batsch) P.Kumm.', 'Pholiota gummosa (Lasch) Singer', + 'Pholiota highlandensis (Peck) Quadr. & Lunghini, 1990', 'Pholiota jahnii Tjall.-Beuk. & Bas', + 'Pholiota lenta (Pers.) Singer', 'Pholiota scamba (Fr.) M.M.Moser', 'Pholiota squarrosa (Bull.) P.Kumm.', + 'Pholiota tuberculosa (Schaeff.) P.Kumm.', 'Pholiotina aporos (Kits van Wav.) Clémençon', + 'Pholiotina arrhenii (Fr.) Singer', 'Pholiotina teneroides (J.E.Lange) Singer', + 'Pholiotina velata (Velen.) Hauskn.', 'Phragmidium mucronatum (Pers.) Schltdl.', + 'Phragmidium rubi-idaei (DC.) P.Karst.', 'Phragmidium tuberculatum J.B.Müll.', + 'Phragmidium violaceum (Schultz) G.Winter', 'Phylloporia ribis (Schumach.) Ryvarden', + 'Phylloporus pelletieri (Lév.) Quél.', 'Phyllotopsis nidulans (Pers.) Singer', + 'Physarum album (Bull.) Chevall.', 'Physcia adscendens (Th.Fr.) H.Olivier', 'Physcia aipolia (Ehrh.) Hampe', + 'Physcia caesia (Hoffm.) Hampe ex Fürnr.', 'Physcia dubia (Hoffm.) Lettau', 'Physcia stellaris (L.) Nyl.', + 'Physcia tenella (Scop.) DC.', 'Physconia distorta (With.) J.R.Laundon', 'Physconia enteroxantha (Nyl.) Poelt', + 'Physconia grisea (Lam.) Poelt', 'Physconia perisidiosa (Erichsen) Moberg', + 'Physisporinus sanguinolentus (Alb. & Schwein.) Pilát', 'Physisporinus vitreus (Pers.) P.Karst.', + 'Picipes badius (Pers.) Zmitr. & Kovalenko, 2016', 'Picipes melanopus (Pers.) Zmitr. & Kovalenko, 2016', + 'Picipes tubaeformis (P.Karst.) Zmitr. & Kovalenko, 2016', 'Piptoporus betulinus (Bull.) P.Karst., 1881', + 'Pithya cupressina Fuckel', 'Pithya vulgaris Fuckel', 'Platismatia glauca (L.) W.L.Culb. & C.F.Culb.', + 'Pleurocybella porrigens (Pers.) Singer', 'Pleurosticta acetabulum (Neck.) Elix & Lumbsch', + 'Pleurotus dryinus (Pers.) P.Kumm.', 'Pleurotus ostreatus (Jacq.) P.Kumm.', 'Pleurotus pulmonarius (Fr.) Quél.', + 'Plicatura crispa (Pers.) Rea', 'Pluteus atromarginatus (Konrad) Kühner', 'Pluteus cervinus (Schaeff.) P.Kumm.', + 'Pluteus cinereofuscus J.E.Lange', 'Pluteus ephebeus (Fr.) Gillet', 'Pluteus hispidulus (Fr.) Gillet', + 'Pluteus leoninus (Schaeff.) P.Kumm.', 'Pluteus nanus (Pers.) P.Kumm.', 'Pluteus petasatus (Fr.) Gillet', + 'Pluteus phlebophorus (Ditmar) P.Kumm., 1871', 'Pluteus plautus (Weinm.) Gillet', + 'Pluteus podospileus Sacc. & Cub.', 'Pluteus pouzarianus Singer', 'Pluteus primus Bonnard', + 'Pluteus romellii (Britzelm.) Lapl.', 'Pluteus salicinus (Pers.) P.Kumm.', 'Pluteus semibulbosus (Lasch) Gillet', + 'Pluteus thomsonii (Berk. & Broome) Dennis', 'Pluteus umbrosus (Pers.) P.Kumm.', + 'Podosphaera aphanis (Wallr.) U.Braun & S.Takam.', 'Polycauliona candelaria (L.) Frödén, Arup & Søchting', + 'Polycauliona polycarpa (Hoffm.) Frödén, Arup & Søchting', + 'Polydesmia pruinosa (Gerd. ex Berk. & Broome) Boud.', 'Polyporus tuberaster (Jacq.) Fr.', + 'Polysporina simplex (Davies) Vezda', 'Porodaedalea pini (Brot.) Murrill', 'Poronia punctata (L.) Fr.', + 'Porphyrellus porphyrosporus (Fr. & Hök) E.-J.Gilbert', 'Porpolomopsis calyptriformis (Berk.) Bresinsky, 2008', + 'Postia alni Niemelä & Vampola, 2001', 'Postia caesia (Schrad.) P.Karst.', 'Postia lactea (Fr.) P.Karst.', + 'Postia wakefieldiae (Kotl. & Pouzar) Pegler & E.M.Saunders, 1994', 'Propolis farinosa (Pers.) Fr.', + 'Protocrea pallida (Ellis & Everh.) Jaklitsch, K.Põldmaa & Samuels, 2008', 'Protomyces macrosporus Unger', + 'Protoparmeliopsis muralis (Rabenh.) M.Choisy', + 'Protostropharia semiglobata (Batsch) Redhead, Moncalvo & Vilgalys, 2013', + 'Protounguicularia transiens (Höhn.) Hutinen', 'Psathyrella ammophila (Durieu & Lév.) P.D.Orton', + 'Psathyrella bipellis (Quél.) A.H.Sm.', 'Psathyrella candolleana (Fr.) Maire', + 'Psathyrella corrugis (Pers.) Konrad & Maubl.', 'Psathyrella cotonea (Quél.) Konrad & Maubl.', + 'Psathyrella fusca (Schumach.) M.M.Moser', 'Psathyrella microrhiza (Lasch) Konrad & Maubl.', + 'Psathyrella multipedata (Peck) A.H.Sm.', 'Psathyrella obtusata (Pers.) A.H.Sm., 1941', + 'Psathyrella piluliformis (Bull.) P.D.Orton', 'Psathyrella pseudogracilis (Romagn.) M.M.Moser', + 'Psathyrella pygmaea (Bull.) Singer', 'Psathyrella spadiceogrisea (Schaeff.) Maire', + 'Psathyrella typhae (Kalchbr.) A.Pearson & Dennis', 'Pseudevernia furfuracea (L.) Zopf', + 'Pseudoboletus parasiticus (Bull.)', 'Pseudoclitocybe cyathiformis (Bull.) Singer', + 'Pseudoclitocybe expallens (Pers.) M.M.Moser', 'Pseudoclitopilus rhodoleucus (Sacc.) Vizzini & Contu, 2012', + 'Pseudohydnum gelatinosum (Scop.) P.Karst.', 'Pseudoinonotus dryadeus (Pers.) T.Wagner & M.Fisch.', + 'Pseudoplectania nigrella (Pers.) Fuckel', 'Psilocybe fimetaria (P.D.Orton) Watling', + 'Psilocybe semilanceata (Fr.) P.Kumm.', 'Pterula multifida E.P.Fr. ex Fr.', 'Puccinia aegopodii P.Syd. & Syd.', + 'Puccinia allii (DC.) F.Rudolphi, 1829', 'Puccinia caricina DC., 1815', 'Puccinia circaeae Pers.', + 'Puccinia coronata Corda', 'Puccinia festucae Plowr.', 'Puccinia hieracii (Röhl.) H.Mart., 1817', + 'Puccinia lapsanae Fuckel', 'Puccinia malvacearum Bertero ex Mont.', 'Puccinia phragmitis (Schumach.) Körn.', + 'Puccinia poarum E.Nielsen', 'Puccinia pulverulenta Grev.', 'Puccinia punctiformis (F.Strauss) Röhl.', + 'Puccinia recondita Dietel & Holw.', 'Puccinia sessilis J.Schröt.', 'Puccinia urticata F.Kern, 1917', + 'Puccinia violae (Schumach.) DC.', 'Pucciniastrum areolatum (Fr.) G.H.Otth', + 'Pulvinula convexella (P.Karst.) Pfister', 'Punctelia jeckeri (Roum.) Kalb', 'Punctelia subrudecta (Nyl.) Krog', + 'Pycnoporellus fulgens (Fr.) Donk', 'Pycnoporus cinnabarinus (Jacq.) P.Karst.', + 'Quaternaria quaternata (Pers.) J.Schröt.', 'Radulomyces confluens (Fr.) M.P.Christ.', + 'Ramalina farinacea (L.) Ach.', 'Ramalina fastigiata (Pers.) Ach.', 'Ramalina fraxinea (L.) Ach.', + 'Ramalina siliquosa (Huds.) A.L.Sm.', 'Ramaria botrytis (Pers.) Ricken', + 'Ramaria fagetorum Maas Geest. ex Schild', 'Ramaria fumigata (Peck) Corner', 'Ramaria krieglsteineri Schild', + 'Ramaria pallida Maire', 'Ramaria sanguinea (Pers.) Quél.', 'Ramaria stricta (Pers.) Quél.', + 'Ramariopsis kunzei (Fr.) Corner', 'Resinicium bicolor (Alb. & Schwein.) Parmasto', + 'Resinomycena saccharifera (Berk. & Broome) Redhead', 'Resupinatus applicatus (Batsch) Gray', + 'Resupinatus poriaeformis (Pers.) Thorn, Moncalvo & Redhead', 'Resupinatus trichotis (Pers.) Singer', + 'Reticularia lycoperdon Bull.', 'Rhizina undulata Fr.', 'Rhizocarpon geographicum (L.) DC.', + 'Rhizocarpon lecanorinum Anders', 'Rhizomarasmius setosus (Sowerby) Antonín & A.Urb., 2015', + 'Rhizopogon obtextus (Spreng.) R.Rauschert', 'Rhodocollybia butyracea (Bull.) Lennox, 1979', + 'Rhodocollybia maculata (Alb. & Schwein.) Singer, 1939', 'Rhodocybe caelata (Fr.) Maire, 1926', + 'Rhodocybe gemina (Paulet) Kuyper & Noordel., 1987', 'Rhopographus filicinus (Fr.) Nitschke ex Fuckel', + 'Rhytisma acerinum (Pers.) Fr.', 'Rickenella fibula (Bull.) Raithelh.', 'Rickenella swartzii (Fr.) Kuyper', + 'Rigidoporus obducens (Pers.) Pouzar', 'Rigidoporus populinus (Schumach.) Pouzar', + 'Rimbachia arachnoidea (Peck) Redhead', 'Ripartites tricholoma (Alb. & Schwein.) P.Karst.', + 'Roridomyces roridus (Scop.) Rexer', 'Rosellinia corticium (Schwein.) Sacc.', + 'Roseodiscus formosus Wiesch., Helleman, Baral & T.Richt., 2011', + 'Rubroboletus legaliae (Pilát & Dermek) Della Maggiora & Trassin., 2015', + 'Rubroboletus satanas (Lenz) Kuan Zhao & Zhu L.Yang, 2014', 'Russula acrifolia Romagn.', + 'Russula adusta (Pers.) Fr.', 'Russula aeruginea Fr.', 'Russula amoenolens Romagn.', 'Russula atrorubens Quél.', + 'Russula aurea Pers.', 'Russula betularum Hora', 'Russula brunneoviolacea Crawshay', + 'Russula caerulea (Pers.) Fr.', 'Russula cessans A.Pearson', 'Russula chloroides (Krombh.) Bres.', + 'Russula claroflava Grove', 'Russula cuprea (Krombh.) J.E.Lange', 'Russula curtipes F.H.Møller & Jul.Schäff.', + 'Russula cyanoxantha (Schaeff.) Fr.', 'Russula decolorans (Fr.) Fr.', 'Russula delica Fr.', + 'Russula densifolia Secr. ex Gillet', 'Russula depallens Fr.', 'Russula emetica (Schaeff.) Pers.', + 'Russula faginea Romagn., 1967', 'Russula farinipes Romell', 'Russula faustiana Sarnari', + 'Russula fellea (Fr.) Fr.', 'Russula foetens (Pers.) Fr.', 'Russula fragilis Fr., 1838', + 'Russula grata Britzelm.', 'Russula graveolens Romell', 'Russula grisea (Batsch) Fr.', + 'Russula heterophylla (Fr.) Fr.', 'Russula illota Romagn.', 'Russula insignis Quél.', + 'Russula integra (L.) Fr., 1838', 'Russula ionochlora Romagn.', 'Russula laccata Huijsman', + 'Russula laeta Jul.Schäff.', 'Russula lepida Fr.', 'Russula luteotacta Rea', 'Russula maculata Quél. & Roze', + 'Russula mairei Singer', 'Russula melliolens Quél.', 'Russula nauseosa (Pers.) Fr.', + 'Russula nigricans (Bull.) Fr.', 'Russula nitida (Pers.) Fr.', 'Russula ochroleuca (Pers.) Fr.', + 'Russula odorata Romagn.', 'Russula olivacea (Schaeff.) Fr.', 'Russula paludosa Britzelm.', + 'Russula parazurea Jul.Schäff.', 'Russula pelargonia Niolle', 'Russula praetervisa Sarnari', + 'Russula pseudointegra Arnould & Goris', 'Russula puellaris Fr.', 'Russula queletii Fr.', + 'Russula risigallina (Batsch) Sacc.', 'Russula romellii Maire', 'Russula roseoaurantia Sarnari', + 'Russula sanguinea (Bull.) Fr.', 'Russula sardonia Fr.', 'Russula seperina Dupain', + 'Russula silvestris (Singer) Reumaux', 'Russula solaris Ferd. & Winge', 'Russula sororia Fr.', + 'Russula subrubens (J.E.Lange) Bon', 'Russula undulata Velen.', 'Russula velenovskyi Melzer & Zvára', + 'Russula velutipes Velen.', 'Russula versicolor Jul.Schäff.', 'Russula vesca Fr.', 'Russula veternosa Fr.', + 'Russula violeipes Quél.', 'Russula virescens (Schaeff.) Fr.', 'Russula viscida Kudrna', + 'Russula xerampelina (Schaeff.) Fr.', 'Rutstroemia calopus P.Karst.', 'Rutstroemia echinophila (Bull.) Höhn.', + 'Rutstroemia firma (Pers.) P.Karst.', 'Ruzenia spermoides (Hoffm.) O.Hilber, 2002', + 'Sabuloglossum arenarium (Rostr.) Hustad, A.N.Mill., Dentinger & P.F.Cannon, 2013', + 'Sagaranella tylicolor (Fr.) V.Hofst., Clémençon, Moncalvo & Redhead, 2015', 'Sarcodon imbricatus (L.) P.Karst.', + 'Sarcodon squamosus (Schaeff.) Quél.', 'Sarcomyxa serotina (Pers.) P.Karst.', + 'Sarcoscypha austriaca (O.Beck ex Sacc.) Boud.', 'Sarcoscypha coccinea (Jacq.) Sacc., 1889', + 'Sarcosphaera coronaria (Jacq. ex Cooke) Boud.', 'Sawadaea bicornis (Wallr.) Miyabe', + 'Schizophyllum amplum (Lév.) Nakasone', 'Schizophyllum commune Fr.', 'Scleroderma areolatum Ehrenb.', + 'Scleroderma bovista Fr.', 'Scleroderma citrinum Pers.', 'Scleroderma verrucosum (Bull.) Pers.', + 'Scopuloides rimosa (Cooke) Jülich', 'Scutellinia hirta (Schumach.) Cooke, 1876', + 'Scutellinia scutellata (L.) Lambotte', 'Scytinostroma hemidichophyticum Pouzar', + 'Seifertia azaleae (Peck) Partr. & Morgan-Jones', 'Serpula himantioides (Fr.) P.Karst.', + 'Sidera vulgaris (Fr.) Miettinen, 2011', 'Simocybe centunculus (Fr.) P.Karst., 1879', + 'Simocybe haustellaris (Fr.) Watling', 'Simocybe sumptuosa (P.D.Orton) Singer', + 'Singerocybe phaeophthalma (Pers.) Harmaja', 'Sistotrema brinkmannii (Bres.) J.Erikss.', + 'Skeletocutis amorpha (Fr.) Kotl. & Pouzar', 'Skeletocutis carneogrisea A.David', + 'Skeletocutis nemoralis A.Korhonen & Miettinen', 'Sparassis crispa (Wulfen) Fr.', 'Spathularia flavida Pers.', + 'Sphaeridium candidum Sacc. & Roum.', 'Sphaerobolus stellatus Tode', + 'Sphagnurus paluster (Peck) Redhead & V.Hofst., 2014', 'Spinellus fusiger (Link) Tiegh.', + 'Steccherinum fimbriatum (Pers.) J.Erikss.', 'Steccherinum ochraceum (Pers.) Gray', + 'Steccherinum oreophilum Lindsey & Gilb.', 'Stemonitis axifera (Bull.) T.Macbr.', 'Stemonitis fusca Roth', + 'Stemonitopsis typhina (F.H.Wigg.) Nann.-Bremek.', 'Stereocaulon condensatum Hoffm.', + 'Stereocaulon saxatile H.Magn.', 'Stereocaulon vesuvianum Pers.', 'Stereum gausapatum (Fr.) Fr.', + 'Stereum hirsutum (Willd.) Gray', 'Stereum rugosum (Pers.) Fr.', 'Stereum sanguinolentum (Alb. & Schwein.) Fr.', + 'Stereum subtomentosum Pouzar', 'Strobilomyces strobilaceus (Scop.) Berk.', + 'Strobilurus esculentus (Wulfen) Singer', 'Strobilurus stephanocystis (Kühner & Romagn. ex Hora) Singer', + 'Strobilurus tenacellus (Pers.) Singer', 'Stropharia aeruginosa (Curtis) Quél.', + 'Stropharia coronilla (Bull.) W.Saunders & W.G.Sm., 1870', 'Stropharia cyanea (Bolton) Tuom.', + 'Stropharia hornemannii (Fr.) S.Lundell & Nannf.', 'Stropharia inuncta (Fr.) Quél.', + 'Stropharia pseudocyanea (Desm.) Morgan', 'Stropharia rugosoannulata Farl. ex Murrill', + 'Subulicystidium longisporum (Pat.) Parmasto', 'Suillellus luridus (Schaeff.) Murrill, 1909', + 'Suillellus queletii (Schulzer) Vizzini, Simonini & Gelardi, 2014', 'Suillus bovinus (L.) Kuntze', + 'Suillus cavipes (Opat.) A.H.Sm. & Thiers', 'Suillus collinitus (Fr.) Kuntze', 'Suillus flavidus (Fr.) Singer', + 'Suillus granulatus (L.) Snell', 'Suillus grevillei (Klotzsch) Singer', 'Suillus luteus (L.) Gray', + 'Suillus variegatus (Sw.) Kuntze', 'Suillus viscidus (L.) Fr.', 'Symphytocarpus amaurochaetoides Nann.-Bremek.', + 'Syzygites megalocarpus Ehrenb.', 'Taphrina alni (Berk. & Broome) Gjaerum', 'Taphrina betulina Rostr.', + 'Taphrina pruni Tul.', 'Tapinella atrotomentosa (Batsch)', 'Tapinella panuoides (Batsch) E.-J.Gilbert', + 'Tarzetta cupularis (L.) Svrcek', 'Tephrocybe rancida (Fr.) Donk', 'Tephromela atra (Huds.) Hafellner', + 'Thelephora anthocephala (Bull.) Fr.', 'Thelephora caryophyllea (Schaeff.) Pers.', + 'Thelephora palmata (Scop.) Fr.', 'Thelephora penicillata (Pers.) Fr.', 'Thelephora terrestris Ehrh.', + 'Thuemenidium atropurpureum (Batsch) Kuntze', + 'Tolypocladium ophioglossoides (J.F.Gmel.) Quandt, Kepler & Spatafora, 2014', + 'Trametes betulina (L.) Pilát, 1939', 'Trametes gibbosa (Pers.) Fr.', 'Trametes hirsuta (Wulfen) Pilát', + 'Trametes ochracea (Pers.) Gilb. & Ryvarden', 'Trametes suaveolens (L.) Fr.', 'Trametes versicolor (L.) Lloyd', + 'Tranzschelia anemones (Pers.) Nannf.', 'Trapelia placodioides Coppins & P.James', + 'Trechispora hymenocystis (Berk. & Broome) K.H.Larss.', 'Trechispora stevensonii (Berk. & Broome) K.H.Larss.', + 'Tremella mesenterica Retz.', 'Tremiscus helvelloides (DC.) Donk', 'Trichaptum abietinum (Dicks.) Ryvarden', + 'Trichaptum fuscoviolaceum (Ehrenb.) Ryvarden', 'Trichia crateriformis G.W.Martin', 'Trichia scabra Rostaf.', + 'Trichia varia (Pers.) Pers.', 'Trichoderma aureoviride Rifai', + 'Trichoderma citrinum (Pers.) Jaklitsch, W.Gams & Voglmayr, 2014', + 'Trichoderma europaeum Jaklitsch & Voglmayr, 2014', + 'Trichoderma pulvinatum (Fuckel) Jaklitsch & Voglmayr, 2014', 'Trichoderma strictipile Bissett, 1992', + 'Trichoglossum hirsutum (Pers.) Boud., 1907', 'Tricholoma aestuans (Fr.) Gillet', + 'Tricholoma albobrunneum (Pers.) P.Kumm.', 'Tricholoma album (Schaeff.) P.Kumm.', + 'Tricholoma argyraceum (Bull.) Gillet', 'Tricholoma arvernense Bon', 'Tricholoma aurantium (Schaeff.) Ricken', + 'Tricholoma basirubens (Bon) A.Riva & Bon', 'Tricholoma cingulatum (Almfelt) Jacobashch', + 'Tricholoma columbetta (Fr.) P.Kumm.', 'Tricholoma equestre (L.) P.Kumm., 1871', + 'Tricholoma focale (Fr.) Ricken', 'Tricholoma frondosae Kalamees & Shchukin', 'Tricholoma fulvum (DC.) Sacc.', + 'Tricholoma imbricatum (Fr.) P.Kumm.', 'Tricholoma inocybeoides A.Pearson', 'Tricholoma lascivum (Fr.) Gillet', + 'Tricholoma orirubens Quél.', 'Tricholoma pessundatum (Fr.) Quél.', 'Tricholoma populinum J.E.Lange', + 'Tricholoma portentosum (Fr.) Quél.', 'Tricholoma psammopus (Kalchbr.) Quél.', + 'Tricholoma saponaceum (Fr.) P.Kumm., 1871', 'Tricholoma scalpturatum (Fr.) Quél.', + 'Tricholoma sciodes (Pers.) C.Martín', 'Tricholoma sejunctum (Sowerby) Quél.', 'Tricholoma squarrulosum Bres.', + 'Tricholoma stans (Fr.) Sacc.', 'Tricholoma stiparophyllum Fr. & N.Lund', + 'Tricholoma sulphureum (Bull.) P.Kumm., 1871', 'Tricholoma terreum (Schaeff.) Quél.', + 'Tricholoma ustale (Fr.) P.Kumm.', 'Tricholoma vaccinum (Schaeff.) P.Kumm.', + 'Tricholomopsis decora (Fr.) Singer', 'Tricholomopsis rutilans (Schaeff.) Singer', + 'Trichopeziza subsulphurea (Svrcek) Baral', 'Triphragmium ulmariae (DC.) Link', + 'Trochila ilicina (Nees ex Fr.) Courtec.', 'Tubaria conspersa (Pers.) Fayod', 'Tubaria dispersa (L.) Singer', + 'Tubaria furfuracea (Pers.) Gillet', 'Tuber aestivum Vittad.', 'Tuber borchii Vittad.', + 'Tubifera ferruginosa (Batsch) J.F.Gmel.', 'Tuckermannopsis chlorophylla (Willd.) Hale', + 'Tulasnella violea (Quél.) Bourdot & Galzin', 'Tulostoma brumale Pers.', 'Tulostoma fimbriatum Fr.', + 'Tylopilus felleus (Bull.) P.Karst.', 'Typhula erythropus (Pers.) Fr.', 'Typhula gyrans (Batsch) Fr.', + 'Typhula spathulata (Peck) Berthier', 'Tyromyces chioneus (Fr.) P.Karst.', 'Umbilicaria polyphylla (L.) Baumg.', + 'Urocystis anemones (Pers.) J.Schröt.', 'Urocystis eranthidis (Pass.) Ainsw. & Sampson', + 'Uromyces dactylidis G.H.Otth', 'Uromyces ficariae (Schumach.) Lév.', 'Uromyces rumicis (Schumach.) G.Winter', + 'Usnea hirta (L.) Weber ex F.H.Wigg.', 'Usnea subfloridana Stirt.', + 'Variospora flavescens (Huds.) Arup, Frödén & Søchting', 'Verpa bohemica (Krombh.) J.Schröt.', + 'Verpa conica (O.F.Müll.) Sw.', 'Verrucaria nigrescens Pers.', 'Vesiculomyces citrinus (Pers.) E.Hagstr., 1977', + 'Volvariella bombycina (Schaeff.) Singer', 'Volvariella hypopithys (Fr.) M.M.Moser, 1953', + 'Volvariella murinella (Quél.) Courtec.', 'Volvariella surrecta (Knapp) Singer', + 'Volvopluteus gloiocephalus (DC.) Vizzini, Contu & Justo, 2011', + 'Vouauxiella lichenicola (Linds.) Petr. & Syd.', 'Vuilleminia comedens (Nees) Maire', + 'Vuilleminia coryli Boidin, Lanq. & Gilles', 'Vuilleminia cystidiata Parmasto', + 'Vulpicida pinastri (Scop.) J.-E.Mattsson', 'Xanthoparmelia conspersa (Ehrh. ex Ach.) Hale', + 'Xanthoparmelia loxodes (Nyl.) O.Blanco, A.Crespo, Elix, D.Hawksw. & Lumbsch', + 'Xanthoparmelia stenophylla (Ach.) Ahti & D.Hawksw.', + 'Xanthoparmelia verruculifera (Nyl.) O.Blanco, A.Crespo, Elix, D.Hawksw. & Lumbsch', + 'Xanthoria calcicola Oxner', 'Xanthoria parietina (L.) Th.Fr.', 'Xanthoriicola physciae (Kalchbr.) D.Hawksw.', + 'Xenasmatella vaga (Fr.) Stalpers', 'Xerocomellus chrysenteron (Bull.) Šutara, 2008', + 'Xerocomellus cisalpinus (Simonini, H.Ladurner & Peintner) Klofac, 2011', + 'Xerocomellus porosporus (Imler ex Watling) Šutara, 2008', 'Xerocomellus pruinatus (Fr. & Hök) Šutara, 2008', + 'Xerocomellus ripariellus (Redeuilh) Šutara, 2008', 'Xerocomus ferrugineus (Schaeff.) Bon', + 'Xerocomus subtomentosus (L.) Fr.', 'Xylaria carpophila (Pers.) Fr.', 'Xylaria hypoxylon (L.) Grev.', + 'Xylaria longipes Nitschke', 'Xylaria oxyacanthae Lév.', 'Xylaria polymorpha (Pers.) Grev.', + 'Xylodon brevisetus (P.Karst.) Hjortstam & Ryvarden', + 'Xylodon flaviporus (Berk. & M.A.Curtis ex Cooke) Riebesehl & Langer, 2017', + 'Xylodon nespori (Bres.) Hjortstam & Ryvarden', 'Xylodon paradoxus (Schrad.) Chevall.', + 'Xylodon raduloides Riebesehl & Langer, 2017' + ] + + def __init__(self, *args, ann_file, open_set=False, **kwargs): + self.open_set = open_set + super(Fungi, self).__init__(*args, ann_file=ann_file, **kwargs) + + def load_data_list(self): + table = pd.read_csv(self.ann_file) + + def to_dict(cls_id, img_path): + # actual file endings are lower case for 300 px dataset + img_path = img_path.lower() if '300' in self.data_prefix else img_path + img_path = self.img_prefix + img_path + return { + 'img_path': img_path, + 'gt_label': np.array(cls_id, dtype=np.int64) + } + + data_list = [to_dict(cls_id, img_path) for cls_id, img_path in zip(table['class_id'], table['image_path']) + if self.open_set or cls_id != -1] + return data_list + + +@DATASETS.register_module() +class FungiTest(Fungi): + def __init__(self, *args, ann_file, **kwargs): + super(FungiTest, self).__init__(*args, ann_file=ann_file, **kwargs) + + def load_annotations(self): + table = pd.read_csv(self.ann_file) + + def to_dict(img_path, obs_id): + return {'img_prefix': self.data_prefix, 'img_info': {'filename': img_path, 'observation_id': obs_id}} + + data_infos = [to_dict(img_path, obs_id) for img_path, obs_id in zip(table['image_path'], table['observationID'])] + return data_infos + + def load_data_list(self): + table = pd.read_csv(self.ann_file) + + def to_dict(img_path, obs_id): + # actual file endings are lower case for 300 px dataset + img_path = img_path.lower() if '300' in self.data_prefix else img_path + img_path = self.img_prefix + img_path + return { + 'img_path': img_path, + 'observation_id': obs_id + } + + data_list = [to_dict(img_path, obs_id) for img_path, obs_id in zip(table['image_path'], table['observationID'])] + return data_list diff --git a/mmpretrain_custom/datasets/transforms/__init__.py b/mmpretrain_custom/datasets/transforms/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..1210b8d753a0277cd470ede4b716ed9687f7e268 --- /dev/null +++ b/mmpretrain_custom/datasets/transforms/__init__.py @@ -0,0 +1 @@ +from .loading import LoadImageFromFileFungi diff --git a/mmpretrain_custom/datasets/transforms/loading.py b/mmpretrain_custom/datasets/transforms/loading.py new file mode 100644 index 0000000000000000000000000000000000000000..3b0523afed7a77eb684a0ecc62ce3c00295d9689 --- /dev/null +++ b/mmpretrain_custom/datasets/transforms/loading.py @@ -0,0 +1,146 @@ +import warnings +from typing import Optional + +import mmengine.fileio as fileio +import numpy as np +import cv2 + +import mmcv +from mmcv.transforms.base import BaseTransform +from mmpretrain.registry import TRANSFORMS + +from mmcv.image.io import _jpegflag, imread_flags +from mmengine.utils import is_str + + +@TRANSFORMS.register_module() +class LoadImageFromFileFungi(BaseTransform): + """Load an image from file. + + Required Keys: + + - img_path + + Modified Keys: + + - img + - img_shape + - ori_shape + + Args: + to_float32 (bool): Whether to convert the loaded image to a float32 + numpy array. If set to False, the loaded image is an uint8 array. + Defaults to False. + color_type (str): The flag argument for :func:`mmcv.imfrombytes`. + Defaults to 'color'. + imdecode_backend (str): The image decoding backend type. The backend + argument for :func:`mmcv.imfrombytes`. + See :func:`mmcv.imfrombytes` for details. + Defaults to 'cv2'. + file_client_args (dict, optional): Arguments to instantiate a + FileClient. See :class:`mmengine.fileio.FileClient` for details. + Defaults to None. It will be deprecated in future. Please use + ``backend_args`` instead. + Deprecated in version 2.0.0rc4. + ignore_empty (bool): Whether to allow loading empty image or file path + not existent. Defaults to False. + backend_args (dict, optional): Instantiates the corresponding file + backend. It may contain `backend` key to specify the file + backend. If it contains, the file backend corresponding to this + value will be used and initialized with the remaining values, + otherwise the corresponding file backend will be selected + based on the prefix of the file path. Defaults to None. + New in version 2.0.0rc4. + """ + + def __init__(self, + to_float32: bool = False, + color_type: str = 'color', + imdecode_backend: str = 'cv2', + file_client_args: Optional[dict] = None, + ignore_empty: bool = False, + *, + backend_args: Optional[dict] = None) -> None: + print('Using LoadImageFromFile from mmpretrain_custom') + self.ignore_empty = ignore_empty + self.to_float32 = to_float32 + self.color_type = color_type + self.imdecode_backend = imdecode_backend + + self.file_client_args: Optional[dict] = None + self.backend_args: Optional[dict] = None + if file_client_args is not None: + warnings.warn( + '"file_client_args" will be deprecated in future. ' + 'Please use "backend_args" instead', DeprecationWarning) + if backend_args is not None: + raise ValueError( + '"file_client_args" and "backend_args" cannot be set ' + 'at the same time.') + + self.file_client_args = file_client_args.copy() + if backend_args is not None: + self.backend_args = backend_args.copy() + + def transform(self, results: dict) -> Optional[dict]: + """Functions to load image. + + Args: + results (dict): Result dict from + :class:`mmengine.dataset.BaseDataset`. + + Returns: + dict: The dict contains loaded image and meta information. + """ + + filename = results['img_path'] + try: + if self.file_client_args is not None: + file_client = fileio.FileClient.infer_client( + self.file_client_args, filename) + img_bytes = file_client.get(filename) + else: + img_bytes = fileio.get( + filename, backend_args=self.backend_args) + img = mmcv.imfrombytes( + img_bytes, flag=self.color_type, backend=self.imdecode_backend) + if img is None: + flag = self.color_type + flag = imread_flags[flag] if is_str(flag) else flag + img = cv2.imread(filename, flag) + assert img is not None, filename + except Exception as e: + if self.ignore_empty: + if img is None: + flag = self.color_type + flag = imread_flags[flag] if is_str(flag) else flag + img = cv2.imread(filename, flag) + assert img is not None, filename + return img + else: + raise e + # in some cases, images are not read successfully, the img would be + # `None`, refer to https://github.com/open-mmlab/mmpretrain/issues/1427 + assert img is not None, f'failed to load image: {filename}' + if self.to_float32: + img = img.astype(np.float32) + + results['img'] = img + results['img_shape'] = img.shape[:2] + results['ori_shape'] = img.shape[:2] + return results + + def __repr__(self): + repr_str = (f'{self.__class__.__name__}(' + f'ignore_empty={self.ignore_empty}, ' + f'to_float32={self.to_float32}, ' + f"color_type='{self.color_type}', " + f"imdecode_backend='{self.imdecode_backend}', ") + + if self.file_client_args is not None: + repr_str += f'file_client_args={self.file_client_args})' + else: + repr_str += f'backend_args={self.backend_args})' + + return repr_str + \ No newline at end of file diff --git a/tools/browse_dataset.py b/tools/browse_dataset.py new file mode 100644 index 0000000000000000000000000000000000000000..91c1705d899dc2df779afb464ff4a23997f8b20e --- /dev/null +++ b/tools/browse_dataset.py @@ -0,0 +1,254 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os.path as osp +import sys +import textwrap + +from matplotlib import transforms +from mmengine.config import Config, DictAction +from mmengine.dataset import Compose +from mmengine.registry import init_default_scope +from mmengine.utils import ProgressBar +from mmengine.visualization.utils import img_from_canvas + +from mmpretrain.datasets.builder import build_dataset +from mmpretrain.structures import DataSample +from mmpretrain.visualization import UniversalVisualizer, create_figure + +try: + from matplotlib._tight_bbox import adjust_bbox +except ImportError: + # To be compatible with matplotlib 3.5 + from matplotlib.tight_bbox import adjust_bbox + + +def parse_args(): + parser = argparse.ArgumentParser(description='Browse a dataset') + parser.add_argument('config', help='train config file path') + parser.add_argument( + '--output-dir', + '-o', + default=None, + type=str, + help='If there is no display interface, you can save it.') + parser.add_argument('--not-show', default=False, action='store_true') + parser.add_argument( + '--phase', + '-p', + default='train', + type=str, + choices=['train', 'test', 'val'], + help='phase of dataset to visualize, accept "train" "test" and "val".' + ' Defaults to "train".') + parser.add_argument( + '--show-number', + '-n', + type=int, + default=sys.maxsize, + help='number of images selected to visualize, must bigger than 0. if ' + 'the number is bigger than length of dataset, show all the images in ' + 'dataset; default "sys.maxsize", show all images in dataset') + parser.add_argument( + '--show-interval', + '-i', + type=float, + default=2, + help='the interval of show (s)') + parser.add_argument( + '--mode', + '-m', + default='transformed', + type=str, + choices=['original', 'transformed', 'concat', 'pipeline'], + help='display mode; display original pictures or transformed pictures' + ' or comparison pictures. "original" means show images load from disk' + '; "transformed" means to show images after transformed; "concat" ' + 'means show images stitched by "original" and "output" images. ' + '"pipeline" means show all the intermediate images. ' + 'Defaults to "transformed".') + parser.add_argument( + '--rescale-factor', + '-r', + type=float, + help='(For `mode=original`) Image rescale factor, which is useful if' + 'the output is too large or too small.') + parser.add_argument( + '--channel-order', + '-c', + default='BGR', + choices=['BGR', 'RGB'], + help='The channel order of the showing images, could be "BGR" ' + 'or "RGB", Defaults to "BGR".') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + args = parser.parse_args() + return args + + +def make_grid(imgs, names): + """Concat list of pictures into a single big picture, align height here.""" + # A large canvas to ensure all text clear. + figure = create_figure(dpi=150, figsize=(16, 9)) + + # deal with imgs + max_nrows = 1 + img_shapes = [] + for img in imgs: + if isinstance(img, list): + max_nrows = max(len(img), max_nrows) + img_shapes.append([i.shape[:2] for i in img]) + else: + img_shapes.append(img.shape[:2]) + gs = figure.add_gridspec(max_nrows, len(imgs)) + + for i, img in enumerate(imgs): + if isinstance(img, list): + for j in range(len(img)): + subplot = figure.add_subplot(gs[j, i]) + subplot.axis(False) + subplot.imshow(img[j]) + name = '\n'.join(textwrap.wrap(names[i] + str(j), width=20)) + subplot.set_title( + f'{name}\n{img_shapes[i][j]}', + fontsize=15, + family='monospace') + else: + subplot = figure.add_subplot(gs[:, i]) + subplot.axis(False) + subplot.imshow(img) + name = '\n'.join(textwrap.wrap(names[i], width=20)) + subplot.set_title( + f'{name}\n{img_shapes[i]}', fontsize=15, family='monospace') + + # Manage the gap of subplots + figure.tight_layout() + + # Remove the white boundary (reserve 0.5 inches at the top to show label) + points = figure.get_tightbbox( + figure.canvas.get_renderer()).get_points() + [[0, 0], [0, 0.5]] + adjust_bbox(figure, transforms.Bbox(points)) + + return img_from_canvas(figure.canvas) + + +class InspectCompose(Compose): + """Compose multiple transforms sequentially. + + And record "img" field of all results in one list. + """ + + def __init__(self, transforms, intermediate_imgs, visualizer): + super().__init__(transforms=transforms) + self.intermediate_imgs = intermediate_imgs + self.visualizer = visualizer + + def __call__(self, data): + if 'img' in data: + self.intermediate_imgs.append({ + 'name': 'Original', + 'img': data['img'].copy() + }) + + for t in self.transforms: + data = t(data) + if data is None: + return None + if 'img' in data: + img = data['img'].copy() + if 'mask' in data: + tmp_img = img[0] if isinstance(img, list) else img + tmp_img = self.visualizer.add_mask_to_image( + tmp_img, + DataSample().set_mask(data['mask']), + resize=tmp_img.shape[:2]) + img = [tmp_img] + img[1:] if isinstance(img, + list) else tmp_img + self.intermediate_imgs.append({ + 'name': t.__class__.__name__, + 'img': img + }) + return data + + +def main(): + args = parse_args() + cfg = Config.fromfile(args.config) + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + + init_default_scope('mmpretrain') # Use mmpretrain as default scope. + + dataset_cfg = cfg.get(args.phase + '_dataloader').get('dataset').get('dataset') + dataset = build_dataset(dataset_cfg) + + # init visualizer + cfg.visualizer.pop('type') + fig_cfg = dict(figsize=(16, 10)) + visualizer = UniversalVisualizer( + **cfg.visualizer, fig_show_cfg=fig_cfg, fig_save_cfg=fig_cfg) + visualizer.dataset_meta = dataset.metainfo + + # init inspection + intermediate_imgs = [] + dataset.pipeline = InspectCompose(dataset.pipeline.transforms, + intermediate_imgs, visualizer) + + # init visualization image number + display_number = min(args.show_number, len(dataset)) + progress_bar = ProgressBar(display_number) + + for i, item in zip(range(display_number), dataset): + + rescale_factor = None + if args.mode == 'original': + image = intermediate_imgs[0]['img'] + # Only original mode need rescale factor, `make_grid` will use + # matplotlib to manage the size of subplots. + rescale_factor = args.rescale_factor + elif args.mode == 'transformed': + print(intermediate_imgs) + image = make_grid([intermediate_imgs[-1]['img']], ['transformed']) + elif args.mode == 'concat': + ori_image = intermediate_imgs[0]['img'] + trans_image = intermediate_imgs[-1]['img'] + image = make_grid([ori_image, trans_image], + ['original', 'transformed']) + else: + image = make_grid([result['img'] for result in intermediate_imgs], + [result['name'] for result in intermediate_imgs]) + + intermediate_imgs.clear() + + data_sample = item['data_samples'].numpy() + + # get filename from dataset or just use index as filename + if hasattr(item['data_samples'], 'img_path'): + filename = osp.basename(item['data_samples'].img_path) + else: + # some dataset have not image path + filename = f'{i}.jpg' + + out_file = osp.join(args.output_dir, + filename) if args.output_dir is not None else None + + visualizer.visualize_cls( + image if args.channel_order == 'RGB' else image[..., ::-1], + data_sample, + rescale_factor=rescale_factor, + show=not args.not_show, + wait_time=args.show_interval, + name=filename, + out_file=out_file) + progress_bar.update() + + +if __name__ == '__main__': + main() diff --git a/tools/dist_train.sh b/tools/dist_train.sh new file mode 100644 index 0000000000000000000000000000000000000000..3fca7641dec4090930c85991a079c28409529d4e --- /dev/null +++ b/tools/dist_train.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +CONFIG=$1 +GPUS=$2 +NNODES=${NNODES:-1} +NODE_RANK=${NODE_RANK:-0} +PORT=${PORT:-29500} +MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"} + +PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ +python -m torch.distributed.launch \ + --nnodes=$NNODES \ + --node_rank=$NODE_RANK \ + --master_addr=$MASTER_ADDR \ + --nproc_per_node=$GPUS \ + --master_port=$PORT \ + $(dirname "$0")/train.py \ + $CONFIG \ + --launcher pytorch ${@:3} diff --git a/tools/generate_result_from_scores.py b/tools/generate_result_from_scores.py new file mode 100644 index 0000000000000000000000000000000000000000..69bff128393246442a39e813024fed96f070038b --- /dev/null +++ b/tools/generate_result_from_scores.py @@ -0,0 +1,36 @@ +import argparse + +from collections import defaultdict +from statistics import mean +from sys import meta_path + +import numpy as np +import pandas as pd +import torch + +parser = argparse.ArgumentParser() +parser.add_argument('scores') +parser.add_argument('out') +args = parser.parse_args() + +scores = pd.read_csv(args.scores, header=None) + +obs_ids = scores.iloc[:, 0] + +dropped = 0 +total = 0 +with open(args.out, 'w') as f: + f.write('observation_id,class_id\n') + for id in obs_ids: + scrs = np.array(scores[scores.iloc[:, 0] == id].iloc[0, 1:]) + scrs = torch.softmax(torch.from_numpy(scrs), dim=0).numpy() + max_score = np.max(scrs) + cls_id = np.argmax(scrs) + if max_score < 0.09: + cls_id = -1 + dropped += 1 + total += 1 + f.write(f'{id},{cls_id}\n') +print(f'dropped {dropped} out of {total}') + + diff --git a/tools/publish_model.py b/tools/publish_model.py new file mode 100644 index 0000000000000000000000000000000000000000..d5ead5768acfef11db58c6fcc21fa35839f3fde8 --- /dev/null +++ b/tools/publish_model.py @@ -0,0 +1,108 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import datetime +import hashlib +import shutil +import warnings +from collections import OrderedDict +from pathlib import Path + +import torch + +import mmpretrain + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Process a checkpoint to be published') + parser.add_argument('in_file', help='input checkpoint filename') + parser.add_argument('out_file', help='output checkpoint filename') + parser.add_argument( + '--no-ema', + action='store_true', + help='Use keys in `ema_state_dict` (no-ema keys).') + parser.add_argument( + '--dataset-type', + type=str, + help='The type of the dataset. If the checkpoint is converted ' + 'from other repository, this option is used to fill the dataset ' + 'meta information to the published checkpoint, like "ImageNet", ' + '"CIFAR10" and others.') + args = parser.parse_args() + return args + + +def process_checkpoint(in_file, out_file, args): + checkpoint = torch.load(in_file, map_location='cpu') + # remove unnecessary fields for smaller file size + for key in ['optimizer', 'param_schedulers', 'hook_msgs', 'message_hub']: + checkpoint.pop(key, None) + + # For checkpoint converted from the official weight + if 'state_dict' not in checkpoint: + checkpoint = dict(state_dict=checkpoint) + + meta = checkpoint.get('meta', {}) + meta.setdefault('mmpretrain_version', mmpretrain.__version__) + + # handle dataset meta information + if args.dataset_type is not None: + from mmpretrain.registry import DATASETS + dataset_class = DATASETS.get(args.dataset_type) + dataset_meta = getattr(dataset_class, 'METAINFO', {}) + else: + dataset_meta = {} + + meta.setdefault('dataset_meta', dataset_meta) + + if len(meta['dataset_meta']) == 0: + warnings.warn('Missing dataset meta information.') + + checkpoint['meta'] = meta + + ema_state_dict = OrderedDict() + if 'ema_state_dict' in checkpoint: + for k, v in checkpoint['ema_state_dict'].items(): + # The ema static dict has some extra fields + if k.startswith('module.'): + origin_k = k[len('module.'):] + assert origin_k in checkpoint['state_dict'] + ema_state_dict[origin_k] = v + del checkpoint['ema_state_dict'] + print('The input checkpoint has EMA weights, ', end='') + if args.no_ema: + # The values stored in `ema_state_dict` is original values. + print('and drop the EMA weights.') + assert ema_state_dict.keys() <= checkpoint['state_dict'].keys() + checkpoint['state_dict'].update(ema_state_dict) + else: + print('and use the EMA weights.') + + temp_out_file = Path(out_file).with_name('temp_' + Path(out_file).name) + torch.save(checkpoint, temp_out_file) + + with open(temp_out_file, 'rb') as f: + sha = hashlib.sha256(f.read()).hexdigest()[:8] + if out_file.endswith('.pth'): + out_file_name = out_file[:-4] + else: + out_file_name = out_file + + current_date = datetime.datetime.now().strftime('%Y%m%d') + final_file = out_file_name + f'_{current_date}-{sha[:8]}.pth' + shutil.move(temp_out_file, final_file) + + print(f'Successfully generated the publish-ckpt as {final_file}.') + + +def main(): + args = parse_args() + out_dir = Path(args.out_file).parent + if not out_dir.exists(): + raise ValueError(f'Directory {out_dir} does not exist, ' + 'please generate it manually.') + process_checkpoint(args.in_file, args.out_file, args) + + +if __name__ == '__main__': + main() diff --git a/tools/slurm_train.sh b/tools/slurm_train.sh new file mode 100644 index 0000000000000000000000000000000000000000..b3feb3d9c7a6c33d82739cdf5ee10365673aaded --- /dev/null +++ b/tools/slurm_train.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +set -x + +PARTITION=$1 +JOB_NAME=$2 +CONFIG=$3 +WORK_DIR=$4 +GPUS=${GPUS:-8} +GPUS_PER_NODE=${GPUS_PER_NODE:-8} +CPUS_PER_TASK=${CPUS_PER_TASK:-5} +SRUN_ARGS=${SRUN_ARGS:-""} +PY_ARGS=${@:5} + +PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ +srun -p ${PARTITION} \ + --job-name=${JOB_NAME} \ + --gres=gpu:${GPUS_PER_NODE} \ + --ntasks=${GPUS} \ + --ntasks-per-node=${GPUS_PER_NODE} \ + --cpus-per-task=${CPUS_PER_TASK} \ + --kill-on-bad-exit=1 \ + ${SRUN_ARGS} \ + python -u tools/train.py ${CONFIG} --work-dir=${WORK_DIR} --launcher="slurm" ${PY_ARGS} diff --git a/tools/test.py b/tools/test.py new file mode 100644 index 0000000000000000000000000000000000000000..230d39caed1678c18c9885c603b9ab7bfb7ed603 --- /dev/null +++ b/tools/test.py @@ -0,0 +1,186 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os +import os.path as osp +from copy import deepcopy + +import mmengine +from mmengine.config import Config, ConfigDict, DictAction +from mmengine.evaluator import DumpResults +from mmengine.runner import Runner + + +def parse_args(): + parser = argparse.ArgumentParser( + description='MMPreTrain test (and eval) a model') + parser.add_argument('config', help='test config file path') + parser.add_argument('checkpoint', help='checkpoint file') + parser.add_argument( + '--work-dir', + help='the directory to save the file containing evaluation metrics') + parser.add_argument('--out', help='the file to output results.') + parser.add_argument( + '--out-item', + choices=['metrics', 'pred'], + help='To output whether metrics or predictions. ' + 'Defaults to output predictions.') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + parser.add_argument( + '--amp', + action='store_true', + help='enable automatic-mixed-precision test') + parser.add_argument( + '--show-dir', + help='directory where the visualization images will be saved.') + parser.add_argument( + '--show', + action='store_true', + help='whether to display the prediction results in a window.') + parser.add_argument( + '--interval', + type=int, + default=1, + help='visualize per interval samples.') + parser.add_argument( + '--wait-time', + type=float, + default=2, + help='display time of every window. (second)') + parser.add_argument( + '--no-pin-memory', + action='store_true', + help='whether to disable the pin_memory option in dataloaders.') + parser.add_argument( + '--tta', + action='store_true', + help='Whether to enable the Test-Time-Aug (TTA). If the config file ' + 'has `tta_pipeline` and `tta_model` fields, use them to determine the ' + 'TTA transforms and how to merge the TTA results. Otherwise, use flip ' + 'TTA by averaging classification score.') + parser.add_argument( + '--launcher', + choices=['none', 'pytorch', 'slurm', 'mpi'], + default='none', + help='job launcher') + # When using PyTorch version >= 2.0.0, the `torch.distributed.launch` + # will pass the `--local-rank` parameter to `tools/train.py` instead + # of `--local_rank`. + parser.add_argument('--local_rank', '--local-rank', type=int, default=0) + args = parser.parse_args() + if 'LOCAL_RANK' not in os.environ: + os.environ['LOCAL_RANK'] = str(args.local_rank) + return args + + +def merge_args(cfg, args): + """Merge CLI arguments to config.""" + cfg.launcher = args.launcher + + # work_dir is determined in this priority: CLI > segment in file > filename + if args.work_dir is not None: + # update configs according to CLI args if args.work_dir is not None + cfg.work_dir = args.work_dir + elif cfg.get('work_dir', None) is None: + # use config filename as default work_dir if cfg.work_dir is None + cfg.work_dir = osp.join('./work_dirs', + osp.splitext(osp.basename(args.config))[0]) + + cfg.load_from = args.checkpoint + + # enable automatic-mixed-precision test + if args.amp: + cfg.test_cfg.fp16 = True + + # -------------------- visualization -------------------- + if args.show or (args.show_dir is not None): + assert 'visualization' in cfg.default_hooks, \ + 'VisualizationHook is not set in the `default_hooks` field of ' \ + 'config. Please set `visualization=dict(type="VisualizationHook")`' + + cfg.default_hooks.visualization.enable = True + cfg.default_hooks.visualization.show = args.show + cfg.default_hooks.visualization.wait_time = args.wait_time + cfg.default_hooks.visualization.out_dir = args.show_dir + cfg.default_hooks.visualization.interval = args.interval + + # -------------------- TTA related args -------------------- + if args.tta: + if 'tta_model' not in cfg: + cfg.tta_model = dict(type='mmpretrain.AverageClsScoreTTA') + if 'tta_pipeline' not in cfg: + test_pipeline = cfg.test_dataloader.dataset.pipeline + cfg.tta_pipeline = deepcopy(test_pipeline) + flip_tta = dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='RandomFlip', prob=1.), + dict(type='RandomFlip', prob=0.) + ], + [test_pipeline[-1]], + ]) + cfg.tta_pipeline[-1] = flip_tta + cfg.model = ConfigDict(**cfg.tta_model, module=cfg.model) + cfg.test_dataloader.dataset.pipeline = cfg.tta_pipeline + + # ----------------- Default dataloader args ----------------- + default_dataloader_cfg = ConfigDict( + pin_memory=True, + collate_fn=dict(type='default_collate'), + ) + + def set_default_dataloader_cfg(cfg, field): + if cfg.get(field, None) is None: + return + dataloader_cfg = deepcopy(default_dataloader_cfg) + dataloader_cfg.update(cfg[field]) + cfg[field] = dataloader_cfg + if args.no_pin_memory: + cfg[field]['pin_memory'] = False + + set_default_dataloader_cfg(cfg, 'test_dataloader') + + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + + return cfg + + +def main(): + args = parse_args() + + if args.out is None and args.out_item is not None: + raise ValueError('Please use `--out` argument to specify the ' + 'path of the output file before using `--out-item`.') + + # load config + cfg = Config.fromfile(args.config) + + # merge cli arguments to config + cfg = merge_args(cfg, args) + + # build the runner from config + runner = Runner.from_cfg(cfg) + + if args.out and args.out_item in ['pred', None]: + runner.test_evaluator.metrics.append( + DumpResults(out_file_path=args.out)) + + # start testing + metrics = runner.test() + + if args.out and args.out_item == 'metrics': + mmengine.dump(metrics, args.out) + + +if __name__ == '__main__': + main() diff --git a/tools/test_generate_result_pre-consensus.py b/tools/test_generate_result_pre-consensus.py new file mode 100644 index 0000000000000000000000000000000000000000..7ce74b39a425fdfb084716915786d7a729275653 --- /dev/null +++ b/tools/test_generate_result_pre-consensus.py @@ -0,0 +1,263 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import imp +import os +import warnings +from numbers import Number +from collections import defaultdict +import os.path as osp +import platform +import multiprocessing as mp + +import cv2 +import mmcv +import mmengine +import numpy as np +import torch + +from torch.nn import DataParallel + +#from mmcv import DictAction +from mmengine.model.wrappers import MMDistributedDataParallel +#from mmcv.parallel import MMDataParallel, MMDistributedDataParallel +#from mmcv.runner import (load_checkpoint, +# wrap_fp16_model) +from mmengine.runner import load_checkpoint +from mmengine.registry import DefaultScope + + +from mmpretrain.datasets import build_dataset +from mmengine.runner import Runner +#from mmcls.datasets import build_dataloader, build_dataset +from mmpretrain.models import build_classifier +#from mmcls.models import build_classifier +#from mmcls.utils import get_root_logger, setup_multi_processes + + +def parse_args(): + parser = argparse.ArgumentParser(description='mmcls test model') + parser.add_argument('config', help='test config file path') + parser.add_argument('checkpoint', help='checkpoint file') + parser.add_argument('out', help='output result file') + parser.add_argument( + '--gpu-collect', + action='store_true', + help='whether to use gpu to collect results') + parser.add_argument('--tmpdir', help='tmp dir for writing some results') + # parser.add_argument( + # '--cfg-options', + # nargs='+', + # action=DictAction, + # help='override some settings in the used config, the key-value pair ' + # 'in xxx=yyy format will be merged into config file. If the value to ' + # 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + # 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + # 'Note that the quotation marks are necessary and that no white space ' + # 'is allowed.') + parser.add_argument( + '--device', default=None, help='device used for testing. (Deprecated)') + parser.add_argument( + '--gpu-ids', + type=int, + nargs='+', + help='(Deprecated, please use --gpu-id) ids of gpus to use ' + '(only applicable to non-distributed testing)') + parser.add_argument( + '--gpu-id', + type=int, + default=0, + help='id of gpu to use ' + '(only applicable to non-distributed testing)') + args = parser.parse_args() + + #assert args.metrics or args.out, \ + # 'Please specify at least one of output path and evaluation metrics.' + + return args + + +def single_gpu_test(model, + data_loader, + show=False, + out_dir=None, + **show_kwargs): + """Test model with local single gpu. + + This method tests model with a single gpu and supports showing results. + + Args: + model (:obj:`torch.nn.Module`): Model to be tested. + data_loader (:obj:`torch.utils.data.DataLoader`): Pytorch data loader. + show (bool): Whether to show the test results. Defaults to False. + out_dir (str): The output directory of result plots of all samples. + Defaults to None, which means not to write output files. + **show_kwargs: Any other keyword arguments for showing results. + + Returns: + list: The prediction results. + """ + model.eval() + results = [] + dataset = data_loader.dataset + prog_bar = mmengine.ProgressBar(len(dataset)) + observation_ids = [] + for i, data in enumerate(data_loader): + with torch.no_grad(): + #result = model(return_loss=False, **data) + #imgs = data['inputs'].cuda() + #data = model.module.data_preprocessor(data, training=False) + imgs = data['inputs'].cuda() + result = model.module.extract_feat(imgs) + + filenames = [x.img_path for x in data['data_samples']] + obs_ids = [osp.basename(x).split('.')[0].split('-')[1] for x in filenames] + result = list(zip(result[0], obs_ids)) + #print(result) + + batch_size = len(result) + results.extend(result) + + #batch_size = data['img'].size(0) + prog_bar.update(batch_size) + return results + +def setup_multi_processes(cfg): + """Setup multi-processing environment variables.""" + # set multi-process start method as `fork` to speed up the training + if platform.system() != 'Windows': + mp_start_method = cfg.get('mp_start_method', 'fork') + current_method = mp.get_start_method(allow_none=True) + if current_method is not None and current_method != mp_start_method: + warnings.warn( + f'Multi-processing start method `{mp_start_method}` is ' + f'different from the previous setting `{current_method}`.' + f'It will be force set to `{mp_start_method}`. You can change ' + f'this behavior by changing `mp_start_method` in your config.') + mp.set_start_method(mp_start_method, force=True) + + # disable opencv multithreading to avoid system being overloaded + opencv_num_threads = cfg.get('opencv_num_threads', 0) + cv2.setNumThreads(opencv_num_threads) + + # setup OMP threads + # This code is referred from https://github.com/pytorch/pytorch/blob/master/torch/distributed/run.py # noqa + if 'OMP_NUM_THREADS' not in os.environ and cfg.data.workers_per_gpu > 1: + omp_num_threads = 1 + warnings.warn( + f'Setting OMP_NUM_THREADS environment variable for each process ' + f'to be {omp_num_threads} in default, to avoid your system being ' + f'overloaded, please further tune the variable for optimal ' + f'performance in your application as needed.') + os.environ['OMP_NUM_THREADS'] = str(omp_num_threads) + + # setup MKL threads + if 'MKL_NUM_THREADS' not in os.environ and cfg.data.workers_per_gpu > 1: + mkl_num_threads = 1 + warnings.warn( + f'Setting MKL_NUM_THREADS environment variable for each process ' + f'to be {mkl_num_threads} in default, to avoid your system being ' + f'overloaded, please further tune the variable for optimal ' + f'performance in your application as needed.') + os.environ['MKL_NUM_THREADS'] = str(mkl_num_threads) + + +def main(): + args = parse_args() + + default_scope = DefaultScope.get_instance('test', scope_name='mmpretrain') + + cfg = mmengine.Config.fromfile(args.config) #mmcv.Config.fromfile(args.config) + #if args.cfg_options is not None: + # cfg.merge_from_dict(args.cfg_options) + + # set multi-process settings + setup_multi_processes(cfg) + + # set cudnn_benchmark + if cfg.get('cudnn_benchmark', False): + torch.backends.cudnn.benchmark = True + cfg.model.pretrained = None + + if args.gpu_ids is not None: + cfg.gpu_ids = args.gpu_ids[0:1] + warnings.warn('`--gpu-ids` is deprecated, please use `--gpu-id`. ' + 'Because we only support single GPU mode in ' + 'non-distributed testing. Use the first GPU ' + 'in `gpu_ids` now.') + else: + cfg.gpu_ids = [args.gpu_id] + + # dataset = build_dataset(cfg.data.test, default_args=dict(test_mode=True)) + + # # build the dataloader + # # The default loader config + # loader_cfg = dict( + # # cfg.gpus will be ignored if distributed + # num_gpus=len(cfg.gpu_ids), + # dist=False, + # round_up=True, + # ) + # # The overall dataloader settings + # loader_cfg.update({ + # k: v + # for k, v in cfg.data.items() if k not in [ + # 'train', 'val', 'test', 'train_dataloader', 'val_dataloader', + # 'test_dataloader' + # ] + # }) + # test_loader_cfg = { + # **loader_cfg, + # 'shuffle': False, # Not shuffle by default + # 'sampler_cfg': None, # Not use sampler by default + # **cfg.data.get('test_dataloader', {}), + # } + # the extra round_up data will be removed during gpu/cpu collect + data_loader = Runner.build_dataloader(cfg.test_dataloader) + + # build the model and load checkpoint + model = build_classifier(cfg.model) + checkpoint = load_checkpoint(model, args.checkpoint, map_location='cpu') + + # if 'CLASSES' in checkpoint.get('meta', {}): + # CLASSES = checkpoint['meta']['CLASSES'] + # if CLASSES is None: + # CLASSES = dataset.CLASSES + + if args.device == 'cpu': + model = model.cpu() + else: + model = DataParallel(model, device_ids=cfg.gpu_ids) + if not model.device_ids: + assert mmcv.digit_version(mmcv.__version__) >= (1, 4, 4), \ + 'To test with CPU, please confirm your mmcv version ' \ + 'is not lower than v1.4.4' + #model.CLASSES = CLASSES + outputs = single_gpu_test(model, data_loader) + + results = defaultdict(list) + for result, obs_id in outputs: + results[obs_id].append(result) + + dropped = 0 + total = 0 + with open(args.out, 'w') as f, open(args.out + '.scores.csv', 'w') as f2: + f.write('observation_id,class_id\n') + for obs_id, result in results.items(): + avg_feats = torch.mean(torch.stack(result, dim=0), dim=0, keepdim=True) + scores = model.module.head(avg_feats) + class_id = np.argmax(scores.detach().cpu()) + #if np.max(scores) < 0.1: + # class_id = -1 + # dropped += 1 + total += 1 + f.write(f'{obs_id},{float(class_id):.1f}\n') + f2.write(f'{obs_id}') + for s in scores: + f2.write(f',{s}') + f2.write('\n') + + print(f'dropped {dropped} out of {total}') + + +if __name__ == '__main__': + main() diff --git a/tools/train.py b/tools/train.py new file mode 100644 index 0000000000000000000000000000000000000000..7a149e74aefc1d8a6638db12d55843e6a33859e7 --- /dev/null +++ b/tools/train.py @@ -0,0 +1,159 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os +import os.path as osp +from copy import deepcopy + +from mmengine.config import Config, ConfigDict, DictAction +from mmengine.runner import Runner +from mmengine.utils import digit_version +from mmengine.utils.dl_utils import TORCH_VERSION + + +def parse_args(): + parser = argparse.ArgumentParser(description='Train a model') + parser.add_argument('config', help='train config file path') + parser.add_argument('--work-dir', help='the dir to save logs and models') + parser.add_argument( + '--resume', + nargs='?', + type=str, + const='auto', + help='If specify checkpoint path, resume from it, while if not ' + 'specify, try to auto resume from the latest checkpoint ' + 'in the work directory.') + parser.add_argument( + '--amp', + action='store_true', + help='enable automatic-mixed-precision training') + parser.add_argument( + '--no-validate', + action='store_true', + help='whether not to evaluate the checkpoint during training') + parser.add_argument( + '--auto-scale-lr', + action='store_true', + help='whether to auto scale the learning rate according to the ' + 'actual batch size and the original batch size.') + parser.add_argument( + '--no-pin-memory', + action='store_true', + help='whether to disable the pin_memory option in dataloaders.') + parser.add_argument( + '--no-persistent-workers', + action='store_true', + help='whether to disable the persistent_workers option in dataloaders.' + ) + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + parser.add_argument( + '--launcher', + choices=['none', 'pytorch', 'slurm', 'mpi'], + default='none', + help='job launcher') + # When using PyTorch version >= 2.0.0, the `torch.distributed.launch` + # will pass the `--local-rank` parameter to `tools/train.py` instead + # of `--local_rank`. + parser.add_argument('--local_rank', '--local-rank', type=int, default=0) + args = parser.parse_args() + if 'LOCAL_RANK' not in os.environ: + os.environ['LOCAL_RANK'] = str(args.local_rank) + + return args + + +def merge_args(cfg, args): + """Merge CLI arguments to config.""" + if args.no_validate: + cfg.val_cfg = None + cfg.val_dataloader = None + cfg.val_evaluator = None + + cfg.launcher = args.launcher + + # work_dir is determined in this priority: CLI > segment in file > filename + if args.work_dir is not None: + # update configs according to CLI args if args.work_dir is not None + cfg.work_dir = args.work_dir + elif cfg.get('work_dir', None) is None: + # use config filename as default work_dir if cfg.work_dir is None + cfg.work_dir = osp.join('./work_dirs', + osp.splitext(osp.basename(args.config))[0]) + + # enable automatic-mixed-precision training + if args.amp is True: + optim_wrapper = cfg.optim_wrapper.get('type', 'OptimWrapper') + assert optim_wrapper in ['OptimWrapper', 'AmpOptimWrapper'], \ + '`--amp` is not supported custom optimizer wrapper type ' \ + f'`{optim_wrapper}.' + cfg.optim_wrapper.type = 'AmpOptimWrapper' + cfg.optim_wrapper.setdefault('loss_scale', 'dynamic') + + # resume training + if args.resume == 'auto': + cfg.resume = True + cfg.load_from = None + elif args.resume is not None: + cfg.resume = True + cfg.load_from = args.resume + + # enable auto scale learning rate + if args.auto_scale_lr: + cfg.auto_scale_lr.enable = True + + # set dataloader args + default_dataloader_cfg = ConfigDict( + pin_memory=True, + persistent_workers=True, + collate_fn=dict(type='default_collate'), + ) + if digit_version(TORCH_VERSION) < digit_version('1.8.0'): + default_dataloader_cfg.persistent_workers = False + + def set_default_dataloader_cfg(cfg, field): + if cfg.get(field, None) is None: + return + dataloader_cfg = deepcopy(default_dataloader_cfg) + dataloader_cfg.update(cfg[field]) + cfg[field] = dataloader_cfg + if args.no_pin_memory: + cfg[field]['pin_memory'] = False + if args.no_persistent_workers: + cfg[field]['persistent_workers'] = False + + set_default_dataloader_cfg(cfg, 'train_dataloader') + set_default_dataloader_cfg(cfg, 'val_dataloader') + set_default_dataloader_cfg(cfg, 'test_dataloader') + + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + + return cfg + + +def main(): + args = parse_args() + + # load config + cfg = Config.fromfile(args.config) + + # merge cli arguments to config + cfg = merge_args(cfg, args) + + # build the runner from config + runner = Runner.from_cfg(cfg) + + # start training + runner.train() + + +if __name__ == '__main__': + main()