From 692044effb325a98b02112bd8c6b393579752036 Mon Sep 17 00:00:00 2001 From: Yifei Yang <2744335995@qq.com> Date: Tue, 6 Dec 2022 14:12:56 +0800 Subject: [PATCH 01/44] Fix disco notebook (#1507) fix notebook --- configs/disco_diffusion/tutorials.ipynb | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/configs/disco_diffusion/tutorials.ipynb b/configs/disco_diffusion/tutorials.ipynb index b21156bfb0..4c6e54d9b2 100644 --- a/configs/disco_diffusion/tutorials.ipynb +++ b/configs/disco_diffusion/tutorials.ipynb @@ -79,8 +79,7 @@ "!git clone -b dev-1.x https://github.com/open-mmlab/mmediting.git \n", "%cd mmediting\n", "!pip install -r requirements.txt\n", - "!pip install -e .\n", - "%cd configs/disco_diffusion" + "!pip install -e ." ] }, { @@ -122,7 +121,7 @@ "metadata": {}, "outputs": [], "source": [ - "config = 'disco-diffusion_adm-u-finetuned_imagenet-512x512.py'\n", + "config = 'configs/disco_diffusion/disco-diffusion_adm-u-finetuned_imagenet-512x512.py'\n", "disco = MODELS.build(Config.fromfile(config).model).cuda().eval()\n", "text_prompts = {\n", " 0: [\"clouds surround the mountains and Chinese palaces, sunshine, lake, overlook, overlook, unreal engine, light effect, Dream, Greg Rutkowski, James Gurney, artstation\"]\n", @@ -219,7 +218,7 @@ "text_prompts = {\n", " 0: [\"clouds surround the mountains and Chinese palaces,sunshine,lake,overlook,overlook,unreal engine,light effect,Dream,Greg Rutkowski,James Gurney,artstation\"]\n", "}\n", - "config = 'disco-diffusion_adm-u-finetuned_imagenet-256x256.py'\n", + "config = 'configs/disco_diffusion/disco-diffusion_adm-u-finetuned_imagenet-256x256.py'\n", "disco = MODELS.build(Config.fromfile(config).model).cuda().eval()\n", "image = disco.infer(width=512, height=448, text_prompts=text_prompts, show_progress=True, num_inference_steps=num_inference_steps, eta=0.8, seed=seed)['samples']\n", "show_tensor(image)" @@ -233,7 +232,7 @@ "source": [ "\n", "# 512x512_diffusion_uncond_finetune_008100\n", - "config = 'disco-diffusion_adm-u-finetuned_imagenet-512x512.py'\n", + "config = 'configs/disco_diffusion/disco-diffusion_adm-u-finetuned_imagenet-512x512.py'\n", "disco = MODELS.build(Config.fromfile(config).model).cuda().eval()\n", "image = disco.infer(width=1280, height=768, text_prompts=text_prompts, show_progress=True, num_inference_steps=num_inference_steps, eta=0.8, seed=seed)['samples']\n", "show_tensor(image)\n" @@ -294,7 +293,7 @@ "from mmedit.models.editors.disco_diffusion.guider import ImageTextGuider\n", "\n", "\n", - "config = 'disco-diffusion_adm-u-finetuned_imagenet-512x512.py'\n", + "config = 'configs/disco_diffusion/disco-diffusion_adm-u-finetuned_imagenet-512x512.py'\n", "disco = MODELS.build(Config.fromfile(config).model).cuda().eval()\n", "text_prompts = {0: [\"A beautiful painting of a map of the city of Atlantis\"]}\n" ] @@ -1179,7 +1178,7 @@ "metadata": {}, "outputs": [], "source": [ - "config = 'disco-diffusion_adm-u-finetuned_imagenet-512x512.py'\n", + "config = 'configs/disco_diffusion/disco-diffusion_adm-u-finetuned_imagenet-512x512.py'\n", "disco = MODELS.build(Config.fromfile(config).model).cuda().eval()" ] }, From 94caa79ea0f03a5f9bc5069f62847e3a9c5bb350 Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Thu, 8 Dec 2022 14:34:11 +0800 Subject: [PATCH 02/44] [Enhancement] Fix unit test for disco diffusion (#1511) fix unit test for disco diffusion --- .../test_disco_diffusion.py | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/tests/test_models/test_editors/test_disco_diffusion/test_disco_diffusion.py b/tests/test_models/test_editors/test_disco_diffusion/test_disco_diffusion.py index ffd350ecf9..9c44b7d760 100644 --- a/tests/test_models/test_editors/test_disco_diffusion/test_disco_diffusion.py +++ b/tests/test_models/test_editors/test_disco_diffusion/test_disco_diffusion.py @@ -1,4 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. +from copy import deepcopy from unittest import TestCase import pytest @@ -40,9 +41,9 @@ def forward(self, x): class TestDiscoDiffusion(TestCase): - def test_init(self): + def setUp(self): # unet - unet32 = DenoisingUnet( + self.unet32 = DenoisingUnet( image_size=32, in_channels=3, base_channels=8, @@ -60,13 +61,17 @@ def test_init(self): use_new_attention_order=False), use_scale_shift_norm=True) # mock clip - clip_models = [clip_mock_wrapper(), clip_mock_wrapper()] + self.clip_models = [clip_mock_wrapper(), clip_mock_wrapper()] # diffusion_scheduler - diffusion_scheduler = DDIMScheduler( + self.diffusion_scheduler = DDIMScheduler( variance_type='learned_range', beta_schedule='linear', clip_sample=False) + def test_init(self): + unet32 = deepcopy(self.unet32) + diffusion_scheduler = deepcopy(self.diffusion_scheduler) + clip_models = deepcopy(self.clip_models) self.disco_diffusion = DiscoDiffusion( unet=unet32, diffusion_scheduler=diffusion_scheduler, @@ -76,7 +81,17 @@ def test_init(self): @pytest.mark.skipif(not torch.cuda.is_available(), reason='requires cuda') def test_infer(self): + unet32 = deepcopy(self.unet32) + diffusion_scheduler = deepcopy(self.diffusion_scheduler) + clip_models = deepcopy(self.clip_models) + self.disco_diffusion = DiscoDiffusion( + unet=unet32, + diffusion_scheduler=diffusion_scheduler, + secondary_model=None, + clip_models=clip_models, + use_fp16=True) self.disco_diffusion.cuda().eval() + # test model structure text_prompts = { 0: ['clouds surround the mountains and palaces,sunshine,lake'] From 379d36a8197a7881cfbf6b17bb1c0c11b3659028 Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Thu, 8 Dec 2022 20:13:31 +0800 Subject: [PATCH 03/44] [Enhancement] Add torch1.13 checking in CI (#1509) add torch1.13 checking in CI --- .circleci/test.yml | 4 +- .github/workflows/merge_stage_test.yml | 54 +++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/.circleci/test.yml b/.circleci/test.yml index 71e58826ad..752c29d95f 100644 --- a/.circleci/test.yml +++ b/.circleci/test.yml @@ -155,8 +155,8 @@ workflows: - lint - build_cpu: name: maximum_version_cpu - torch: 1.12.1 - torchvision: 0.13.1 + torch: 1.13.0 + torchvision: 0.14.0 python: 3.9.0 requires: - minimum_version_cpu diff --git a/.github/workflows/merge_stage_test.yml b/.github/workflows/merge_stage_test.yml index c48e3a9796..07a3775d5d 100644 --- a/.github/workflows/merge_stage_test.yml +++ b/.github/workflows/merge_stage_test.yml @@ -14,6 +14,7 @@ on: - dev-1.x - test-1.x - 1.x + - test-branch concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -64,7 +65,7 @@ jobs: strategy: matrix: python-version: [3.7] - torch: [1.6.0, 1.7.1, 1.8.1, 1.9.1, 1.10.1, 1.11.0, 1.12.1] + torch: [1.6.0, 1.7.1, 1.8.1, 1.9.1, 1.10.1, 1.11.0, 1.12.1, 1.13.0] include: - torch: 1.6.0 torchvision: 0.7.0 @@ -80,6 +81,8 @@ jobs: torchvision: 0.12.0 - torch: 1.12.1 torchvision: 0.13.1 + - torch: 1.13.0 + torchvision: 0.14.0 steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} @@ -163,6 +166,55 @@ jobs: python setup.py check -m -s TORCH_CUDA_ARCH_LIST=7.0 pip install -e . + build_cu116: + runs-on: ubuntu-18.04 + container: + image: pytorch/pytorch:1.13.0-cuda11.6-cudnn8-devel + strategy: + matrix: + python-version: [3.7] + include: + - torch: 1.8.1 + cuda: 10.2 + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Upgrade pip + run: pip install pip --upgrade + - name: Fetch GPG keys + run: | + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub + - name: Install Python-dev + run: apt-get update && apt-get install -y python${{matrix.python-version}}-dev + if: ${{matrix.python-version != 3.9}} + - name: Install system dependencies + run: | + apt-get update && apt-get install -y ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 + - name: Install PyTorch + run: python -m pip install torch torchvision --extra-index-url https://download.pytorch.org/whl/cpu + - name: Install mmediting dependencies + run: | + pip install git+https://github.com/open-mmlab/mmengine.git@main + pip install -U openmim + mim install 'mmcv >= 2.0.0rc1' + mim install 'mmdet >= 3.0.0rc2' + pip install -r requirements/tests.txt + pip install imageio-ffmpeg + pip install git+https://github.com/openai/CLIP.git + - name: Build and install + run: | + python setup.py check -m -s + TORCH_CUDA_ARCH_LIST=7.0 pip install -e . + - name: Run unittests and generate coverage report + run: | + coverage run --branch --source mmedit -m pytest tests/ + coverage xml --omit="**/stylegan3_ops/*,**/conv2d_gradfix.py,**/grid_sample_gradfix.py,**/misc.py,**/upfirdn2d.py,**all_gather_layer.py" + coverage report -m + build_windows: runs-on: ${{ matrix.os }} strategy: From b2333a8d70408daab3adf8607e97698efdb3d35c Mon Sep 17 00:00:00 2001 From: Yanhong Zeng Date: Fri, 9 Dec 2022 10:50:50 +0800 Subject: [PATCH 04/44] [Enhance] set the default 404 page for readthedocs (#1513) * enable 404 extension * update conf.py * fix extensions * add notfoundpage in conf * update requirements * fix typo --- .readthedocs.yml | 1 - docs/en/3_model_zoo.md | 74 ++++++++++++++----- docs/en/_templates/404.html | 16 ++++ .../classtemplate.rst | 0 docs/en/conf.py | 20 +---- .../5_unconditional_gans_datasets.md | 6 +- .../6_image_translation_datasets.md | 12 ++- docs/zh_cn/_templates/404.html | 16 ++++ docs/zh_cn/conf.py | 5 +- requirements/docs.txt | 6 +- requirements/readthedocs.txt | 1 + 11 files changed, 110 insertions(+), 47 deletions(-) create mode 100644 docs/en/_templates/404.html rename docs/en/{_template => _templates}/classtemplate.rst (100%) create mode 100644 docs/zh_cn/_templates/404.html diff --git a/.readthedocs.yml b/.readthedocs.yml index 5fc74db3d3..5d508503d4 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -7,4 +7,3 @@ python: install: - requirements: requirements/docs.txt - requirements: requirements/readthedocs.txt - - requirements: requirements/runtime.txt diff --git a/docs/en/3_model_zoo.md b/docs/en/3_model_zoo.md index d3eff263c7..1ef3a61a83 100644 --- a/docs/en/3_model_zoo.md +++ b/docs/en/3_model_zoo.md @@ -1,20 +1,25 @@ # Overview -- Number of checkpoints: 169 -- Number of configs: 169 -- Number of papers: 42 - - ALGORITHM: 43 +- Number of checkpoints: 178 +- Number of configs: 174 +- Number of papers: 46 + - ALGORITHM: 47 - Tasks: - - image2image translation - video interpolation - - unconditional gans - image super-resolution - - internal learning - - conditional gans - inpainting + - image generation + - image2image + - text2image - video super-resolution - - colorization + - image2image translation + - 3d-aware generation + - conditional gans + - image restoration - matting + - unconditional gans + - internal learning + - colorization For supported datasets, see [datasets overview](dataset_zoo/0_overview.md). @@ -106,6 +111,14 @@ For supported datasets, see [datasets overview](dataset_zoo/0_overview.md). - Number of papers: 1 - \[ALGORITHM\] Deep Image Matting ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/dim/README.md#citation)) +## Disco Diffusion + +- Tasks: image2image,text2image +- Number of checkpoints: 2 +- Number of configs: 0 +- Number of papers: 1 + - \[ALGORITHM\] Disco-Diffusion ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/disco_diffusion/README.md#citation)) + ## EDSR (CVPR'2017) - Tasks: image super-resolution @@ -122,6 +135,14 @@ For supported datasets, see [datasets overview](dataset_zoo/0_overview.md). - Number of papers: 1 - \[ALGORITHM\] Edvr: Video Restoration With Enhanced Deformable Convolutional Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/edvr/README.md#citation)) +## EG3D (CVPR'2022) + +- Tasks: 3d-aware generation +- Number of checkpoints: 3 +- Number of configs: 3 +- Number of papers: 1 + - \[ALGORITHM\] Efficient Geometry-Aware 3d Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/eg3d/README.md#citation)) + ## ESRGAN (ECCVW'2018) - Tasks: image super-resolution @@ -170,6 +191,14 @@ For supported datasets, see [datasets overview](dataset_zoo/0_overview.md). - Number of papers: 1 - \[ALGORITHM\] Globally and Locally Consistent Image Completion ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/global_local/README.md#citation)) +## Guided Diffusion (NeurIPS'2021) + +- Tasks: image generation +- Number of checkpoints: 2 +- Number of configs: 0 +- Number of papers: 1 + - \[ALGORITHM\] Diffusion Models Beat Gans on Image Synthesis ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/guided_diffusion/README.md#citation)) + ## IconVSR (CVPR'2021) - Tasks: video super-resolution @@ -186,14 +215,6 @@ For supported datasets, see [datasets overview](dataset_zoo/0_overview.md). - Number of papers: 1 - \[ALGORITHM\] Indices Matter: Learning to Index for Deep Image Matting ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/indexnet/README.md#citation)) -## LIIF (CVPR'2021) - -- Tasks: image super-resolution -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Learning Continuous Image Representation With Local Implicit Image Function ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/liif/README.md#citation)) - ## Instance-aware Image Colorization (CVPR'2020) - Tasks: colorization @@ -202,6 +223,14 @@ For supported datasets, see [datasets overview](dataset_zoo/0_overview.md). - Number of papers: 1 - \[ALGORITHM\] Instance-Aware Image Colorization ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/inst_colorization/README.md#quick-start)) +## LIIF (CVPR'2021) + +- Tasks: image super-resolution +- Number of checkpoints: 2 +- Number of configs: 2 +- Number of papers: 1 + - \[ALGORITHM\] Learning Continuous Image Representation With Local Implicit Image Function ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/liif/README.md#citation)) + ## LSGAN (ICCV'2017) - Tasks: unconditional gans @@ -210,6 +239,14 @@ For supported datasets, see [datasets overview](dataset_zoo/0_overview.md). - Number of papers: 1 - \[ALGORITHM\] Least Squares Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/lsgan/README.md#citation)) +## NAFNet (ECCV'2022) + +- Tasks: image restoration +- Number of checkpoints: 2 +- Number of configs: 2 +- Number of papers: 1 + - \[ALGORITHM\] Simple Baselines for Image Restoration ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/nafnet/README.md#citation)) + ## PConv (ECCV'2018) - Tasks: inpainting @@ -236,6 +273,7 @@ For supported datasets, see [datasets overview](dataset_zoo/0_overview.md). ## Positional Encoding in GANs +- Tasks: unconditional gans - Number of checkpoints: 21 - Number of configs: 21 - Number of papers: 1 @@ -339,7 +377,7 @@ For supported datasets, see [datasets overview](dataset_zoo/0_overview.md). ## TOFlow (IJCV'2019) -- Tasks: video interpolation, video super-resolution +- Tasks: video interpolation,video super-resolution - Number of checkpoints: 6 - Number of configs: 6 - Number of papers: 1 diff --git a/docs/en/_templates/404.html b/docs/en/_templates/404.html new file mode 100644 index 0000000000..1cd18b7310 --- /dev/null +++ b/docs/en/_templates/404.html @@ -0,0 +1,16 @@ +{% extends "layout.html" %} + +{% block body %} + +

Page Not Found

+

+ Oops! The page you are looking for cannot be found. +

+

+ This is likely to happen when you are switching document versions and the page you are reading is moved to another location in the new version. You can look for it in the content table left, or go to the homepage. +

+

+ If you cannot find documentation you want, please open an issue to tell us! +

+ +{% endblock %} diff --git a/docs/en/_template/classtemplate.rst b/docs/en/_templates/classtemplate.rst similarity index 100% rename from docs/en/_template/classtemplate.rst rename to docs/en/_templates/classtemplate.rst diff --git a/docs/en/conf.py b/docs/en/conf.py index 81909842d5..54cd1f3da3 100644 --- a/docs/en/conf.py +++ b/docs/en/conf.py @@ -41,6 +41,8 @@ 'myst_parser', 'sphinx_copybutton', 'sphinx.ext.autodoc.typehints', + 'sphinx_tabs.tabs', + 'notfound.extension', ] autodoc_mock_imports = [ @@ -94,11 +96,6 @@ 'url': 'https://mmediting.readthedocs.io/en/1.x/', 'description': '1.x branch', }, - { - 'name': 'MMEditing 1.x', - 'url': 'https://mmediting.readthedocs.io/en/dev-1.x/', - 'description': 'docs at 1.x branch' - }, ], 'active': True, @@ -106,16 +103,6 @@ ], 'menu_lang': 'en', - 'header_note': { - 'content': - 'You are reading the documentation for MMEditing 0.x, which ' - 'will soon be deprecated by the end of 2022. We recommend you upgrade ' - 'to MMEditing 1.0 to enjoy fruitful new features and better performance ' # noqa - ' brought by OpenMMLab 2.0. Check out the ' - 'changelog, ' # noqa - 'code ' # noqa - 'and documentation of MMEditing 1.0 for more details.', # noqa - } } # Add any paths that contain custom static files (such as style sheets) here, @@ -130,7 +117,8 @@ language = 'en' # The master toctree document. -master_doc = 'index' +root_doc = 'index' +notfound_template = '404.html' def builder_inited_handler(app): diff --git a/docs/en/dataset_zoo/5_unconditional_gans_datasets.md b/docs/en/dataset_zoo/5_unconditional_gans_datasets.md index a0f4d67164..f5024af12b 100644 --- a/docs/en/dataset_zoo/5_unconditional_gans_datasets.md +++ b/docs/en/dataset_zoo/5_unconditional_gans_datasets.md @@ -8,7 +8,7 @@ dataset_type = 'BasicImageDataset' train_pipeline = [ dict(type='LoadImageFromFile', key='img'), dict(type='Flip', keys=['img'], direction='horizontal'), - dict(type='PackGenInputs', keys=['img'], meta_keys=['img_path']) + dict(type='PackEditInputs', keys=['img'], meta_keys=['img_path']) ] # `batch_size` and `data_root` need to be set. @@ -23,7 +23,7 @@ train_dataloader = dict( pipeline=train_pipeline)) ``` -Here, we adopt `InfinitySampler` to avoid frequent dataloader reloading, which will accelerate the training procedure. As shown in the example, `pipeline` provides important data pipeline to process images, including loading from file system, resizing, cropping, transferring to `torch.Tensor` and packing to `GenDataSample`. All of supported data pipelines can be found in `mmedit/datasets/transforms`. +Here, we adopt `InfinitySampler` to avoid frequent dataloader reloading, which will accelerate the training procedure. As shown in the example, `pipeline` provides important data pipeline to process images, including loading from file system, resizing, cropping, transferring to `torch.Tensor` and packing to `EditDataSample`. All of supported data pipelines can be found in `mmedit/datasets/transforms`. For unconditional GANs with dynamic architectures like PGGAN and StyleGANv1, `GrowScaleImgDataset` is recommended to use for training. Since such dynamic architectures need real images in different scales, directly adopting `UnconditionalImageDataset` will bring heavy I/O cost for loading multiple high-resolution images. Here is an example we use for training PGGAN in CelebA-HQ dataset: @@ -33,7 +33,7 @@ dataset_type = 'GrowScaleImgDataset' pipeline = [ dict(type='LoadImageFromFile', key='img'), dict(type='Flip', keys=['img'], direction='horizontal'), - dict(type='PackGenInputs') + dict(type='PackEditInputs') ] # `samples_per_gpu` and `imgs_root` need to be set. diff --git a/docs/en/dataset_zoo/6_image_translation_datasets.md b/docs/en/dataset_zoo/6_image_translation_datasets.md index 85cec47c16..51e5312cdd 100644 --- a/docs/en/dataset_zoo/6_image_translation_datasets.md +++ b/docs/en/dataset_zoo/6_image_translation_datasets.md @@ -67,7 +67,7 @@ test_dataloader = dict( ``` Here, we adopt `LoadPairedImageFromFile` to load a paired image as the common loader does and crops -it into two images with the same shape in different domains. As shown in the example, `pipeline` provides important data pipeline to process images, including loading from file system, resizing, cropping, flipping, transferring to `torch.Tensor` and packing to `GenDataSample`. All of supported data pipelines can be found in `mmedit/datasets/transforms`. +it into two images with the same shape in different domains. As shown in the example, `pipeline` provides important data pipeline to process images, including loading from file system, resizing, cropping, flipping, transferring to `torch.Tensor` and packing to `EditDataSample`. All of supported data pipelines can be found in `mmedit/datasets/transforms`. For unpaired-data trained translation model like CycleGAN , `UnpairedImageDataset` is designed to train such translation models. Here is an example config for horse2zebra dataset: @@ -99,17 +99,15 @@ train_pipeline = [ dict(type='Flip', keys=[f'img_{domain_a}'], direction='horizontal'), dict(type='Flip', keys=[f'img_{domain_b}'], direction='horizontal'), dict( - type='PackGenInputs', - keys=[f'img_{domain_a}', f'img_{domain_b}'], - meta_keys=[f'img_{domain_a}_path', f'img_{domain_b}_path']) + type='PackEditInputs', + keys=[f'img_{domain_a}', f'img_{domain_b}']) ] test_pipeline = [ dict(type='LoadImageFromFile', io_backend='disk', key='img', flag='color'), dict(type='Resize', scale=(256, 256), interpolation='bicubic'), dict( - type='PackGenInputs', - keys=[f'img_{domain_a}', f'img_{domain_b}'], - meta_keys=[f'img_{domain_a}_path', f'img_{domain_b}_path']) + type='PackEditInputs', + keys=[f'img_{domain_a}', f'img_{domain_b}']) ] data_root = './data/horse2zebra/' # `batch_size` and `data_root` need to be set. diff --git a/docs/zh_cn/_templates/404.html b/docs/zh_cn/_templates/404.html new file mode 100644 index 0000000000..3ead60b47a --- /dev/null +++ b/docs/zh_cn/_templates/404.html @@ -0,0 +1,16 @@ +{% extends "layout.html" %} + +{% block body %} + +

未找到页面

+

+ 未找到你要打开的页面。 +

+

+ 如果你是从旧版本文档跳转至此,可能是对应的页面被移动了。请从左侧的目录中寻找新版本文档,或者跳转至首页。 +

+

+ 如果你找不到希望打开的文档,欢迎在 Issue 中告诉我们! +

+ +{% endblock %} diff --git a/docs/zh_cn/conf.py b/docs/zh_cn/conf.py index 9d397fccb2..de81ed9666 100644 --- a/docs/zh_cn/conf.py +++ b/docs/zh_cn/conf.py @@ -37,6 +37,8 @@ 'sphinx_markdown_tables', 'sphinx_copybutton', 'myst_parser', + 'sphinx_tabs.tabs', + 'notfound.extension', ] autodoc_mock_imports = [ @@ -111,7 +113,8 @@ language = 'zh_CN' # The master toctree document. -master_doc = 'index' +root_doc = 'index' +notfound_template = '404.html' def builder_inited_handler(app): diff --git a/requirements/docs.txt b/requirements/docs.txt index 64eb44b257..2e5d336226 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -1,6 +1,10 @@ docutils==0.16.0 +modelindex myst_parser -e git+https://github.com/open-mmlab/pytorch_sphinx_theme.git#egg=pytorch_sphinx_theme -sphinx==4.0.2 +sphinx==4.5.0 sphinx-copybutton +sphinx-notfound-page +sphinx-tabs sphinx_markdown_tables +tabulate diff --git a/requirements/readthedocs.txt b/requirements/readthedocs.txt index 3d5505bbf7..8297c02f27 100644 --- a/requirements/readthedocs.txt +++ b/requirements/readthedocs.txt @@ -1,5 +1,6 @@ lmdb mmcv>=2.0.0rc1 +mmengine prettytable Pygments regex From b1ca2b5fc2bcc5a5a7d13a2184e5e339e6153a0f Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Fri, 9 Dec 2022 17:31:28 +0800 Subject: [PATCH 05/44] [Enhanchement] Revise test requirements and CI (#1514) * revise test requirements and CI * remove open-clip from tests.txt --- .circleci/test.yml | 6 ------ .github/workflows/merge_stage_test.yml | 19 ++----------------- .github/workflows/pr_stage_test.yml | 11 +---------- requirements/runtime.txt | 2 -- requirements/tests.txt | 3 +++ 5 files changed, 6 insertions(+), 35 deletions(-) diff --git a/.circleci/test.yml b/.circleci/test.yml index 752c29d95f..4daf343ace 100644 --- a/.circleci/test.yml +++ b/.circleci/test.yml @@ -62,10 +62,7 @@ jobs: pip install git+https://github.com/open-mmlab/mmengine.git@main pip install -U openmim mim install 'mmcv >= 2.0.0rc1' - mim install 'mmdet >= 3.0.0rc2' pip install -r requirements/tests.txt - pip install git+https://github.com/openai/CLIP.git - pip install imageio-ffmpeg - run: name: Build and install command: | @@ -108,10 +105,7 @@ jobs: docker exec mmedit pip install -e /mmengine docker exec mmedit pip install -U openmim docker exec mmedit mim install 'mmcv >= 2.0.0rc1' - docker exec mmedit mim install 'mmdet >= 3.0.0rc2' docker exec mmedit pip install -r requirements/tests.txt - docker exec mmedit pip install git+https://github.com/openai/CLIP.git - docker exec mmedit pip install imageio-ffmpeg - run: name: Build and install command: | diff --git a/.github/workflows/merge_stage_test.yml b/.github/workflows/merge_stage_test.yml index 07a3775d5d..901f252c80 100644 --- a/.github/workflows/merge_stage_test.yml +++ b/.github/workflows/merge_stage_test.yml @@ -42,16 +42,13 @@ jobs: run: pip install torch==${{matrix.torch}}+cpu torchvision==${{matrix.torchvision}}+cpu -f https://download.pytorch.org/whl/torch_stable.html - name: Install MMEngine run: pip install git+https://github.com/open-mmlab/mmengine.git@main - - name: Install MMCV and MMDet + - name: Install MMCV run: | pip install -U openmim mim install 'mmcv >= 2.0.0rc1' - mim install 'mmdet >= 3.0.0rc2' - name: Install other dependencies run: | pip install -r requirements/tests.txt - pip install git+https://github.com/openai/CLIP.git - pip install imageio-ffmpeg - name: Build and install run: rm -rf .eggs && pip install -e . - name: Run unittests and generate coverage report @@ -95,17 +92,13 @@ jobs: run: pip install torch==${{matrix.torch}}+cpu torchvision==${{matrix.torchvision}}+cpu -f https://download.pytorch.org/whl/torch_stable.html - name: Install MMEngine run: pip install git+https://github.com/open-mmlab/mmengine.git@main - - name: Install MMCV and MMDet + - name: Install MMCV run: | pip install -U openmim mim install 'mmcv >= 2.0.0rc1' - mim install 'mmdet >= 3.0.0rc2' - name: Install other dependencies run: | pip install -r requirements/tests.txt - pip install git+https://github.com/openai/CLIP.git - pip install imageio-ffmpeg - - name: Build and install run: rm -rf .eggs && pip install -e . - name: Run unittests and generate coverage report @@ -156,11 +149,9 @@ jobs: run: python -m pip install torch==1.8.1+cpu torchvision==0.9.1+cpu -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html - name: Install mmediting dependencies run: | - pip install git+https://github.com/open-mmlab/mmengine.git@main pip install -U openmim mim install 'mmcv >= 2.0.0rc1' pip install -r requirements/tests.txt - pip install imageio-ffmpeg - name: Build and install run: | python setup.py check -m -s @@ -201,10 +192,7 @@ jobs: pip install git+https://github.com/open-mmlab/mmengine.git@main pip install -U openmim mim install 'mmcv >= 2.0.0rc1' - mim install 'mmdet >= 3.0.0rc2' pip install -r requirements/tests.txt - pip install imageio-ffmpeg - pip install git+https://github.com/openai/CLIP.git - name: Build and install run: | python setup.py check -m -s @@ -239,10 +227,7 @@ jobs: python -m pip install git+https://github.com/open-mmlab/mmengine.git@main python -m pip install -U openmim mim install 'mmcv >= 2.0.0rc1' - mim install 'mmdet >= 3.0.0rc2' python -m pip install -r requirements/tests.txt - python -m pip install git+https://github.com/openai/CLIP.git - python -m pip install imageio-ffmpeg - name: Build and install run: | python -m pip install -e . diff --git a/.github/workflows/pr_stage_test.yml b/.github/workflows/pr_stage_test.yml index dab6e3145a..bb789e332d 100644 --- a/.github/workflows/pr_stage_test.yml +++ b/.github/workflows/pr_stage_test.yml @@ -35,16 +35,13 @@ jobs: run: pip install torch==${{matrix.torch}}+cpu torchvision==${{matrix.torchvision}}+cpu -f https://download.pytorch.org/whl/torch_stable.html - name: Install MMEngine run: pip install git+https://github.com/open-mmlab/mmengine.git@main - - name: Install MMCV and MMDet + - name: Install MMCV run: | pip install -U openmim mim install 'mmcv >= 2.0.0rc1' - mim install 'mmdet >= 3.0.0rc2' - name: Install other dependencies run: | pip install -r requirements/tests.txt - pip install git+https://github.com/openai/CLIP.git - pip install imageio-ffmpeg - name: Build and install run: rm -rf .eggs && pip install -e . - name: Run unittests and generate coverage report @@ -98,10 +95,7 @@ jobs: pip install git+https://github.com/open-mmlab/mmengine.git@main pip install -U openmim mim install 'mmcv >= 2.0.0rc1' - mim install 'mmdet >= 3.0.0rc2' pip install -r requirements/tests.txt - pip install git+https://github.com/openai/CLIP.git - pip install imageio-ffmpeg - name: Build and install run: | python setup.py check -m -s @@ -134,10 +128,7 @@ jobs: python -m pip install git+https://github.com/open-mmlab/mmengine.git@main python -m pip install -U openmim mim install 'mmcv >= 2.0.0rc1' - mim install 'mmdet >= 3.0.0rc2' python -m pip install -r requirements/tests.txt - pip install git+https://github.com/openai/CLIP.git - python -m pip install imageio-ffmpeg - name: Build and install run: | python -m pip install -e . diff --git a/requirements/runtime.txt b/requirements/runtime.txt index 1035119e93..fc13ae548f 100644 --- a/requirements/runtime.txt +++ b/requirements/runtime.txt @@ -16,5 +16,3 @@ opencv-python!=4.5.5.62,!=4.5.5.64 Pillow resize_right tensorboard -torch -torchvision diff --git a/requirements/tests.txt b/requirements/tests.txt index 44d49a9d9c..075956b746 100644 --- a/requirements/tests.txt +++ b/requirements/tests.txt @@ -1,3 +1,4 @@ +clip @ git+https://github.com/openai/CLIP.git@d50d76daa670286dd6cacf3bcd80b5e4823fc8e1 # codecov # flake8 # isort==5.10.1 @@ -6,5 +7,7 @@ # pytest-runner # yapf coverage +imageio-ffmpeg==0.4.4 interrogate +mmdet >= 3.0.0rc2 pytest From ac6e3d003262ec6bde17a526b5defa378aacd312 Mon Sep 17 00:00:00 2001 From: Yanhong Zeng Date: Mon, 12 Dec 2022 18:13:19 +0800 Subject: [PATCH 06/44] [Enhance] Recursive generate summary and docstring for API Reference (#1517) * remove apis * enable recursive api rendering * fix template * fix rendering for models * fix lint * using autoapi instead of autodoc * use autoapi instead of autodocs * fix lint Co-authored-by: zengyh1900 --- .gitignore | 1 - .readthedocs.yml | 2 +- docs/en/3_model_zoo.md | 22 ++--- docs/en/Makefile | 1 + docs/en/_templates/classtemplate.rst | 14 --- docs/en/_templates/python/attribute.rst | 1 + docs/en/_templates/python/class.rst | 58 +++++++++++ docs/en/_templates/python/data.rst | 32 ++++++ docs/en/_templates/python/exception.rst | 1 + docs/en/_templates/python/function.rst | 15 +++ docs/en/_templates/python/method.rst | 19 ++++ docs/en/_templates/python/module.rst | 114 ++++++++++++++++++++++ docs/en/_templates/python/package.rst | 1 + docs/en/_templates/python/property.rst | 15 +++ docs/en/api/apis.rst | 27 ----- docs/en/api/datasets.rst | 22 ----- docs/en/api/datasets.transforms.rst | 72 -------------- docs/en/api/engine.hooks.rst | 20 ---- docs/en/api/engine.optimizers.rst | 16 --- docs/en/api/engine.runner.rst | 18 ---- docs/en/api/engine.schedulers.rst | 15 --- docs/en/api/evaluation.functional.rst | 24 ----- docs/en/api/evaluation.metrics.rst | 36 ------- docs/en/api/models.base_models.rst | 23 ----- docs/en/api/models.data_preprocessors.rst | 18 ---- docs/en/api/models.editors.rst | 108 -------------------- docs/en/api/models.losses.rst | 44 --------- docs/en/api/models.utils.rst | 25 ----- docs/en/api/structures.rst | 15 --- docs/en/api/utils.rst | 28 ------ docs/en/api/visualization.rst | 19 ---- docs/en/conf.py | 47 +++++++-- docs/en/index.rst | 45 ++++----- requirements/docs.txt | 2 +- requirements/readthedocs.txt | 3 + 35 files changed, 336 insertions(+), 587 deletions(-) delete mode 100644 docs/en/_templates/classtemplate.rst create mode 100644 docs/en/_templates/python/attribute.rst create mode 100644 docs/en/_templates/python/class.rst create mode 100644 docs/en/_templates/python/data.rst create mode 100644 docs/en/_templates/python/exception.rst create mode 100644 docs/en/_templates/python/function.rst create mode 100644 docs/en/_templates/python/method.rst create mode 100644 docs/en/_templates/python/module.rst create mode 100644 docs/en/_templates/python/package.rst create mode 100644 docs/en/_templates/python/property.rst delete mode 100644 docs/en/api/apis.rst delete mode 100644 docs/en/api/datasets.rst delete mode 100644 docs/en/api/datasets.transforms.rst delete mode 100644 docs/en/api/engine.hooks.rst delete mode 100644 docs/en/api/engine.optimizers.rst delete mode 100644 docs/en/api/engine.runner.rst delete mode 100644 docs/en/api/engine.schedulers.rst delete mode 100644 docs/en/api/evaluation.functional.rst delete mode 100644 docs/en/api/evaluation.metrics.rst delete mode 100644 docs/en/api/models.base_models.rst delete mode 100644 docs/en/api/models.data_preprocessors.rst delete mode 100644 docs/en/api/models.editors.rst delete mode 100644 docs/en/api/models.losses.rst delete mode 100644 docs/en/api/models.utils.rst delete mode 100644 docs/en/api/structures.rst delete mode 100644 docs/en/api/utils.rst delete mode 100644 docs/en/api/visualization.rst diff --git a/.gitignore b/.gitignore index 1991b64bde..eafffbfb23 100644 --- a/.gitignore +++ b/.gitignore @@ -70,7 +70,6 @@ docs/en/_tmp/ docs/zh_cn/_build/ docs/zh_cn/_tmp/ requirements/src/ -docs/en/api/generated # PyBuilder target/ diff --git a/.readthedocs.yml b/.readthedocs.yml index 5d508503d4..4978771764 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -1,6 +1,6 @@ version: 2 -formats: all +formats: [pdf, epub] python: version: 3.7 diff --git a/docs/en/3_model_zoo.md b/docs/en/3_model_zoo.md index 1ef3a61a83..78bdf30067 100644 --- a/docs/en/3_model_zoo.md +++ b/docs/en/3_model_zoo.md @@ -5,21 +5,21 @@ - Number of papers: 46 - ALGORITHM: 47 - Tasks: - - video interpolation - - image super-resolution - - inpainting - - image generation - image2image - - text2image + - unconditional gans - video super-resolution - - image2image translation - - 3d-aware generation - conditional gans - - image restoration + - inpainting - matting - - unconditional gans - - internal learning + - image super-resolution + - video interpolation + - image restoration - colorization + - internal learning + - text2image + - image generation + - 3d-aware generation + - image2image translation For supported datasets, see [datasets overview](dataset_zoo/0_overview.md). @@ -377,7 +377,7 @@ For supported datasets, see [datasets overview](dataset_zoo/0_overview.md). ## TOFlow (IJCV'2019) -- Tasks: video interpolation,video super-resolution +- Tasks: video super-resolution,video interpolation - Number of checkpoints: 6 - Number of configs: 6 - Number of papers: 1 diff --git a/docs/en/Makefile b/docs/en/Makefile index d4bb2cbb9e..5f9c6de4b5 100644 --- a/docs/en/Makefile +++ b/docs/en/Makefile @@ -17,4 +17,5 @@ help: # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile + rm -rf _build @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/en/_templates/classtemplate.rst b/docs/en/_templates/classtemplate.rst deleted file mode 100644 index 4f74842394..0000000000 --- a/docs/en/_templates/classtemplate.rst +++ /dev/null @@ -1,14 +0,0 @@ -.. role:: hidden - :class: hidden-section -.. currentmodule:: {{ module }} - - -{{ name | underline}} - -.. autoclass:: {{ name }} - :members: - - -.. - autogenerated from source/_templates/classtemplate.rst - note it does not have :inherited-members: diff --git a/docs/en/_templates/python/attribute.rst b/docs/en/_templates/python/attribute.rst new file mode 100644 index 0000000000..ebaba555ad --- /dev/null +++ b/docs/en/_templates/python/attribute.rst @@ -0,0 +1 @@ +{% extends "python/data.rst" %} diff --git a/docs/en/_templates/python/class.rst b/docs/en/_templates/python/class.rst new file mode 100644 index 0000000000..df5edffb62 --- /dev/null +++ b/docs/en/_templates/python/class.rst @@ -0,0 +1,58 @@ +{% if obj.display %} +.. py:{{ obj.type }}:: {{ obj.short_name }}{% if obj.args %}({{ obj.args }}){% endif %} +{% for (args, return_annotation) in obj.overloads %} + {{ " " * (obj.type | length) }} {{ obj.short_name }}{% if args %}({{ args }}){% endif %} +{% endfor %} + + + {% if obj.bases %} + {% if "show-inheritance" in autoapi_options %} + Bases: {% for base in obj.bases %}{{ base|link_objs }}{% if not loop.last %}, {% endif %}{% endfor %} + {% endif %} + + + {% if "show-inheritance-diagram" in autoapi_options and obj.bases != ["object"] %} + .. autoapi-inheritance-diagram:: {{ obj.obj["full_name"] }} + :parts: 1 + {% if "private-members" in autoapi_options %} + :private-bases: + {% endif %} + + {% endif %} + {% endif %} + {% if obj.docstring %} + {{ obj.docstring|indent(3) }} + {% endif %} + {% if "inherited-members" in autoapi_options %} + {% set visible_classes = obj.classes|selectattr("display")|list %} + {% else %} + {% set visible_classes = obj.classes|rejectattr("inherited")|selectattr("display")|list %} + {% endif %} + {% for klass in visible_classes %} + {{ klass.render()|indent(3) }} + {% endfor %} + {% if "inherited-members" in autoapi_options %} + {% set visible_properties = obj.properties|selectattr("display")|list %} + {% else %} + {% set visible_properties = obj.properties|rejectattr("inherited")|selectattr("display")|list %} + {% endif %} + {% for property in visible_properties %} + {{ property.render()|indent(3) }} + {% endfor %} + {% if "inherited-members" in autoapi_options %} + {% set visible_attributes = obj.attributes|selectattr("display")|list %} + {% else %} + {% set visible_attributes = obj.attributes|rejectattr("inherited")|selectattr("display")|list %} + {% endif %} + {% for attribute in visible_attributes %} + {{ attribute.render()|indent(3) }} + {% endfor %} + {% if "inherited-members" in autoapi_options %} + {% set visible_methods = obj.methods|selectattr("display")|list %} + {% else %} + {% set visible_methods = obj.methods|rejectattr("inherited")|selectattr("display")|list %} + {% endif %} + {% for method in visible_methods %} + {{ method.render()|indent(3) }} + {% endfor %} +{% endif %} diff --git a/docs/en/_templates/python/data.rst b/docs/en/_templates/python/data.rst new file mode 100644 index 0000000000..89417f1e15 --- /dev/null +++ b/docs/en/_templates/python/data.rst @@ -0,0 +1,32 @@ +{% if obj.display %} +.. py:{{ obj.type }}:: {{ obj.name }} + {%+ if obj.value is not none or obj.annotation is not none -%} + :annotation: + {%- if obj.annotation %} :{{ obj.annotation }} + {%- endif %} + {%- if obj.value is not none %} = {% + if obj.value is string and obj.value.splitlines()|count > 1 -%} + Multiline-String + + .. raw:: html + +
Show Value + + .. code-block:: text + :linenos: + + {{ obj.value|indent(width=8) }} + + .. raw:: html + +
+ + {%- else -%} + {{ obj.value|string|truncate(100) }} + {%- endif %} + {%- endif %} + {% endif %} + + + {{ obj.docstring|indent(3) }} +{% endif %} diff --git a/docs/en/_templates/python/exception.rst b/docs/en/_templates/python/exception.rst new file mode 100644 index 0000000000..92f3d38fd5 --- /dev/null +++ b/docs/en/_templates/python/exception.rst @@ -0,0 +1 @@ +{% extends "python/class.rst" %} diff --git a/docs/en/_templates/python/function.rst b/docs/en/_templates/python/function.rst new file mode 100644 index 0000000000..b00d5c2445 --- /dev/null +++ b/docs/en/_templates/python/function.rst @@ -0,0 +1,15 @@ +{% if obj.display %} +.. py:function:: {{ obj.short_name }}({{ obj.args }}){% if obj.return_annotation is not none %} -> {{ obj.return_annotation }}{% endif %} + +{% for (args, return_annotation) in obj.overloads %} + {{ obj.short_name }}({{ args }}){% if return_annotation is not none %} -> {{ return_annotation }}{% endif %} + +{% endfor %} + {% for property in obj.properties %} + :{{ property }}: + {% endfor %} + + {% if obj.docstring %} + {{ obj.docstring|indent(3) }} + {% endif %} +{% endif %} diff --git a/docs/en/_templates/python/method.rst b/docs/en/_templates/python/method.rst new file mode 100644 index 0000000000..723cb7bbe5 --- /dev/null +++ b/docs/en/_templates/python/method.rst @@ -0,0 +1,19 @@ +{%- if obj.display %} +.. py:method:: {{ obj.short_name }}({{ obj.args }}){% if obj.return_annotation is not none %} -> {{ obj.return_annotation }}{% endif %} + +{% for (args, return_annotation) in obj.overloads %} + {{ obj.short_name }}({{ args }}){% if return_annotation is not none %} -> {{ return_annotation }}{% endif %} + +{% endfor %} + {% if obj.properties %} + {% for property in obj.properties %} + :{{ property }}: + {% endfor %} + + {% else %} + + {% endif %} + {% if obj.docstring %} + {{ obj.docstring|indent(3) }} + {% endif %} +{% endif %} diff --git a/docs/en/_templates/python/module.rst b/docs/en/_templates/python/module.rst new file mode 100644 index 0000000000..d2714f6c9d --- /dev/null +++ b/docs/en/_templates/python/module.rst @@ -0,0 +1,114 @@ +{% if not obj.display %} +:orphan: + +{% endif %} +:py:mod:`{{ obj.name }}` +=========={{ "=" * obj.name|length }} + +.. py:module:: {{ obj.name }} + +{% if obj.docstring %} +.. autoapi-nested-parse:: + + {{ obj.docstring|indent(3) }} + +{% endif %} + +{% block subpackages %} +{% set visible_subpackages = obj.subpackages|selectattr("display")|list %} +{% if visible_subpackages %} +Subpackages +----------- +.. toctree:: + :titlesonly: + :maxdepth: 3 + +{% for subpackage in visible_subpackages %} + {{ subpackage.short_name }}/index.rst +{% endfor %} + + +{% endif %} +{% endblock %} +{% block submodules %} +{% set visible_submodules = obj.submodules|selectattr("display")|list %} +{% if visible_submodules %} +Submodules +---------- +.. toctree:: + :titlesonly: + :maxdepth: 1 + +{% for submodule in visible_submodules %} + {{ submodule.short_name }}/index.rst +{% endfor %} + + +{% endif %} +{% endblock %} +{% block content %} +{% if obj.all is not none %} +{% set visible_children = obj.children|selectattr("short_name", "in", obj.all)|list %} +{% elif obj.type is equalto("package") %} +{% set visible_children = obj.children|selectattr("display")|list %} +{% else %} +{% set visible_children = obj.children|selectattr("display")|rejectattr("imported")|list %} +{% endif %} +{% if visible_children %} +{{ obj.type|title }} Contents +{{ "-" * obj.type|length }}--------- + +{% set visible_classes = visible_children|selectattr("type", "equalto", "class")|list %} +{% set visible_functions = visible_children|selectattr("type", "equalto", "function")|list %} +{% set visible_attributes = visible_children|selectattr("type", "equalto", "data")|list %} +{% if "show-module-summary" in autoapi_options and (visible_classes or visible_functions) %} +{% block classes scoped %} +{% if visible_classes %} +Classes +~~~~~~~ + +.. autoapisummary:: + +{% for klass in visible_classes %} + {{ klass.id }} +{% endfor %} + + +{% endif %} +{% endblock %} + +{% block functions scoped %} +{% if visible_functions %} +Functions +~~~~~~~~~ + +.. autoapisummary:: + +{% for function in visible_functions %} + {{ function.id }} +{% endfor %} + + +{% endif %} +{% endblock %} + +{% block attributes scoped %} +{% if visible_attributes %} +Attributes +~~~~~~~~~~ + +.. autoapisummary:: + +{% for attribute in visible_attributes %} + {{ attribute.id }} +{% endfor %} + + +{% endif %} +{% endblock %} +{% endif %} +{% for obj_item in visible_children %} +{{ obj_item.render()|indent(0) }} +{% endfor %} +{% endif %} +{% endblock %} diff --git a/docs/en/_templates/python/package.rst b/docs/en/_templates/python/package.rst new file mode 100644 index 0000000000..fb9a64965e --- /dev/null +++ b/docs/en/_templates/python/package.rst @@ -0,0 +1 @@ +{% extends "python/module.rst" %} diff --git a/docs/en/_templates/python/property.rst b/docs/en/_templates/python/property.rst new file mode 100644 index 0000000000..70af24236f --- /dev/null +++ b/docs/en/_templates/python/property.rst @@ -0,0 +1,15 @@ +{%- if obj.display %} +.. py:property:: {{ obj.short_name }} + {% if obj.annotation %} + :type: {{ obj.annotation }} + {% endif %} + {% if obj.properties %} + {% for property in obj.properties %} + :{{ property }}: + {% endfor %} + {% endif %} + + {% if obj.docstring %} + {{ obj.docstring|indent(3) }} + {% endif %} +{% endif %} diff --git a/docs/en/api/apis.rst b/docs/en/api/apis.rst deleted file mode 100644 index 0e92c02b67..0000000000 --- a/docs/en/api/apis.rst +++ /dev/null @@ -1,27 +0,0 @@ -.. role:: hidden - :class: hidden-section - -mmedit.apis -=================================== - -.. currentmodule:: mmedit.apis - -APIS ----------------- -.. autosummary:: - :toctree: generated - :nosignatures: - - matting_inference - inpainting_inference - restoration_inference - restoration_video_inference - restoration_face_inference - video_interpolation_inference - - init_model - delete_cfg - set_random_seed - sample_conditional_model - sample_unconditional_model - sample_img2img_model diff --git a/docs/en/api/datasets.rst b/docs/en/api/datasets.rst deleted file mode 100644 index e0cfc25858..0000000000 --- a/docs/en/api/datasets.rst +++ /dev/null @@ -1,22 +0,0 @@ -.. role:: hidden - :class: hidden-section - -mmedit.datasets -=================================== - -.. currentmodule:: mmedit.datasets - -.. autosummary:: - :toctree: generated - :nosignatures: - :template: classtemplate.rst - - AdobeComp1kDataset - BasicImageDataset - BasicFramesDataset - BasicConditionalDataset - UnpairedImageDataset - PairedImageDataset - ImageNet - CIFAR10 - GrowScaleImgDataset diff --git a/docs/en/api/datasets.transforms.rst b/docs/en/api/datasets.transforms.rst deleted file mode 100644 index b3796c3b2a..0000000000 --- a/docs/en/api/datasets.transforms.rst +++ /dev/null @@ -1,72 +0,0 @@ -.. role:: hidden - :class: hidden-section - -mmedit.datasets.transforms -=================================== - -.. currentmodule:: mmedit.datasets.transforms - -.. autosummary:: - :toctree: generated - :nosignatures: - :template: classtemplate.rst - - BinarizeImage - Clip - ColorJitter - CopyValues - Crop - CropLike - DegradationsWithShuffle - LoadImageFromFile - LoadMask - Flip - FixedCrop - GenerateCoordinateAndCell - GenerateFacialHeatmap - GenerateFrameIndices - GenerateFrameIndiceswithPadding - GenerateSegmentIndices - GetMaskedImage - GetSpatialDiscountMask - MATLABLikeResize - MirrorSequence - ModCrop - Normalize - PackEditInputs - PairedRandomCrop - RandomAffine - RandomBlur - RandomDownSampling - RandomJPEGCompression - RandomMaskDilation - RandomNoise - RandomResize - RandomResizedCrop - RandomRotation - RandomTransposeHW - RandomVideoCompression - RescaleToZeroOne - Resize - SetValues - TemporalReverse - ToTensor - UnsharpMasking - CropAroundCenter - CropAroundFg - GenerateSeg - CropAroundUnknown - GenerateSoftSeg - FormatTrimap - TransformTrimap - GenerateTrimap - GenerateTrimapWithDistTransform - CompositeFg - RandomLoadResizeBg - MergeFgAndBg - PerturbBg - RandomJitter - LoadPairedImageFromFile - CenterCropLongEdge - RandomCropLongEdge - NumpyPad diff --git a/docs/en/api/engine.hooks.rst b/docs/en/api/engine.hooks.rst deleted file mode 100644 index 7f86d27383..0000000000 --- a/docs/en/api/engine.hooks.rst +++ /dev/null @@ -1,20 +0,0 @@ -.. role:: hidden - :class: hidden-section - -mmedit.engine.hooks -=================================== - -.. currentmodule:: mmedit.engine.hooks - -.. autosummary:: - :toctree: generated - :nosignatures: - :template: classtemplate.rst - - ReduceLRSchedulerHook - BasicVisualizationHook - GenVisualizationHook - ExponentialMovingAverageHook - GenIterTimerHook - PGGANFetchDataHook - PickleDataHook diff --git a/docs/en/api/engine.optimizers.rst b/docs/en/api/engine.optimizers.rst deleted file mode 100644 index 4425aeadef..0000000000 --- a/docs/en/api/engine.optimizers.rst +++ /dev/null @@ -1,16 +0,0 @@ -.. role:: hidden - :class: hidden-section - -mmedit.engine.optimizers -=================================== - -.. currentmodule:: mmedit.engine.optimizers - -.. autosummary:: - :toctree: generated - :nosignatures: - :template: classtemplate.rst - - MultiOptimWrapperConstructor - PGGANOptimWrapperConstructor - SinGANOptimWrapperConstructor diff --git a/docs/en/api/engine.runner.rst b/docs/en/api/engine.runner.rst deleted file mode 100644 index e8b71920f8..0000000000 --- a/docs/en/api/engine.runner.rst +++ /dev/null @@ -1,18 +0,0 @@ -.. role:: hidden - :class: hidden-section - -mmedit.engine.runner -=================================== - -.. currentmodule:: mmedit.engine.runner - -.. autosummary:: - :toctree: generated - :nosignatures: - :template: classtemplate.rst - - MultiValLoop - MultiTestLoop - GenTestLoop - GenValLoop - GenLogProcessor diff --git a/docs/en/api/engine.schedulers.rst b/docs/en/api/engine.schedulers.rst deleted file mode 100644 index 87b43e6873..0000000000 --- a/docs/en/api/engine.schedulers.rst +++ /dev/null @@ -1,15 +0,0 @@ -.. role:: hidden - :class: hidden-section - -mmedit.engine.schedulers -=================================== - -.. currentmodule:: mmedit.engine.schedulers - -.. autosummary:: - :toctree: generated - :nosignatures: - :template: classtemplate.rst - - LinearLrInterval - ReduceLR diff --git a/docs/en/api/evaluation.functional.rst b/docs/en/api/evaluation.functional.rst deleted file mode 100644 index 45ba9adb6b..0000000000 --- a/docs/en/api/evaluation.functional.rst +++ /dev/null @@ -1,24 +0,0 @@ -.. role:: hidden - :class: hidden-section - -mmedit.evaluation.functional -=================================== - -.. currentmodule:: mmedit.evaluation.functional - -.. autosummary:: - :toctree: generated - :nosignatures: - :template: classtemplate.rst - - InceptionV3 - -.. autosummary:: - :toctree: generated - :nosignatures: - - gauss_gradient - disable_gpu_fuser_on_pt19 - load_inception - prepare_vgg_feat - prepare_inception_feat diff --git a/docs/en/api/evaluation.metrics.rst b/docs/en/api/evaluation.metrics.rst deleted file mode 100644 index b2756a557a..0000000000 --- a/docs/en/api/evaluation.metrics.rst +++ /dev/null @@ -1,36 +0,0 @@ -.. role:: hidden - :class: hidden-section - -mmedit.evaluation.metrics -=================================== - -.. currentmodule:: mmedit.evaluation.metrics - -.. autosummary:: - :toctree: generated - :nosignatures: - :template: classtemplate.rst - - MAE - MSE - PSNR - SNR - SSIM - MultiScaleStructureSimilarity - FrechetInceptionDistance - TransFID - InceptionScore - TransIS - SAD - MattingMSE - ConnectivityError - GradientError - PerceptualPathLength - PrecisionAndRecall - SlicedWassersteinDistance - NIQE - Equivariance - psnr - snr - ssim - niqe diff --git a/docs/en/api/models.base_models.rst b/docs/en/api/models.base_models.rst deleted file mode 100644 index bbd7e74a02..0000000000 --- a/docs/en/api/models.base_models.rst +++ /dev/null @@ -1,23 +0,0 @@ -.. role:: hidden - :class: hidden-section - -mmedit.models.base_models -=================================== - -.. currentmodule:: mmedit.models.base_models - -.. autosummary:: - :toctree: generated - :nosignatures: - :template: classtemplate.rst - - BaseEditModel - BaseGAN - BaseConditionalGAN - BaseMattor - BasicInterpolator - BaseTranslationModel - OneStageInpaintor - TwoStageInpaintor - ExponentialMovingAverage - RampUpEMA diff --git a/docs/en/api/models.data_preprocessors.rst b/docs/en/api/models.data_preprocessors.rst deleted file mode 100644 index f3f333faf3..0000000000 --- a/docs/en/api/models.data_preprocessors.rst +++ /dev/null @@ -1,18 +0,0 @@ -.. role:: hidden - :class: hidden-section - -mmedit.models.data_preprocessors -=================================== - -.. currentmodule:: mmedit.models.data_preprocessors - -.. autosummary:: - :toctree: generated - :nosignatures: - :template: classtemplate.rst - - EditDataPreprocessor - MattorPreprocessor - split_batch - stack_batch - GenDataPreprocessor diff --git a/docs/en/api/models.editors.rst b/docs/en/api/models.editors.rst deleted file mode 100644 index e029ba8d48..0000000000 --- a/docs/en/api/models.editors.rst +++ /dev/null @@ -1,108 +0,0 @@ -.. role:: hidden - :class: hidden-section - -mmedit.models.editors -=================================== - -.. currentmodule:: mmedit.models.editors - -.. autosummary:: - :toctree: generated - :nosignatures: - :template: classtemplate.rst - - AOTEncoderDecoder - AOTBlockNeck - AOTInpaintor - ContextualAttentionNeck - ContextualAttentionModule - CAIN - CAINNet - DIM - DIC - DICNet - LightCNN - FeedbackBlock - FeedbackBlockHeatmapAttention - FeedbackBlockCustom - MaxFeature - FLAVR - FLAVRNet - ToFResBlock - TOFlowVFINet - TOFlowVSRNet - DeepFillEncoder - DeepFillEncoderDecoder - DeepFillDecoder - DeepFillRefiner - DeepFillv1Inpaintor - DeepFillv1Discriminators - EDSRNet - ESRGAN - DepthwiseIndexBlock - HolisticIndexBlock - IndexNet - IndexNetEncoder - IndexedUpsample - IndexNetDecoder - GCA - GLEncoderDecoder - GLEncoder - GLDecoder - GLDilationNeck - PartialConv2d - PConvEncoderDecoder - PConvEncoder - PConvDecoder - PConvInpaintor - MaskConvModule - RRDBNet - SRCNNNet - RRDBNet - RealESRGAN - UNetDiscriminatorWithSpectralNorm - EDVR - EDVRNet - TDAN - TDANNet - BasicVSR - BasicVSRNet - BasicVSRPlusPlusNet - IconVSRNet - RealBasicVSR - RealBasicVSRNet - SRGAN - MaxFeature - ModifiedVGG - MSRResNet - RDNNet - LTE - TTSR - TTSRNet - TTSRDiscriminator - TTSRNet - SearchTransformer - GLEANStyleGANv2 - LIIF - MLPRefiner - PlainRefiner - PlainDecoder - FBAResnetDilated - FBADecoder - WGANGP - CycleGAN - SAGAN - LSGAN - GGAN - Pix2Pix - StyleGAN1 - StyleGAN2 - StyleGAN3 - BigGAN - DCGAN - ProgressiveGrowingGAN - SinGAN - IDLossModel - PESinGAN - MSPIEStyleGAN2 - StyleGAN3Generator diff --git a/docs/en/api/models.losses.rst b/docs/en/api/models.losses.rst deleted file mode 100644 index 292d9eb924..0000000000 --- a/docs/en/api/models.losses.rst +++ /dev/null @@ -1,44 +0,0 @@ -.. role:: hidden - :class: hidden-section - -mmedit.models.losses -=================================== - -.. currentmodule:: mmedit.models.losses - -.. autosummary:: - :toctree: generated - :nosignatures: - :template: classtemplate.rst - - L1Loss - MSELoss - CharbonnierLoss - L1CompositionLoss - MSECompositionLoss - CharbonnierCompLoss - GANLoss - GaussianBlur - GradientPenaltyLoss - PerceptualLoss - PerceptualVGG - reduce_loss - mask_reduce_loss - DiscShiftLoss - MaskedTVLoss - GradientLoss - TransferalPerceptualLoss - LightCNNFeatureLoss - gradient_penalty_loss - r1_gradient_penalty_loss - gen_path_regularizer - FaceIdLoss - CLIPLoss - CLIPLossComps - DiscShiftLossComps - FaceIdLossComps - GANLossComps - GeneratorPathRegularizerComps - GradientPenaltyLossComps - R1GradientPenaltyComps - disc_shift_loss diff --git a/docs/en/api/models.utils.rst b/docs/en/api/models.utils.rst deleted file mode 100644 index 6b075c2838..0000000000 --- a/docs/en/api/models.utils.rst +++ /dev/null @@ -1,25 +0,0 @@ -.. role:: hidden - :class: hidden-section - -mmedit.models.utils -=================================== - -.. currentmodule:: mmedit.models.utils - -.. autosummary:: - :toctree: generated - :nosignatures: - - default_init_weights - make_layer - flow_warp - generation_init_weights - set_requires_grad - extract_bbox_patch - extract_around_bbox - get_unknown_tensor - noise_sample_fn - label_sample_fn - get_valid_num_batches - get_valid_noise_size - get_module_device diff --git a/docs/en/api/structures.rst b/docs/en/api/structures.rst deleted file mode 100644 index dec2284c8b..0000000000 --- a/docs/en/api/structures.rst +++ /dev/null @@ -1,15 +0,0 @@ -.. role:: hidden - :class: hidden-section - -mmedit.structures -=================================== - -.. currentmodule:: mmedit.structures - -.. autosummary:: - :toctree: generated - :nosignatures: - :template: classtemplate.rst - - EditDataSample - PixelData diff --git a/docs/en/api/utils.rst b/docs/en/api/utils.rst deleted file mode 100644 index 448f3e70ec..0000000000 --- a/docs/en/api/utils.rst +++ /dev/null @@ -1,28 +0,0 @@ -.. role:: hidden - :class: hidden-section - -mmedit.utils -=================================== - -.. currentmodule:: mmedit.utils - -.. autosummary:: - :toctree: generated - :nosignatures: - - modify_args - print_colored_log - register_all_modules - download_from_url - get_sampler - tensor2img - random_choose_unknown - add_gaussian_noise - adjust_gamma - make_coord - bbox2mask - brush_stroke_mask - get_irregular_mask - random_bbox - reorder_image - to_numpy diff --git a/docs/en/api/visualization.rst b/docs/en/api/visualization.rst deleted file mode 100644 index 50cf94eb04..0000000000 --- a/docs/en/api/visualization.rst +++ /dev/null @@ -1,19 +0,0 @@ -.. role:: hidden - :class: hidden-section - -mmedit.visualization -=================================== - -.. currentmodule:: mmedit.visualization - -.. autosummary:: - :toctree: generated - :nosignatures: - :template: classtemplate.rst - - ConcatImageVisualizer - GenVisualizer - GenVisBackend - PaviGenVisBackend - TensorboardGenVisBackend - WandbGenVisBackend diff --git a/docs/en/conf.py b/docs/en/conf.py index 54cd1f3da3..fc8a5c89d7 100644 --- a/docs/en/conf.py +++ b/docs/en/conf.py @@ -31,23 +31,44 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.autosummary', 'sphinx.ext.intersphinx', 'sphinx.ext.napoleon', 'sphinx.ext.viewcode', 'sphinx.ext.autosectionlabel', 'sphinx_markdown_tables', - 'myst_parser', 'sphinx_copybutton', - 'sphinx.ext.autodoc.typehints', 'sphinx_tabs.tabs', - 'notfound.extension', + 'myst_parser', ] +extensions.append('notfound.extension') # enable customizing not-found page + +extensions.append('autoapi.extension') +autoapi_type = 'python' +autoapi_dirs = ['../../mmedit'] +autoapi_add_toctree_entry = False +autoapi_template_dir = '_templates' +# autoapi_options = ['members', 'undoc-members', 'show-module-summary'] + +# # Core library for html generation from docstrings +# extensions.append('sphinx.ext.autodoc') +# extensions.append('sphinx.ext.autodoc.typehints') +# # Enable 'expensive' imports for sphinx_autodoc_typehints +# set_type_checking_flag = True +# # Sphinx-native method. Not as good as sphinx_autodoc_typehints +# autodoc_typehints = "description" + +# extensions.append('sphinx.ext.autosummary') # Create neat summary tables +# autosummary_generate = True # Turn on sphinx.ext.autosummary +# # Add __init__ doc (ie. params) to class summaries +# autoclass_content = 'both' +# autodoc_skip_member = [] +# # If no docstring, inherit from base class +# autodoc_inherit_docstrings = True + autodoc_mock_imports = [ - 'mmedit.version', 'mmcv.ops.ModulatedDeformConv2d', - 'mmcv.ops.modulated_deform_conv2d', 'mmcv._ext' + 'mmedit.version', 'mmcv._ext', 'mmcv.ops.ModulatedDeformConv2d', + 'mmcv.ops.modulated_deform_conv2d', 'clip', 'resize_right', 'pandas' ] source_suffix = { @@ -55,6 +76,11 @@ '.md': 'markdown', } +# # Remove 'view source code' from top of page (for html, not python) +# html_show_sourcelink = False +# nbsphinx_allow_errors = True # Continue through Jupyter errors +# add_module_names = False # Remove namespaces from class/method signatures + # Ignore >>> when copying code copybutton_prompt_text = r'>>> |\.\.\. ' copybutton_prompt_is_regexp = True @@ -126,5 +152,12 @@ def builder_inited_handler(app): subprocess.run(['python', './.dev_scripts/update_model_zoo.py']) +def skip_member(app, what, name, obj, skip, options): + if what == 'package' or what == 'module': + skip = True + return skip + + def setup(app): app.connect('builder-inited', builder_inited_handler) + app.connect('autoapi-skip-member', skip_member) diff --git a/docs/en/index.rst b/docs/en/index.rst index e60fbaefc0..8fdbd66ed8 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -63,6 +63,29 @@ Documentation advanced_guides/3_transforms.md advanced_guides/4_losses.md +.. toctree:: + :maxdepth: 2 + :caption: API Reference + + mmedit.apis.inferencers + mmedit.structures + mmedit.datasets + mmedit.datasets.transforms + mmedit.evaluation + mmedit.visualization + mmedit.engine.hooks + mmedit.engine.logging + mmedit.engine.optimizers + mmedit.engine.runner + mmedit.engine.schedulers + mmedit.models.base_archs + mmedit.models.base_models + mmedit.models.losses + mmedit.models.data_preprocessors + mmedit.models.utils + mmedit.models.editors + mmedit.utils + .. toctree:: :maxdepth: 1 @@ -99,28 +122,6 @@ Documentation migration/9_visualization.md migration/10_amp.md -.. toctree:: - :maxdepth: 2 - :caption: API Reference - - mmedit.apis - mmedit.datasets - mmedit.datasets.transforms - mmedit.engine.hooks - mmedit.engine.optimizers - mmedit.engine.runner - mmedit.engine.schedulers - mmedit.evaluation.metrics - mmedit.evaluation.functional - mmedit.models.base_models - mmedit.models.data_preprocessors - mmedit.models.losses - mmedit.models.utils - mmedit.models.editors - mmedit.structures - mmedit.visualization - mmedit.utils - .. toctree:: :maxdepth: 1 diff --git a/requirements/docs.txt b/requirements/docs.txt index 2e5d336226..486729d482 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -3,8 +3,8 @@ modelindex myst_parser -e git+https://github.com/open-mmlab/pytorch_sphinx_theme.git#egg=pytorch_sphinx_theme sphinx==4.5.0 +sphinx-autoapi sphinx-copybutton sphinx-notfound-page sphinx-tabs sphinx_markdown_tables -tabulate diff --git a/requirements/readthedocs.txt b/requirements/readthedocs.txt index 8297c02f27..17e5a5c8ea 100644 --- a/requirements/readthedocs.txt +++ b/requirements/readthedocs.txt @@ -1,10 +1,13 @@ lmdb +lpips mmcv>=2.0.0rc1 +mmdet >= 3.0.0rc2 mmengine prettytable Pygments regex scikit-image +tabulate titlecase torch torchvision From 9af4e3102ec0f25ead43d4957876d1f52f125c4e Mon Sep 17 00:00:00 2001 From: Yanhong Zeng Date: Mon, 12 Dec 2022 20:50:15 +0800 Subject: [PATCH 07/44] [Fix] fix documentation link checker (#1522) fix incorrect command --- .dev_scripts/README.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/.dev_scripts/README.md b/.dev_scripts/README.md index deb066b41f..d599a1633a 100644 --- a/.dev_scripts/README.md +++ b/.dev_scripts/README.md @@ -1,7 +1,7 @@ # Scripts for developing MMEditing -- [1. Check UT](#check-ut) -- [2. Test all the models](#test-benchmark) +- [1. Check UT](#1-check-ut) +- [2. Test all the models](#2-test-all-the-models) - [3. Train all the models](#3-train-all-the-models) - [3.1 Train for debugging](#31-train-for-debugging) - [3.2 Train for FP32](#32-train-for-fp32) @@ -9,7 +9,9 @@ - [4. Monitor your training](#4-monitor-your-training) - [5. Train with a list of models](#5-train-with-a-list-of-models) - [6. Train with skipping a list of models](#6-train-with-skipping-a-list-of-models) -- [7. Automatically check links](#automatically-check-links) +- [7. Train failed or canceled jobs](#7-train-failed-or-canceled-jobs) +- [8. Deterministic training](#8-deterministic-training) +- [9. Automatically check links](#9-automatically-check-links) ## 1. Check UT @@ -224,10 +226,10 @@ python .dev_scripts/train_benchmark.py mm_lol --job-name xzn --models pix2pix -- Use the following script to check whether the links in documentations are valid: ```shell -python3 .github/scripts/doc_link_checker.py --target docs/zh_cn -python3 .github/scripts/doc_link_checker.py --target README_zh-CN.md -python3 .github/scripts/doc_link_checker.py --target docs/en -python3 .github/scripts/doc_link_checker.py --target README.md +python .dev_scripts/doc_link_checker.py --target docs/zh_cn +python .dev_scripts/doc_link_checker.py --target README_zh-CN.md +python .dev_scripts/doc_link_checker.py --target docs/en +python .dev_scripts/doc_link_checker.py --target README.md ``` You can specify the `--target` by a file or a directory. From 179366adb81d630c5e1a20ed9c411d6cdbd96c61 Mon Sep 17 00:00:00 2001 From: Yanhong Zeng Date: Mon, 12 Dec 2022 21:20:40 +0800 Subject: [PATCH 08/44] [Doc] improve the structure of documentation (#1521) refactor doc structure --- README.md | 15 +- README_zh-CN.md | 8 +- docs/en/3_model_zoo.md | 22 +- docs/en/advanced_guides/data_flow.md | 5 + docs/en/advanced_guides/data_preprocessor.md | 5 + .../{2_dataset.md => dataset.md} | 0 docs/en/advanced_guides/evaluator.md | 5 + .../{4_losses.md => losses.md} | 0 .../{1_models.md => models.md} | 4 +- docs/en/advanced_guides/structures.md | 5 + .../{3_transforms.md => transforms.md} | 2 +- .../3_changelog.md => community/changelog.md} | 0 .../contribution_guide.md} | 0 .../2_projects.md => community/projects.md} | 0 .../install.md} | 53 +-- .../overview.md} | 8 +- docs/en/get_started/quick_run.md | 48 +++ docs/en/index.rst | 95 +++-- docs/en/migration/{10_amp.md => amp.md} | 0 docs/en/migration/{6_data.md => data.md} | 2 +- ...tributed_train.md => distributed_train.md} | 0 .../{4_eval_test.md => eval_test.md} | 2 +- docs/en/migration/{3_models.md => models.md} | 2 +- .../{8_optimizers.md => optimizers.md} | 0 .../migration/{1_overview.md => overview.md} | 4 +- .../en/migration/{2_runtime.md => runtime.md} | 0 .../migration/{5_schedule.md => schedule.md} | 0 .../{9_visualization.md => visualization.md} | 2 +- docs/en/model_zoo.md | 400 ++++++++++++++++++ ..._switch_language.md => switch_language.md} | 0 .../en/user_guides/{1_config.md => config.md} | 0 ..._dataset_prepare.md => dataset_prepare.md} | 2 +- .../en/user_guides/{7_deploy.md => deploy.md} | 0 .../en/{notes/4_faq.md => user_guides/faq.md} | 4 +- .../{3_inference.md => inference.md} | 0 .../user_guides/{8_metrics.md => metrics.md} | 6 +- .../{4_train_test.md => train_test.md} | 4 +- .../{6_useful_tools.md => useful_tools.md} | 2 +- .../{5_visualization.md => visualization.md} | 0 39 files changed, 566 insertions(+), 139 deletions(-) create mode 100644 docs/en/advanced_guides/data_flow.md create mode 100644 docs/en/advanced_guides/data_preprocessor.md rename docs/en/advanced_guides/{2_dataset.md => dataset.md} (100%) create mode 100644 docs/en/advanced_guides/evaluator.md rename docs/en/advanced_guides/{4_losses.md => losses.md} (100%) rename docs/en/advanced_guides/{1_models.md => models.md} (99%) create mode 100644 docs/en/advanced_guides/structures.md rename docs/en/advanced_guides/{3_transforms.md => transforms.md} (99%) rename docs/en/{notes/3_changelog.md => community/changelog.md} (100%) rename docs/en/{notes/1_contribution_guide.md => community/contribution_guide.md} (100%) rename docs/en/{notes/2_projects.md => community/projects.md} (100%) rename docs/en/{2_get_started.md => get_started/install.md} (76%) rename docs/en/{1_overview.md => get_started/overview.md} (94%) create mode 100644 docs/en/get_started/quick_run.md rename docs/en/migration/{10_amp.md => amp.md} (100%) rename docs/en/migration/{6_data.md => data.md} (99%) rename docs/en/migration/{7_distributed_train.md => distributed_train.md} (100%) rename docs/en/migration/{4_eval_test.md => eval_test.md} (97%) rename docs/en/migration/{3_models.md => models.md} (99%) rename docs/en/migration/{8_optimizers.md => optimizers.md} (100%) rename docs/en/migration/{1_overview.md => overview.md} (94%) rename docs/en/migration/{2_runtime.md => runtime.md} (100%) rename docs/en/migration/{5_schedule.md => schedule.md} (100%) rename docs/en/migration/{9_visualization.md => visualization.md} (95%) create mode 100644 docs/en/model_zoo.md rename docs/en/{5_switch_language.md => switch_language.md} (100%) rename docs/en/user_guides/{1_config.md => config.md} (100%) rename docs/en/user_guides/{2_dataset_prepare.md => dataset_prepare.md} (96%) rename docs/en/user_guides/{7_deploy.md => deploy.md} (100%) rename docs/en/{notes/4_faq.md => user_guides/faq.md} (95%) rename docs/en/user_guides/{3_inference.md => inference.md} (100%) rename docs/en/user_guides/{8_metrics.md => metrics.md} (98%) rename docs/en/user_guides/{4_train_test.md => train_test.md} (97%) rename docs/en/user_guides/{6_useful_tools.md => useful_tools.md} (90%) rename docs/en/user_guides/{5_visualization.md => visualization.md} (100%) diff --git a/README.md b/README.md index 5eaa62b138..349e4a192d 100644 --- a/README.md +++ b/README.md @@ -29,13 +29,13 @@ [📘Documentation](https://mmediting.readthedocs.io/en/1.x/) | [🛠️Installation](https://mmediting.readthedocs.io/en/1.x/2_get_started.html#installation) | [👀Model Zoo](https://mmediting.readthedocs.io/en/1.x/3_model_zoo.html) | -[🆕Update News](docs/en/notes/3_changelog.md) | +[🆕Update News](docs/en/community/changelog.md) | [🚀Ongoing Projects](https://github.com/open-mmlab/mmediting/projects) | [🤔Reporting Issues](https://github.com/open-mmlab/mmediting/issues) - +English | [简体中文](README_zh-CN.md) -English | [简体中文](/README_zh-CN.md) + ## Introduction @@ -125,7 +125,7 @@ Find more new features in [1.x branch](https://github.com/open-mmlab/mmediting/t - Fix FLAVR register. - Fix the number of channels in RDB. -Please refer to [changelog.md](docs/en/changelog.md) for details and release history. +Please refer to [changelog.md](docs/en/community/changelog.md) for details and release history. ## Installation @@ -153,11 +153,11 @@ cd mmediting pip3 install -e . ``` -Please refer to [get_started.md](docs/en/2_get_started.md) for more detailed instruction. +Please refer to [installation](docs/en/get_started/install.md) for more detailed instruction. ## Getting Started -Please see [get_started.md](docs/en/2_get_started.md) and [inference.md](docs/en/user_guides/3_inference.md) for the basic usage of MMEditing. +Please see [quick run](docs/en/get_started/quick_run.md) and [inference](docs/en/user_guides/inference.md) for the basic usage of MMEditing. ## Model Zoo @@ -307,7 +307,8 @@ If MMEditing is helpful to your research, please cite it as below. ## License -This project is released under the [Apache 2.0 license](LICENSE). Please refer to [LICENSES.md](LICENSES.md) for the careful check, if you are using our code for commercial matters. +This project is released under the [Apache 2.0 license](LICENSE). +Please refer to [LICENSES](LICENSE) for the careful check, if you are using our code for commercial matters. ## Projects in OpenMMLab 2.0 diff --git a/README_zh-CN.md b/README_zh-CN.md index 016b0c1bcb..8c87457ffd 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -29,13 +29,13 @@ [📘使用文档](https://mmediting.readthedocs.io/zh_CN/1.x/) | [🛠️安装教程](https://mmediting.readthedocs.io/zh_CN/1.x/2_get_started.htmll) | [👀模型库](https://mmediting.readthedocs.io/zh_CN/1.x/3_model_zoo.html) | -[🆕更新记录](docs/zh_cn/notes/3_changelog.md) | +[🆕更新记录](docs/zh_cn/community/changelog.md) | [🚀进行中的项目](https://github.com/open-mmlab/mmediting/projects) | [🤔提出问题](https://github.com/open-mmlab/mmediting/issues) - +[English](README.md) | 简体中文 -[English](/README.md) | 简体中文 + ## 介绍 @@ -124,7 +124,7 @@ MMEditing 缜密地设计新的框架并将其精心实现,希望能够为您 - 修复 FLAVR 的注册问题。 - 修正 RDB 模型中的通道数。 -如果像了解更多版本更新细节和历史信息,请阅读[更新日志](docs/en/changelog.md)。 +如果像了解更多版本更新细节和历史信息,请阅读[更新日志](docs/en/community/changelog.md)。 ## 安装 diff --git a/docs/en/3_model_zoo.md b/docs/en/3_model_zoo.md index 78bdf30067..138738c31a 100644 --- a/docs/en/3_model_zoo.md +++ b/docs/en/3_model_zoo.md @@ -5,21 +5,21 @@ - Number of papers: 46 - ALGORITHM: 47 - Tasks: - - image2image - - unconditional gans - - video super-resolution - conditional gans - - inpainting + - image2image translation - matting - - image super-resolution - - video interpolation - image restoration - - colorization - - internal learning + - inpainting - text2image - - image generation + - video interpolation + - image2image + - unconditional gans + - colorization - 3d-aware generation - - image2image translation + - image generation + - image super-resolution + - internal learning + - video super-resolution For supported datasets, see [datasets overview](dataset_zoo/0_overview.md). @@ -113,7 +113,7 @@ For supported datasets, see [datasets overview](dataset_zoo/0_overview.md). ## Disco Diffusion -- Tasks: image2image,text2image +- Tasks: text2image,image2image - Number of checkpoints: 2 - Number of configs: 0 - Number of papers: 1 diff --git a/docs/en/advanced_guides/data_flow.md b/docs/en/advanced_guides/data_flow.md new file mode 100644 index 0000000000..8e52420ef7 --- /dev/null +++ b/docs/en/advanced_guides/data_flow.md @@ -0,0 +1,5 @@ +# Data Flow in MMEditing \[Coming Soon!\] + +We're improving this documentation. Don't hesitate to join us! + +[Make a pull request](https://github.com/open-mmlab/mmediting/compare) or [discuss with us](https://github.com/open-mmlab/mmediting/discussions/1429)! diff --git a/docs/en/advanced_guides/data_preprocessor.md b/docs/en/advanced_guides/data_preprocessor.md new file mode 100644 index 0000000000..3b36403d19 --- /dev/null +++ b/docs/en/advanced_guides/data_preprocessor.md @@ -0,0 +1,5 @@ +# Data Pre-Processor \[Coming Soon!\] + +We're improving this documentation. Don't hesitate to join us! + +[Make a pull request](https://github.com/open-mmlab/mmediting/compare) or [discuss with us](https://github.com/open-mmlab/mmediting/discussions/1429)! diff --git a/docs/en/advanced_guides/2_dataset.md b/docs/en/advanced_guides/dataset.md similarity index 100% rename from docs/en/advanced_guides/2_dataset.md rename to docs/en/advanced_guides/dataset.md diff --git a/docs/en/advanced_guides/evaluator.md b/docs/en/advanced_guides/evaluator.md new file mode 100644 index 0000000000..ce5e922ccf --- /dev/null +++ b/docs/en/advanced_guides/evaluator.md @@ -0,0 +1,5 @@ +# Evaluator \[Coming Soon!\] + +We're improving this documentation. Don't hesitate to join us! + +[Make a pull request](https://github.com/open-mmlab/mmediting/compare) or [discuss with us](https://github.com/open-mmlab/mmediting/discussions/1429)! diff --git a/docs/en/advanced_guides/4_losses.md b/docs/en/advanced_guides/losses.md similarity index 100% rename from docs/en/advanced_guides/4_losses.md rename to docs/en/advanced_guides/losses.md diff --git a/docs/en/advanced_guides/1_models.md b/docs/en/advanced_guides/models.md similarity index 99% rename from docs/en/advanced_guides/1_models.md rename to docs/en/advanced_guides/models.md index 0d5e9cefdb..a29b80f3a8 100644 --- a/docs/en/advanced_guides/1_models.md +++ b/docs/en/advanced_guides/models.md @@ -406,7 +406,7 @@ After implementing the network architecture and the forward loop of SRCNN, now we can create a new file `configs/srcnn/srcnn_x4k915_g1_1000k_div2k.py` to set the configurations needed by training SRCNN. -In the configuration file, we need to specify the parameters of our model, `class BaseEditModel`, including the generator network architecture, loss function, additional training and testing configuration, and data preprocessor of input tensors. Please refer to the [Introduction to the loss in MMEditing](./4_losses.md) for more details of losses in MMEditing. +In the configuration file, we need to specify the parameters of our model, `class BaseEditModel`, including the generator network architecture, loss function, additional training and testing configuration, and data preprocessor of input tensors. Please refer to the [Introduction to the loss in MMEditing](./losses.md) for more details of losses in MMEditing. ```python # model settings @@ -733,7 +733,7 @@ model = dict( out_channels=1)) ``` -We also need to specify the training dataloader and testing dataloader according to [create your own dataloader](2_dataset.md). +We also need to specify the training dataloader and testing dataloader according to [create your own dataloader](dataset.md). Finally we can start training our own model by: ```python diff --git a/docs/en/advanced_guides/structures.md b/docs/en/advanced_guides/structures.md new file mode 100644 index 0000000000..7bb959fedf --- /dev/null +++ b/docs/en/advanced_guides/structures.md @@ -0,0 +1,5 @@ +# Data Structure in MMEditing \[Coming Soon!\] + +We're improving this documentation. Don't hesitate to join us! + +[Make a pull request](https://github.com/open-mmlab/mmediting/compare) or [discuss with us](https://github.com/open-mmlab/mmediting/discussions/1429)! diff --git a/docs/en/advanced_guides/3_transforms.md b/docs/en/advanced_guides/transforms.md similarity index 99% rename from docs/en/advanced_guides/3_transforms.md rename to docs/en/advanced_guides/transforms.md index 565a3499ab..6fdfc7061a 100644 --- a/docs/en/advanced_guides/3_transforms.md +++ b/docs/en/advanced_guides/transforms.md @@ -1,4 +1,4 @@ -# Design Your Own Data Pipelines +# Design Your Own Data Transforms In this tutorial, we introduce the design of transforms pipeline in MMEditing. diff --git a/docs/en/notes/3_changelog.md b/docs/en/community/changelog.md similarity index 100% rename from docs/en/notes/3_changelog.md rename to docs/en/community/changelog.md diff --git a/docs/en/notes/1_contribution_guide.md b/docs/en/community/contribution_guide.md similarity index 100% rename from docs/en/notes/1_contribution_guide.md rename to docs/en/community/contribution_guide.md diff --git a/docs/en/notes/2_projects.md b/docs/en/community/projects.md similarity index 100% rename from docs/en/notes/2_projects.md rename to docs/en/community/projects.md diff --git a/docs/en/2_get_started.md b/docs/en/get_started/install.md similarity index 76% rename from docs/en/2_get_started.md rename to docs/en/get_started/install.md index 3c7edcc92e..7059f26a99 100644 --- a/docs/en/2_get_started.md +++ b/docs/en/get_started/install.md @@ -1,4 +1,4 @@ -# Get Started: Install and Run MMEditing +# Installation In this section, you will know about: @@ -156,7 +156,7 @@ docker run --gpus all --shm-size=8g -it -v {DATA_DIR}:/mmediting/data mmediting #### Trouble shooting -If you have some issues during the installation, please first view the [FAQ](notes/4_faq.md) page. +If you have some issues during the installation, please first view the [FAQ](../user_guides/faq.md) page. You may [open an issue](https://github.com/open-mmlab/mmediting/issues/new/choose) on GitHub if no solution is found. ### Developing with multiple MMEditing versions @@ -168,52 +168,3 @@ To use the default MMEditing installed in the environment rather than that you a ```shell PYTHONPATH="$(dirname $0)/..":$PYTHONPATH ``` - -## Quick run - -After installing MMEditing successfully, now you are able to play with MMEditing! - -To synthesize an image of a church, you only need several lines of codes by MMEditing! - -```python -from mmedit.apis import init_model, sample_unconditional_model - -config_file = 'configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-church-256x256.py' -# you can download this checkpoint in advance and use a local file path. -checkpoint_file = 'https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-church-config-f-official_20210327_172657-1d42b7d1.pth' -device = 'cuda:0' -# init a generative model -model = init_model(config_file, checkpoint_file, device=device) -# sample images -fake_imgs = sample_unconditional_model(model, 4) -``` - -Or you can just run the following command. - -```bash -python demo/unconditional_demo.py \ -configs/styleganv2/stylegan2_c2_lsun-church_256_b4x8_800k.py \ -https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-church-config-f-official_20210327_172657-1d42b7d1.pth - -``` - -You will see a new image `unconditional_samples.png` in folder `work_dirs/demos/`, which contained generated samples. - -What's more, if you want to make these photos much more clear, -you only need several lines of codes for image super-resolution by MMEditing! - -```python -import mmcv -from mmedit.apis import init_model, restoration_inference -from mmedit.engine.misc import tensor2img - -config = 'configs/esrgan/esrgan_x4c64b23g32_1xb16-400k_div2k.py' -checkpoint = 'https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth' -img_path = 'tests/data/image/lq/baboon_x4.png' -model = init_model(config, checkpoint) -output = restoration_inference(model, img_path) -output = tensor2img(output) -mmcv.imwrite(output, 'output.png') -``` - -Now, you can check your fancy photos in `output.png`. diff --git a/docs/en/1_overview.md b/docs/en/get_started/overview.md similarity index 94% rename from docs/en/1_overview.md rename to docs/en/get_started/overview.md index b1c7f51472..40a9781b91 100644 --- a/docs/en/1_overview.md +++ b/docs/en/get_started/overview.md @@ -78,7 +78,7 @@ MMEditing supports various applications, including: - **New Modular Design for Flexible Combination:** - We decompose the editing framework into different modules and one can easily construct a customized editor framework by combining different modules. Specifically, a new design for complex loss modules is proposed for customizing the links between modules, which can achieve flexible combinations among different modules.(Tutorial for [losses](advanced_guides/4_losses.md)) + We decompose the editing framework into different modules and one can easily construct a customized editor framework by combining different modules. Specifically, a new design for complex loss modules is proposed for customizing the links between modules, which can achieve flexible combinations among different modules.(Tutorial for [losses](../advanced_guides/losses.md)) - **Efficient Distributed Training:** @@ -86,12 +86,12 @@ MMEditing supports various applications, including: ## Get started -For installation instructions, please see [get_started](2_get_started.md). +For installation instructions, please see [Installation](install.md). ## User guides -For beginners, we suggest learning the basic usage of MMEditing from [user_guides](user_guides/1_config.md). +For beginners, we suggest learning the basic usage of MMEditing from [user_guides](../user_guides/config.md). ### Advanced guides -For users who are familiar with MMEditing, you may want to learn the design of MMEditing, as well as how to extend the repo, how to use multiple repos and other advanced usages, please refer to [advanced_guides](advanced_guides/1_models.md). +For users who are familiar with MMEditing, you may want to learn the design of MMEditing, as well as how to extend the repo, how to use multiple repos and other advanced usages, please refer to [advanced_guides](../advanced_guides/models.md). diff --git a/docs/en/get_started/quick_run.md b/docs/en/get_started/quick_run.md new file mode 100644 index 0000000000..e032430f49 --- /dev/null +++ b/docs/en/get_started/quick_run.md @@ -0,0 +1,48 @@ +# Quick Run + +After installing MMEditing successfully, now you are able to play with MMEditing! + +To synthesize an image of a church, you only need several lines of codes by MMEditing! + +```python +from mmedit.apis import init_model, sample_unconditional_model + +config_file = 'configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-church-256x256.py' +# you can download this checkpoint in advance and use a local file path. +checkpoint_file = 'https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-church-config-f-official_20210327_172657-1d42b7d1.pth' +device = 'cuda:0' +# init a generative model +model = init_model(config_file, checkpoint_file, device=device) +# sample images +fake_imgs = sample_unconditional_model(model, 4) +``` + +Or you can just run the following command. + +```bash +python demo/unconditional_demo.py \ +configs/styleganv2/stylegan2_c2_lsun-church_256_b4x8_800k.py \ +https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-church-config-f-official_20210327_172657-1d42b7d1.pth + +``` + +You will see a new image `unconditional_samples.png` in folder `work_dirs/demos/`, which contained generated samples. + +What's more, if you want to make these photos much more clear, +you only need several lines of codes for image super-resolution by MMEditing! + +```python +import mmcv +from mmedit.apis import init_model, restoration_inference +from mmedit.engine.misc import tensor2img + +config = 'configs/esrgan/esrgan_x4c64b23g32_1xb16-400k_div2k.py' +checkpoint = 'https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth' +img_path = 'tests/data/image/lq/baboon_x4.png' +model = init_model(config, checkpoint) +output = restoration_inference(model, img_path) +output = tensor2img(output) +mmcv.imwrite(output, 'output.png') +``` + +Now, you can check your fancy photos in `output.png`. diff --git a/docs/en/index.rst b/docs/en/index.rst index 8fdbd66ed8..2570003ec1 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -34,34 +34,52 @@ Codes are available on `GitHub `_. Documentation ============= +.. toctree:: + :maxdepth: 1 + :caption: Community + + community/contribution_guide.md + community/projects.md + community/changelog.md + + .. toctree:: :maxdepth: 1 :caption: Get Started - 1_overview.md - 2_get_started.md + get_started/overview.md + get_started/install.md + get_started/quick_run.md + .. toctree:: :maxdepth: 1 :caption: User Guides - user_guides/1_config.md - user_guides/2_dataset_prepare.md - user_guides/3_inference.md - user_guides/4_train_test.md - user_guides/5_visualization.md - user_guides/6_useful_tools.md - user_guides/7_deploy.md - user_guides/8_metrics.md + user_guides/config.md + user_guides/dataset_prepare.md + user_guides/inference.md + user_guides/train_test.md + user_guides/metrics.md + user_guides/visualization.md + user_guides/useful_tools.md + user_guides/deploy.md + user_guides/faq.md + .. toctree:: :maxdepth: 2 :caption: Advanced Guides - advanced_guides/1_models.md - advanced_guides/2_dataset.md - advanced_guides/3_transforms.md - advanced_guides/4_losses.md + advanced_guides/models.md + advanced_guides/dataset.md + advanced_guides/transforms.md + advanced_guides/losses.md + advanced_guides/evaluator.md + advanced_guides/structures.md + advanced_guides/data_preprocessor.md + advanced_guides/data_flow.md + .. toctree:: :maxdepth: 2 @@ -91,52 +109,41 @@ Documentation :maxdepth: 1 :caption: Model Zoo - 3_model_zoo.md + model_zoo/model_zoo.md .. toctree:: :maxdepth: 1 :caption: Dataset Zoo - dataset_zoo/0_overview.md - dataset_zoo/1_super_resolution_datasets.md - dataset_zoo/2_inpainting_datasets.md - dataset_zoo/3_matting_datasets.md - dataset_zoo/4_video_interpolation_datasets.md - dataset_zoo/5_unconditional_gans_datasets.md - dataset_zoo/6_image_translation_datasets.md + dataset_zoo/overview.md + dataset_zoo/super_resolution_datasets.md + dataset_zoo/inpainting_datasets.md + dataset_zoo/matting_datasets.md + dataset_zoo/video_interpolation_datasets.md + dataset_zoo/unconditional_gans_datasets.md + dataset_zoo/image_translation_datasets.md .. toctree:: :maxdepth: 1 :caption: Migration from MMEdit 0.x - migration/1_overview.md - migration/2_runtime.md - migration/3_models.md - migration/4_eval_test.md - migration/5_schedule.md - migration/6_data.md - migration/7_distributed_train.md - migration/8_optimizers.md - migration/9_visualization.md - migration/10_amp.md - - -.. toctree:: - :maxdepth: 1 - :caption: Notes - - notes/1_contribution_guide.md - notes/2_projects.md - notes/3_changelog.md - notes/4_faq.md - + migration/overview.md + migration/runtime.md + migration/models.md + migration/eval_test.md + migration/schedule.md + migration/data.md + migration/distributed_train.md + migration/optimizers.md + migration/visualization.md + migration/amp.md .. toctree:: :caption: Switch Language - 5_switch_language.md + switch_language.md diff --git a/docs/en/migration/10_amp.md b/docs/en/migration/amp.md similarity index 100% rename from docs/en/migration/10_amp.md rename to docs/en/migration/amp.md diff --git a/docs/en/migration/6_data.md b/docs/en/migration/data.md similarity index 99% rename from docs/en/migration/6_data.md rename to docs/en/migration/data.md index 5b00eba624..e6751a120a 100644 --- a/docs/en/migration/6_data.md +++ b/docs/en/migration/data.md @@ -12,7 +12,7 @@ We update data pipelines settings in MMEdit 1.x. Important modifications are as - Remove normalization and color space transforms operations. They are moved from datasets transforms pipelines to data_preprocessor. - The original formatting transforms pipelines `Collect` and `ToTensor` are combined as `PackEditInputs`. - More details of data pipelines are shown in [transform guides](../advanced_guides/3_transforms.md). + More details of data pipelines are shown in [transform guides](../advanced_guides/transforms.md). diff --git a/docs/en/migration/7_distributed_train.md b/docs/en/migration/distributed_train.md similarity index 100% rename from docs/en/migration/7_distributed_train.md rename to docs/en/migration/distributed_train.md diff --git a/docs/en/migration/4_eval_test.md b/docs/en/migration/eval_test.md similarity index 97% rename from docs/en/migration/4_eval_test.md rename to docs/en/migration/eval_test.md index 87c2290d69..5341329d20 100644 --- a/docs/en/migration/4_eval_test.md +++ b/docs/en/migration/eval_test.md @@ -50,7 +50,7 @@ test_cfg = dict(type='TestLoop') # The name of test loop type We have merged [MMGeneration 1.x](https://github.com/open-mmlab/mmgeneration/tree/1.x) into MMEditing. Here is migration of Evaluation and Testing Settings about MMGeneration. -The evaluation field is splited to `val_evaluator` and `test_evaluator`. And it won't support `interval` and `save_best` arguments. The `interval` is moved to `train_cfg.val_interval`, see [the schedule settings](./5_schedule.md) and the `save_best` is moved to `default_hooks.checkpoint.save_best`. +The evaluation field is splited to `val_evaluator` and `test_evaluator`. And it won't support `interval` and `save_best` arguments. The `interval` is moved to `train_cfg.val_interval`, see [the schedule settings](./schedule.md) and the `save_best` is moved to `default_hooks.checkpoint.save_best`.
diff --git a/docs/en/migration/3_models.md b/docs/en/migration/models.md similarity index 99% rename from docs/en/migration/3_models.md rename to docs/en/migration/models.md index 07c6fb9d47..1cd4f3c40b 100644 --- a/docs/en/migration/3_models.md +++ b/docs/en/migration/models.md @@ -68,4 +68,4 @@ We refactor models in MMEdit 1.x. Important modifications are as following. - The `models` in MMedit 1.x is refactored to five parts: `base_models`, `data_preprocessors`, `editors`, `layers` and `losses`. - Add `data_preprocessor` module in `models`. Normalization and color space transforms operations are moved from datasets transforms pipelines to data_preprocessor. The data out from the data pipeline is transformed by this module and then fed into the model. -More details of models are shown in [model guides](../advanced_guides/1_models.md). +More details of models are shown in [model guides](../advanced_guides/models.md). diff --git a/docs/en/migration/8_optimizers.md b/docs/en/migration/optimizers.md similarity index 100% rename from docs/en/migration/8_optimizers.md rename to docs/en/migration/optimizers.md diff --git a/docs/en/migration/1_overview.md b/docs/en/migration/overview.md similarity index 94% rename from docs/en/migration/1_overview.md rename to docs/en/migration/overview.md index 7302148cf3..b4e71473f3 100644 --- a/docs/en/migration/1_overview.md +++ b/docs/en/migration/overview.md @@ -7,7 +7,7 @@ This section introduce the following contents in terms of migration from MMEditi ## New dependencies -MMEdit 1.x depends on some new packages, you can prepare a new clean environment and install again according to the [install tutorial](../2_get_started.md). Or install the below packages manually. +MMEdit 1.x depends on some new packages, you can prepare a new clean environment and install again according to the [install tutorial](../get_started/install.md). Or install the below packages manually. 1. [MMEngine](https://github.com/open-mmlab/mmengine): MMEngine is the core the OpenMMLab 2.0 architecture, and we splited many compentents unrelated to computer vision from MMCV to MMEngine. 2. [MMCV](https://github.com/open-mmlab/mmcv/tree/dev-2.x): The computer vision package of OpenMMLab. This is not a new dependency, but you need to upgrade it to above 2.0.0rc0 version. @@ -25,4 +25,4 @@ We refactor overall structures in MMEdit 1.x as following. We rename config file to new template: `{model_settings}_{module_setting}_{training_setting}_{datasets_info}`. -More details of config are shown in [config guides](../user_guides/1_config.md). +More details of config are shown in [config guides](../user_guides/config.md). diff --git a/docs/en/migration/2_runtime.md b/docs/en/migration/runtime.md similarity index 100% rename from docs/en/migration/2_runtime.md rename to docs/en/migration/runtime.md diff --git a/docs/en/migration/5_schedule.md b/docs/en/migration/schedule.md similarity index 100% rename from docs/en/migration/5_schedule.md rename to docs/en/migration/schedule.md diff --git a/docs/en/migration/9_visualization.md b/docs/en/migration/visualization.md similarity index 95% rename from docs/en/migration/9_visualization.md rename to docs/en/migration/visualization.md index 0f782531b7..6c9e3329c8 100644 --- a/docs/en/migration/9_visualization.md +++ b/docs/en/migration/visualization.md @@ -41,4 +41,4 @@ custom_hooks = [dict(type='BasicVisualizationHook', interval=1)]
-To learn more about the visualization function, please refers to [this tutorial](../user_guides/5_visualization.md). +To learn more about the visualization function, please refers to [this tutorial](../user_guides/visualization.md). diff --git a/docs/en/model_zoo.md b/docs/en/model_zoo.md new file mode 100644 index 0000000000..78bdf30067 --- /dev/null +++ b/docs/en/model_zoo.md @@ -0,0 +1,400 @@ +# Overview + +- Number of checkpoints: 178 +- Number of configs: 174 +- Number of papers: 46 + - ALGORITHM: 47 +- Tasks: + - image2image + - unconditional gans + - video super-resolution + - conditional gans + - inpainting + - matting + - image super-resolution + - video interpolation + - image restoration + - colorization + - internal learning + - text2image + - image generation + - 3d-aware generation + - image2image translation + +For supported datasets, see [datasets overview](dataset_zoo/0_overview.md). + +## AOT-GAN (TVCG'2021) + +- Tasks: inpainting +- Number of checkpoints: 1 +- Number of configs: 1 +- Number of papers: 1 + - \[ALGORITHM\] Aggregated Contextual Transformations for High-Resolution Image Inpainting ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/aot_gan/README.md#citation)) + +## BasicVSR (CVPR'2021) + +- Tasks: video super-resolution +- Number of checkpoints: 3 +- Number of configs: 3 +- Number of papers: 1 + - \[ALGORITHM\] Basicvsr: The Search for Essential Components in Video Super-Resolution and Beyond ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/basicvsr/README.md#citation)) + +## BasicVSR++ (CVPR'2022) + +- Tasks: video super-resolution +- Number of checkpoints: 7 +- Number of configs: 7 +- Number of papers: 1 + - \[ALGORITHM\] Basicvsr++: Improving Video Super-Resolution With Enhanced Propagation and Alignment ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/basicvsr_pp/README.md#citation)) + +## BigGAN (ICLR'2019) + +- Tasks: conditional gans +- Number of checkpoints: 7 +- Number of configs: 6 +- Number of papers: 1 + - \[ALGORITHM\] Large Scale {Gan ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/biggan/README.md#citation)) + +## CAIN (AAAI'2020) + +- Tasks: video interpolation +- Number of checkpoints: 1 +- Number of configs: 1 +- Number of papers: 1 + - \[ALGORITHM\] Channel Attention Is All You Need for Video Frame Interpolation ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/cain/README.md#citation)) + +## CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent Adversarial Networks (ICCV'2017) + +- Tasks: image2image translation +- Number of checkpoints: 6 +- Number of configs: 6 +- Number of papers: 1 + - \[ALGORITHM\] Unpaired Image-to-Image Translation Using Cycle-Consistent Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/cyclegan/README.md#citation)) + +## Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks (ICLR'2016) + +- Tasks: unconditional gans +- Number of checkpoints: 3 +- Number of configs: 3 +- Number of papers: 1 + - \[ALGORITHM\] Unsupervised Representation Learning With Deep Convolutional Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/dcgan/README.md#citation)) + +## DeepFillv1 (CVPR'2018) + +- Tasks: inpainting +- Number of checkpoints: 2 +- Number of configs: 2 +- Number of papers: 1 + - \[ALGORITHM\] Generative Image Inpainting With Contextual Attention ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/deepfillv1/README.md#citation)) + +## DeepFillv2 (CVPR'2019) + +- Tasks: inpainting +- Number of checkpoints: 2 +- Number of configs: 2 +- Number of papers: 1 + - \[ALGORITHM\] Free-Form Image Inpainting With Gated Convolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/deepfillv2/README.md#citation)) + +## DIC (CVPR'2020) + +- Tasks: image super-resolution +- Number of checkpoints: 2 +- Number of configs: 2 +- Number of papers: 1 + - \[ALGORITHM\] Deep Face Super-Resolution With Iterative Collaboration Between Attentive Recovery and Landmark Estimation ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/dic/README.md#citation)) + +## DIM (CVPR'2017) + +- Tasks: matting +- Number of checkpoints: 3 +- Number of configs: 3 +- Number of papers: 1 + - \[ALGORITHM\] Deep Image Matting ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/dim/README.md#citation)) + +## Disco Diffusion + +- Tasks: image2image,text2image +- Number of checkpoints: 2 +- Number of configs: 0 +- Number of papers: 1 + - \[ALGORITHM\] Disco-Diffusion ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/disco_diffusion/README.md#citation)) + +## EDSR (CVPR'2017) + +- Tasks: image super-resolution +- Number of checkpoints: 3 +- Number of configs: 3 +- Number of papers: 1 + - \[ALGORITHM\] Enhanced Deep Residual Networks for Single Image Super-Resolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/edsr/README.md#citation)) + +## EDVR (CVPRW'2019) + +- Tasks: video super-resolution +- Number of checkpoints: 4 +- Number of configs: 4 +- Number of papers: 1 + - \[ALGORITHM\] Edvr: Video Restoration With Enhanced Deformable Convolutional Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/edvr/README.md#citation)) + +## EG3D (CVPR'2022) + +- Tasks: 3d-aware generation +- Number of checkpoints: 3 +- Number of configs: 3 +- Number of papers: 1 + - \[ALGORITHM\] Efficient Geometry-Aware 3d Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/eg3d/README.md#citation)) + +## ESRGAN (ECCVW'2018) + +- Tasks: image super-resolution +- Number of checkpoints: 2 +- Number of configs: 2 +- Number of papers: 1 + - \[ALGORITHM\] Esrgan: Enhanced Super-Resolution Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/esrgan/README.md#citation)) + +## FLAVR (arXiv'2020) + +- Tasks: video interpolation +- Number of checkpoints: 1 +- Number of configs: 1 +- Number of papers: 1 + - \[ALGORITHM\] Flavr: Flow-Agnostic Video Representations for Fast Frame Interpolation ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/flavr/README.md#citation)) + +## GCA (AAAI'2020) + +- Tasks: matting +- Number of checkpoints: 4 +- Number of configs: 4 +- Number of papers: 1 + - \[ALGORITHM\] Natural Image Matting via Guided Contextual Attention ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/gca/README.md#citation)) + +## GGAN (ArXiv'2017) + +- Tasks: unconditional gans +- Number of checkpoints: 3 +- Number of configs: 3 +- Number of papers: 1 + - \[ALGORITHM\] Geometric Gan ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/ggan/README.md#citation)) + +## GLEAN (CVPR'2021) + +- Tasks: image super-resolution +- Number of checkpoints: 4 +- Number of configs: 7 +- Number of papers: 1 + - \[ALGORITHM\] Glean: Generative Latent Bank for Large-Factor Image Super-Resolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/glean/README.md#citation)) + +## Global&Local (ToG'2017) + +- Tasks: inpainting +- Number of checkpoints: 2 +- Number of configs: 2 +- Number of papers: 1 + - \[ALGORITHM\] Globally and Locally Consistent Image Completion ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/global_local/README.md#citation)) + +## Guided Diffusion (NeurIPS'2021) + +- Tasks: image generation +- Number of checkpoints: 2 +- Number of configs: 0 +- Number of papers: 1 + - \[ALGORITHM\] Diffusion Models Beat Gans on Image Synthesis ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/guided_diffusion/README.md#citation)) + +## IconVSR (CVPR'2021) + +- Tasks: video super-resolution +- Number of checkpoints: 3 +- Number of configs: 3 +- Number of papers: 1 + - \[ALGORITHM\] Basicvsr: The Search for Essential Components in Video Super-Resolution and Beyond ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/iconvsr/README.md#citation)) + +## IndexNet (ICCV'2019) + +- Tasks: matting +- Number of checkpoints: 2 +- Number of configs: 2 +- Number of papers: 1 + - \[ALGORITHM\] Indices Matter: Learning to Index for Deep Image Matting ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/indexnet/README.md#citation)) + +## Instance-aware Image Colorization (CVPR'2020) + +- Tasks: colorization +- Number of checkpoints: 1 +- Number of configs: 1 +- Number of papers: 1 + - \[ALGORITHM\] Instance-Aware Image Colorization ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/inst_colorization/README.md#quick-start)) + +## LIIF (CVPR'2021) + +- Tasks: image super-resolution +- Number of checkpoints: 2 +- Number of configs: 2 +- Number of papers: 1 + - \[ALGORITHM\] Learning Continuous Image Representation With Local Implicit Image Function ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/liif/README.md#citation)) + +## LSGAN (ICCV'2017) + +- Tasks: unconditional gans +- Number of checkpoints: 4 +- Number of configs: 4 +- Number of papers: 1 + - \[ALGORITHM\] Least Squares Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/lsgan/README.md#citation)) + +## NAFNet (ECCV'2022) + +- Tasks: image restoration +- Number of checkpoints: 2 +- Number of configs: 2 +- Number of papers: 1 + - \[ALGORITHM\] Simple Baselines for Image Restoration ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/nafnet/README.md#citation)) + +## PConv (ECCV'2018) + +- Tasks: inpainting +- Number of checkpoints: 2 +- Number of configs: 4 +- Number of papers: 1 + - \[ALGORITHM\] Image Inpainting for Irregular Holes Using Partial Convolutions ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/partial_conv/README.md#citation)) + +## PGGAN (ICLR'2018) + +- Tasks: unconditional gans +- Number of checkpoints: 3 +- Number of configs: 3 +- Number of papers: 1 + - \[ALGORITHM\] Progressive Growing of Gans for Improved Quality, Stability, and Variation ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/pggan/README.md#citation)) + +## Pix2Pix (CVPR'2017) + +- Tasks: image2image translation +- Number of checkpoints: 4 +- Number of configs: 4 +- Number of papers: 1 + - \[ALGORITHM\] Image-to-Image Translation With Conditional Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/pix2pix/README.md#citation)) + +## Positional Encoding in GANs + +- Tasks: unconditional gans +- Number of checkpoints: 21 +- Number of configs: 21 +- Number of papers: 1 + - \[ALGORITHM\] Positional Encoding as Spatial Inductive Bias in Gans ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/positional_encoding_in_gans/README.md#citation)) + +## RDN (CVPR'2018) + +- Tasks: image super-resolution +- Number of checkpoints: 3 +- Number of configs: 3 +- Number of papers: 1 + - \[ALGORITHM\] Residual Dense Network for Image Super-Resolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/rdn/README.md#citation)) + +## RealBasicVSR (CVPR'2022) + +- Tasks: video super-resolution +- Number of checkpoints: 2 +- Number of configs: 2 +- Number of papers: 1 + - \[ALGORITHM\] Realbasicvsr: Investigating Tradeoffs in Real-World Video Super-Resolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/real_basicvsr/README.md#citation)) + +## Real-ESRGAN (ICCVW'2021) + +- Tasks: image super-resolution +- Number of checkpoints: 2 +- Number of configs: 2 +- Number of papers: 1 + - \[ALGORITHM\] Real-Esrgan: Training Real-World Blind Super-Resolution With Pure Synthetic Data ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/real_esrgan/README.md#citation)) + +## SAGAN (ICML'2019) + +- Tasks: conditional gans +- Number of checkpoints: 9 +- Number of configs: 6 +- Number of papers: 1 + - \[ALGORITHM\] Self-Attention Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/sagan/README.md#citation)) + +## SinGAN (ICCV'2019) + +- Tasks: internal learning +- Number of checkpoints: 3 +- Number of configs: 3 +- Number of papers: 1 + - \[ALGORITHM\] Singan: Learning a Generative Model From a Single Natural Image ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/singan/README.md#citation)) + +## SNGAN (ICLR'2018) + +- Tasks: conditional gans +- Number of checkpoints: 10 +- Number of configs: 6 +- Number of papers: 1 + - \[ALGORITHM\] Spectral Normalization for Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/sngan_proj/README.md#citation)) + +## SRCNN (TPAMI'2015) + +- Tasks: image super-resolution +- Number of checkpoints: 1 +- Number of configs: 1 +- Number of papers: 1 + - \[ALGORITHM\] Image Super-Resolution Using Deep Convolutional Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/srcnn/README.md#citation)) + +## SRGAN (CVPR'2016) + +- Tasks: image super-resolution +- Number of checkpoints: 2 +- Number of configs: 2 +- Number of papers: 1 + - \[ALGORITHM\] Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/srgan_resnet/README.md#citation)) + +## StyleGANv1 (CVPR'2019) + +- Tasks: unconditional gans +- Number of checkpoints: 2 +- Number of configs: 2 +- Number of papers: 1 + - \[ALGORITHM\] A Style-Based Generator Architecture for Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/styleganv1/README.md#citation)) + +## StyleGANv2 (CVPR'2020) + +- Tasks: unconditional gans +- Number of checkpoints: 12 +- Number of configs: 12 +- Number of papers: 1 + - \[ALGORITHM\] Analyzing and Improving the Image Quality of Stylegan ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/styleganv2/README.md#citation)) + +## StyleGANv3 (NeurIPS'2021) + +- Tasks: unconditional gans +- Number of checkpoints: 9 +- Number of configs: 10 +- Number of papers: 1 + - \[ALGORITHM\] Alias-Free Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/styleganv3/README.md#citation)) + +## TDAN (CVPR'2020) + +- Tasks: video super-resolution +- Number of checkpoints: 2 +- Number of configs: 4 +- Number of papers: 1 + - \[ALGORITHM\] Tdan: Temporally-Deformable Alignment Network for Video Super-Resolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/tdan/README.md#citation)) + +## TOFlow (IJCV'2019) + +- Tasks: video super-resolution,video interpolation +- Number of checkpoints: 6 +- Number of configs: 6 +- Number of papers: 1 + - \[ALGORITHM\] Video Enhancement With Task-Oriented Flow ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/tof/README.md#citation)) + +## TTSR (CVPR'2020) + +- Tasks: image super-resolution +- Number of checkpoints: 2 +- Number of configs: 2 +- Number of papers: 1 + - \[ALGORITHM\] Learning Texture Transformer Network for Image Super-Resolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/ttsr/README.md#citation)) + +## WGAN-GP (NeurIPS'2017) + +- Tasks: unconditional gans +- Number of checkpoints: 2 +- Number of configs: 2 +- Number of papers: 1 + - \[ALGORITHM\] Improved Training of Wasserstein Gans ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/wgan-gp/README.md#citation)) diff --git a/docs/en/5_switch_language.md b/docs/en/switch_language.md similarity index 100% rename from docs/en/5_switch_language.md rename to docs/en/switch_language.md diff --git a/docs/en/user_guides/1_config.md b/docs/en/user_guides/config.md similarity index 100% rename from docs/en/user_guides/1_config.md rename to docs/en/user_guides/config.md diff --git a/docs/en/user_guides/2_dataset_prepare.md b/docs/en/user_guides/dataset_prepare.md similarity index 96% rename from docs/en/user_guides/2_dataset_prepare.md rename to docs/en/user_guides/dataset_prepare.md index c58fe4a8a9..475c69283e 100644 --- a/docs/en/user_guides/2_dataset_prepare.md +++ b/docs/en/user_guides/dataset_prepare.md @@ -36,4 +36,4 @@ We support detailed tutorials and split them according to different tasks. Please check our [dataset zoo](../dataset_zoo/0_overview.md) for data preparation of different tasks. -If you're interested in more details of datasets in MMEditing, please check the [advanced guides](../advanced_guides/2_dataset.md). +If you're interested in more details of datasets in MMEditing, please check the [advanced guides](../advanced_guides/dataset.md). diff --git a/docs/en/user_guides/7_deploy.md b/docs/en/user_guides/deploy.md similarity index 100% rename from docs/en/user_guides/7_deploy.md rename to docs/en/user_guides/deploy.md diff --git a/docs/en/notes/4_faq.md b/docs/en/user_guides/faq.md similarity index 95% rename from docs/en/notes/4_faq.md rename to docs/en/user_guides/faq.md index 4edec727c2..d1c9123dc9 100644 --- a/docs/en/notes/4_faq.md +++ b/docs/en/user_guides/faq.md @@ -15,11 +15,11 @@ and make sure you fill in all required information in the template. **Q2**: What's the folder structure of xxx dataset? -**A2**: You can make sure the folder structure is correct following tutorials of [dataset preparation](../user_guides/2_dataset_prepare.md). +**A2**: You can make sure the folder structure is correct following tutorials of [dataset preparation](../user_guides/dataset_prepare.md). **Q3**: How to use LMDB data to train the model? -**A3**: You can use scripts in `tools/data` to make LMDB files. More details are shown in tutorials of [dataset preparation](../user_guides/2_dataset_prepare.md). +**A3**: You can use scripts in `tools/data` to make LMDB files. More details are shown in tutorials of [dataset preparation](../user_guides/dataset_prepare.md). **Q4**: Why `MMCV==xxx is used but incompatible` is raised when import I try to import `mmgen`? diff --git a/docs/en/user_guides/3_inference.md b/docs/en/user_guides/inference.md similarity index 100% rename from docs/en/user_guides/3_inference.md rename to docs/en/user_guides/inference.md diff --git a/docs/en/user_guides/8_metrics.md b/docs/en/user_guides/metrics.md similarity index 98% rename from docs/en/user_guides/8_metrics.md rename to docs/en/user_guides/metrics.md index 9c501a566f..d9c593502c 100644 --- a/docs/en/user_guides/8_metrics.md +++ b/docs/en/user_guides/metrics.md @@ -2,7 +2,7 @@ MMEditing supports **17 metrics** to assess the quality of models. -Please refer to [Train and Test in MMEditing](../user_guides/4_train_test.md) for usages. +Please refer to [Train and Test in MMEditing](../user_guides/train_test.md) for usages. Here, we will specify the details of different metrics one by one. @@ -176,7 +176,7 @@ metrics = [ ``` `TransFID` has same usage as `FID`, but it's designed for translation models like `Pix2Pix` and `CycleGAN`, which is adapted for our evaluator. You can refer -to [evaluation](../user_guides/4_train_test.md) for details. +to [evaluation](../user_guides/train_test.md) for details. ## IS and TransIS @@ -223,7 +223,7 @@ We also perform a survey on the influence of data loading pipeline and the versi `TransIS` has same usage as `IS`, but it's designed for translation models like `Pix2Pix` and `CycleGAN`, which is adapted for our evaluator. You can refer -to [evaluation](../user_guides/4_train_test.md) for details. +to [evaluation](../user_guides/train_test.md) for details. ## Precision and Recall diff --git a/docs/en/user_guides/4_train_test.md b/docs/en/user_guides/train_test.md similarity index 97% rename from docs/en/user_guides/4_train_test.md rename to docs/en/user_guides/train_test.md index f4894de795..3a314b15ab 100644 --- a/docs/en/user_guides/4_train_test.md +++ b/docs/en/user_guides/train_test.md @@ -19,7 +19,7 @@ In this section, we provide the following guides: ## Prerequisite -Users need to [prepare dataset](../user_guides/2_dataset_prepare.md) first to enable training and testing models in MMEditing. +Users need to [prepare dataset](../user_guides/dataset_prepare.md) first to enable training and testing models in MMEditing. ## Test a model in MMEditing @@ -211,4 +211,4 @@ val_evaluator = dict(type='GenEvaluator', metrics=metrics) You can set `val_begin` and `val_interval` to adjust when to begin validation and interval of validation. -For details of metrics, refer to [metrics' guide](./8_metrics.md). +For details of metrics, refer to [metrics' guide](./metrics.md). diff --git a/docs/en/user_guides/6_useful_tools.md b/docs/en/user_guides/useful_tools.md similarity index 90% rename from docs/en/user_guides/6_useful_tools.md rename to docs/en/user_guides/useful_tools.md index a5b0f95d53..441a03c115 100644 --- a/docs/en/user_guides/6_useful_tools.md +++ b/docs/en/user_guides/useful_tools.md @@ -61,7 +61,7 @@ The final output filename will be `stylegan2_c2_8xb4_ffhq-1024x1024_{time}-{hash ## Print full config -MMGeneration incorporates config mechanism to set parameters used for training and testing models. With our [config](../user_guides/1_config.md) mechanism, users can easily conduct extensive experiments without hard coding. If you wish to inspect the config file, you may run `python tools/misc/print_config.py /PATH/TO/CONFIG` to see the complete config. +MMGeneration incorporates config mechanism to set parameters used for training and testing models. With our [config](../user_guides/config.md) mechanism, users can easily conduct extensive experiments without hard coding. If you wish to inspect the config file, you may run `python tools/misc/print_config.py /PATH/TO/CONFIG` to see the complete config. An Example: diff --git a/docs/en/user_guides/5_visualization.md b/docs/en/user_guides/visualization.md similarity index 100% rename from docs/en/user_guides/5_visualization.md rename to docs/en/user_guides/visualization.md From 4ee8e9159d7c01b9be4e33791108ad442ecddcde Mon Sep 17 00:00:00 2001 From: Yanhong Zeng Date: Tue, 13 Dec 2022 13:28:11 +0800 Subject: [PATCH 09/44] [Doc] improve toctree and update model zoo and dataset zoo (#1525) * update circleci * update model zoo * update model zoo * move changelog.md * fix lint * fix index toctree --- .circleci/config.yml | 9 +- .circleci/test.yml | 4 - README.md | 6 +- README_zh-CN.md | 2 +- configs/cyclegan/README.md | 2 +- configs/cyclegan/metafile.yml | 20 +- configs/disco_diffusion/README.md | 4 +- configs/disco_diffusion/metafile.yml | 6 +- configs/pix2pix/README.md | 2 +- configs/pix2pix/metafile.yml | 8 +- demo/README.md | 4 +- demo/mmediting_inference_tutorial.ipynb | 8 +- docs/en/.dev_scripts/update_dataset_zoo.py | 51 +++ docs/en/.dev_scripts/update_dataset_zoo.sh | 39 -- docs/en/.dev_scripts/update_model_zoo.py | 115 +++-- docs/en/.gitignore | 3 + docs/en/3_model_zoo.md | 400 ------------------ docs/en/Makefile | 2 + docs/en/advanced_guides/data_flow.md | 2 +- docs/en/advanced_guides/data_preprocessor.md | 2 +- docs/en/advanced_guides/structures.md | 2 +- docs/en/{community => }/changelog.md | 0 docs/en/conf.py | 2 +- docs/en/dataset_zoo/0_overview.md | 18 - .../1_super_resolution_datasets.md | 356 ---------------- docs/en/dataset_zoo/2_inpainting_datasets.md | 114 ----- docs/en/dataset_zoo/3_matting_datasets.md | 147 ------- .../4_video_interpolation_datasets.md | 50 --- .../5_unconditional_gans_datasets.md | 91 ---- .../6_image_translation_datasets.md | 147 ------- docs/en/{user_guides => }/faq.md | 6 +- docs/en/get_started/install.md | 2 +- docs/en/get_started/overview.md | 8 +- docs/en/get_started/quick_run.md | 2 +- docs/en/{advanced_guides => howto}/dataset.md | 2 +- docs/en/{advanced_guides => howto}/losses.md | 2 +- docs/en/{advanced_guides => howto}/models.md | 4 +- .../{advanced_guides => howto}/transforms.md | 2 +- docs/en/index.rst | 51 ++- docs/en/migration/data.md | 2 +- docs/en/migration/models.md | 2 +- docs/en/model_zoo.md | 400 ------------------ docs/en/user_guides/dataset_prepare.md | 6 +- docs/en/user_guides/deploy.md | 2 +- docs/en/user_guides/inference.md | 2 +- docs/en/user_guides/metrics.md | 2 +- docs/en/user_guides/train_test.md | 2 +- docs/en/user_guides/useful_tools.md | 2 +- .../bgm/preprocess_bgm_dataset.py | 0 .../{inpainting => }/celeba-hq/README.md | 0 .../celeba-hq/README_zh-CN.md | 0 .../{matting => }/comp1k/README.md | 0 .../{matting => }/comp1k/README_zh-CN.md | 0 .../{matting => }/comp1k/check_extended_fg.py | 0 .../{ => comp1k}/evaluate_comp1k.py | 0 .../{matting => }/comp1k/extend_fg.py | 0 .../comp1k/filter_comp1k_anno.py | 0 .../comp1k/preprocess_comp1k_dataset.py | 0 .../{super-resolution => }/df2k_ost/README.md | 0 .../df2k_ost/README_zh-CN.md | 0 .../df2k_ost/preprocess_df2k_ost_dataset.py | 0 .../{super-resolution => }/div2k/README.md | 0 .../div2k/README_zh-CN.md | 0 .../div2k/preprocess_div2k_dataset.py | 0 tools/dataset_converters/generation/README.md | 8 - .../generation/README_zh-CN.md | 8 - .../image_translation/README.md | 147 ------- tools/dataset_converters/inpainting/README.md | 25 -- .../inpainting/README_zh-CN.md | 25 -- tools/dataset_converters/matting/README.md | 7 - .../matting/README_zh-CN.md | 7 - .../{generation => }/paired-pix2pix/README.md | 0 .../paired-pix2pix/README_zh-CN.md | 0 .../paris-street-view/README.md | 0 .../paris-street-view/README_zh-CN.md | 0 .../{inpainting => }/places365/README.md | 0 .../places365/README_zh-CN.md | 0 .../{super-resolution => }/reds/README.md | 0 .../reds/README_zh-CN.md | 0 .../reds/crop_sub_images.py | 0 .../reds/preprocess_reds_dataset.py | 0 .../super-resolution/README.md | 13 - .../super-resolution/README_zh-CN.md | 13 - .../unpaired-cyclegan/README.md | 0 .../unpaired-cyclegan/README_zh-CN.md | 0 .../{super-resolution => }/vid4/README.md | 0 .../vid4/README_zh-CN.md | 0 .../video-interpolation/README.md | 7 - .../video-interpolation/README_zh-CN.md | 7 - .../vimeo90k-triplet/README.md | 0 .../vimeo90k-triplet/README_zh-CN.md | 0 .../{super-resolution => }/vimeo90k/README.md | 0 .../vimeo90k/README_zh-CN.md | 0 .../vimeo90k/preprocess_vimeo90k_dataset.py | 0 94 files changed, 235 insertions(+), 2147 deletions(-) create mode 100644 docs/en/.dev_scripts/update_dataset_zoo.py delete mode 100644 docs/en/.dev_scripts/update_dataset_zoo.sh create mode 100644 docs/en/.gitignore delete mode 100644 docs/en/3_model_zoo.md rename docs/en/{community => }/changelog.md (100%) delete mode 100644 docs/en/dataset_zoo/0_overview.md delete mode 100644 docs/en/dataset_zoo/1_super_resolution_datasets.md delete mode 100644 docs/en/dataset_zoo/2_inpainting_datasets.md delete mode 100644 docs/en/dataset_zoo/3_matting_datasets.md delete mode 100644 docs/en/dataset_zoo/4_video_interpolation_datasets.md delete mode 100644 docs/en/dataset_zoo/5_unconditional_gans_datasets.md delete mode 100644 docs/en/dataset_zoo/6_image_translation_datasets.md rename docs/en/{user_guides => }/faq.md (91%) rename docs/en/{advanced_guides => howto}/dataset.md (99%) rename docs/en/{advanced_guides => howto}/losses.md (99%) rename docs/en/{advanced_guides => howto}/models.md (99%) rename docs/en/{advanced_guides => howto}/transforms.md (99%) delete mode 100644 docs/en/model_zoo.md rename tools/dataset_converters/{matting => }/bgm/preprocess_bgm_dataset.py (100%) rename tools/dataset_converters/{inpainting => }/celeba-hq/README.md (100%) rename tools/dataset_converters/{inpainting => }/celeba-hq/README_zh-CN.md (100%) rename tools/dataset_converters/{matting => }/comp1k/README.md (100%) rename tools/dataset_converters/{matting => }/comp1k/README_zh-CN.md (100%) rename tools/dataset_converters/{matting => }/comp1k/check_extended_fg.py (100%) rename tools/dataset_converters/{ => comp1k}/evaluate_comp1k.py (100%) rename tools/dataset_converters/{matting => }/comp1k/extend_fg.py (100%) rename tools/dataset_converters/{matting => }/comp1k/filter_comp1k_anno.py (100%) rename tools/dataset_converters/{matting => }/comp1k/preprocess_comp1k_dataset.py (100%) rename tools/dataset_converters/{super-resolution => }/df2k_ost/README.md (100%) rename tools/dataset_converters/{super-resolution => }/df2k_ost/README_zh-CN.md (100%) rename tools/dataset_converters/{super-resolution => }/df2k_ost/preprocess_df2k_ost_dataset.py (100%) rename tools/dataset_converters/{super-resolution => }/div2k/README.md (100%) rename tools/dataset_converters/{super-resolution => }/div2k/README_zh-CN.md (100%) rename tools/dataset_converters/{super-resolution => }/div2k/preprocess_div2k_dataset.py (100%) delete mode 100644 tools/dataset_converters/generation/README.md delete mode 100644 tools/dataset_converters/generation/README_zh-CN.md delete mode 100644 tools/dataset_converters/image_translation/README.md delete mode 100644 tools/dataset_converters/inpainting/README.md delete mode 100644 tools/dataset_converters/inpainting/README_zh-CN.md delete mode 100644 tools/dataset_converters/matting/README.md delete mode 100644 tools/dataset_converters/matting/README_zh-CN.md rename tools/dataset_converters/{generation => }/paired-pix2pix/README.md (100%) rename tools/dataset_converters/{generation => }/paired-pix2pix/README_zh-CN.md (100%) rename tools/dataset_converters/{inpainting => }/paris-street-view/README.md (100%) rename tools/dataset_converters/{inpainting => }/paris-street-view/README_zh-CN.md (100%) rename tools/dataset_converters/{inpainting => }/places365/README.md (100%) rename tools/dataset_converters/{inpainting => }/places365/README_zh-CN.md (100%) rename tools/dataset_converters/{super-resolution => }/reds/README.md (100%) rename tools/dataset_converters/{super-resolution => }/reds/README_zh-CN.md (100%) rename tools/dataset_converters/{super-resolution => }/reds/crop_sub_images.py (100%) rename tools/dataset_converters/{super-resolution => }/reds/preprocess_reds_dataset.py (100%) delete mode 100644 tools/dataset_converters/super-resolution/README.md delete mode 100644 tools/dataset_converters/super-resolution/README_zh-CN.md rename tools/dataset_converters/{generation => }/unpaired-cyclegan/README.md (100%) rename tools/dataset_converters/{generation => }/unpaired-cyclegan/README_zh-CN.md (100%) rename tools/dataset_converters/{super-resolution => }/vid4/README.md (100%) rename tools/dataset_converters/{super-resolution => }/vid4/README_zh-CN.md (100%) delete mode 100644 tools/dataset_converters/video-interpolation/README.md delete mode 100644 tools/dataset_converters/video-interpolation/README_zh-CN.md rename tools/dataset_converters/{video-interpolation => }/vimeo90k-triplet/README.md (100%) rename tools/dataset_converters/{video-interpolation => }/vimeo90k-triplet/README_zh-CN.md (100%) rename tools/dataset_converters/{super-resolution => }/vimeo90k/README.md (100%) rename tools/dataset_converters/{super-resolution => }/vimeo90k/README_zh-CN.md (100%) rename tools/dataset_converters/{super-resolution => }/vimeo90k/preprocess_vimeo90k_dataset.py (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index e7650e63ea..78e6a43292 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -23,11 +23,14 @@ workflows: mmedit/.* lint_only false requirements/.* lint_only false tests/.* lint_only false - tools/.* lint_only false - configs/.* lint_only false .circleci/.* lint_only false + tools/.* lint_only true + configs/.* lint_only true + docs/.* lint_only true .dev_scripts/.* lint_only true - base-revision: 1.x + .github/.* lint_only true + demo/.* lint_only true + base-revision: dev-1.x # this is the path of the configuration we should trigger once # path filtering and pipeline parameter value updates are # complete. In this case, we are using the parent dynamic diff --git a/.circleci/test.yml b/.circleci/test.yml index 4daf343ace..e2c22719cd 100644 --- a/.circleci/test.yml +++ b/.circleci/test.yml @@ -125,7 +125,6 @@ workflows: branches: ignore: - dev-1.x - - test-1.x - 1.x pr_stage_test: when: @@ -138,7 +137,6 @@ workflows: branches: ignore: - dev-1.x - - test-1.x - 1.x - build_cpu: name: minimum_version_cpu @@ -181,5 +179,3 @@ workflows: branches: only: - dev-1.x - - test-1.x - - 1.x diff --git a/README.md b/README.md index 349e4a192d..06d9cf809b 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ [📘Documentation](https://mmediting.readthedocs.io/en/1.x/) | [🛠️Installation](https://mmediting.readthedocs.io/en/1.x/2_get_started.html#installation) | [👀Model Zoo](https://mmediting.readthedocs.io/en/1.x/3_model_zoo.html) | -[🆕Update News](docs/en/community/changelog.md) | +[🆕Update News](docs/en/changelog.md) | [🚀Ongoing Projects](https://github.com/open-mmlab/mmediting/projects) | [🤔Reporting Issues](https://github.com/open-mmlab/mmediting/issues) @@ -125,7 +125,7 @@ Find more new features in [1.x branch](https://github.com/open-mmlab/mmediting/t - Fix FLAVR register. - Fix the number of channels in RDB. -Please refer to [changelog.md](docs/en/community/changelog.md) for details and release history. +Please refer to [changelog.md](docs/en/changelog.md) for details and release history. ## Installation @@ -253,7 +253,7 @@ Supported algorithms:
-Image2Image Translation +Image2Image - ✅ [Pix2Pix](configs/pix2pix/README.md) (CVPR'2017) - ✅ [CycleGAN](configs/cyclegan/README.md) (ICCV'2017) diff --git a/README_zh-CN.md b/README_zh-CN.md index 8c87457ffd..2319802e7d 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -251,7 +251,7 @@ pip3 install -e .
-Image2Image Translation +Image2Image - ✅ [Pix2Pix](configs/pix2pix/README.md) (CVPR'2017) - ✅ [CycleGAN](configs/cyclegan/README.md) (ICCV'2017) diff --git a/configs/cyclegan/README.md b/configs/cyclegan/README.md index b72a0fefcf..de27ba78d0 100644 --- a/configs/cyclegan/README.md +++ b/configs/cyclegan/README.md @@ -2,7 +2,7 @@ > [CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent Adversarial Networks](https://openaccess.thecvf.com/content_iccv_2017/html/Zhu_Unpaired_Image-To-Image_Translation_ICCV_2017_paper.html) -> **Task**: Image2Image Translation +> **Task**: Image2Image diff --git a/configs/cyclegan/metafile.yml b/configs/cyclegan/metafile.yml index 6c54aec4aa..573265939e 100644 --- a/configs/cyclegan/metafile.yml +++ b/configs/cyclegan/metafile.yml @@ -20,7 +20,7 @@ Models: Metrics: FID: 124.8033 IS: 1.792 - Task: Image2Image Translation + Task: Image2Image Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_80k_facades_20210902_165905-5e2c0876.pth - Config: configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-80kiters_facades.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent @@ -33,7 +33,7 @@ Models: Metrics: FID: 125.1694 IS: 1.905 - Task: Image2Image Translation + Task: Image2Image Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_80k_facades_convert-bgr_20210902_164411-d8e72b45.pth - Config: configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-250kiters_summer2winter.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent @@ -46,7 +46,7 @@ Models: Metrics: FID: 83.7177 IS: 2.771 - Task: Image2Image Translation + Task: Image2Image Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165932-fcf08dc1.pth - Config: configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-250kiters_summer2winter.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent @@ -59,7 +59,7 @@ Models: Metrics: FID: 83.1418 IS: 2.72 - Task: Image2Image Translation + Task: Image2Image Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165640-8b825581.pth - Config: configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-250kiters_summer2winter.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent @@ -72,7 +72,7 @@ Models: Metrics: FID: 72.8025 IS: 3.129 - Task: Image2Image Translation + Task: Image2Image Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165932-fcf08dc1.pth - Config: configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-250kiters_summer2winter.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent @@ -85,7 +85,7 @@ Models: Metrics: FID: 73.5001 IS: 3.107 - Task: Image2Image Translation + Task: Image2Image Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165640-8b825581.pth - Config: configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-270kiters_horse2zebra.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent @@ -98,7 +98,7 @@ Models: Metrics: FID: 64.5225 IS: 1.418 - Task: Image2Image Translation + Task: Image2Image Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_170004-a32c733a.pth - Config: configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-270kiters_horse2zebra.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent @@ -111,7 +111,7 @@ Models: Metrics: FID: 74.777 IS: 1.542 - Task: Image2Image Translation + Task: Image2Image Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_165724-77c9c806.pth - Config: configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-270kiters_horse2zebra.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent @@ -124,7 +124,7 @@ Models: Metrics: FID: 141.1517 IS: 3.154 - Task: Image2Image Translation + Task: Image2Image Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_170004-a32c733a.pth - Config: configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-270kiters_horse2zebra.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent @@ -137,5 +137,5 @@ Models: Metrics: FID: 134.3728 IS: 3.091 - Task: Image2Image Translation + Task: Image2Image Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_165724-77c9c806.pth diff --git a/configs/disco_diffusion/README.md b/configs/disco_diffusion/README.md index 912316297f..b55f037505 100644 --- a/configs/disco_diffusion/README.md +++ b/configs/disco_diffusion/README.md @@ -1,8 +1,8 @@ -# Disco Diffusion +# Disco Diffusion (2022) > [Disco Diffusion](https://github.com/alembics/disco-diffusion) -> **Task**: Text2Image, Image2Image +> **Task**: Text2Image, Image2Image, diffusion diff --git a/configs/disco_diffusion/metafile.yml b/configs/disco_diffusion/metafile.yml index 6938b212b8..f3a26fd520 100644 --- a/configs/disco_diffusion/metafile.yml +++ b/configs/disco_diffusion/metafile.yml @@ -15,7 +15,7 @@ Models: Results: - Dataset: Others Metrics: {} - Task: Text2Image, Image2Image + Task: Text2Image, Image2Image, diffusion Weights: https://download.openmmlab.com/mmediting/synthesizers/disco/adm-u_finetuned_imagenet-512x512-ab471d70.pth - Config: configs/disco/disco-diffusion_adm-u-finetuned_imagenet-256x256.py In Collection: Disco Diffusion @@ -25,7 +25,7 @@ Models: Results: - Dataset: Others Metrics: {} - Task: Text2Image, Image2Image + Task: Text2Image, Image2Image, diffusion Weights: <> - Config: configs/disco/disco-diffusion_portrait-generator-v001.py In Collection: Disco Diffusion @@ -35,5 +35,5 @@ Models: Results: - Dataset: Others Metrics: {} - Task: Text2Image, Image2Image + Task: Text2Image, Image2Image, diffusion Weights: https://download.openmmlab.com/mmediting/synthesizers/disco/adm-u-cvt-rgb_portrait-v001-f4a3f3bc.pth diff --git a/configs/pix2pix/README.md b/configs/pix2pix/README.md index 99636fa555..10ceeb3069 100644 --- a/configs/pix2pix/README.md +++ b/configs/pix2pix/README.md @@ -2,7 +2,7 @@ > [Pix2Pix: Image-to-Image Translation with Conditional Adversarial Networks](https://openaccess.thecvf.com/content_cvpr_2017/html/Isola_Image-To-Image_Translation_With_CVPR_2017_paper.html) -> **Task**: Image2Image Translation +> **Task**: Image2Image diff --git a/configs/pix2pix/metafile.yml b/configs/pix2pix/metafile.yml index 48b8c6db13..79b582ec55 100644 --- a/configs/pix2pix/metafile.yml +++ b/configs/pix2pix/metafile.yml @@ -17,7 +17,7 @@ Models: Metrics: FID: 124.9773 IS: 1.62 - Task: Image2Image Translation + Task: Image2Image Weights: https://download.openmmlab.com/mmgen/pix2pix/refactor/pix2pix_vanilla_unet_bn_1x1_80k_facades_20210902_170442-c0958d50.pth - Config: https://github.com/open-mmlab/mmediting/tree/master/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_aerial2maps.py In Collection: Pix2Pix @@ -29,7 +29,7 @@ Models: Metrics: FID: 122.5856 IS: 3.137 - Task: Image2Image Translation + Task: Image2Image Weights: https://download.openmmlab.com/mmgen/pix2pix/refactor/pix2pix_vanilla_unet_bn_a2b_1x1_219200_maps_convert-bgr_20210902_170729-59a31517.pth - Config: https://github.com/open-mmlab/mmediting/tree/master/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_maps2aerial.py In Collection: Pix2Pix @@ -41,7 +41,7 @@ Models: Metrics: FID: 88.4635 IS: 3.31 - Task: Image2Image Translation + Task: Image2Image Weights: https://download.openmmlab.com/mmgen/pix2pix/refactor/pix2pix_vanilla_unet_bn_b2a_1x1_219200_maps_convert-bgr_20210902_170814-6d2eac4a.pth - Config: https://github.com/open-mmlab/mmediting/tree/master/configs/pix2pix/pix2pix_vanilla-unet-bn_wo-jitter-flip-1xb4-190kiters_edges2shoes.py In Collection: Pix2Pix @@ -53,5 +53,5 @@ Models: Metrics: FID: 84.375 IS: 2.815 - Task: Image2Image Translation + Task: Image2Image Weights: https://download.openmmlab.com/mmgen/pix2pix/refactor/pix2pix_vanilla_unet_bn_wo_jitter_flip_1x4_186840_edges2shoes_convert-bgr_20210902_170902-0c828552.pth diff --git a/demo/README.md b/demo/README.md index 469e232e7e..6ce948fd45 100644 --- a/demo/README.md +++ b/demo/README.md @@ -71,10 +71,10 @@ print all supported tasks for inference. python mmediting_inference_demo.py --print-supported-tasks ``` -print all supported models for one task, take 'Image2Image Translation' for example. +print all supported models for one task, take 'Image2Image' for example. ```shell -python mmediting_inference_demo.py --print-task-supported-models 'Image2Image Translation' +python mmediting_inference_demo.py --print-task-supported-models 'Image2Image' ``` ### 2.2 Perform inference with command line diff --git a/demo/mmediting_inference_tutorial.ipynb b/demo/mmediting_inference_tutorial.ipynb index 738b6ff9af..3fe752fcc2 100644 --- a/demo/mmediting_inference_tutorial.ipynb +++ b/demo/mmediting_inference_tutorial.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -34,7 +35,7 @@ "\n", "  [4.4 Inference of super resolution models](#44-inference-of-image-super-resolution-models)\n", "\n", - "  [4.5 Inference of image2image translation models](#45-inference-of-image-translation-models)\n", + "  [4.5 Inference of image2image models](#45-inference-of-image-translation-models)\n", "\n", "  [4.6 Inference of unconditional GANs models](#46-inference-of-unconditional-gan-models)\n", "\n", @@ -261,12 +262,13 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Check inference supported tasks and models\n", "\n", - "There are multiple task types in MMEditing: Matting, Inpainting, Video Super-Resolution, Image Super-Resolution, Image2Image Translation, Unconditional GANs, Conditional GANs, Video Interpolation. \n", + "There are multiple task types in MMEditing: Matting, Inpainting, Video Super-Resolution, Image Super-Resolution, Image2Image, Unconditional GANs, Conditional GANs, Video Interpolation. \n", "\n", "We provide some models for each task. All available models and tasks could be printed out like this." ] @@ -303,7 +305,7 @@ "print(supported_tasks)\n", "\n", "# print all supported models for one task, take image translation for example.\n", - "task_supported_models = MMEdit.get_task_supported_models('Image2Image Translation')\n", + "task_supported_models = MMEdit.get_task_supported_models('Image2Image')\n", "print('translation models:')\n", "print(task_supported_models)" ] diff --git a/docs/en/.dev_scripts/update_dataset_zoo.py b/docs/en/.dev_scripts/update_dataset_zoo.py new file mode 100644 index 0000000000..66dedb7f40 --- /dev/null +++ b/docs/en/.dev_scripts/update_dataset_zoo.py @@ -0,0 +1,51 @@ +import os + +from tqdm import tqdm + + +def update_dataset_zoo(): + + target_dir = 'dataset_zoo' + source_dir = '../../tools/dataset_converters' + os.makedirs(target_dir, exist_ok=True) + + # generate overview + overviewmsg = """ +# Overview + +""" + + # generate index.rst + rstmsg = """ +.. toctree:: + :maxdepth: 1 + :caption: Dataset Zoo + + overview.md +""" + + subfolders = os.listdir(source_dir) + for subf in tqdm(subfolders): + + target_subf = subf.replace('-', '_').lower() + target_readme = os.path.join(target_dir, target_subf + '.md') + source_readme = os.path.join(source_dir, subf, 'README.md') + if not os.path.exists(source_readme): + continue + + overviewmsg += f'\n- [{subf}]({target_subf}.md)' + rstmsg += f'\n {target_subf}.md' + + # generate all tasks dataset_zoo + command = f'cat {source_readme} > {target_readme}' + os.popen(command) + + with open(os.path.join(target_dir, 'overview.md'), 'w') as f: + f.write(overviewmsg) + + with open(os.path.join(target_dir, 'index.rst'), 'w') as f: + f.write(rstmsg) + + +if __name__ == '__main__': + update_dataset_zoo() diff --git a/docs/en/.dev_scripts/update_dataset_zoo.sh b/docs/en/.dev_scripts/update_dataset_zoo.sh deleted file mode 100644 index 6ac06a6126..0000000000 --- a/docs/en/.dev_scripts/update_dataset_zoo.sh +++ /dev/null @@ -1,39 +0,0 @@ -# generate all tasks dataset_zoo -cat ../../tools/dataset_converters/super-resolution/README.md > dataset_zoo/1_super_resolution_datasets.md -cat ../../tools/dataset_converters/inpainting/README.md > dataset_zoo/2_inpainting_datasets.md -cat ../../tools/dataset_converters/matting/README.md > dataset_zoo/3_matting_datasets.md -cat ../../tools/dataset_converters/video-interpolation/README.md > dataset_zoo/4_video_interpolation_datasets.md -cat ../../tools/dataset_converters/unconditional_gans/README.md > dataset_zoo/5_unconditional_gans_datasets.md -cat ../../tools/dataset_converters/image_translation/README.md > dataset_zoo/6_image_translation_datasets.md - -# generate markdown TOC -sed -i -e 's/](comp1k\(\/README.md)\)/](composition-1k\1/g' dataset_zoo/3_matting_datasets.md - -sed -i -e 's/](\(.*\)\/README.md)/](#\1-dataset)/g' dataset_zoo/1_super_resolution_datasets.md -sed -i -e 's/](\(.*\)\/README.md)/](#\1-dataset)/g' dataset_zoo/2_inpainting_datasets.md -sed -i -e 's/](\(.*\)\/README.md)/](#\1-dataset)/g' dataset_zoo/3_matting_datasets.md -sed -i -e 's/](\(.*\)\/README.md)/](#\1-dataset)/g' dataset_zoo/4_video_interpolation_datasets.md -sed -i -e 's/](\(.*\)\/README.md)/](#\1-dataset)/g' dataset_zoo/5_unconditional_gans_datasets.md -sed -i -e 's/](\(.*\)\/README.md)/](#\1-dataset)/g' dataset_zoo/6_image_translation_datasets.md - -# gather all datasets -cat ../../tools/dataset_converters/super-resolution/*/README.md | sed 's/# Preparing /\n# /g' | sed "s/#/#&/" >> dataset_zoo/1_super_resolution_datasets.md -cat ../../tools/dataset_converters/inpainting/*/README.md | sed 's/# Preparing /\n# /g' | sed "s/#/#&/" >> dataset_zoo/2_inpainting_datasets.md -cat ../../tools/dataset_converters/matting/*/README.md | sed 's/# Preparing /\n# /g' | sed "s/#/#&/" >> dataset_zoo/3_matting_datasets.md -cat ../../tools/dataset_converters/video-interpolation/*/README.md | sed 's/# Preparing /\n# /g' | sed "s/#/#&/" >> dataset_zoo/4_video_interpolation_datasets.md -cat ../../tools/dataset_converters/unconditional_gans/*/README.md | sed 's/# Preparing /\n# /g' | sed "s/#/#&/" >> dataset_zoo/5_unconditional_gans_datasets.md -cat ../../tools/dataset_converters/image_translation/*/README.md | sed 's/# Preparing /\n# /g' | sed "s/#/#&/" >> dataset_zoo/6_image_translation_datasets.md - -echo '# Overview' > dataset_zoo/0_overview.md -echo "- [Prepare Super-Resolution Datasets](./1_super_resolution_datasets.md)" >> dataset_zoo/0_overview.md -cat dataset_zoo/1_super_resolution_datasets.md | grep -oP '(- \[.*-dataset.*)' | sed 's/- \[/ - \[/g' | sed 's/(#/(.\/1_super_resolution_datasets.md#/g' >> dataset_zoo/0_overview.md -echo "- [Prepare Inpainting Datasets](./2_inpainting_datasets.md)" >> dataset_zoo/0_overview.md -cat dataset_zoo/2_inpainting_datasets.md | grep -oP '(- \[.*-dataset.*)' | sed 's/- \[/ - \[/g' | sed 's/(#/(.\/2_inpainting_datasets.md#/g' >> dataset_zoo/0_overview.md -echo "- [Prepare Matting Datasets](./3_matting_datasets.md)" >> dataset_zoo/0_overview.md -cat dataset_zoo/3_matting_datasets.md | grep -oP '(- \[.*-dataset.*)' | sed 's/- \[/ - \[/g' | sed 's/(#/(.\/3_matting_datasets.md#/g' >> dataset_zoo/0_overview.md -echo "- [Prepare Video Frame Interpolation Datasets](./4_video_interpolation_datasets.md)" >> dataset_zoo/0_overview.md -cat dataset_zoo/4_video_interpolation_datasets.md | grep -oP '(- \[.*-dataset.*)' | sed 's/- \[/ - \[/g' | sed 's/(#/(.\/4_video_interpolation_datasets.md#/g' >> dataset_zoo/0_overview.md -echo "- [Prepare Unconditional GANs Datasets](./5_unconditional_gans_datasets.md)" >> dataset_zoo/0_overview.md -cat dataset_zoo/5_unconditional_gans_datasets.md | grep -oP '(- \[.*-dataset.*)' | sed 's/- \[/ - \[/g' | sed 's/(#/(.\/5_unconditional_gans_datasets.md#/g' >> dataset_zoo/0_overview.md -echo "- [Prepare Image Translation Datasets](./6_image_translation_datasets.md)" >> dataset_zoo/0_overview.md -cat dataset_zoo/6_image_translation_datasets.md | grep -oP '(- \[.*-dataset.*)' | sed '$a\n' |sed 's/- \[/ - \[/g' | sed 's/(#/(.\/6_image_translation_datasets.md#/g' >> dataset_zoo/0_overview.md diff --git a/docs/en/.dev_scripts/update_model_zoo.py b/docs/en/.dev_scripts/update_model_zoo.py index e24c664a3b..773397f152 100755 --- a/docs/en/.dev_scripts/update_model_zoo.py +++ b/docs/en/.dev_scripts/update_model_zoo.py @@ -3,6 +3,7 @@ import functools as func import glob +import os import os.path as osp import re from os.path import basename, dirname @@ -20,9 +21,54 @@ def anchor(name): name.strip().lower())).strip('-') +def summarize(stats, name, task='all'): + allpapers = func.reduce(lambda a, b: a.union(b), + [p for p, _, _, _, _, _ in stats]) + allconfigs = func.reduce(lambda a, b: a.union(b), + [c for _, c, _, _, _, _ in stats]) + allckpts = func.reduce(lambda a, b: a.union(b), + [c for _, _, c, _, _, _ in stats]) + alltasks = func.reduce(lambda a, b: a.union(b), + [t for _, _, _, t, _, _ in stats]) + task_desc = '\n - '.join(list(alltasks)) + + # Overview + papertypes, papercounts = np.unique([t for t, _ in allpapers], + return_counts=True) + countstr = '\n'.join( + [f' - {t}: {c}' for t, c in zip(papertypes, papercounts)]) + countstr = '\n'.join([f' - ALGORITHM: {len(stats)}']) + + summary = f"""# {name} +""" + + if name != 'Overview': + summary += '\n## Summary' + + summary += f""" +* Number of checkpoints: {len(allckpts)} +* Number of configs: {len(allconfigs)} +* Number of papers: {len(allpapers)} +{countstr} + """ + + if name == 'Overview': + summary += f""" +* Tasks: + - {task_desc} + + """ + + return summary + + # Count algorithms def update_model_zoo(): + target_dir = 'model_zoo' + + os.makedirs(target_dir, exist_ok=True) + root_dir = dirname(dirname(dirname(dirname(osp.abspath(__file__))))) files = sorted(glob.glob(osp.join(root_dir, 'configs/*/README.md'))) stats = [] @@ -33,6 +79,7 @@ def update_model_zoo(): # title title = content.split('\n')[0].replace('#', '') + year = title.split('\'')[-1].split(')')[0] # count papers papers = set( @@ -83,52 +130,52 @@ def update_model_zoo(): if len(tasks) > 0: statsmsg += f"\n* Tasks: {','.join(list(tasks))}" statsmsg += f""" + * Number of checkpoints: {len(ckpts)} * Number of configs: {len(configs)} * Number of papers: {len(papers)} {paperlist} """ - # * We should have: {len(glob.glob(osp.join(dirname(f), '*.py')))} - stats.append((papers, configs, ckpts, tasks, statsmsg)) - - allpapers = func.reduce(lambda a, b: a.union(b), - [p for p, _, _, _, _ in stats]) - allconfigs = func.reduce(lambda a, b: a.union(b), - [c for _, c, _, _, _ in stats]) - allckpts = func.reduce(lambda a, b: a.union(b), - [c for _, _, c, _, _ in stats]) - alltasks = func.reduce(lambda a, b: a.union(b), - [t for _, _, _, t, _ in stats]) - task_desc = '\n - '.join(list(alltasks)) + stats.append((papers, configs, ckpts, tasks, year, statsmsg)) - # Summarize + # overview + overview = summarize(stats, 'Overview') + with open(osp.join(target_dir, 'overview.md'), 'w') as f: + f.write(overview) - msglist = '\n'.join(x for _, _, _, _, x in stats) - papertypes, papercounts = np.unique([t for t, _ in allpapers], - return_counts=True) - countstr = '\n'.join( - [f' - {t}: {c}' for t, c in zip(papertypes, papercounts)]) - countstr = '\n'.join([f' - ALGORITHM: {len(stats)}']) - - modelzoo = f"""# Overview - -* Number of checkpoints: {len(allckpts)} -* Number of configs: {len(allconfigs)} -* Number of papers: {len(allpapers)} -{countstr} -* Tasks: - - {task_desc} - -For supported datasets, see [datasets overview](dataset_zoo/0_overview.md). + alltasks = func.reduce(lambda a, b: a.union(b), + [t for _, _, _, t, _, _ in stats]) -{msglist} + # index.rst + indexmsg = """ +.. toctree:: + :maxdepth: 1 + :caption: Model Zoo - """ + overview.md +""" - with open('3_model_zoo.md', 'w') as f: - f.write(modelzoo) + for task in alltasks: + task = task.replace(' ', '_').replace('-', '_').lower() + indexmsg += f' {task}.md\n' + + with open(osp.join(target_dir, 'index.rst'), 'w') as f: + f.write(indexmsg) + + # task-specific + for task in alltasks: + filtered_model = [(paper, config, ckpt, tasks, year, x) + for paper, config, ckpt, tasks, year, x in stats + if task in tasks] + filtered_model = sorted(filtered_model, key=lambda x: x[-2])[::-1] + overview = summarize(filtered_model, task) + msglist = '\n'.join(x for _, _, _, _, _, x in filtered_model) + + task = task.replace(' ', '_').replace('-', '_').lower() + with open(osp.join(target_dir, f'{task}.md'), 'w') as f: + f.write(overview + '\n' + msglist) if __name__ == '__main__': diff --git a/docs/en/.gitignore b/docs/en/.gitignore new file mode 100644 index 0000000000..db69732497 --- /dev/null +++ b/docs/en/.gitignore @@ -0,0 +1,3 @@ +model_zoo +dataset_zoo +autoapi diff --git a/docs/en/3_model_zoo.md b/docs/en/3_model_zoo.md deleted file mode 100644 index 138738c31a..0000000000 --- a/docs/en/3_model_zoo.md +++ /dev/null @@ -1,400 +0,0 @@ -# Overview - -- Number of checkpoints: 178 -- Number of configs: 174 -- Number of papers: 46 - - ALGORITHM: 47 -- Tasks: - - conditional gans - - image2image translation - - matting - - image restoration - - inpainting - - text2image - - video interpolation - - image2image - - unconditional gans - - colorization - - 3d-aware generation - - image generation - - image super-resolution - - internal learning - - video super-resolution - -For supported datasets, see [datasets overview](dataset_zoo/0_overview.md). - -## AOT-GAN (TVCG'2021) - -- Tasks: inpainting -- Number of checkpoints: 1 -- Number of configs: 1 -- Number of papers: 1 - - \[ALGORITHM\] Aggregated Contextual Transformations for High-Resolution Image Inpainting ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/aot_gan/README.md#citation)) - -## BasicVSR (CVPR'2021) - -- Tasks: video super-resolution -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Basicvsr: The Search for Essential Components in Video Super-Resolution and Beyond ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/basicvsr/README.md#citation)) - -## BasicVSR++ (CVPR'2022) - -- Tasks: video super-resolution -- Number of checkpoints: 7 -- Number of configs: 7 -- Number of papers: 1 - - \[ALGORITHM\] Basicvsr++: Improving Video Super-Resolution With Enhanced Propagation and Alignment ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/basicvsr_pp/README.md#citation)) - -## BigGAN (ICLR'2019) - -- Tasks: conditional gans -- Number of checkpoints: 7 -- Number of configs: 6 -- Number of papers: 1 - - \[ALGORITHM\] Large Scale {Gan ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/biggan/README.md#citation)) - -## CAIN (AAAI'2020) - -- Tasks: video interpolation -- Number of checkpoints: 1 -- Number of configs: 1 -- Number of papers: 1 - - \[ALGORITHM\] Channel Attention Is All You Need for Video Frame Interpolation ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/cain/README.md#citation)) - -## CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent Adversarial Networks (ICCV'2017) - -- Tasks: image2image translation -- Number of checkpoints: 6 -- Number of configs: 6 -- Number of papers: 1 - - \[ALGORITHM\] Unpaired Image-to-Image Translation Using Cycle-Consistent Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/cyclegan/README.md#citation)) - -## Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks (ICLR'2016) - -- Tasks: unconditional gans -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Unsupervised Representation Learning With Deep Convolutional Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/dcgan/README.md#citation)) - -## DeepFillv1 (CVPR'2018) - -- Tasks: inpainting -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Generative Image Inpainting With Contextual Attention ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/deepfillv1/README.md#citation)) - -## DeepFillv2 (CVPR'2019) - -- Tasks: inpainting -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Free-Form Image Inpainting With Gated Convolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/deepfillv2/README.md#citation)) - -## DIC (CVPR'2020) - -- Tasks: image super-resolution -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Deep Face Super-Resolution With Iterative Collaboration Between Attentive Recovery and Landmark Estimation ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/dic/README.md#citation)) - -## DIM (CVPR'2017) - -- Tasks: matting -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Deep Image Matting ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/dim/README.md#citation)) - -## Disco Diffusion - -- Tasks: text2image,image2image -- Number of checkpoints: 2 -- Number of configs: 0 -- Number of papers: 1 - - \[ALGORITHM\] Disco-Diffusion ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/disco_diffusion/README.md#citation)) - -## EDSR (CVPR'2017) - -- Tasks: image super-resolution -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Enhanced Deep Residual Networks for Single Image Super-Resolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/edsr/README.md#citation)) - -## EDVR (CVPRW'2019) - -- Tasks: video super-resolution -- Number of checkpoints: 4 -- Number of configs: 4 -- Number of papers: 1 - - \[ALGORITHM\] Edvr: Video Restoration With Enhanced Deformable Convolutional Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/edvr/README.md#citation)) - -## EG3D (CVPR'2022) - -- Tasks: 3d-aware generation -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Efficient Geometry-Aware 3d Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/eg3d/README.md#citation)) - -## ESRGAN (ECCVW'2018) - -- Tasks: image super-resolution -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Esrgan: Enhanced Super-Resolution Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/esrgan/README.md#citation)) - -## FLAVR (arXiv'2020) - -- Tasks: video interpolation -- Number of checkpoints: 1 -- Number of configs: 1 -- Number of papers: 1 - - \[ALGORITHM\] Flavr: Flow-Agnostic Video Representations for Fast Frame Interpolation ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/flavr/README.md#citation)) - -## GCA (AAAI'2020) - -- Tasks: matting -- Number of checkpoints: 4 -- Number of configs: 4 -- Number of papers: 1 - - \[ALGORITHM\] Natural Image Matting via Guided Contextual Attention ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/gca/README.md#citation)) - -## GGAN (ArXiv'2017) - -- Tasks: unconditional gans -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Geometric Gan ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/ggan/README.md#citation)) - -## GLEAN (CVPR'2021) - -- Tasks: image super-resolution -- Number of checkpoints: 4 -- Number of configs: 7 -- Number of papers: 1 - - \[ALGORITHM\] Glean: Generative Latent Bank for Large-Factor Image Super-Resolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/glean/README.md#citation)) - -## Global&Local (ToG'2017) - -- Tasks: inpainting -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Globally and Locally Consistent Image Completion ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/global_local/README.md#citation)) - -## Guided Diffusion (NeurIPS'2021) - -- Tasks: image generation -- Number of checkpoints: 2 -- Number of configs: 0 -- Number of papers: 1 - - \[ALGORITHM\] Diffusion Models Beat Gans on Image Synthesis ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/guided_diffusion/README.md#citation)) - -## IconVSR (CVPR'2021) - -- Tasks: video super-resolution -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Basicvsr: The Search for Essential Components in Video Super-Resolution and Beyond ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/iconvsr/README.md#citation)) - -## IndexNet (ICCV'2019) - -- Tasks: matting -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Indices Matter: Learning to Index for Deep Image Matting ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/indexnet/README.md#citation)) - -## Instance-aware Image Colorization (CVPR'2020) - -- Tasks: colorization -- Number of checkpoints: 1 -- Number of configs: 1 -- Number of papers: 1 - - \[ALGORITHM\] Instance-Aware Image Colorization ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/inst_colorization/README.md#quick-start)) - -## LIIF (CVPR'2021) - -- Tasks: image super-resolution -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Learning Continuous Image Representation With Local Implicit Image Function ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/liif/README.md#citation)) - -## LSGAN (ICCV'2017) - -- Tasks: unconditional gans -- Number of checkpoints: 4 -- Number of configs: 4 -- Number of papers: 1 - - \[ALGORITHM\] Least Squares Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/lsgan/README.md#citation)) - -## NAFNet (ECCV'2022) - -- Tasks: image restoration -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Simple Baselines for Image Restoration ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/nafnet/README.md#citation)) - -## PConv (ECCV'2018) - -- Tasks: inpainting -- Number of checkpoints: 2 -- Number of configs: 4 -- Number of papers: 1 - - \[ALGORITHM\] Image Inpainting for Irregular Holes Using Partial Convolutions ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/partial_conv/README.md#citation)) - -## PGGAN (ICLR'2018) - -- Tasks: unconditional gans -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Progressive Growing of Gans for Improved Quality, Stability, and Variation ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/pggan/README.md#citation)) - -## Pix2Pix (CVPR'2017) - -- Tasks: image2image translation -- Number of checkpoints: 4 -- Number of configs: 4 -- Number of papers: 1 - - \[ALGORITHM\] Image-to-Image Translation With Conditional Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/pix2pix/README.md#citation)) - -## Positional Encoding in GANs - -- Tasks: unconditional gans -- Number of checkpoints: 21 -- Number of configs: 21 -- Number of papers: 1 - - \[ALGORITHM\] Positional Encoding as Spatial Inductive Bias in Gans ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/positional_encoding_in_gans/README.md#citation)) - -## RDN (CVPR'2018) - -- Tasks: image super-resolution -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Residual Dense Network for Image Super-Resolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/rdn/README.md#citation)) - -## RealBasicVSR (CVPR'2022) - -- Tasks: video super-resolution -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Realbasicvsr: Investigating Tradeoffs in Real-World Video Super-Resolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/real_basicvsr/README.md#citation)) - -## Real-ESRGAN (ICCVW'2021) - -- Tasks: image super-resolution -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Real-Esrgan: Training Real-World Blind Super-Resolution With Pure Synthetic Data ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/real_esrgan/README.md#citation)) - -## SAGAN (ICML'2019) - -- Tasks: conditional gans -- Number of checkpoints: 9 -- Number of configs: 6 -- Number of papers: 1 - - \[ALGORITHM\] Self-Attention Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/sagan/README.md#citation)) - -## SinGAN (ICCV'2019) - -- Tasks: internal learning -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Singan: Learning a Generative Model From a Single Natural Image ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/singan/README.md#citation)) - -## SNGAN (ICLR'2018) - -- Tasks: conditional gans -- Number of checkpoints: 10 -- Number of configs: 6 -- Number of papers: 1 - - \[ALGORITHM\] Spectral Normalization for Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/sngan_proj/README.md#citation)) - -## SRCNN (TPAMI'2015) - -- Tasks: image super-resolution -- Number of checkpoints: 1 -- Number of configs: 1 -- Number of papers: 1 - - \[ALGORITHM\] Image Super-Resolution Using Deep Convolutional Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/srcnn/README.md#citation)) - -## SRGAN (CVPR'2016) - -- Tasks: image super-resolution -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/srgan_resnet/README.md#citation)) - -## StyleGANv1 (CVPR'2019) - -- Tasks: unconditional gans -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] A Style-Based Generator Architecture for Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/styleganv1/README.md#citation)) - -## StyleGANv2 (CVPR'2020) - -- Tasks: unconditional gans -- Number of checkpoints: 12 -- Number of configs: 12 -- Number of papers: 1 - - \[ALGORITHM\] Analyzing and Improving the Image Quality of Stylegan ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/styleganv2/README.md#citation)) - -## StyleGANv3 (NeurIPS'2021) - -- Tasks: unconditional gans -- Number of checkpoints: 9 -- Number of configs: 10 -- Number of papers: 1 - - \[ALGORITHM\] Alias-Free Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/styleganv3/README.md#citation)) - -## TDAN (CVPR'2020) - -- Tasks: video super-resolution -- Number of checkpoints: 2 -- Number of configs: 4 -- Number of papers: 1 - - \[ALGORITHM\] Tdan: Temporally-Deformable Alignment Network for Video Super-Resolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/tdan/README.md#citation)) - -## TOFlow (IJCV'2019) - -- Tasks: video super-resolution,video interpolation -- Number of checkpoints: 6 -- Number of configs: 6 -- Number of papers: 1 - - \[ALGORITHM\] Video Enhancement With Task-Oriented Flow ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/tof/README.md#citation)) - -## TTSR (CVPR'2020) - -- Tasks: image super-resolution -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Learning Texture Transformer Network for Image Super-Resolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/ttsr/README.md#citation)) - -## WGAN-GP (NeurIPS'2017) - -- Tasks: unconditional gans -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Improved Training of Wasserstein Gans ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/wgan-gp/README.md#citation)) diff --git a/docs/en/Makefile b/docs/en/Makefile index 5f9c6de4b5..56ae5906ce 100644 --- a/docs/en/Makefile +++ b/docs/en/Makefile @@ -18,4 +18,6 @@ help: # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile rm -rf _build + rm -rf model_zoo + rm -rf dataset_zoo @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/en/advanced_guides/data_flow.md b/docs/en/advanced_guides/data_flow.md index 8e52420ef7..5fb38c7fd8 100644 --- a/docs/en/advanced_guides/data_flow.md +++ b/docs/en/advanced_guides/data_flow.md @@ -1,4 +1,4 @@ -# Data Flow in MMEditing \[Coming Soon!\] +# Data flow in MMEditing \[Coming Soon!\] We're improving this documentation. Don't hesitate to join us! diff --git a/docs/en/advanced_guides/data_preprocessor.md b/docs/en/advanced_guides/data_preprocessor.md index 3b36403d19..70431b77b1 100644 --- a/docs/en/advanced_guides/data_preprocessor.md +++ b/docs/en/advanced_guides/data_preprocessor.md @@ -1,4 +1,4 @@ -# Data Pre-Processor \[Coming Soon!\] +# Data pre-processor \[Coming Soon!\] We're improving this documentation. Don't hesitate to join us! diff --git a/docs/en/advanced_guides/structures.md b/docs/en/advanced_guides/structures.md index 7bb959fedf..1bd386f146 100644 --- a/docs/en/advanced_guides/structures.md +++ b/docs/en/advanced_guides/structures.md @@ -1,4 +1,4 @@ -# Data Structure in MMEditing \[Coming Soon!\] +# Data structure in MMEditing \[Coming Soon!\] We're improving this documentation. Don't hesitate to join us! diff --git a/docs/en/community/changelog.md b/docs/en/changelog.md similarity index 100% rename from docs/en/community/changelog.md rename to docs/en/changelog.md diff --git a/docs/en/conf.py b/docs/en/conf.py index fc8a5c89d7..d6aed67aad 100644 --- a/docs/en/conf.py +++ b/docs/en/conf.py @@ -148,8 +148,8 @@ def builder_inited_handler(app): - subprocess.run(['bash', './.dev_scripts/update_dataset_zoo.sh']) subprocess.run(['python', './.dev_scripts/update_model_zoo.py']) + subprocess.run(['python', './.dev_scripts/update_dataset_zoo.py']) def skip_member(app, what, name, obj, skip, options): diff --git a/docs/en/dataset_zoo/0_overview.md b/docs/en/dataset_zoo/0_overview.md deleted file mode 100644 index d0a2da7f40..0000000000 --- a/docs/en/dataset_zoo/0_overview.md +++ /dev/null @@ -1,18 +0,0 @@ -# Overview - -- [Prepare Super-Resolution Datasets](./1_super_resolution_datasets.md) - - [DF2K_OST](./1_super_resolution_datasets.md#df2k_ost-dataset) \[ [Homepage](https://github.com/xinntao/Real-ESRGAN/blob/master/docs/Training.md) \] - - [DIV2K](./1_super_resolution_datasets.md#div2k-dataset) \[ [Homepage](https://data.vision.ee.ethz.ch/cvl/DIV2K/) \] - - [REDS](./1_super_resolution_datasets.md#reds-dataset) \[ [Homepage](https://seungjunnah.github.io/Datasets/reds.html) \] - - [Vid4](./1_super_resolution_datasets.md#vid4-dataset) \[ [Homepage](https://drive.google.com/file/d/1ZuvNNLgR85TV_whJoHM7uVb-XW1y70DW/view) \] - - [Vimeo90K](./1_super_resolution_datasets.md#vimeo90k-dataset) \[ [Homepage](http://toflow.csail.mit.edu) \] -- [Prepare Inpainting Datasets](./2_inpainting_datasets.md) - - [CelebA-HQ](./2_inpainting_datasets.md#celeba-hq-dataset) \[ [Homepage](https://github.com/tkarras/progressive_growing_of_gans#preparing-datasets-for-training) \] - - [Paris Street View](./2_inpainting_datasets.md#paris-street-view-dataset) \[ [Homepage](https://github.com/pathak22/context-encoder/issues/24) \] - - [Places365](./2_inpainting_datasets.md#places365-dataset) \[ [Homepage](http://places2.csail.mit.edu/) \] -- [Prepare Matting Datasets](./3_matting_datasets.md) - - [Composition-1k](./3_matting_datasets.md#composition-1k-dataset) \[ [Homepage](https://sites.google.com/view/deepimagematting) \] -- [Prepare Video Frame Interpolation Datasets](./4_video_interpolation_datasets.md) - - [Vimeo90K-triplet](./4_video_interpolation_datasets.md#vimeo90k-triplet-dataset) \[ [Homepage](http://toflow.csail.mit.edu) \] -- [Prepare Unconditional GANs Datasets](./5_unconditional_gans_datasets.md) -- [Prepare Image Translation Datasets](./6_image_translation_datasets.md) diff --git a/docs/en/dataset_zoo/1_super_resolution_datasets.md b/docs/en/dataset_zoo/1_super_resolution_datasets.md deleted file mode 100644 index e6afa8ff6d..0000000000 --- a/docs/en/dataset_zoo/1_super_resolution_datasets.md +++ /dev/null @@ -1,356 +0,0 @@ -# Super-Resolution Datasets - -It is recommended to symlink the dataset root to `$MMEDITING/data`. If your folder structure is different, you may need to change the corresponding paths in config files. - -MMEditing supported super-resolution datasets: - -- Image Super-Resolution - - [DF2K_OST](#df2k_ost-dataset) \[ [Homepage](https://github.com/xinntao/Real-ESRGAN/blob/master/docs/Training.md) \] - - [DIV2K](#div2k-dataset) \[ [Homepage](https://data.vision.ee.ethz.ch/cvl/DIV2K/) \] -- Video Super-Resolution - - [REDS](#reds-dataset) \[ [Homepage](https://seungjunnah.github.io/Datasets/reds.html) \] - - [Vid4](#vid4-dataset) \[ [Homepage](https://drive.google.com/file/d/1ZuvNNLgR85TV_whJoHM7uVb-XW1y70DW/view) \] - - [Vimeo90K](#vimeo90k-dataset) \[ [Homepage](http://toflow.csail.mit.edu) \] - -## DF2K_OST Dataset - - - -```bibtex -@inproceedings{wang2021real, - title={Real-ESRGAN: Training Real-World Blind Super-Resolution with Pure Synthetic Data}, - author={Wang, Xintao and Xie, Liangbin and Dong, Chao and Shan, Ying}, - booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision}, - pages={1905--1914}, - year={2021} -} -``` - -- The DIV2K dataset can be downloaded from [here](https://data.vision.ee.ethz.ch/cvl/DIV2K/) (We use the training set only). -- The Flickr2K dataset can be downloaded [here](https://cv.snu.ac.kr/research/EDSR/Flickr2K.tar) (We use the training set only). -- The OST dataset can be downloaded [here](https://openmmlab.oss-cn-hangzhou.aliyuncs.com/datasets/OST_dataset.zip) (We use the training set only). - -Please first put all the images into the `GT` folder (naming does not need to be in order): - -```text -mmediting -├── mmedit -├── tools -├── configs -├── data -│ ├── df2k_ost -│ │ ├── GT -│ │ │ ├── 0001.png -│ │ │ ├── 0002.png -│ │ │ ├── ... -... -``` - -### Crop sub-images - -For faster IO, we recommend to crop the images to sub-images. We provide such a script: - -```shell -python tools/dataset_converters/super-resolution/df2k_ost/preprocess_df2k_ost_dataset.py --data-root ./data/df2k_ost -``` - -The generated data is stored under `df2k_ost` and the data structure is as follows, where `_sub` indicates the sub-images. - -```text -mmediting -├── mmedit -├── tools -├── configs -├── data -│ ├── df2k_ost -│ │ ├── GT -│ │ ├── GT_sub -... -``` - -### Prepare LMDB dataset for DF2K_OST - -If you want to use LMDB datasets for faster IO speed, you can make LMDB files by: - -```shell -python tools/dataset_converters/super-resolution/df2k_ost/preprocess_df2k_ost_dataset.py --data-root ./data/df2k_ost --make-lmdb -``` - -## DIV2K Dataset - - - -```bibtex -@InProceedings{Agustsson_2017_CVPR_Workshops, - author = {Agustsson, Eirikur and Timofte, Radu}, - title = {NTIRE 2017 Challenge on Single Image Super-Resolution: Dataset and Study}, - booktitle = {The IEEE Conference on Computer Vision and Pattern Recognition (CVPR) Workshops}, - month = {July}, - year = {2017} -} -``` - -- Training dataset: [DIV2K dataset](https://data.vision.ee.ethz.ch/cvl/DIV2K/). -- Validation dataset: Set5 and Set14. - -```text -mmediting -├── mmedit -├── tools -├── configs -├── data -│ ├── DIV2K -│ │ ├── DIV2K_train_HR -│ │ ├── DIV2K_train_LR_bicubic -│ │ │ ├── X2 -│ │ │ ├── X3 -│ │ │ ├── X4 -│ │ ├── DIV2K_valid_HR -│ │ ├── DIV2K_valid_LR_bicubic -│ │ │ ├── X2 -│ │ │ ├── X3 -│ │ │ ├── X4 -│ ├── Set5 -│ │ ├── GTmod12 -│ │ ├── LRbicx2 -│ │ ├── LRbicx3 -│ │ ├── LRbicx4 -│ ├── Set14 -│ │ ├── GTmod12 -│ │ ├── LRbicx2 -│ │ ├── LRbicx3 -│ │ ├── LRbicx4 -``` - -### Crop sub-images - -For faster IO, we recommend to crop the DIV2K images to sub-images. We provide such a script: - -```shell -python tools/dataset_converters/super-resolution/div2k/preprocess_div2k_dataset.py --data-root ./data/DIV2K -``` - -The generated data is stored under `DIV2K` and the data structure is as follows, where `_sub` indicates the sub-images. - -```text -mmediting -├── mmedit -├── tools -├── configs -├── data -│ ├── DIV2K -│ │ ├── DIV2K_train_HR -│ │ ├── DIV2K_train_HR_sub -│ │ ├── DIV2K_train_LR_bicubic -│ │ │ ├── X2 -│ │ │ ├── X3 -│ │ │ ├── X4 -│ │ │ ├── X2_sub -│ │ │ ├── X3_sub -│ │ │ ├── X4_sub -│ │ ├── DIV2K_valid_HR -│ │ ├── ... -... -``` - -### Prepare annotation list - -If you use the annotation mode for the dataset, you first need to prepare a specific `txt` file. - -Each line in the annotation file contains the image names and image shape (usually for the ground-truth images), separated by a white space. - -Example of an annotation file: - -```text -0001_s001.png (480,480,3) -0001_s002.png (480,480,3) -``` - -### Prepare LMDB dataset for DIV2K - -If you want to use LMDB datasets for faster IO speed, you can make LMDB files by: - -```shell -python tools/dataset_converters/super-resolution/div2k/preprocess_div2k_dataset.py --data-root ./data/DIV2K --make-lmdb -``` - -## REDS Dataset - - - -```bibtex -@InProceedings{Nah_2019_CVPR_Workshops_REDS, - author = {Nah, Seungjun and Baik, Sungyong and Hong, Seokil and Moon, Gyeongsik and Son, Sanghyun and Timofte, Radu and Lee, Kyoung Mu}, - title = {NTIRE 2019 Challenge on Video Deblurring and Super-Resolution: Dataset and Study}, - booktitle = {The IEEE Conference on Computer Vision and Pattern Recognition (CVPR) Workshops}, - month = {June}, - year = {2019} -} -``` - -- Training dataset: [REDS dataset](https://seungjunnah.github.io/Datasets/reds.html). -- Validation dataset: [REDS dataset](https://seungjunnah.github.io/Datasets/reds.html) and Vid4. - -Note that we merge train and val datasets in REDS for easy switching between REDS4 partition (used in EDVR) and the official validation partition. -The original val dataset (clip names from 000 to 029) are modified to avoid conflicts with training dataset (total 240 clips). Specifically, the clip names are changed to 240, 241, ... 269. - -You can prepare the REDS dataset by running: - -```shell -python tools/dataset_converters/super-resolution/reds/preprocess_reds_dataset.py --root-path ./data/REDS -``` - -```text -mmediting -├── mmedit -├── tools -├── configs -├── data -│ ├── REDS -│ │ ├── train_sharp -│ │ │ ├── 000 -│ │ │ ├── 001 -│ │ │ ├── ... -│ │ ├── train_sharp_bicubic -│ │ │ ├── 000 -│ │ │ ├── 001 -│ │ │ ├── ... -│ ├── REDS4 -│ │ ├── GT -│ │ ├── sharp_bicubic -``` - -### Prepare LMDB dataset for REDS - -If you want to use LMDB datasets for faster IO speed, you can make LMDB files by: - -```shell -python tools/dataset_converters/super-resolution/reds/preprocess_reds_dataset.py --root-path ./data/REDS --make-lmdb -``` - -### Crop to sub-images - -MMEditing also support cropping REDS images to sub-images for faster IO. We provide such a script: - -```shell -python tools/dataset_converters/super-resolution/reds/crop_sub_images.py --data-root ./data/REDS -scales 4 -``` - -The generated data is stored under `REDS` and the data structure is as follows, where `_sub` indicates the sub-images. - -```text -mmediting -├── mmedit -├── tools -├── configs -├── data -│ ├── REDS -│ │ ├── train_sharp -│ │ │ ├── 000 -│ │ │ ├── 001 -│ │ │ ├── ... -│ │ ├── train_sharp_sub -│ │ │ ├── 000_s001 -│ │ │ ├── 000_s002 -│ │ │ ├── ... -│ │ │ ├── 001_s001 -│ │ │ ├── ... -│ │ ├── train_sharp_bicubic -│ │ │ ├── X4 -│ │ │ │ ├── 000 -│ │ │ │ ├── 001 -│ │ │ │ ├── ... -│ │ │ ├── X4_sub -│ │ │ ├── 000_s001 -│ │ │ ├── 000_s002 -│ │ │ ├── ... -│ │ │ ├── 001_s001 -│ │ │ ├── ... -``` - -Note that by default `preprocess_reds_dataset.py` does not make lmdb and annotation file for the cropped dataset. You may need to modify the scripts a little bit for such operations. - -## Vid4 Dataset - - - -```bibtex -@article{xue2019video, - title={On Bayesian adaptive video super resolution}, - author={Liu, Ce and Sun, Deqing}, - journal={IEEE Transactions on Pattern Analysis and Machine Intelligence}, - volume={36}, - number={2}, - pages={346--360}, - year={2013}, - publisher={IEEE} -} -``` - -The Vid4 dataset can be downloaded from [here](https://drive.google.com/file/d/1ZuvNNLgR85TV_whJoHM7uVb-XW1y70DW/view?usp=sharing). There are two degradations in the dataset. - -1. BIx4 contains images downsampled by bicubic interpolation -2. BDx4 contains images blurred by Gaussian kernel with σ=1.6, followed by a subsampling every four pixels. - -## Vimeo90K Dataset - - - -```bibtex -@article{xue2019video, - title={Video Enhancement with Task-Oriented Flow}, - author={Xue, Tianfan and Chen, Baian and Wu, Jiajun and Wei, Donglai and Freeman, William T}, - journal={International Journal of Computer Vision (IJCV)}, - volume={127}, - number={8}, - pages={1106--1125}, - year={2019}, - publisher={Springer} -} -``` - -The training and test datasets can be download from [here](http://toflow.csail.mit.edu/). - -The Vimeo90K dataset has a `clip/sequence/img` folder structure: - -```text -mmediting -├── mmedit -├── tools -├── configs -├── data -│ ├── vimeo_triplet -│ │ ├── BDx4 -│ │ │ ├── 00001 -│ │ │ │ ├── 0001 -│ │ │ │ │ ├── im1.png -│ │ │ │ │ ├── im2.png -│ │ │ │ │ ├── ... -│ │ │ │ ├── 0002 -│ │ │ │ ├── 0003 -│ │ │ │ ├── ... -│ │ │ ├── 00002 -│ │ │ ├── ... -│ │ ├── BIx4 -│ │ ├── GT -│ │ ├── meta_info_Vimeo90K_test_GT.txt -│ │ ├── meta_info_Vimeo90K_train_GT.txt -``` - -### Prepare the annotation files for Vimeo90K dataset - -To prepare the annotation file for training, you need to download the official training list path for Vimeo90K from the official website, and run the following command: - -```shell -python tools/dataset_converters/super-resolution/vimeo90k/preprocess_vimeo90k_dataset.py ./data/Vimeo90K/official_train_list.txt -``` - -The annotation file for test is generated similarly. - -### Prepare LMDB dataset for Vimeo90K - -If you want to use LMDB datasets for faster IO speed, you can make LMDB files by: - -```shell -python tools/dataset_converters/super-resolution/vimeo90k/preprocess_vimeo90k_dataset.py ./data/Vimeo90K/official_train_list.txt --gt-path ./data/Vimeo90K/GT --lq-path ./data/Vimeo90K/LQ --make-lmdb -``` diff --git a/docs/en/dataset_zoo/2_inpainting_datasets.md b/docs/en/dataset_zoo/2_inpainting_datasets.md deleted file mode 100644 index f5dac5abac..0000000000 --- a/docs/en/dataset_zoo/2_inpainting_datasets.md +++ /dev/null @@ -1,114 +0,0 @@ -# Inpainting Datasets - -It is recommended to symlink the dataset root to `$MMEDITING/data`. If your folder structure is different, you may need to change the corresponding paths in config files. - -MMEditing supported inpainting datasets: - -- [CelebA-HQ](#celeba-hq-dataset) \[ [Homepage](https://github.com/tkarras/progressive_growing_of_gans#preparing-datasets-for-training) \] -- [Paris Street View](#paris-street-view-dataset) \[ [Homepage](https://github.com/pathak22/context-encoder/issues/24) \] -- [Places365](#places365-dataset) \[ [Homepage](http://places2.csail.mit.edu/) \] - -As we only need images for inpainting task, further preparation is not necessary and the folder structure can be different from the example. You can utilize the information provided by the original dataset like `Place365` (e.g. `meta`). Also, you can easily scan the data set and list all of the images to a specific `txt` file. Here is an example for the `Places365_val.txt` from Places365 and we will only use the image name information in inpainting. - -``` -Places365_val_00000001.jpg 165 -Places365_val_00000002.jpg 358 -Places365_val_00000003.jpg 93 -Places365_val_00000004.jpg 164 -Places365_val_00000005.jpg 289 -Places365_val_00000006.jpg 106 -Places365_val_00000007.jpg 81 -Places365_val_00000008.jpg 121 -Places365_val_00000009.jpg 150 -Places365_val_00000010.jpg 302 -Places365_val_00000011.jpg 42 -``` - -## CelebA-HQ Dataset - - - -```bibtex -@article{karras2017progressive, - title={Progressive growing of gans for improved quality, stability, and variation}, - author={Karras, Tero and Aila, Timo and Laine, Samuli and Lehtinen, Jaakko}, - journal={arXiv preprint arXiv:1710.10196}, - year={2017} -} -``` - -Follow the instructions [here](https://github.com/tkarras/progressive_growing_of_gans##preparing-datasets-for-training) to prepare the dataset. - -```text -mmediting -├── mmedit -├── tools -├── configs -├── data -│ ├── CelebA-HQ -│ │ ├── train_256 -| | ├── test_256 -| | ├── train_celeba_img_list.txt -| | ├── val_celeba_img_list.txt - -``` - -## Paris Street View Dataset - - - -```bibtex -@inproceedings{pathak2016context, - title={Context encoders: Feature learning by inpainting}, - author={Pathak, Deepak and Krahenbuhl, Philipp and Donahue, Jeff and Darrell, Trevor and Efros, Alexei A}, - booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition}, - pages={2536--2544}, - year={2016} -} -``` - -Obtain the dataset [here](https://github.com/pathak22/context-encoder/issues/24). - -```text -mmediting -├── mmedit -├── tools -├── configs -├── data -│ ├── paris_street_view -│ │ ├── train -| | ├── val - -``` - -## Places365 Dataset - - - -```bibtex - @article{zhou2017places, - title={Places: A 10 million Image Database for Scene Recognition}, - author={Zhou, Bolei and Lapedriza, Agata and Khosla, Aditya and Oliva, Aude and Torralba, Antonio}, - journal={IEEE Transactions on Pattern Analysis and Machine Intelligence}, - year={2017}, - publisher={IEEE} - } - -``` - -Prepare the data from [Places365](http://places2.csail.mit.edu/download.html). - -```text -mmediting -├── mmedit -├── tools -├── configs -├── data -│ ├── Places -│ │ ├── data_large -│ │ ├── val_large -| | ├── meta -| | | ├── places365_train_challenge.txt -| | | ├── places365_val.txt - -``` diff --git a/docs/en/dataset_zoo/3_matting_datasets.md b/docs/en/dataset_zoo/3_matting_datasets.md deleted file mode 100644 index cc9c95f924..0000000000 --- a/docs/en/dataset_zoo/3_matting_datasets.md +++ /dev/null @@ -1,147 +0,0 @@ -# Matting Datasets - -It is recommended to symlink the dataset root to `$MMEDITING/data`. If your folder structure is different, you may need to change the corresponding paths in config files. - -MMEditing supported matting datasets: - -- [Composition-1k](#composition-1k-dataset) \[ [Homepage](https://sites.google.com/view/deepimagematting) \] - -## Composition-1k Dataset - -### Introduction - - - -```bibtex -@inproceedings{xu2017deep, - title={Deep image matting}, - author={Xu, Ning and Price, Brian and Cohen, Scott and Huang, Thomas}, - booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition}, - pages={2970--2979}, - year={2017} -} -``` - -The Adobe Composition-1k dataset consists of foreground images and their corresponding alpha images. -To get the full dataset, one need to composite the foregrounds with selected backgrounds from the COCO dataset and the Pascal VOC dataset. - -### Obtain and Extract - -Please follow the instructions of [paper authors](https://sites.google.com/view/deepimagematting) to obtain the Composition-1k (comp1k) dataset. - -### Composite the full dataset - -The Adobe composition-1k dataset contains only `alpha` and `fg` (and `trimap` in test set). -It is needed to merge `fg` with COCO data (training) or VOC data (test) before training or evaluation. -Use the following script to perform image composition and generate annotation files for training or testing: - -```shell -## The script is run under the root folder of MMEditing -python tools/dataset_converters/matting/comp1k/preprocess_comp1k_dataset.py data/adobe_composition-1k data/coco data/VOCdevkit --composite -``` - -The generated data is stored under `adobe_composition-1k/Training_set` and `adobe_composition-1k/Test_set` respectively. -If you only want to composite test data (since compositing training data is time-consuming), you can skip compositing the training set by removing the `--composite` option: - -```shell -## skip compositing training set -python tools/dataset_converters/matting/comp1k/preprocess_comp1k_dataset.py data/adobe_composition-1k data/coco data/VOCdevkit -``` - -If you only want to preprocess test data, i.e. for FBA, you can skip the train set by adding the `--skip-train` option: - -```shell -## skip preprocessing training set -python tools/data/matting/comp1k/preprocess_comp1k_dataset.py data/adobe_composition-1k data/coco data/VOCdevkit --skip-train -``` - -> Currently, `GCA` and `FBA` support online composition of training data. But you can modify the data pipeline of other models to perform online composition instead of loading composited images (we called it `merged` in our data pipeline). - -### Check Directory Structure for DIM - -The result folder structure should look like: - -```text -mmediting -├── mmedit -├── tools -├── configs -├── data -│ ├── adobe_composition-1k -│ │ ├── Test_set -│ │ │ ├── Adobe-licensed images -│ │ │ │ ├── alpha -│ │ │ │ ├── fg -│ │ │ │ ├── trimaps -│ │ │ ├── merged (generated by tools/dataset_converters/matting/comp1k/preprocess_comp1k_dataset.py) -│ │ │ ├── bg (generated by tools/dataset_converters/matting/comp1k/preprocess_comp1k_dataset.py) -│ │ ├── Training_set -│ │ │ ├── Adobe-licensed images -│ │ │ │ ├── alpha -│ │ │ │ ├── fg -│ │ │ ├── Other -│ │ │ │ ├── alpha -│ │ │ │ ├── fg -│ │ │ ├── merged (generated by tools/dataset_converters/matting/comp1k/preprocess_comp1k_dataset.py) -│ │ │ ├── bg (generated by tools/dataset_converters/matting/comp1k/preprocess_comp1k_dataset.py) -│ │ ├── test_list.json (generated by tools/dataset_converters/matting/comp1k/preprocess_comp1k_dataset.py) -│ │ ├── training_list.json (generated by tools/dataset_converters/matting/comp1k/preprocess_comp1k_dataset.py) -│ ├── coco -│ │ ├── train2014 (or train2017) -│ ├── VOCdevkit -│ │ ├── VOC2012 -``` - -### Prepare the dataset for FBA - -FBA adopts dynamic dataset augmentation proposed in [Learning-base Sampling for Natural Image Matting](https://openaccess.thecvf.com/content_CVPR_2019/papers/Tang_Learning-Based_Sampling_for_Natural_Image_Matting_CVPR_2019_paper.pdf). -In addition, to reduce artifacts during augmentation, it uses the extended version of foreground as foreground. -We provide scripts to estimate foregrounds. - -Prepare the test set as follows: - -```shell -## skip preprocessing training set, as it composites online during training -python tools/dataset_converters/matting/comp1k/preprocess_comp1k_dataset.py data/adobe_composition-1k data/coco data/VOCdevkit --skip-train -``` - -Extend the foreground of training set as follows: - -```shell -python tools/dataset_converters/matting/comp1k/extend_fg.py data/adobe_composition-1k -``` - -### Check Directory Structure for DIM - -The final folder structure should look like: - -```text -mmediting -├── mmedit -├── tools -├── configs -├── data -│ ├── adobe_composition-1k -│ │ ├── Test_set -│ │ │ ├── Adobe-licensed images -│ │ │ │ ├── alpha -│ │ │ │ ├── fg -│ │ │ │ ├── trimaps -│ │ │ ├── merged (generated by tools/data/matting/comp1k/preprocess_comp1k_dataset.py) -│ │ │ ├── bg (generated by tools/data/matting/comp1k/preprocess_comp1k_dataset.py) -│ │ ├── Training_set -│ │ │ ├── Adobe-licensed images -│ │ │ │ ├── alpha -│ │ │ │ ├── fg -│ │ │ │ ├── fg_extended (generated by tools/data/matting/comp1k/extend_fg.py) -│ │ │ ├── Other -│ │ │ │ ├── alpha -│ │ │ │ ├── fg -│ │ │ │ ├── fg_extended (generated by tools/data/matting/comp1k/extend_fg.py) -│ │ ├── test_list.json (generated by tools/data/matting/comp1k/preprocess_comp1k_dataset.py) -│ │ ├── training_list_fba.json (generated by tools/data/matting/comp1k/extend_fg.py) -│ ├── coco -│ │ ├── train2014 (or train2017) -│ ├── VOCdevkit -│ │ ├── VOC2012 -``` diff --git a/docs/en/dataset_zoo/4_video_interpolation_datasets.md b/docs/en/dataset_zoo/4_video_interpolation_datasets.md deleted file mode 100644 index 9889939c91..0000000000 --- a/docs/en/dataset_zoo/4_video_interpolation_datasets.md +++ /dev/null @@ -1,50 +0,0 @@ -# Video Frame Interpolation Datasets - -It is recommended to symlink the dataset root to `$MMEDITING/data`. If your folder structure is different, you may need to change the corresponding paths in config files. - -MMEditing supported video frame interpolation datasets: - -- [Vimeo90K-triplet](#vimeo90k-triplet-dataset) \[ [Homepage](http://toflow.csail.mit.edu) \] - -## Vimeo90K-triplet Dataset - - - -```bibtex -@article{xue2019video, - title={Video Enhancement with Task-Oriented Flow}, - author={Xue, Tianfan and Chen, Baian and Wu, Jiajun and Wei, Donglai and Freeman, William T}, - journal={International Journal of Computer Vision (IJCV)}, - volume={127}, - number={8}, - pages={1106--1125}, - year={2019}, - publisher={Springer} -} -``` - -The training and test datasets can be download from [here](http://toflow.csail.mit.edu/). - -The Vimeo90K-triplet dataset has a `clip/sequence/img` folder structure: - -```text -mmediting -├── mmedit -├── tools -├── configs -├── data -│ ├── vimeo_triplet -│ │ ├── tri_testlist.txt -│ │ ├── tri_trainlist.txt -│ │ ├── sequences -│ │ │ ├── 00001 -│ │ │ │ ├── 0001 -│ │ │ │ │ ├── im1.png -│ │ │ │ │ ├── im2.png -│ │ │ │ │ └── im3.png -│ │ │ │ ├── 0002 -│ │ │ │ ├── 0003 -│ │ │ │ ├── ... -│ │ │ ├── 00002 -│ │ │ ├── ... -``` diff --git a/docs/en/dataset_zoo/5_unconditional_gans_datasets.md b/docs/en/dataset_zoo/5_unconditional_gans_datasets.md deleted file mode 100644 index f5024af12b..0000000000 --- a/docs/en/dataset_zoo/5_unconditional_gans_datasets.md +++ /dev/null @@ -1,91 +0,0 @@ -# Unconditional GANs Datasets - -**Data preparation for unconditional model** is simple. What you need to do is downloading the images and put them into a directory. Next, you should set a symlink in the `data` directory. For standard unconditional gans with static architectures, like DCGAN and StyleGAN2, `UnconditionalImageDataset` is designed to train such unconditional models. Here is an example config for FFHQ dataset: - -```python -dataset_type = 'BasicImageDataset' - -train_pipeline = [ - dict(type='LoadImageFromFile', key='img'), - dict(type='Flip', keys=['img'], direction='horizontal'), - dict(type='PackEditInputs', keys=['img'], meta_keys=['img_path']) -] - -# `batch_size` and `data_root` need to be set. -train_dataloader = dict( - batch_size=4, - num_workers=8, - persistent_workers=True, - sampler=dict(type='InfiniteSampler', shuffle=True), - dataset=dict( - type=dataset_type, - data_root=None, # set by user - pipeline=train_pipeline)) -``` - -Here, we adopt `InfinitySampler` to avoid frequent dataloader reloading, which will accelerate the training procedure. As shown in the example, `pipeline` provides important data pipeline to process images, including loading from file system, resizing, cropping, transferring to `torch.Tensor` and packing to `EditDataSample`. All of supported data pipelines can be found in `mmedit/datasets/transforms`. - -For unconditional GANs with dynamic architectures like PGGAN and StyleGANv1, `GrowScaleImgDataset` is recommended to use for training. Since such dynamic architectures need real images in different scales, directly adopting `UnconditionalImageDataset` will bring heavy I/O cost for loading multiple high-resolution images. Here is an example we use for training PGGAN in CelebA-HQ dataset: - -```python -dataset_type = 'GrowScaleImgDataset' - -pipeline = [ - dict(type='LoadImageFromFile', key='img'), - dict(type='Flip', keys=['img'], direction='horizontal'), - dict(type='PackEditInputs') -] - -# `samples_per_gpu` and `imgs_root` need to be set. -train_dataloader = dict( - num_workers=4, - batch_size=64, - dataset=dict( - type='GrowScaleImgDataset', - data_roots={ - '1024': './data/ffhq/images', - '256': './data/ffhq/ffhq_imgs/ffhq_256', - '64': './data/ffhq/ffhq_imgs/ffhq_64' - }, - gpu_samples_base=4, - # note that this should be changed with total gpu number - gpu_samples_per_scale={ - '4': 64, - '8': 32, - '16': 16, - '32': 8, - '64': 4, - '128': 4, - '256': 4, - '512': 4, - '1024': 4 - }, - len_per_stage=300000, - pipeline=pipeline), - sampler=dict(type='InfiniteSampler', shuffle=True)) -``` - -In this dataset, you should provide a dictionary of image paths to the `data_roots`. Thus, you should resize the images in the dataset in advance. -For the resizing methods in the data pre-processing, we adopt bilinear interpolation methods in all of the experiments studied in MMEditing. - -Note that this dataset should be used with `PGGANFetchDataHook`. In this config file, this hook should be added in the customized hooks, as shown below. - -```python -custom_hooks = [ - dict( - type='GenVisualizationHook', - interval=5000, - fixed_input=True, - # vis ema and orig at the same time - vis_kwargs_list=dict( - type='Noise', - name='fake_img', - sample_model='ema/orig', - target_keys=['ema', 'orig'])), - dict(type='PGGANFetchDataHook') -] -``` - -This fetching data hook helps the dataloader update the status of dataset to change the data source and batch size during training. - -Here, we provide several download links of datasets frequently used in unconditional models: [LSUN](http://dl.yf.io/lsun/), [CelebA](http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html), [CelebA-HQ](https://drive.google.com/drive/folders/11Vz0fqHS2rXDb5pprgTjpD7S2BAJhi1P), [FFHQ](https://drive.google.com/drive/folders/1u2xu7bSrWxrbUxk-dT-UvEJq8IjdmNTP). diff --git a/docs/en/dataset_zoo/6_image_translation_datasets.md b/docs/en/dataset_zoo/6_image_translation_datasets.md deleted file mode 100644 index 51e5312cdd..0000000000 --- a/docs/en/dataset_zoo/6_image_translation_datasets.md +++ /dev/null @@ -1,147 +0,0 @@ -# Image Translation Datasets - -**Data preparation for translation model** needs a little attention. You should organize the files in the way we told you in `quick_run.md`. Fortunately, for most official datasets like facades and summer2winter_yosemite, they already have the right format. Also, you should set a symlink in the `data` directory. For paired-data trained translation model like Pix2Pix , `PairedImageDataset` is designed to train such translation models. Here is an example config for facades dataset: - -```python -train_dataset_type = 'PairedImageDataset' -val_dataset_type = 'PairedImageDataset' -img_norm_cfg = dict(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) -train_pipeline = [ - dict( - type='LoadPairedImageFromFile', - io_backend='disk', - key='pair', - domain_a=domain_a, - domain_b=domain_b, - flag='color'), - dict( - type='Resize', - keys=[f'img_{domain_a}', f'img_{domain_b}'], - scale=(286, 286), - interpolation='bicubic') -] -test_pipeline = [ - dict( - type='LoadPairedImageFromFile', - io_backend='disk', - key='image', - domain_a=domain_a, - domain_b=domain_b, - flag='color'), - dict( - type='Resize', - keys=[f'img_{domain_a}', f'img_{domain_b}'], - scale=(256, 256), - interpolation='bicubic') -] -dataroot = 'data/paired/facades' -train_dataloader = dict( - batch_size=1, - num_workers=4, - persistent_workers=True, - sampler=dict(type='InfiniteSampler', shuffle=True), - dataset=dict( - type=dataset_type, - data_root=dataroot, # set by user - pipeline=train_pipeline)) - -val_dataloader = dict( - batch_size=1, - num_workers=4, - dataset=dict( - type=dataset_type, - data_root=dataroot, # set by user - pipeline=test_pipeline), - sampler=dict(type='DefaultSampler', shuffle=False), - persistent_workers=True) - -test_dataloader = dict( - batch_size=1, - num_workers=4, - dataset=dict( - type=dataset_type, - data_root=dataroot, # set by user - pipeline=test_pipeline), - sampler=dict(type='DefaultSampler', shuffle=False), - persistent_workers=True) -``` - -Here, we adopt `LoadPairedImageFromFile` to load a paired image as the common loader does and crops -it into two images with the same shape in different domains. As shown in the example, `pipeline` provides important data pipeline to process images, including loading from file system, resizing, cropping, flipping, transferring to `torch.Tensor` and packing to `EditDataSample`. All of supported data pipelines can be found in `mmedit/datasets/transforms`. - -For unpaired-data trained translation model like CycleGAN , `UnpairedImageDataset` is designed to train such translation models. Here is an example config for horse2zebra dataset: - -```python -train_dataset_type = 'UnpairedImageDataset' -val_dataset_type = 'UnpairedImageDataset' -img_norm_cfg = dict(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) -domain_a, domain_b = 'horse', 'zebra' -train_pipeline = [ - dict( - type='LoadImageFromFile', - io_backend='disk', - key=f'img_{domain_a}', - flag='color'), - dict( - type='LoadImageFromFile', - io_backend='disk', - key=f'img_{domain_b}', - flag='color'), - dict( - type='TransformBroadcaster', - mapping={'img': [f'img_{domain_a}', f'img_{domain_b}']}, - auto_remap=True, - share_random_params=True, - transforms=[ - dict(type='Resize', scale=(286, 286), interpolation='bicubic'), - dict(type='Crop', crop_size=(256, 256), random_crop=True), - ]), - dict(type='Flip', keys=[f'img_{domain_a}'], direction='horizontal'), - dict(type='Flip', keys=[f'img_{domain_b}'], direction='horizontal'), - dict( - type='PackEditInputs', - keys=[f'img_{domain_a}', f'img_{domain_b}']) -] -test_pipeline = [ - dict(type='LoadImageFromFile', io_backend='disk', key='img', flag='color'), - dict(type='Resize', scale=(256, 256), interpolation='bicubic'), - dict( - type='PackEditInputs', - keys=[f'img_{domain_a}', f'img_{domain_b}']) -] -data_root = './data/horse2zebra/' -# `batch_size` and `data_root` need to be set. -train_dataloader = dict( - batch_size=1, - num_workers=4, - persistent_workers=True, - sampler=dict(type='InfiniteSampler', shuffle=True), - dataset=dict( - type=dataset_type, - data_root=data_root, # set by user - pipeline=train_pipeline)) - -val_dataloader = dict( - batch_size=None, - num_workers=4, - dataset=dict( - type=dataset_type, - data_root=data_root, # set by user - pipeline=test_pipeline), - sampler=dict(type='DefaultSampler', shuffle=False), - persistent_workers=True) - -test_dataloader = dict( - batch_size=None, - num_workers=4, - dataset=dict( - type=dataset_type, - data_root=data_root, # set by user - pipeline=test_pipeline), - sampler=dict(type='DefaultSampler', shuffle=False), - persistent_workers=True) -``` - -`UnpairedImageDataset` will load both images (domain A and B) from different paths and transform them at the same time. - -Here, we provide download links of datasets used in [Pix2Pix](http://efrosgans.eecs.berkeley.edu/pix2pix/datasets/) and [CycleGAN](https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/datasets/). diff --git a/docs/en/user_guides/faq.md b/docs/en/faq.md similarity index 91% rename from docs/en/user_guides/faq.md rename to docs/en/faq.md index d1c9123dc9..7205a47449 100644 --- a/docs/en/user_guides/faq.md +++ b/docs/en/faq.md @@ -1,4 +1,4 @@ -# Frequently Asked Questions +# Frequently asked questions We list some common troubles faced by many users and their corresponding solutions here. Feel free to enrich the list if you find any frequent issues @@ -15,11 +15,11 @@ and make sure you fill in all required information in the template. **Q2**: What's the folder structure of xxx dataset? -**A2**: You can make sure the folder structure is correct following tutorials of [dataset preparation](../user_guides/dataset_prepare.md). +**A2**: You can make sure the folder structure is correct following tutorials of [dataset preparation](user_guides/dataset_prepare.md). **Q3**: How to use LMDB data to train the model? -**A3**: You can use scripts in `tools/data` to make LMDB files. More details are shown in tutorials of [dataset preparation](../user_guides/dataset_prepare.md). +**A3**: You can use scripts in `tools/data` to make LMDB files. More details are shown in tutorials of [dataset preparation](user_guides/dataset_prepare.md). **Q4**: Why `MMCV==xxx is used but incompatible` is raised when import I try to import `mmgen`? diff --git a/docs/en/get_started/install.md b/docs/en/get_started/install.md index 7059f26a99..e2651cb393 100644 --- a/docs/en/get_started/install.md +++ b/docs/en/get_started/install.md @@ -156,7 +156,7 @@ docker run --gpus all --shm-size=8g -it -v {DATA_DIR}:/mmediting/data mmediting #### Trouble shooting -If you have some issues during the installation, please first view the [FAQ](../user_guides/faq.md) page. +If you have some issues during the installation, please first view the [FAQ](../faq.md) page. You may [open an issue](https://github.com/open-mmlab/mmediting/issues/new/choose) on GitHub if no solution is found. ### Developing with multiple MMEditing versions diff --git a/docs/en/get_started/overview.md b/docs/en/get_started/overview.md index 40a9781b91..62af697b74 100644 --- a/docs/en/get_started/overview.md +++ b/docs/en/get_started/overview.md @@ -78,7 +78,7 @@ MMEditing supports various applications, including: - **New Modular Design for Flexible Combination:** - We decompose the editing framework into different modules and one can easily construct a customized editor framework by combining different modules. Specifically, a new design for complex loss modules is proposed for customizing the links between modules, which can achieve flexible combinations among different modules.(Tutorial for [losses](../advanced_guides/losses.md)) + We decompose the editing framework into different modules and one can easily construct a customized editor framework by combining different modules. Specifically, a new design for complex loss modules is proposed for customizing the links between modules, which can achieve flexible combinations among different modules.(Tutorial for [losses](../howto/losses.md)) - **Efficient Distributed Training:** @@ -94,4 +94,8 @@ For beginners, we suggest learning the basic usage of MMEditing from [user_guide ### Advanced guides -For users who are familiar with MMEditing, you may want to learn the design of MMEditing, as well as how to extend the repo, how to use multiple repos and other advanced usages, please refer to [advanced_guides](../advanced_guides/models.md). +For users who are familiar with MMEditing, you may want to learn the design of MMEditing, as well as how to extend the repo, how to use multiple repos and other advanced usages, please refer to [advanced_guides](../advanced_guides/evaluator.md). + +### How to + +For users who want to use MMEditing to do something, please refer to [How to](../howto/models.md). diff --git a/docs/en/get_started/quick_run.md b/docs/en/get_started/quick_run.md index e032430f49..cddaacbf4d 100644 --- a/docs/en/get_started/quick_run.md +++ b/docs/en/get_started/quick_run.md @@ -1,4 +1,4 @@ -# Quick Run +# Quick run After installing MMEditing successfully, now you are able to play with MMEditing! diff --git a/docs/en/advanced_guides/dataset.md b/docs/en/howto/dataset.md similarity index 99% rename from docs/en/advanced_guides/dataset.md rename to docs/en/howto/dataset.md index ab0c380ee5..c2805aac5f 100644 --- a/docs/en/advanced_guides/dataset.md +++ b/docs/en/howto/dataset.md @@ -1,4 +1,4 @@ -# Prepare Your Own Datasets +# How to prepare your own datasets In this document, we will introduce the design of each datasets in MMEditing and how users can design their own dataset. diff --git a/docs/en/advanced_guides/losses.md b/docs/en/howto/losses.md similarity index 99% rename from docs/en/advanced_guides/losses.md rename to docs/en/howto/losses.md index 22ea7a2590..3485a02ed9 100644 --- a/docs/en/advanced_guides/losses.md +++ b/docs/en/howto/losses.md @@ -1,4 +1,4 @@ -# Design Your Own Loss Functions +# How to design your own loss functions `losses` are registered as `LOSSES` in `MMEditing`. Customizing losses is similar to customizing any other model. diff --git a/docs/en/advanced_guides/models.md b/docs/en/howto/models.md similarity index 99% rename from docs/en/advanced_guides/models.md rename to docs/en/howto/models.md index a29b80f3a8..a09fdf0288 100644 --- a/docs/en/advanced_guides/models.md +++ b/docs/en/howto/models.md @@ -1,4 +1,4 @@ -# Design Your Own Models +# How to design your own models MMEditing is built upon MMEngine and MMCV, which enables users to design new models quickly, train and evaluate them easily. In this section, you will learn how to design your own models. @@ -425,7 +425,7 @@ model = dict( )) ``` -We also need to specify the training dataloader and testing dataloader according to [create your own dataloader](../dataset_zoo/0_overview.md). +We also need to specify the training dataloader and testing dataloader according to [create your own dataloader](../dataset_zoo/overview.md). Finally we can start training our own model by: ```python diff --git a/docs/en/advanced_guides/transforms.md b/docs/en/howto/transforms.md similarity index 99% rename from docs/en/advanced_guides/transforms.md rename to docs/en/howto/transforms.md index 6fdfc7061a..46719f58c9 100644 --- a/docs/en/advanced_guides/transforms.md +++ b/docs/en/howto/transforms.md @@ -1,4 +1,4 @@ -# Design Your Own Data Transforms +# How to design your own data transforms In this tutorial, we introduce the design of transforms pipeline in MMEditing. diff --git a/docs/en/index.rst b/docs/en/index.rst index 2570003ec1..44b45f6d90 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -40,7 +40,6 @@ Documentation community/contribution_guide.md community/projects.md - community/changelog.md .. toctree:: @@ -81,6 +80,36 @@ Documentation advanced_guides/data_flow.md +.. toctree:: + :maxdepth: 2 + :caption: How To + + howto/models.md + howto/dataset.md + howto/transforms.md + howto/losses.md + +.. toctree:: + + faq.md + +.. toctree:: + :maxdepth: 2 + :caption: Model Zoo + + model_zoo/index.rst + + +.. toctree:: + :maxdepth: 1 + :caption: Dataset Zoo + + dataset_zoo/index.rst + +.. toctree:: + + changelog.md + .. toctree:: :maxdepth: 2 :caption: API Reference @@ -105,26 +134,6 @@ Documentation mmedit.utils -.. toctree:: - :maxdepth: 1 - :caption: Model Zoo - - model_zoo/model_zoo.md - - -.. toctree:: - :maxdepth: 1 - :caption: Dataset Zoo - - dataset_zoo/overview.md - dataset_zoo/super_resolution_datasets.md - dataset_zoo/inpainting_datasets.md - dataset_zoo/matting_datasets.md - dataset_zoo/video_interpolation_datasets.md - dataset_zoo/unconditional_gans_datasets.md - dataset_zoo/image_translation_datasets.md - - .. toctree:: :maxdepth: 1 :caption: Migration from MMEdit 0.x diff --git a/docs/en/migration/data.md b/docs/en/migration/data.md index e6751a120a..b91758d1c8 100644 --- a/docs/en/migration/data.md +++ b/docs/en/migration/data.md @@ -12,7 +12,7 @@ We update data pipelines settings in MMEdit 1.x. Important modifications are as - Remove normalization and color space transforms operations. They are moved from datasets transforms pipelines to data_preprocessor. - The original formatting transforms pipelines `Collect` and `ToTensor` are combined as `PackEditInputs`. - More details of data pipelines are shown in [transform guides](../advanced_guides/transforms.md). + More details of data pipelines are shown in [transform guides](../howto/transforms.md). diff --git a/docs/en/migration/models.md b/docs/en/migration/models.md index 1cd4f3c40b..f467755eb8 100644 --- a/docs/en/migration/models.md +++ b/docs/en/migration/models.md @@ -68,4 +68,4 @@ We refactor models in MMEdit 1.x. Important modifications are as following. - The `models` in MMedit 1.x is refactored to five parts: `base_models`, `data_preprocessors`, `editors`, `layers` and `losses`. - Add `data_preprocessor` module in `models`. Normalization and color space transforms operations are moved from datasets transforms pipelines to data_preprocessor. The data out from the data pipeline is transformed by this module and then fed into the model. -More details of models are shown in [model guides](../advanced_guides/models.md). +More details of models are shown in [model guides](../howto/models.md). diff --git a/docs/en/model_zoo.md b/docs/en/model_zoo.md deleted file mode 100644 index 78bdf30067..0000000000 --- a/docs/en/model_zoo.md +++ /dev/null @@ -1,400 +0,0 @@ -# Overview - -- Number of checkpoints: 178 -- Number of configs: 174 -- Number of papers: 46 - - ALGORITHM: 47 -- Tasks: - - image2image - - unconditional gans - - video super-resolution - - conditional gans - - inpainting - - matting - - image super-resolution - - video interpolation - - image restoration - - colorization - - internal learning - - text2image - - image generation - - 3d-aware generation - - image2image translation - -For supported datasets, see [datasets overview](dataset_zoo/0_overview.md). - -## AOT-GAN (TVCG'2021) - -- Tasks: inpainting -- Number of checkpoints: 1 -- Number of configs: 1 -- Number of papers: 1 - - \[ALGORITHM\] Aggregated Contextual Transformations for High-Resolution Image Inpainting ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/aot_gan/README.md#citation)) - -## BasicVSR (CVPR'2021) - -- Tasks: video super-resolution -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Basicvsr: The Search for Essential Components in Video Super-Resolution and Beyond ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/basicvsr/README.md#citation)) - -## BasicVSR++ (CVPR'2022) - -- Tasks: video super-resolution -- Number of checkpoints: 7 -- Number of configs: 7 -- Number of papers: 1 - - \[ALGORITHM\] Basicvsr++: Improving Video Super-Resolution With Enhanced Propagation and Alignment ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/basicvsr_pp/README.md#citation)) - -## BigGAN (ICLR'2019) - -- Tasks: conditional gans -- Number of checkpoints: 7 -- Number of configs: 6 -- Number of papers: 1 - - \[ALGORITHM\] Large Scale {Gan ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/biggan/README.md#citation)) - -## CAIN (AAAI'2020) - -- Tasks: video interpolation -- Number of checkpoints: 1 -- Number of configs: 1 -- Number of papers: 1 - - \[ALGORITHM\] Channel Attention Is All You Need for Video Frame Interpolation ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/cain/README.md#citation)) - -## CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent Adversarial Networks (ICCV'2017) - -- Tasks: image2image translation -- Number of checkpoints: 6 -- Number of configs: 6 -- Number of papers: 1 - - \[ALGORITHM\] Unpaired Image-to-Image Translation Using Cycle-Consistent Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/cyclegan/README.md#citation)) - -## Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks (ICLR'2016) - -- Tasks: unconditional gans -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Unsupervised Representation Learning With Deep Convolutional Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/dcgan/README.md#citation)) - -## DeepFillv1 (CVPR'2018) - -- Tasks: inpainting -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Generative Image Inpainting With Contextual Attention ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/deepfillv1/README.md#citation)) - -## DeepFillv2 (CVPR'2019) - -- Tasks: inpainting -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Free-Form Image Inpainting With Gated Convolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/deepfillv2/README.md#citation)) - -## DIC (CVPR'2020) - -- Tasks: image super-resolution -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Deep Face Super-Resolution With Iterative Collaboration Between Attentive Recovery and Landmark Estimation ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/dic/README.md#citation)) - -## DIM (CVPR'2017) - -- Tasks: matting -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Deep Image Matting ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/dim/README.md#citation)) - -## Disco Diffusion - -- Tasks: image2image,text2image -- Number of checkpoints: 2 -- Number of configs: 0 -- Number of papers: 1 - - \[ALGORITHM\] Disco-Diffusion ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/disco_diffusion/README.md#citation)) - -## EDSR (CVPR'2017) - -- Tasks: image super-resolution -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Enhanced Deep Residual Networks for Single Image Super-Resolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/edsr/README.md#citation)) - -## EDVR (CVPRW'2019) - -- Tasks: video super-resolution -- Number of checkpoints: 4 -- Number of configs: 4 -- Number of papers: 1 - - \[ALGORITHM\] Edvr: Video Restoration With Enhanced Deformable Convolutional Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/edvr/README.md#citation)) - -## EG3D (CVPR'2022) - -- Tasks: 3d-aware generation -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Efficient Geometry-Aware 3d Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/eg3d/README.md#citation)) - -## ESRGAN (ECCVW'2018) - -- Tasks: image super-resolution -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Esrgan: Enhanced Super-Resolution Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/esrgan/README.md#citation)) - -## FLAVR (arXiv'2020) - -- Tasks: video interpolation -- Number of checkpoints: 1 -- Number of configs: 1 -- Number of papers: 1 - - \[ALGORITHM\] Flavr: Flow-Agnostic Video Representations for Fast Frame Interpolation ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/flavr/README.md#citation)) - -## GCA (AAAI'2020) - -- Tasks: matting -- Number of checkpoints: 4 -- Number of configs: 4 -- Number of papers: 1 - - \[ALGORITHM\] Natural Image Matting via Guided Contextual Attention ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/gca/README.md#citation)) - -## GGAN (ArXiv'2017) - -- Tasks: unconditional gans -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Geometric Gan ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/ggan/README.md#citation)) - -## GLEAN (CVPR'2021) - -- Tasks: image super-resolution -- Number of checkpoints: 4 -- Number of configs: 7 -- Number of papers: 1 - - \[ALGORITHM\] Glean: Generative Latent Bank for Large-Factor Image Super-Resolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/glean/README.md#citation)) - -## Global&Local (ToG'2017) - -- Tasks: inpainting -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Globally and Locally Consistent Image Completion ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/global_local/README.md#citation)) - -## Guided Diffusion (NeurIPS'2021) - -- Tasks: image generation -- Number of checkpoints: 2 -- Number of configs: 0 -- Number of papers: 1 - - \[ALGORITHM\] Diffusion Models Beat Gans on Image Synthesis ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/guided_diffusion/README.md#citation)) - -## IconVSR (CVPR'2021) - -- Tasks: video super-resolution -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Basicvsr: The Search for Essential Components in Video Super-Resolution and Beyond ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/iconvsr/README.md#citation)) - -## IndexNet (ICCV'2019) - -- Tasks: matting -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Indices Matter: Learning to Index for Deep Image Matting ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/indexnet/README.md#citation)) - -## Instance-aware Image Colorization (CVPR'2020) - -- Tasks: colorization -- Number of checkpoints: 1 -- Number of configs: 1 -- Number of papers: 1 - - \[ALGORITHM\] Instance-Aware Image Colorization ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/inst_colorization/README.md#quick-start)) - -## LIIF (CVPR'2021) - -- Tasks: image super-resolution -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Learning Continuous Image Representation With Local Implicit Image Function ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/liif/README.md#citation)) - -## LSGAN (ICCV'2017) - -- Tasks: unconditional gans -- Number of checkpoints: 4 -- Number of configs: 4 -- Number of papers: 1 - - \[ALGORITHM\] Least Squares Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/lsgan/README.md#citation)) - -## NAFNet (ECCV'2022) - -- Tasks: image restoration -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Simple Baselines for Image Restoration ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/nafnet/README.md#citation)) - -## PConv (ECCV'2018) - -- Tasks: inpainting -- Number of checkpoints: 2 -- Number of configs: 4 -- Number of papers: 1 - - \[ALGORITHM\] Image Inpainting for Irregular Holes Using Partial Convolutions ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/partial_conv/README.md#citation)) - -## PGGAN (ICLR'2018) - -- Tasks: unconditional gans -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Progressive Growing of Gans for Improved Quality, Stability, and Variation ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/pggan/README.md#citation)) - -## Pix2Pix (CVPR'2017) - -- Tasks: image2image translation -- Number of checkpoints: 4 -- Number of configs: 4 -- Number of papers: 1 - - \[ALGORITHM\] Image-to-Image Translation With Conditional Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/pix2pix/README.md#citation)) - -## Positional Encoding in GANs - -- Tasks: unconditional gans -- Number of checkpoints: 21 -- Number of configs: 21 -- Number of papers: 1 - - \[ALGORITHM\] Positional Encoding as Spatial Inductive Bias in Gans ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/positional_encoding_in_gans/README.md#citation)) - -## RDN (CVPR'2018) - -- Tasks: image super-resolution -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Residual Dense Network for Image Super-Resolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/rdn/README.md#citation)) - -## RealBasicVSR (CVPR'2022) - -- Tasks: video super-resolution -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Realbasicvsr: Investigating Tradeoffs in Real-World Video Super-Resolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/real_basicvsr/README.md#citation)) - -## Real-ESRGAN (ICCVW'2021) - -- Tasks: image super-resolution -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Real-Esrgan: Training Real-World Blind Super-Resolution With Pure Synthetic Data ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/real_esrgan/README.md#citation)) - -## SAGAN (ICML'2019) - -- Tasks: conditional gans -- Number of checkpoints: 9 -- Number of configs: 6 -- Number of papers: 1 - - \[ALGORITHM\] Self-Attention Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/sagan/README.md#citation)) - -## SinGAN (ICCV'2019) - -- Tasks: internal learning -- Number of checkpoints: 3 -- Number of configs: 3 -- Number of papers: 1 - - \[ALGORITHM\] Singan: Learning a Generative Model From a Single Natural Image ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/singan/README.md#citation)) - -## SNGAN (ICLR'2018) - -- Tasks: conditional gans -- Number of checkpoints: 10 -- Number of configs: 6 -- Number of papers: 1 - - \[ALGORITHM\] Spectral Normalization for Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/sngan_proj/README.md#citation)) - -## SRCNN (TPAMI'2015) - -- Tasks: image super-resolution -- Number of checkpoints: 1 -- Number of configs: 1 -- Number of papers: 1 - - \[ALGORITHM\] Image Super-Resolution Using Deep Convolutional Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/srcnn/README.md#citation)) - -## SRGAN (CVPR'2016) - -- Tasks: image super-resolution -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/srgan_resnet/README.md#citation)) - -## StyleGANv1 (CVPR'2019) - -- Tasks: unconditional gans -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] A Style-Based Generator Architecture for Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/styleganv1/README.md#citation)) - -## StyleGANv2 (CVPR'2020) - -- Tasks: unconditional gans -- Number of checkpoints: 12 -- Number of configs: 12 -- Number of papers: 1 - - \[ALGORITHM\] Analyzing and Improving the Image Quality of Stylegan ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/styleganv2/README.md#citation)) - -## StyleGANv3 (NeurIPS'2021) - -- Tasks: unconditional gans -- Number of checkpoints: 9 -- Number of configs: 10 -- Number of papers: 1 - - \[ALGORITHM\] Alias-Free Generative Adversarial Networks ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/styleganv3/README.md#citation)) - -## TDAN (CVPR'2020) - -- Tasks: video super-resolution -- Number of checkpoints: 2 -- Number of configs: 4 -- Number of papers: 1 - - \[ALGORITHM\] Tdan: Temporally-Deformable Alignment Network for Video Super-Resolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/tdan/README.md#citation)) - -## TOFlow (IJCV'2019) - -- Tasks: video super-resolution,video interpolation -- Number of checkpoints: 6 -- Number of configs: 6 -- Number of papers: 1 - - \[ALGORITHM\] Video Enhancement With Task-Oriented Flow ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/tof/README.md#citation)) - -## TTSR (CVPR'2020) - -- Tasks: image super-resolution -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Learning Texture Transformer Network for Image Super-Resolution ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/ttsr/README.md#citation)) - -## WGAN-GP (NeurIPS'2017) - -- Tasks: unconditional gans -- Number of checkpoints: 2 -- Number of configs: 2 -- Number of papers: 1 - - \[ALGORITHM\] Improved Training of Wasserstein Gans ([⇨](https://github.com/open-mmlab/mmediting/blob/1.x/configs/wgan-gp/README.md#citation)) diff --git a/docs/en/user_guides/dataset_prepare.md b/docs/en/user_guides/dataset_prepare.md index 475c69283e..fe208aee9c 100644 --- a/docs/en/user_guides/dataset_prepare.md +++ b/docs/en/user_guides/dataset_prepare.md @@ -1,4 +1,4 @@ -# Tutorial 2: Prepare Datasets +# Tutorial 2: Prepare datasets In this section, we will detail how to prepare data and adopt the proper dataset in our repo for different methods. @@ -34,6 +34,6 @@ python tools/dataset_converters/super-resolution/div2k/preprocess_div2k_dataset. We support detailed tutorials and split them according to different tasks. -Please check our [dataset zoo](../dataset_zoo/0_overview.md) for data preparation of different tasks. +Please check our [dataset zoo](../dataset_zoo/overview.md) for data preparation of different tasks. -If you're interested in more details of datasets in MMEditing, please check the [advanced guides](../advanced_guides/dataset.md). +If you're interested in more details of datasets in MMEditing, please check the [advanced guides](../howto/dataset.md). diff --git a/docs/en/user_guides/deploy.md b/docs/en/user_guides/deploy.md index d7a688f344..c9e50cf168 100644 --- a/docs/en/user_guides/deploy.md +++ b/docs/en/user_guides/deploy.md @@ -1,4 +1,4 @@ -# Tutorial 7: Deploy Models in MMEditing +# Tutorial 7: Deploy models in MMEditing [MMDeploy](https://github.com/open-mmlab/mmdeploy) is an open-source deep learning model deployment toolset. MMDeploy supports deploying models in MMEditing. Please refer to [MMDeploy](https://github.com/open-mmlab/mmdeploy) for more information. diff --git a/docs/en/user_guides/inference.md b/docs/en/user_guides/inference.md index 22e88566cd..dcb2e6efe3 100644 --- a/docs/en/user_guides/inference.md +++ b/docs/en/user_guides/inference.md @@ -1,4 +1,4 @@ -# Tutorial 3: Inference with Pre-trained Models +# Tutorial 3: Inference with pre-trained models MMEditing provides APIs for you to easily play with state-of-the-art models on your own images or videos. Specifically, MMEditing supports various fundamental generative models, including: diff --git a/docs/en/user_guides/metrics.md b/docs/en/user_guides/metrics.md index d9c593502c..1ce00355eb 100644 --- a/docs/en/user_guides/metrics.md +++ b/docs/en/user_guides/metrics.md @@ -1,4 +1,4 @@ -# Tutorial 8: Using Metrics in MMEditing +# Tutorial 8: Using metrics in MMEditing MMEditing supports **17 metrics** to assess the quality of models. diff --git a/docs/en/user_guides/train_test.md b/docs/en/user_guides/train_test.md index 3a314b15ab..72ad958772 100644 --- a/docs/en/user_guides/train_test.md +++ b/docs/en/user_guides/train_test.md @@ -1,4 +1,4 @@ -# Tutorial 4: Train and Test in MMEditing +# Tutorial 4: Train and test in MMEditing In this section, we introduce how to test and train models in MMEditing. diff --git a/docs/en/user_guides/useful_tools.md b/docs/en/user_guides/useful_tools.md index 441a03c115..ea7c759e4e 100644 --- a/docs/en/user_guides/useful_tools.md +++ b/docs/en/user_guides/useful_tools.md @@ -1,4 +1,4 @@ -# Tutorial 6: Useful Tools +# Tutorial 6: Useful tools We provide lots of useful tools under `tools/` directory. diff --git a/tools/dataset_converters/matting/bgm/preprocess_bgm_dataset.py b/tools/dataset_converters/bgm/preprocess_bgm_dataset.py similarity index 100% rename from tools/dataset_converters/matting/bgm/preprocess_bgm_dataset.py rename to tools/dataset_converters/bgm/preprocess_bgm_dataset.py diff --git a/tools/dataset_converters/inpainting/celeba-hq/README.md b/tools/dataset_converters/celeba-hq/README.md similarity index 100% rename from tools/dataset_converters/inpainting/celeba-hq/README.md rename to tools/dataset_converters/celeba-hq/README.md diff --git a/tools/dataset_converters/inpainting/celeba-hq/README_zh-CN.md b/tools/dataset_converters/celeba-hq/README_zh-CN.md similarity index 100% rename from tools/dataset_converters/inpainting/celeba-hq/README_zh-CN.md rename to tools/dataset_converters/celeba-hq/README_zh-CN.md diff --git a/tools/dataset_converters/matting/comp1k/README.md b/tools/dataset_converters/comp1k/README.md similarity index 100% rename from tools/dataset_converters/matting/comp1k/README.md rename to tools/dataset_converters/comp1k/README.md diff --git a/tools/dataset_converters/matting/comp1k/README_zh-CN.md b/tools/dataset_converters/comp1k/README_zh-CN.md similarity index 100% rename from tools/dataset_converters/matting/comp1k/README_zh-CN.md rename to tools/dataset_converters/comp1k/README_zh-CN.md diff --git a/tools/dataset_converters/matting/comp1k/check_extended_fg.py b/tools/dataset_converters/comp1k/check_extended_fg.py similarity index 100% rename from tools/dataset_converters/matting/comp1k/check_extended_fg.py rename to tools/dataset_converters/comp1k/check_extended_fg.py diff --git a/tools/dataset_converters/evaluate_comp1k.py b/tools/dataset_converters/comp1k/evaluate_comp1k.py similarity index 100% rename from tools/dataset_converters/evaluate_comp1k.py rename to tools/dataset_converters/comp1k/evaluate_comp1k.py diff --git a/tools/dataset_converters/matting/comp1k/extend_fg.py b/tools/dataset_converters/comp1k/extend_fg.py similarity index 100% rename from tools/dataset_converters/matting/comp1k/extend_fg.py rename to tools/dataset_converters/comp1k/extend_fg.py diff --git a/tools/dataset_converters/matting/comp1k/filter_comp1k_anno.py b/tools/dataset_converters/comp1k/filter_comp1k_anno.py similarity index 100% rename from tools/dataset_converters/matting/comp1k/filter_comp1k_anno.py rename to tools/dataset_converters/comp1k/filter_comp1k_anno.py diff --git a/tools/dataset_converters/matting/comp1k/preprocess_comp1k_dataset.py b/tools/dataset_converters/comp1k/preprocess_comp1k_dataset.py similarity index 100% rename from tools/dataset_converters/matting/comp1k/preprocess_comp1k_dataset.py rename to tools/dataset_converters/comp1k/preprocess_comp1k_dataset.py diff --git a/tools/dataset_converters/super-resolution/df2k_ost/README.md b/tools/dataset_converters/df2k_ost/README.md similarity index 100% rename from tools/dataset_converters/super-resolution/df2k_ost/README.md rename to tools/dataset_converters/df2k_ost/README.md diff --git a/tools/dataset_converters/super-resolution/df2k_ost/README_zh-CN.md b/tools/dataset_converters/df2k_ost/README_zh-CN.md similarity index 100% rename from tools/dataset_converters/super-resolution/df2k_ost/README_zh-CN.md rename to tools/dataset_converters/df2k_ost/README_zh-CN.md diff --git a/tools/dataset_converters/super-resolution/df2k_ost/preprocess_df2k_ost_dataset.py b/tools/dataset_converters/df2k_ost/preprocess_df2k_ost_dataset.py similarity index 100% rename from tools/dataset_converters/super-resolution/df2k_ost/preprocess_df2k_ost_dataset.py rename to tools/dataset_converters/df2k_ost/preprocess_df2k_ost_dataset.py diff --git a/tools/dataset_converters/super-resolution/div2k/README.md b/tools/dataset_converters/div2k/README.md similarity index 100% rename from tools/dataset_converters/super-resolution/div2k/README.md rename to tools/dataset_converters/div2k/README.md diff --git a/tools/dataset_converters/super-resolution/div2k/README_zh-CN.md b/tools/dataset_converters/div2k/README_zh-CN.md similarity index 100% rename from tools/dataset_converters/super-resolution/div2k/README_zh-CN.md rename to tools/dataset_converters/div2k/README_zh-CN.md diff --git a/tools/dataset_converters/super-resolution/div2k/preprocess_div2k_dataset.py b/tools/dataset_converters/div2k/preprocess_div2k_dataset.py similarity index 100% rename from tools/dataset_converters/super-resolution/div2k/preprocess_div2k_dataset.py rename to tools/dataset_converters/div2k/preprocess_div2k_dataset.py diff --git a/tools/dataset_converters/generation/README.md b/tools/dataset_converters/generation/README.md deleted file mode 100644 index f195e361c5..0000000000 --- a/tools/dataset_converters/generation/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Generation Datasets - -It is recommended to symlink the dataset root to `$MMEDITING/data`. If your folder structure is different, you may need to change the corresponding paths in config files. - -MMEditing supported generation datasets: - -- [Paired Dataset for Pix2pix](paired-pix2pix/README.md) \[ [Homepage](http://efrosgans.eecs.berkeley.edu/pix2pix/datasets/) \] -- [Unpaired Dataset for CycleGAN](unpaired-cyclegan/README.md) \[ [Homepage](https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/datasets/) \] diff --git a/tools/dataset_converters/generation/README_zh-CN.md b/tools/dataset_converters/generation/README_zh-CN.md deleted file mode 100644 index 1dd3b8c1e4..0000000000 --- a/tools/dataset_converters/generation/README_zh-CN.md +++ /dev/null @@ -1,8 +0,0 @@ -# 图像生成数据集 - -建议将数据集软链接到 `$MMEDITING/data` 。如果您的文件夹结构不同,您可能需要更改配置文件中的相应路径。 - -MMEditing 支持的生成数据集: - -- [Pix2Pix 的配对数据集](paired-pix2pix/README.md) \[ [主页](http://efrosgans.eecs.berkeley.edu/pix2pix/datasets/) \] -- [CycleGAN 的未配对数据集](unpaired-cyclegan/README.md) \[ [主页](https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/datasets/) \] diff --git a/tools/dataset_converters/image_translation/README.md b/tools/dataset_converters/image_translation/README.md deleted file mode 100644 index 51e5312cdd..0000000000 --- a/tools/dataset_converters/image_translation/README.md +++ /dev/null @@ -1,147 +0,0 @@ -# Image Translation Datasets - -**Data preparation for translation model** needs a little attention. You should organize the files in the way we told you in `quick_run.md`. Fortunately, for most official datasets like facades and summer2winter_yosemite, they already have the right format. Also, you should set a symlink in the `data` directory. For paired-data trained translation model like Pix2Pix , `PairedImageDataset` is designed to train such translation models. Here is an example config for facades dataset: - -```python -train_dataset_type = 'PairedImageDataset' -val_dataset_type = 'PairedImageDataset' -img_norm_cfg = dict(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) -train_pipeline = [ - dict( - type='LoadPairedImageFromFile', - io_backend='disk', - key='pair', - domain_a=domain_a, - domain_b=domain_b, - flag='color'), - dict( - type='Resize', - keys=[f'img_{domain_a}', f'img_{domain_b}'], - scale=(286, 286), - interpolation='bicubic') -] -test_pipeline = [ - dict( - type='LoadPairedImageFromFile', - io_backend='disk', - key='image', - domain_a=domain_a, - domain_b=domain_b, - flag='color'), - dict( - type='Resize', - keys=[f'img_{domain_a}', f'img_{domain_b}'], - scale=(256, 256), - interpolation='bicubic') -] -dataroot = 'data/paired/facades' -train_dataloader = dict( - batch_size=1, - num_workers=4, - persistent_workers=True, - sampler=dict(type='InfiniteSampler', shuffle=True), - dataset=dict( - type=dataset_type, - data_root=dataroot, # set by user - pipeline=train_pipeline)) - -val_dataloader = dict( - batch_size=1, - num_workers=4, - dataset=dict( - type=dataset_type, - data_root=dataroot, # set by user - pipeline=test_pipeline), - sampler=dict(type='DefaultSampler', shuffle=False), - persistent_workers=True) - -test_dataloader = dict( - batch_size=1, - num_workers=4, - dataset=dict( - type=dataset_type, - data_root=dataroot, # set by user - pipeline=test_pipeline), - sampler=dict(type='DefaultSampler', shuffle=False), - persistent_workers=True) -``` - -Here, we adopt `LoadPairedImageFromFile` to load a paired image as the common loader does and crops -it into two images with the same shape in different domains. As shown in the example, `pipeline` provides important data pipeline to process images, including loading from file system, resizing, cropping, flipping, transferring to `torch.Tensor` and packing to `EditDataSample`. All of supported data pipelines can be found in `mmedit/datasets/transforms`. - -For unpaired-data trained translation model like CycleGAN , `UnpairedImageDataset` is designed to train such translation models. Here is an example config for horse2zebra dataset: - -```python -train_dataset_type = 'UnpairedImageDataset' -val_dataset_type = 'UnpairedImageDataset' -img_norm_cfg = dict(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) -domain_a, domain_b = 'horse', 'zebra' -train_pipeline = [ - dict( - type='LoadImageFromFile', - io_backend='disk', - key=f'img_{domain_a}', - flag='color'), - dict( - type='LoadImageFromFile', - io_backend='disk', - key=f'img_{domain_b}', - flag='color'), - dict( - type='TransformBroadcaster', - mapping={'img': [f'img_{domain_a}', f'img_{domain_b}']}, - auto_remap=True, - share_random_params=True, - transforms=[ - dict(type='Resize', scale=(286, 286), interpolation='bicubic'), - dict(type='Crop', crop_size=(256, 256), random_crop=True), - ]), - dict(type='Flip', keys=[f'img_{domain_a}'], direction='horizontal'), - dict(type='Flip', keys=[f'img_{domain_b}'], direction='horizontal'), - dict( - type='PackEditInputs', - keys=[f'img_{domain_a}', f'img_{domain_b}']) -] -test_pipeline = [ - dict(type='LoadImageFromFile', io_backend='disk', key='img', flag='color'), - dict(type='Resize', scale=(256, 256), interpolation='bicubic'), - dict( - type='PackEditInputs', - keys=[f'img_{domain_a}', f'img_{domain_b}']) -] -data_root = './data/horse2zebra/' -# `batch_size` and `data_root` need to be set. -train_dataloader = dict( - batch_size=1, - num_workers=4, - persistent_workers=True, - sampler=dict(type='InfiniteSampler', shuffle=True), - dataset=dict( - type=dataset_type, - data_root=data_root, # set by user - pipeline=train_pipeline)) - -val_dataloader = dict( - batch_size=None, - num_workers=4, - dataset=dict( - type=dataset_type, - data_root=data_root, # set by user - pipeline=test_pipeline), - sampler=dict(type='DefaultSampler', shuffle=False), - persistent_workers=True) - -test_dataloader = dict( - batch_size=None, - num_workers=4, - dataset=dict( - type=dataset_type, - data_root=data_root, # set by user - pipeline=test_pipeline), - sampler=dict(type='DefaultSampler', shuffle=False), - persistent_workers=True) -``` - -`UnpairedImageDataset` will load both images (domain A and B) from different paths and transform them at the same time. - -Here, we provide download links of datasets used in [Pix2Pix](http://efrosgans.eecs.berkeley.edu/pix2pix/datasets/) and [CycleGAN](https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/datasets/). diff --git a/tools/dataset_converters/inpainting/README.md b/tools/dataset_converters/inpainting/README.md deleted file mode 100644 index ecc6d7b45d..0000000000 --- a/tools/dataset_converters/inpainting/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Inpainting Datasets - -It is recommended to symlink the dataset root to `$MMEDITING/data`. If your folder structure is different, you may need to change the corresponding paths in config files. - -MMEditing supported inpainting datasets: - -- [CelebA-HQ](celeba-hq/README.md) \[ [Homepage](https://github.com/tkarras/progressive_growing_of_gans#preparing-datasets-for-training) \] -- [Paris Street View](paris-street-view/README.md) \[ [Homepage](https://github.com/pathak22/context-encoder/issues/24) \] -- [Places365](places365/README.md) \[ [Homepage](http://places2.csail.mit.edu/) \] - -As we only need images for inpainting task, further preparation is not necessary and the folder structure can be different from the example. You can utilize the information provided by the original dataset like `Place365` (e.g. `meta`). Also, you can easily scan the data set and list all of the images to a specific `txt` file. Here is an example for the `Places365_val.txt` from Places365 and we will only use the image name information in inpainting. - -``` -Places365_val_00000001.jpg 165 -Places365_val_00000002.jpg 358 -Places365_val_00000003.jpg 93 -Places365_val_00000004.jpg 164 -Places365_val_00000005.jpg 289 -Places365_val_00000006.jpg 106 -Places365_val_00000007.jpg 81 -Places365_val_00000008.jpg 121 -Places365_val_00000009.jpg 150 -Places365_val_00000010.jpg 302 -Places365_val_00000011.jpg 42 -``` diff --git a/tools/dataset_converters/inpainting/README_zh-CN.md b/tools/dataset_converters/inpainting/README_zh-CN.md deleted file mode 100644 index f9a241884f..0000000000 --- a/tools/dataset_converters/inpainting/README_zh-CN.md +++ /dev/null @@ -1,25 +0,0 @@ -# 图像补全数据集 - -建议将数据集软链接到 `$MMEDITING/data` 。如果您的文件夹结构不同,您可能需要更改配置文件中的相应路径。 - -MMEditing 支持的补全数据集: - -- [Paris Street View](paris-street-view/README.md) \[ [主页](https://github.com/pathak22/context-encoder/issues/24) \] -- [CelebA-HQ](celeba-hq/README.md) \[ [主页](https://github.com/tkarras/progressive_growing_of_gans#preparing-datasets-for-training) \] -- [Places365](places365/README.md) \[ [主页](http://places2.csail.mit.edu/) \] - -由于在图像补全任务中,我们只需要使用图像,因此我们不需要对数据集进行额外的预处理操作,文件目录的结构也可以和本例有所不同。您可以利用原始数据集提供的信息,如 `Place365` (例如 `meta`)。或者,您可以直接遍历数据集文件夹,并将所有图像文件的路径罗列在一个文本文件中。下面的例子节选自 Places365 数据集中的 `Places365_val.txt`,针对图像补全任务,我们只需要使用其中的文件名信息。 - -``` -Places365_val_00000001.jpg 165 -Places365_val_00000002.jpg 358 -Places365_val_00000003.jpg 93 -Places365_val_00000004.jpg 164 -Places365_val_00000005.jpg 289 -Places365_val_00000006.jpg 106 -Places365_val_00000007.jpg 81 -Places365_val_00000008.jpg 121 -Places365_val_00000009.jpg 150 -Places365_val_00000010.jpg 302 -Places365_val_00000011.jpg 42 -``` diff --git a/tools/dataset_converters/matting/README.md b/tools/dataset_converters/matting/README.md deleted file mode 100644 index 8cb9183d13..0000000000 --- a/tools/dataset_converters/matting/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Matting Datasets - -It is recommended to symlink the dataset root to `$MMEDITING/data`. If your folder structure is different, you may need to change the corresponding paths in config files. - -MMEditing supported matting datasets: - -- [Composition-1k](comp1k/README.md) \[ [Homepage](https://sites.google.com/view/deepimagematting) \] diff --git a/tools/dataset_converters/matting/README_zh-CN.md b/tools/dataset_converters/matting/README_zh-CN.md deleted file mode 100644 index fad8f5b3b2..0000000000 --- a/tools/dataset_converters/matting/README_zh-CN.md +++ /dev/null @@ -1,7 +0,0 @@ -# 抠图数据集 - -建议将数据集软链接到 `$MMEDITING/data` 。如果您的文件夹结构不同,您可能需要更改配置文件中的相应路径。 - -MMEditing 支持的抠图数据集: - -- [Composition-1k](comp1k/README.md) \[ [Homepage](https://sites.google.com/view/deepimagematting) \] diff --git a/tools/dataset_converters/generation/paired-pix2pix/README.md b/tools/dataset_converters/paired-pix2pix/README.md similarity index 100% rename from tools/dataset_converters/generation/paired-pix2pix/README.md rename to tools/dataset_converters/paired-pix2pix/README.md diff --git a/tools/dataset_converters/generation/paired-pix2pix/README_zh-CN.md b/tools/dataset_converters/paired-pix2pix/README_zh-CN.md similarity index 100% rename from tools/dataset_converters/generation/paired-pix2pix/README_zh-CN.md rename to tools/dataset_converters/paired-pix2pix/README_zh-CN.md diff --git a/tools/dataset_converters/inpainting/paris-street-view/README.md b/tools/dataset_converters/paris-street-view/README.md similarity index 100% rename from tools/dataset_converters/inpainting/paris-street-view/README.md rename to tools/dataset_converters/paris-street-view/README.md diff --git a/tools/dataset_converters/inpainting/paris-street-view/README_zh-CN.md b/tools/dataset_converters/paris-street-view/README_zh-CN.md similarity index 100% rename from tools/dataset_converters/inpainting/paris-street-view/README_zh-CN.md rename to tools/dataset_converters/paris-street-view/README_zh-CN.md diff --git a/tools/dataset_converters/inpainting/places365/README.md b/tools/dataset_converters/places365/README.md similarity index 100% rename from tools/dataset_converters/inpainting/places365/README.md rename to tools/dataset_converters/places365/README.md diff --git a/tools/dataset_converters/inpainting/places365/README_zh-CN.md b/tools/dataset_converters/places365/README_zh-CN.md similarity index 100% rename from tools/dataset_converters/inpainting/places365/README_zh-CN.md rename to tools/dataset_converters/places365/README_zh-CN.md diff --git a/tools/dataset_converters/super-resolution/reds/README.md b/tools/dataset_converters/reds/README.md similarity index 100% rename from tools/dataset_converters/super-resolution/reds/README.md rename to tools/dataset_converters/reds/README.md diff --git a/tools/dataset_converters/super-resolution/reds/README_zh-CN.md b/tools/dataset_converters/reds/README_zh-CN.md similarity index 100% rename from tools/dataset_converters/super-resolution/reds/README_zh-CN.md rename to tools/dataset_converters/reds/README_zh-CN.md diff --git a/tools/dataset_converters/super-resolution/reds/crop_sub_images.py b/tools/dataset_converters/reds/crop_sub_images.py similarity index 100% rename from tools/dataset_converters/super-resolution/reds/crop_sub_images.py rename to tools/dataset_converters/reds/crop_sub_images.py diff --git a/tools/dataset_converters/super-resolution/reds/preprocess_reds_dataset.py b/tools/dataset_converters/reds/preprocess_reds_dataset.py similarity index 100% rename from tools/dataset_converters/super-resolution/reds/preprocess_reds_dataset.py rename to tools/dataset_converters/reds/preprocess_reds_dataset.py diff --git a/tools/dataset_converters/super-resolution/README.md b/tools/dataset_converters/super-resolution/README.md deleted file mode 100644 index 42c33f7305..0000000000 --- a/tools/dataset_converters/super-resolution/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Super-Resolution Datasets - -It is recommended to symlink the dataset root to `$MMEDITING/data`. If your folder structure is different, you may need to change the corresponding paths in config files. - -MMEditing supported super-resolution datasets: - -- Image Super-Resolution - - [DF2K_OST](df2k_ost/README.md) \[ [Homepage](https://github.com/xinntao/Real-ESRGAN/blob/master/docs/Training.md) \] - - [DIV2K](div2k/README.md) \[ [Homepage](https://data.vision.ee.ethz.ch/cvl/DIV2K/) \] -- Video Super-Resolution - - [REDS](reds/README.md) \[ [Homepage](https://seungjunnah.github.io/Datasets/reds.html) \] - - [Vid4](vid4/README.md) \[ [Homepage](https://drive.google.com/file/d/1ZuvNNLgR85TV_whJoHM7uVb-XW1y70DW/view) \] - - [Vimeo90K](vimeo90k/README.md) \[ [Homepage](http://toflow.csail.mit.edu) \] diff --git a/tools/dataset_converters/super-resolution/README_zh-CN.md b/tools/dataset_converters/super-resolution/README_zh-CN.md deleted file mode 100644 index c0aa099e73..0000000000 --- a/tools/dataset_converters/super-resolution/README_zh-CN.md +++ /dev/null @@ -1,13 +0,0 @@ -# 超分辨率数据集 - -建议将数据集的根目录链接到 `$MMEDITING/data` 下,如果您的文件目录结构不一致,那么可能需要在配置文件中修改对应的文件路径。 - -MMEditing 支持下列超分辨率数据集: - -- 图像超分辨率 - - [DIV2K](div2k/README_zh-CN.md) \[ [Homepage](https://data.vision.ee.ethz.ch/cvl/DIV2K/) \] - - [DF2K_OST](df2k_ost/README_zh-CN.md) \[ [Homepage](https://github.com/xinntao/Real-ESRGAN/blob/master/docs/Training.md) \] -- 视频超分辨率 - - [REDS](reds/README_zh-CN.md) \[ [Homepage](https://seungjunnah.github.io/Datasets/reds.html) \] - - [Vimeo90K](vimeo90k/README_zh-CN.md) \[ [Homepage](http://toflow.csail.mit.edu) \] - - [Vid4](vid4/README_zh-CN.md) \[ [Homepage](https://drive.google.com/file/d/1ZuvNNLgR85TV_whJoHM7uVb-XW1y70DW/view) \] diff --git a/tools/dataset_converters/generation/unpaired-cyclegan/README.md b/tools/dataset_converters/unpaired-cyclegan/README.md similarity index 100% rename from tools/dataset_converters/generation/unpaired-cyclegan/README.md rename to tools/dataset_converters/unpaired-cyclegan/README.md diff --git a/tools/dataset_converters/generation/unpaired-cyclegan/README_zh-CN.md b/tools/dataset_converters/unpaired-cyclegan/README_zh-CN.md similarity index 100% rename from tools/dataset_converters/generation/unpaired-cyclegan/README_zh-CN.md rename to tools/dataset_converters/unpaired-cyclegan/README_zh-CN.md diff --git a/tools/dataset_converters/super-resolution/vid4/README.md b/tools/dataset_converters/vid4/README.md similarity index 100% rename from tools/dataset_converters/super-resolution/vid4/README.md rename to tools/dataset_converters/vid4/README.md diff --git a/tools/dataset_converters/super-resolution/vid4/README_zh-CN.md b/tools/dataset_converters/vid4/README_zh-CN.md similarity index 100% rename from tools/dataset_converters/super-resolution/vid4/README_zh-CN.md rename to tools/dataset_converters/vid4/README_zh-CN.md diff --git a/tools/dataset_converters/video-interpolation/README.md b/tools/dataset_converters/video-interpolation/README.md deleted file mode 100644 index 04036a026f..0000000000 --- a/tools/dataset_converters/video-interpolation/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Video Frame Interpolation Datasets - -It is recommended to symlink the dataset root to `$MMEDITING/data`. If your folder structure is different, you may need to change the corresponding paths in config files. - -MMEditing supported video frame interpolation datasets: - -- [Vimeo90K-triplet](vimeo90k-triplet/README.md) \[ [Homepage](http://toflow.csail.mit.edu) \] diff --git a/tools/dataset_converters/video-interpolation/README_zh-CN.md b/tools/dataset_converters/video-interpolation/README_zh-CN.md deleted file mode 100644 index 6f989e6fa7..0000000000 --- a/tools/dataset_converters/video-interpolation/README_zh-CN.md +++ /dev/null @@ -1,7 +0,0 @@ -# 视频插帧数据集 - -建议将数据集的根目录链接到 `$MMEDITING/data` 下,如果您的文件目录结构不一致,那么可能需要在配置文件中修改对应的文件路径。 - -MMEditing 支持下列视频插帧数据集: - -- [Vimeo90K-triplet](vimeo90k-triplet/README.md) \[ [Homepage](http://toflow.csail.mit.edu) \] diff --git a/tools/dataset_converters/video-interpolation/vimeo90k-triplet/README.md b/tools/dataset_converters/vimeo90k-triplet/README.md similarity index 100% rename from tools/dataset_converters/video-interpolation/vimeo90k-triplet/README.md rename to tools/dataset_converters/vimeo90k-triplet/README.md diff --git a/tools/dataset_converters/video-interpolation/vimeo90k-triplet/README_zh-CN.md b/tools/dataset_converters/vimeo90k-triplet/README_zh-CN.md similarity index 100% rename from tools/dataset_converters/video-interpolation/vimeo90k-triplet/README_zh-CN.md rename to tools/dataset_converters/vimeo90k-triplet/README_zh-CN.md diff --git a/tools/dataset_converters/super-resolution/vimeo90k/README.md b/tools/dataset_converters/vimeo90k/README.md similarity index 100% rename from tools/dataset_converters/super-resolution/vimeo90k/README.md rename to tools/dataset_converters/vimeo90k/README.md diff --git a/tools/dataset_converters/super-resolution/vimeo90k/README_zh-CN.md b/tools/dataset_converters/vimeo90k/README_zh-CN.md similarity index 100% rename from tools/dataset_converters/super-resolution/vimeo90k/README_zh-CN.md rename to tools/dataset_converters/vimeo90k/README_zh-CN.md diff --git a/tools/dataset_converters/super-resolution/vimeo90k/preprocess_vimeo90k_dataset.py b/tools/dataset_converters/vimeo90k/preprocess_vimeo90k_dataset.py similarity index 100% rename from tools/dataset_converters/super-resolution/vimeo90k/preprocess_vimeo90k_dataset.py rename to tools/dataset_converters/vimeo90k/preprocess_vimeo90k_dataset.py From c7f3dfd13e9edb3c0aeadb649780a749dfd40a1a Mon Sep 17 00:00:00 2001 From: Yanhong Zeng Date: Tue, 13 Dec 2022 14:19:29 +0800 Subject: [PATCH 10/44] [Enhance] enable projects (#1526) * update projects * fix typo * fix typo * update workflow: lint_only for projects --- .circleci/config.yml | 1 + .github/workflows/merge_stage_test.yml | 1 + .github/workflows/pr_stage_test.yml | 1 + projects/README.md | 24 +++ projects/example_project/README.md | 140 ++++++++++++++++++ .../configs/examplenet_8xb32_in1k.py | 7 + projects/example_project/models/__init__.py | 3 + .../example_project/models/example_net.py | 31 ++++ 8 files changed, 208 insertions(+) create mode 100644 projects/README.md create mode 100644 projects/example_project/README.md create mode 100644 projects/example_project/configs/examplenet_8xb32_in1k.py create mode 100644 projects/example_project/models/__init__.py create mode 100644 projects/example_project/models/example_net.py diff --git a/.circleci/config.yml b/.circleci/config.yml index 78e6a43292..9de733444d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -30,6 +30,7 @@ workflows: .dev_scripts/.* lint_only true .github/.* lint_only true demo/.* lint_only true + projects/.* lint_only true base-revision: dev-1.x # this is the path of the configuration we should trigger once # path filtering and pipeline parameter value updates are diff --git a/.github/workflows/merge_stage_test.yml b/.github/workflows/merge_stage_test.yml index 901f252c80..ff94784262 100644 --- a/.github/workflows/merge_stage_test.yml +++ b/.github/workflows/merge_stage_test.yml @@ -9,6 +9,7 @@ on: - '.dev_scripts/**' - '.circleci/**' - 'configs/**' + - 'projects/**' branches: - dev-1.x diff --git a/.github/workflows/pr_stage_test.yml b/.github/workflows/pr_stage_test.yml index bb789e332d..bac567a170 100644 --- a/.github/workflows/pr_stage_test.yml +++ b/.github/workflows/pr_stage_test.yml @@ -6,6 +6,7 @@ on: - 'README.md' - 'README_zh-CN.md' - 'docs/**' + - 'projects/**' - '.dev_scripts/**' - '.circleci/**' - 'configs/**' diff --git a/projects/README.md b/projects/README.md new file mode 100644 index 0000000000..2a4e69da7b --- /dev/null +++ b/projects/README.md @@ -0,0 +1,24 @@ +# Welcome to Projects of MMEditing + +In this folder, we welcome all contribution of image, video, 3D content generation, editing and processing. + +Here, these requirements, e.g. code standards, are not that strict as in core package. +Thus, developers from the community can implement their algorithms much more easily and efficiently in MMEditing. +We appreciate all contributions from community to make MMEditing greater. + +Here is an [example project](./example_project) about how to add your algorithms easily. +You can copy and create your own project from the [example project](./example_project). + +We also provide some documentation listed below: + +- [New Model Guide](https://mmediting.readthedocs.io/en/dev-1.x/howto/models.html) + + The documentation of adding new models. + +- [Contribution Guide](https://mmediting.readthedocs.io/en/dev-1.x/community/contributing.html) + + The guides for new contributors about how to add your projects to MMEditing. + +- [Discussions](https://github.com/open-mmlab/mmediting/discussions) + + Welcome to start discussion! diff --git a/projects/example_project/README.md b/projects/example_project/README.md new file mode 100644 index 0000000000..7675bfb700 --- /dev/null +++ b/projects/example_project/README.md @@ -0,0 +1,140 @@ +# Example Project + +This is an example README for community `projects/`. You can write your README in your own project. Here are +some recommended parts of a README for others to understand and use your project, you can copy or modify them +according to your project. + +## Description \[required\] + +You can share any information you would like others to know. For example: + +``` +Author: @xxx. + +This is an implementation of \[XXX\]. +``` + +## Usage \[required\] + +### Setup Environment \[required\] + +Please refer to [Get Started](https://mmediting.readthedocs.io/en/1.x/get_started/I.html) to install +MMEditing. + +At first, add the current folder to `PYTHONPATH`, so that Python can find your code. Run command in the current directory to add it. + +> Please run it every time after you opened a new shell. + +```shell +export PYTHONPATH=`pwd`:$PYTHONPATH +``` + +### Data Preparation \[optional\] + +Prepare the ImageNet-2012 dataset according to the [instruction](https://mmediting.readthedocs.io/en/dev-1.x/user_guides/dataset_prepare.html#imagenet). + +### Training commands \[optional\] + +**To train with single GPU:** + +```bash +mim train mmedit configs/examplenet_8xb32_in1k.py +``` + +**To train with multiple GPUs:** + +```bash +mim train mmedit configs/examplenet_8xb32_in1k.py --launcher pytorch --gpus 8 +``` + +**To train with multiple GPUs by slurm:** + +```bash +mim train mmedit configs/examplenet_8xb32_in1k.py --launcher slurm \ + --gpus 16 --gpus-per-node 8 --partition $PARTITION +``` + +### Testing commands \[required\] + +**To test with single GPU:** + +```bash +mim test mmedit configs/examplenet_8xb32_in1k.py $CHECKPOINT +``` + +**To test with multiple GPUs:** + +```bash +mim test mmedit configs/examplenet_8xb32_in1k.py $CHECKPOINT --launcher pytorch --gpus 8 +``` + +**To test with multiple GPUs by slurm:** + +```bash +mim test mmedit configs/examplenet_8xb32_in1k.py $CHECKPOINT --launcher slurm \ + --gpus 16 --gpus-per-node 8 --partition $PARTITION +``` + +## Results \[required\] + +| Model | Pretrain | Top-1 (%) | Top-5 (%) | Config | Download | +| :----------------: | :----------: | :-------: | :-------: | :----------------------------------------: | :------------------------------------: | +| ExampleNet-tiny | From scratch | 82.33 | 96.15 | [config](configs/examplenet_8xb32_in1k.py) | [model](MODEL-LINK) \| [log](LOG-LINK) | +| ExampleNet-small\* | From scratch | 83.63 | 96.51 | [config](configs/examplenet_8xb32_in1k.py) | [model](MODEL-LINK) | +| ExampleNet-base\* | From scratch | 84.34 | 96.86 | [config](configs/examplenet_8xb32_in1k.py) | [model](MODEL-LINK) | + +*Models with * are converted from the [official repo](REPO-LINK). The config files of these models are only for inference. We don't ensure these config files' training accuracy and welcome you to contribute your reproduction results.* + +You can also paste some visual results here if the model doesn't have quantitative results. + +## Citation \[required\] + + + +```bibtex +@misc{mmediting2022, + title = {{MMEditing}: {OpenMMLab} Image and Video Editing Toolbox}, + author = {{MMEditing Contributors}}, + howpublished = {\url{https://github.com/open-mmlab/mmediting}}, + year = {2022} +} +``` + +## Checklist \[required\] + +Here is a checklist of this project's progress. And you can ignore this part if you don't plan to contribute +to MMediting projects. + +- [ ] Milestone 1: PR-ready, and acceptable to be one of the `projects/`. + + - [ ] Finish the code + + + + - [ ] Basic docstrings & proper citation + + + + - [ ] Converted checkpoint and results (Only for reproduction) + + + +- [ ] Milestone 2: Indicates a successful model implementation. + + - [ ] Training results + + + +- [ ] Milestone 3: Good to be a part of our core package! + + - [ ] Unit tests + + + + - [ ] Code style + + + + - [ ] `metafile.yml` and `README.md` + + diff --git a/projects/example_project/configs/examplenet_8xb32_in1k.py b/projects/example_project/configs/examplenet_8xb32_in1k.py new file mode 100644 index 0000000000..2a047ad943 --- /dev/null +++ b/projects/example_project/configs/examplenet_8xb32_in1k.py @@ -0,0 +1,7 @@ +# Directly inherit the entire recipe you want to use. +_base_ = 'mmediting::srcnn/srcnn_x4k915_1xb16-1000k_div2k.py' + +# This line is to import your own modules. +custom_imports = dict(imports='models') + +# Set your model, training, testing configurations. diff --git a/projects/example_project/models/__init__.py b/projects/example_project/models/__init__.py new file mode 100644 index 0000000000..e2d4f2f571 --- /dev/null +++ b/projects/example_project/models/__init__.py @@ -0,0 +1,3 @@ +from .example_net import ExampleNet + +__all__ = ['ExampleNet'] diff --git a/projects/example_project/models/example_net.py b/projects/example_project/models/example_net.py new file mode 100644 index 0000000000..374b761800 --- /dev/null +++ b/projects/example_project/models/example_net.py @@ -0,0 +1,31 @@ +from mmedit.models import ResNet +from mmedit.registry import MODELS + + +# Register your model to the `MODELS`. +@MODELS.register_module() +class ExampleNet(ResNet): + """Implements an example backbone. + + Implement the backbone network just like a normal pytorch network. + """ + + def __init__(self, **kwargs) -> None: + print('#############################\n' + '# Hello MMEditing! #\n' + '#############################') + super().__init__(**kwargs) + + def forward(self, x): + """The forward method of the network. + + Args: + x (torch.Tensor): A tensor of image batch with shape + ``(batch_size, num_channels, height, width)``. + + Returns: + Tuple[torch.Tensor]: Please return a tuple of tensors and every + tensor is a feature map of specified scale. If you only want the + final feature map, simply return a tuple with one item. + """ + return super().forward(x) From e8eb1be832b5624944cb0ef3d310d06bf9cd3180 Mon Sep 17 00:00:00 2001 From: Yanhong Zeng Date: Tue, 13 Dec 2022 14:29:43 +0800 Subject: [PATCH 11/44] [Docs] update contribution guidance (#1527) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Refactor] Refactor components, losses * [Improve] Update name * [Fix] Update matting metrics * [Refactor] VFI * [Refactor] finish & rearrange all matting pipeline * [Refactor] PSNR, SNR, MAE, MSE * [Refactor] SSIM * [Refactor] Inpainting pipeline * rename * [Refactor] train/tests tools * [Refactor] Linear LR Schduler * [Refactor] NIQE * Support strict=False * [Refactor] ReduceLR * [Fix] add register_all_modules in utils * [Refactor] add default runtime to all tasks * [Refactor] Update transforms for matting * [Refactor] Add SetValues * [Fix] Fix test for old flavr_net * [Improve] lasy init file_client to enable uri infer * [Improve] Update train/test tools * [Refactor] Matting models, components, metrics, transforms * [Improve] Move auto-2d-to-3d to loading * Update dataset to support null info in ann file * Update Metrics * Update reduce_lr * [Refactor] BaseModel * [Refactor] Mattor Configs * [Refactor] Update format and data_sample * [Refactor] VFI models and configs * [Fix] fileclient bug in loading * [Refactor] generate assistant transforms * [Refactor] SRCNN, EDSR, RDN * [Refactor] Dataset configs for inpainting * [Fix] VFI: update param_scheduler, hooks, and epoch_base_runner * [Fix] Hotfix segfault in CI rm gitlab_ci * [Refactor] EditOptimWrapperConstructor * [Refactor] 2.0 visualization hook and sample codes * [Fix] Add docstrings for visualizers * [Improve] Better GCA models & ceph support for matting transforms * [Refactor] LIIF DIC TTSR del vis_data * [Refactor] Merge inpainting components * [Improve] split REDS * [Refactor] Global&Local inpaintor * [Refactor] Video SR (#960) * Clear UT * Update tof * Update * Update other methods * Update all * Update * Update * Fix typo * Delete tmp file * [Refactor] Update readme of configs (#963) * [Docs] Add GPU info to README (#972) Co-authored-by: 张劲东 * [Refactor] Refactor all inpaintors (#973) * [Refactor] LIIF DIC TTSR * [Refactor] Merge inpainting components * [Improve] split REDS * [Refactor] Global&Local inpaintor * [Refactor] Video SR (#960) * Clear UT * Update tof * Update * Update other methods * Update all * Update * Update * Fix typo * debug:- * ftr: deepfillv1-local-test * debug: deepfillv1-train * - * ftr: runnable train.py * - * - * rebasing * debug:- * ftr: deepfillv1-local-test * debug: deepfillv1-train * - * ftr: runnable train.py * - * - * restore restoreres * fix * remove images * ftr: deepfillv2 pass local test * debug:pconv-stage1 * ftr: pconv pass local test * dev: aot * bugfix: aot-load-mask * debug:pconv-train * debug:pconv-train * debug:pconv-train * debug:pconv-train * debug:aot-train * debug:aot-train * debug:aot-train * refactor: refactor test script for inpainting models * bugfix: constructing optimizers manually instead of build_optimizers[deprecated] * bugfix: docstring coverage in pconv_inpaintor Co-authored-by: Yshuo-Li <1375829094@qq.com> Co-authored-by: wangruohui <5826-wangruohui@users.noreply.gitlab.sh.sensetime.com> Co-authored-by: ys-li <56712176+Yshuo-Li@users.noreply.github.com> Co-authored-by: wangruohui <12756472+wangruohui@users.noreply.github.com> * Update Metafiles for ``GPU Info`` (#974) Update metafile * [Update] Remove `mmcls` in requirements (#979) * [Fix] fix model registry and docs in demo (#975) * [Fix] fix model registry and docs in demo * [Fix] fix matting demo and restoration image demo * [Fix] fix inpainting demo * [Fix] modify init_model method in inference demo * [Fix] fix inference api * [Fix] fix image restoration demo * [Fix] fix video restoration and interpolation demo * [Fix] fix video interpolation demo * [Docs] Update Chinese Demo docs * [Improve] Update MMCV_MAX to 2.0 (#978) * [Improve] Update MMCV and MMENGINE version * [Refactor] Update configs and dosctrings (#968) 1. Update docstring 2. Fix configs * [Fix] Fix bugs found in benchmark regression (#981) * [Feature] scripts for benchmark regression * [Fix] optim_scheduler in edsr_x4c64b16_g1_300k_div2k.py * [Fix] remove ceph path from configs * - * clean * restore bg_dir ceph Co-authored-by: wangruohui <12756472+wangruohui@users.noreply.github.com> * Fix gca (#988) * fix * fix * remove debug * [Fix] clear personal ceph settings in configs * Update for publish and benchmark * [Fix] remove personal ceph information from save_dir in configs Co-authored-by: zenggyh1900 * [Feature] Use Circle-CI instead of Github-CI (#994) * [Feature] support circle ci * [Fix] Fix UT of metrics (#991) * [Fix] Fix UT of metrics * [Fix] add forward_tensor function in srgan (#992) Co-authored-by: LeoXing1996 Co-authored-by: ys-li <56712176+Yshuo-Li@users.noreply.github.com> * [Fix] Using sequence_length instead of max_frame_num in video dataset and update related UT (#997) * [Fix] Using sequence_length instead of max_frame_num in video dataset * [Fix] Update related UT for video dataset Co-authored-by: LeoXing1996 * [Fix] Fix forward_train() in realbasicvsr * [Fix] Fix bugs caused by refactoring to pass CI (#1000) * [Fix] using tensor.repeat instead of tensor.tile due to updated torch version * [Refactor] remove github ci * [Fix] fix register_all_modules (#1022) * [Refactor] refactor dir and fix bugs (#1037) * [Refactor] clear tests_old * [Feature] add .pre-commit0config-zh-cn.yaml * [Refactor] expand algorithms under configs * [Refactor] refactor config dir * [Refactor] refactor tools dir * [Refactor] remove components, synthesizers in mmedit/models * [Refactor] evaluation/evaluator * [Refactor] refactor models * [Refactor] expand all models under models/ * [Refactor] dev scripts * [Refactor] organize uts according to models * [Refactor] refact utils and evaluation * [Refactor] clear ceph paths * [Feature] update cosinerestartlr in configs * [Fix] Resolve some import errors (#1007) resolve import error Co-authored-by: LeoXing1996 * [Fix] Revise ut for image super resolution models (#1008) [Refactor] revise UT for ISR, Matting, and VFI, * [Refactor] Refactor VSR models (#1010) * Refactor models and add UTs for VSR models * [refactor] clear datasets * refactor: remove logger * [Refactor] add UT for common components * [Refactor] clear unused dataset * [refactor] update ut * [Refactor]: clear builder * [Feature] enable resume/amp option in train.py * [Refactor] add UT * fix ut * [Refactor] expand mask and matting folder in transforms * [Refactor] clear common, components * update ut * fix ut * [Fix] Refactor evluation, engine, visualization (#1012) * refactor * Leoxing/refactor more (#1013) * resolve conflict * rename transforms/utils.py to transforms/trans_utils.py * [fix] fix the batch size to mini-batch size in inpainting's configs * [fix] clear personal ceph paths in configs * [Refactor] refactor directory and fix UT (#1014) * [Refactor] refactor configs path * [fix] update error message in mmedit/__init__.py * clear empty folder * [Fix] fix data config and some import errors (#1015) * [Fix] Fix param_scheduler of edsr x4 (#1016) * [Fix] Fix glean (#1017) * [Fix] Fix tof configs (#1019) * [Fix] fix configs error * [Feature] enable skip, rerun, and specific GPU numbers in train_benchmark * [Fix] fix config errors * [Enhancement] Revise test benchmark and download script (#1021) * revise test benchmark and download script * hot fix * support job watcher * remove task name in download * [Feature] Update dev_scripts and fix configs * fix train_benchmark * [Fix] dev_scripts and configs (#1026) * fix dev_scripts and configs * [Fix] Update config of glean (#1027) * [Fix] Fix config of real-esrgan (#1031) * [Fix] Fix config of RDN (#1029) * [Fix] update config of Tdan (#1032) * Fix config of real-esrgan * Update config of TDAN * [Fix] add UT for each module accordingly (#1033) * fix test_datasets UT * [Fix] fix test_engine UT * [Fix] fix test_structures UT * fix test_evaluation UT * fix test_data_preprocessors and test_base_models UT * fix test_models_utils UT * fix test_editors UT * fix test_layers UT * fix import errors * Add test data * fix test_api UT * [Fix] fix bugs in model and configs due to refactor (#1035) * fix configs using div2k * fix config * fix loading pconv_mask * fix ema hook in real_esrgan * [Fix] fix deepfillv1 and add ut for ema Co-authored-by: LeoXing1996 Co-authored-by: LeoXing1996 Co-authored-by: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Co-authored-by: ys-li <56712176+Yshuo-Li@users.noreply.github.com> * [Fix] fix bug in crop transform (#1042) * [Refactor] rename configs and update readme accordingly (#1041) * update config_filename, content inside config files, link in readme * refactor apis used mmcv.cnn before * [Fix] fix configs and OptimWrapper called in train_step (#1045) * [Fix] config and liif (#1046) * [Fix] Fix test benchmark (#1040) * [Feature ] support testing with multiple datasets in test stage * [Feature] enable testing benchmark regression by scripts * [Fix] fix fully functional demo and tools (#1047) * [Fix] fix fully functional demo and tools * [Fix] config filename (#1048) * rename config filename * update config link in readme * reset experiment name and base in config * fix UT * [Refactor] refactor documentations (#1039) * refact dirs * update director structure * refactor directory structure * [Docs] fix docs (#1049) * [Docs] fix advanced_guides * [Docs] Add notes docs * [Docs] fix user_guides and model_zoo * [Docs] migration * [Doc] fix reviewed docs * fix reviewd docs * [Doc] refactor advanced_guides/model (#1061) * [Doc] refactor advanced_guides/model * [Doc] refactor advanced_guides/model * doc: models * Apply suggestions from code review Co-authored-by: Yifei Yang <2744335995@qq.com> * + loss.md * fix lint Co-authored-by: Yifei Yang <2744335995@qq.com> Co-authored-by: Z-Fran <49083766+Z-Fran@users.noreply.github.com> * [Documentation] useful tools: flops, model converters (#1059) useful tools: flops, model converters * [Document] user_guides/train_test.md (#1058) * train_test: train and test with cpu/single-gpu/multi-gpu/slurm * fix outdated message * [Documentation] user_guides: inference (#1060) * user_guides: inference * fix typo * get_started: installation and demo (#1057) * get_started: installation and demo * use only a demo in get_started * update demo in get_started Co-authored-by: Z-Fran <49083766+Z-Fran@users.noreply.github.com> * [Refactor] overview (#1055) * overview * refactor overview * fix typo * Apply suggestions from code review Co-authored-by: Yifei Yang <2744335995@qq.com> Co-authored-by: Yifei Yang <2744335995@qq.com> Co-authored-by: Z-Fran <49083766+Z-Fran@users.noreply.github.com> * [Doc] fix doc building (#1066) * advoid conflict * fix lint Co-authored-by: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Co-authored-by: Yifei Yang <2744335995@qq.com> * [Refactor] refactor data flow and engine library (#1054) * [Refactor]: refactor data_flow and the import from mmengine * [Fix] update UT * [Improve] Use relpath for NIQE params (#1002) * niqe_relpath * [Fix] import os Co-authored-by: zenggyh1900 * [Fix] fix training configuration in the configs of basicvsr_pp (#1067) * - * fix rebase conflict * [Docs] fix docstring (#1062) * [Doc] fix editors docsring (#1069) Co-authored-by: Yanhong Zeng * [Doc] Refactor Chinese docs (#1070) * [Doc] Refactor Chinese docs * fix switch_language doc * [Doc] fix README * [Doc] fix README (#1071) * [Doc] fix README * fix readme_zh-CN * [Fix] fix docs/en (#1072) * remove unnecessary images and update gitignore * autoformat docstring by docformatter * fix link * update switch_language * update changelog * Bump to version V1.0.0rc0 (#1073) * [Refactor] update requirements and version * remove mmengine version requirement * [Fix] Deploy 1.x to pypi (#1075) [Fix] push to pypi * [Fix] fix data flow in multi_loop (#1081) * [Fix] fix multi_loops UT and clean debug code (#1083) * [Fix] fix multi_loops UT and clean debug code * [Fix] Fix concat visualizer due to data_flow refactor (#1082) * [Fix] expand output dict for concat visualizer * [Feature] Update Github workflow and CircleCi (#1086) * update GitHub workflow and ci * [Fix] fix visualization (#1091) * [Fix] fix visualization * fix test_visualization_hook * [Fix] fix glean test_pipeline (#1088) * [Doc] Add task and quickstart info in README (#1106) * [Doc] Add task and quickstart info in README * [Feature] Support models of MMGeneration to MMEditing (#1105) * [Document] merge mmgeneration into mmediting (#1111) * merge overview, get_started, user_guides, advanced_guides * update index.rst * update migration and notes * [Fix] Add Unit tests (#1109) * update ut Co-authored-by: zengyh1900 * [Doc] user_guides/5_visualization (#1112) * [Documentation] update intallation scripts (#1113) * Update 2_get_started.md (#1116) * [Doc] fix docstring warnings (#1120) * [Doc] fix migration docs (#1115) * [Doc] Modify advanced guideds and notes (#1118) * add loss table * enhance transform and dataset docs * change projects format * [Doc] user_guides/2_dataset_prepare (#1122) * [Doc] user_guides/2_dataset_prepare * [fix] update dataset zoo Co-authored-by: zenggyh1900 * [Doc] advanced_guides/5_metrics (#1117) * [Doc] advanced_guides/5_metrics * move metrics from advanced_guides to user_guides Co-authored-by: zenggyh1900 * [Fix] Fix Windows CI (#1123) * rename / delete some uts * skip test ppl * remove linux ut to speed up debug * skip some stylegan1 uts in win-cu CI * skip & mock some unit tests * add debug in workflow * fix ut for vis_backend * skip two stage * skip two stage encoder decoder * skip stylegan ut * skip plain ut * skip more uts * uncomment pr-stage-test.yml * Update pr_stage_test.yml Co-authored-by: Yanhong Zeng * [Doc] advanced-guides/1_models (#1130) * [Doc] model_zoo (#1128) * [Doc] model_zoo * update number of checkpoints Co-authored-by: zenggyh1900 * [Fix] fix warning (#1129) fix warning * [Enhancement] Add unit test for GAN models (#1125) * add unit test for SAGAN * add unit test for DCGAN * [Fix] Skip unit test of Eq when torch < 1.8.0 (#1131) skip unit test of Eq when torch < 1.8.0 * [Enhancement] Add dataset unit test (#1114) * add unit test for basic conditional dataset * add unit test for categories * add unit test for imagenet dataset * add unit test for cifar10 dataset * [Enhancement] Add unit test for evaluator (#1119) * add unit test for evaluator * modify mock usage * [Enhancement] Add unit test for loops + IterTimeHook (mmedit/engine/*.py) (#1121) * add unit test for loops * add unit test for iter time hook * [Enhancement] Add unit tests for BaseGAN and BaseConditionalGAN (#1124) * complete ut for baseGAN * complete unit tests for conditional GAN * Review by Bohuai (#1094) * Review by Bohuai In the example, config path is wrong. * rebase on 1.x Co-authored-by: zenggyh1900 * Review by Wu Bohuai (#1076) update note Co-authored-by: zenggyh1900 * Fix warning (#1132) * fix: docstring warning * [Documentation ]update model zoo (#1133) * update model zoo * fix lint * [Enhancement] Add more unit tests (#1134) * add unit test of FID inception * revise ut of FID-inception * add unit test for sampler, misc and visHook * add unit test for styleGAN2 and ADA * add unit tests for p2p * add unit test and model for arcface * skip windows CI for ArcFace * skip test on pt1.6 for Ada * fix bug * update more unit tests * update requirement * fix label sample fn under windows env * skip ut for clip loss when torch<=1.6.0 * add git to Dockerfile * fix gpu unit test * Remove omit when coverage is not uploaded * skip some unit tests due to limited RAM * [Enhancement] Add positional encoding in GANs to MMEditing (#1139) * support mspie and pe-singan * add configs for positional encoding in gans * fix lint error caused by rebase * move PESinGAN and positional encoding to MSPIE * [Doc] update task label in README (#1137) * [Doc] update losses.md (#1141) * fix typo (#1140) * [Enhancement] Revise file structure and add ut (#1145) * refactor mmedit/models/utils/ * rename layers to base_archs * move fid-inception and inception_utils to evaluation/funcitonal * merge batch process to edit data processor * move misc to utils * rename loops.py to gen_loops.py * move log_processor to runner * move trans utils to utils * move some function from metric_utils to mmedit/utils * add unit test for inception utils.py * add unit test for average model * add unit test for base translation model * add more ut for sagan generator * add more unit test for biggan generator * add unit test for io_utils and revise the name of variable * add more unit test for biggan deep generator * remove useless ut files and revise some uts * add unit test for stylegan3 * add more unit test for cyclegan * add more unit test for stylegan2 module * skip unit test of CLIP loss on win-cuda env * omit ops under stylegan2 folder * fix ut of alpha.py to avoid the randomness * update base_archs * update base_archs * update ut * fix import error * add unit test for singan-modules * add unit test for sn module * add unit test for stylegan1 and stylegan3 * revise unit test of arcFace * add unit test for wgan-module * complete unit test of gen metric * remove useless unit test files * remove useless uts and revise ut checking script * revise omit file list in CI configs * update dev_scripts Co-authored-by: zenggyh1900 * [Docs] Fix Readme according to the merge (#1142) * modify readme for merged edit * fix readme of models * fix lint * fix as comments * [Doc] Update configs in README (#1138) * [Doc] Update configs in README * [Fix] fix checkpoint of metafile * [Doc] fix checkpoint in README * [Doc] fix glean metafile * [Doc] fix checkpoint url * [Fix] fix model_zoo script * [Doc] update model_zoo Co-authored-by: Yanhong Zeng * [Doc] update dataset_zoo (#1143) * [Doc] update dataset README * [Doc] update daaset_zoo scripts * [Doc] update dataset_zoo * [Fix] Fix stylegan3 ut (#1146) * skip some s3 ut * fix lint * [Fix] Fix lint after merge (#1148) * fix lint * avoid randomness in stylegan2 generator unit test * [Fix] remove ToTensor transform (#1144) * [Fix] remove ToTensor transform * fix api inference bug Co-authored-by: Yanhong Zeng * [Fix] replace lr_config by param_scheduler (#1147) * [Fix] replace lr_config by param_scheduler * fix edvr * fix basicvsr * remove fixed lr_config * [Fix] fix trans_utils import error (#1149) * [Fix] readme (#1152) * update readme * update readme * [Enhancement] Add CPU unit test for IconVSR (#1151) add cpu for iconvsr * update model zoo * update changelog (#1155) * [Enhancement] Update setup and publish workflow (#1153) * update setup and publish workflow * install pytorch in workflow * [Feature] Add pickle data hook (#1156) * add pickle data hook * fix ut * [Fix] Fix merge stage test (#1157) fix merge stage test * [Fix] Fix PyTorch installation in merge stage test (#1158) fix merge stage test * [Improve] add a version option in docs menu (#1162) * update docs menu * update docs/datasets * [Enhance] update dev_scripts for link checking (#1164) update dev_scripts for link checking * [Refactoring] decompose the implementations of different metrics into several files (#1161) * refactor metrics * add UT for refactored metrics * [Fix] Fix PPL bug (#1172) fix ppl bug * [Fix] Fix some known bugs. (#1200) * fix bug in ceph config generation * fix download error in io_utils * trigger CI * [Fix] Benchmark related bugs (#1236) * fix benchmark url and related stuff * fix lint * [Enhancement] Support rerun failed or canceled jobs in `train_benchmark.py` (#1259) * trigger CI * fix cache dir in job watcher * support rerun failure or canceled jobs in train benchmark * add use case and readme for rerun * avoid trigger circle CI pr-stage-test when .dev_script is modified * support change cpus-per-task in train benchmark * [Fix] Fix bugs in `sr test config`, `realbasicvsr config` and `pconv config` (#1167) * fix pconv bug * fix realbasicvsr * fix sisr test config * [Fix] fix test of Vid4 datasets bug (#1293) * [Fix] fix test of Vid4 datasets bug * Update tof_x4_official_vimeo90k.py * Update tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd.py * Update tdan_test_config.py * [Feature] Support multi-metrics with different sample-model (#1171) support multi-metrics with different sample-model * [Fix] fix GenerateSegmentIndices ut (#1302) * [Enhancement] Reduce the randomness in unit test of `stylegan3_utils.py` (#1306) make s3-utils unit test more robustic * [CI] Fix GitHub windows CI (#1320) * add 'python -m' to windows' workflow * [Fix] fix basicvsr++ mirror sequence bug (#1304) * [Fix] fix sisr-test psnr config (#1319) * [Fix] fix vsr models pytorch2onnx (#1300) * [Bug] Ensure the output type of `GenerateFacialHeatmap` is `np.float32` (#1310) * trigger CI * ensure output of GenerateFacialHeatmap is float32 * [Bug] Fix sampling behavior of `unpaired_dataset.py` and urls in cyclegan's README (#1308) * trigger CI * fix download url in cyclegan readme * fix bug in unpaired dataset * support evaluate multi metrics in one configs for cyclegan models * [README] Fix TTSR's README (#1325) fix TTSR's README * [CI] Update `paths-ignore` for GitHub CI (#1327) update paths-ignore for GitHub CI * [Bug] Save gt images in PGGAN's `forward` (#1328) * save gt image to data samples in forward * add ut to ensure gt img is saved * [Bug] Correct RDN number of channels (#1332) * [Bug] Revise flip transformation in some conditional gan's setting (#1331) revise flip transformation in some conditional gan's setting * [Unit Test] Fix unit test of SNR (#1335) fix unit test of SNR * [Bug] Revise flavr config (#1336) revise flavr config * [Fix] fix realesrgan ema (#1341) * [Fix] fix realesrgan ema * fix * fix ut * fix config * fix ut * [Fix] Fix bugs find during benchmark running (#1348) * fix stylegan1 register name, add fid metric mapping * fix lint * [Fix] fix liif test config (#1353) * [Enhancement] Complete save_best in configs (#1349) complete save_best in generative models and glean * [Config] Revise discriminator's learning rate of TTSR to align with 0.x version (#1352) align ttsr-gan's disc lr with 0.x version (1e-4 -> 1e-5) * [Fix] fix edsr configs (#1367) fix edsr * [Enhancement] Add pixel value clip in visualizer (#1365) add pixel value clip in visualizer * [Bug] Fix randomness in FixedCrop + add L1 loss in Pix2Pix (#1364) * fix randomness in FixedCrop + add L1 loss in Pix2Pix * add deterministic training for p2p * [Fix] fix realbasicvsr config (#1358) * [Enhancement] Fix PESinGAN-inter-pad setting + add SinGAN Dataset + add SinGAN demo (#1363) * add singan dataset * adopt singan config with PackEditInputs * revise forward logic of SinGANMSGeneratorPE * fix ema-related logic of SinGAN * add singan demo * add unit test for pe-singan * add unit test for singan-ema and revise singan * [Fix] fix types of exceptions in demos (#1372) fix types of exceptions in demos * [Enhancement] Support deterministic training in benchmark (#1356) * support deterministic training in benchmark * add kill-on-bad-exit to benchmark * [Fix] Avoid cast int and float in GenDataPreprocessor (#1385) avoid cast int and float in GenDataPreprocessor * [Config] Update metric config in ggan (#1386) * update metric config in ggan * update gen_default_runtime * [Config] Revise batch size in wang-gp's config (#1384) revise batch size in wang-gp's config * [Fix]: add type and change default number of preprocess_div2k_dataset.py (#1380) * [Fix]: add type and change default number of preprocess_div2k_dataset.py * using mmengine.scandir instead of mmcv.scandir Co-authored-by: zenggyh1900 * [Feature] Support qualitative comparison tools (#1303) * Add base gui * support patch compare * support slider compare * readme * add recording prompt * fix lint * fix comments Co-authored-by: unknown * [Docs] Revise docs (change PackGenInputs and GenDataSample to mmediting ones) (#1382) revise docs (change PackGenInputs and GenDataSample to mmediting ones) Co-authored-by: Yanhong Zeng * [Config] Revise Pix2Pix edges2shoes config (#1391) * revise config for p2p-edge2shoes * update batch size setting * rename config name and revise readme * [Bug] fix rdn and srcnn train configs (#1392) * fix srcnn * fix rdn * [Fix] Fix test/val pipeline of pegan configs (#1393) fix ppegan configs * [Fix] Modify Readme of S3 (#1398) modify readme * [Fix] Correct fid of ggan (#1397) fix readme of ggan * [Feature] support instance_aware_colorization inference (#1370) * add Instance-aware Image Colorization * update configs * update docstring if instance-aware image colorization * add unit test of instance_aware_colorization * use mmdet Co-authored-by: ruoning * bump to v1.0.0rc2 (#1405) * [Improve] add a version option in docs menu (#1162) * [Enhance] update dev_scripts for link checking (#1164) * [Refactoring] decompose the implementations of different metrics into several files (#1161) * [Fix] Fix PPL bug (#1172) * [Fix] Fix some known bugs. (#1200) * [Fix] Benchmark related bugs (#1236) * [Enhancement] Support rerun failed or canceled jobs in `train_benchmark.py` (#1259) * [Fix] Fix bugs in `sr test config`, `realbasicvsr config` and `pconv config` (#1167) * [Fix] fix test of Vid4 datasets bug (#1293) * [Feature] Support multi-metrics with different sample-model (#1171) * [Fix] fix GenerateSegmentIndices ut (#1302) * [Enhancement] Reduce the randomness in unit test of `stylegan3_utils.py` (#1306) * [CI] Fix GitHub windows CI (#1320) * [Fix] fix basicvsr++ mirror sequence bug (#1304) * [Fix] fix sisr-test psnr config (#1319) * [Fix] fix vsr models pytorch2onnx (#1300) * [Bug] Ensure the output type of `GenerateFacialHeatmap` is `np.float32` (#1310) * [Bug] Fix sampling behavior of `unpaired_dataset.py` and urls in cyclegan's README (#1308) * [README] Fix TTSR's README (#1325) * [CI] Update `paths-ignore` for GitHub CI (#1327) * [Bug] Save gt images in PGGAN's `forward` (#1328) * [Bug] Correct RDN number of channels (#1332) * [Bug] Revise flip transformation in some conditional gan's setting (#1331) * [Unit Test] Fix unit test of SNR (#1335) * [Bug] Revise flavr config (#1336) * [Fix] fix realesrgan ema (#1341) * [Fix] Fix bugs find during benchmark running (#1348) * [Fix] fix liif test config (#1353) * [Enhancement] Complete save_best in configs (#1349) * [Config] Revise discriminator's learning rate of TTSR to align with 0.x version (#1352) * [Fix] fix edsr configs (#1367) * [Enhancement] Add pixel value clip in visualizer (#1365) * [Bug] Fix randomness in FixedCrop + add L1 loss in Pix2Pix (#1364) * [Fix] fix realbasicvsr config (#1358) * [Enhancement] Fix PESinGAN-inter-pad setting + add SinGAN Dataset + add SinGAN demo (#1363) * [Fix] fix types of exceptions in demos (#1372) * [Enhancement] Support deterministic training in benchmark (#1356) * [Fix] Avoid cast int and float in GenDataPreprocessor (#1385) * [Config] Update metric config in ggan (#1386) * [Config] Revise batch size in wang-gp's config (#1384) * [Fix]: add type and change default number of preprocess_div2k_dataset.py (#1380) * [Feature] Support qualitative comparison tools (#1303) * [Docs] Revise docs (change PackGenInputs and GenDataSample to mmediting ones) (#1382) * [Config] Revise Pix2Pix edges2shoes config (#1391) * [Bug] fix rdn and srcnn train configs (#1392) * [Fix] Fix test/val pipeline of pegan configs (#1393) * [Fix] Modify Readme of S3 (#1398) * [Fix] Correct fid of ggan (#1397) * [Feature] support instance_aware_colorization inference (#1370) Co-authored-by: ruoning Co-authored-by: Yifei Yang <2744335995@qq.com> Co-authored-by: LeoXing1996 Co-authored-by: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Co-authored-by: Qunliang Xing Co-authored-by: Yang Gao Co-authored-by: ruoning <44117949+ruoningYu@users.noreply.github.com> * [Bug] fix cain config (#1404) * fix srcnn * [Bug] fix cain config * [Fix] Revise config and pretrain model loading in esrgan (#1407) revise config and pretrain model loading in esrgan * [Fix] Fix lsgan config (#1409) fix lsgan config * [Enhancement] Support `try_import` for `mmdet` (#1408) * add try-import for mmdet * revise import logic * add unit test for try_import Co-authored-by: Yanhong Zeng Co-authored-by: Yifei Yang <2744335995@qq.com> * [Enhancement] Set ``real_feat`` to cpu in inception_utils (#1415) fix s2 configs * [Enhancement] git ignore slurm generated files (#1416) * improve git ignore * add a blank line * [Fix] modify readme and configs of stylegan2&pegan (#1418) modify readme and configs of stylegan2&pegan * [Enhancement] Support try-import for `clip` (#1420) * support try-import for clip * update ci * [Enhancement]: Improve the rendering of Docs-API (#1373) * [Enhancement]: Improve the rendering of Docs-API * fix lint Co-authored-by: root Co-authored-by: Yanhong Zeng * [Fix] Complete requirements (#1419) * add requirements * fix lint Co-authored-by: Yanhong Zeng * [Doc] Update changelog and README for 1.0.0rc3. (#1421) * update changelog and README * revise change log * [Bug] Install clip in merge stage test (#1423) install clip in merge stage test * [Fix] Install clip in windows CI (#1424) install clip in windows CI * Bump to 1.0.0rc3. (#1425) * [Improve] add a version option in docs menu (#1162) * update docs menu * update docs/datasets * [Enhance] update dev_scripts for link checking (#1164) update dev_scripts for link checking * [Refactoring] decompose the implementations of different metrics into several files (#1161) * refactor metrics * add UT for refactored metrics * [Fix] Fix PPL bug (#1172) fix ppl bug * [Fix] Fix some known bugs. (#1200) * fix bug in ceph config generation * fix download error in io_utils * trigger CI * [Fix] Benchmark related bugs (#1236) * fix benchmark url and related stuff * fix lint * [Enhancement] Support rerun failed or canceled jobs in `train_benchmark.py` (#1259) * trigger CI * fix cache dir in job watcher * support rerun failure or canceled jobs in train benchmark * add use case and readme for rerun * avoid trigger circle CI pr-stage-test when .dev_script is modified * support change cpus-per-task in train benchmark * [Fix] Fix bugs in `sr test config`, `realbasicvsr config` and `pconv config` (#1167) * fix pconv bug * fix realbasicvsr * fix sisr test config * [Fix] fix test of Vid4 datasets bug (#1293) * [Fix] fix test of Vid4 datasets bug * Update tof_x4_official_vimeo90k.py * Update tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd.py * Update tdan_test_config.py * [Feature] Support multi-metrics with different sample-model (#1171) support multi-metrics with different sample-model * [Fix] fix GenerateSegmentIndices ut (#1302) * [Enhancement] Reduce the randomness in unit test of `stylegan3_utils.py` (#1306) make s3-utils unit test more robustic * [CI] Fix GitHub windows CI (#1320) * add 'python -m' to windows' workflow * [Fix] fix basicvsr++ mirror sequence bug (#1304) * [Fix] fix sisr-test psnr config (#1319) * [Fix] fix vsr models pytorch2onnx (#1300) * [Bug] Ensure the output type of `GenerateFacialHeatmap` is `np.float32` (#1310) * trigger CI * ensure output of GenerateFacialHeatmap is float32 * [Bug] Fix sampling behavior of `unpaired_dataset.py` and urls in cyclegan's README (#1308) * trigger CI * fix download url in cyclegan readme * fix bug in unpaired dataset * support evaluate multi metrics in one configs for cyclegan models * [README] Fix TTSR's README (#1325) fix TTSR's README * [CI] Update `paths-ignore` for GitHub CI (#1327) update paths-ignore for GitHub CI * [Bug] Save gt images in PGGAN's `forward` (#1328) * save gt image to data samples in forward * add ut to ensure gt img is saved * [Bug] Correct RDN number of channels (#1332) * [Bug] Revise flip transformation in some conditional gan's setting (#1331) revise flip transformation in some conditional gan's setting * [Unit Test] Fix unit test of SNR (#1335) fix unit test of SNR * [Bug] Revise flavr config (#1336) revise flavr config * [Fix] fix realesrgan ema (#1341) * [Fix] fix realesrgan ema * fix * fix ut * fix config * fix ut * [Fix] Fix bugs find during benchmark running (#1348) * fix stylegan1 register name, add fid metric mapping * fix lint * [Fix] fix liif test config (#1353) * [Enhancement] Complete save_best in configs (#1349) complete save_best in generative models and glean * [Config] Revise discriminator's learning rate of TTSR to align with 0.x version (#1352) align ttsr-gan's disc lr with 0.x version (1e-4 -> 1e-5) * [Fix] fix edsr configs (#1367) fix edsr * [Enhancement] Add pixel value clip in visualizer (#1365) add pixel value clip in visualizer * [Bug] Fix randomness in FixedCrop + add L1 loss in Pix2Pix (#1364) * fix randomness in FixedCrop + add L1 loss in Pix2Pix * add deterministic training for p2p * [Fix] fix realbasicvsr config (#1358) * [Enhancement] Fix PESinGAN-inter-pad setting + add SinGAN Dataset + add SinGAN demo (#1363) * add singan dataset * adopt singan config with PackEditInputs * revise forward logic of SinGANMSGeneratorPE * fix ema-related logic of SinGAN * add singan demo * add unit test for pe-singan * add unit test for singan-ema and revise singan * [Fix] fix types of exceptions in demos (#1372) fix types of exceptions in demos * [Enhancement] Support deterministic training in benchmark (#1356) * support deterministic training in benchmark * add kill-on-bad-exit to benchmark * [Fix] Avoid cast int and float in GenDataPreprocessor (#1385) avoid cast int and float in GenDataPreprocessor * [Config] Update metric config in ggan (#1386) * update metric config in ggan * update gen_default_runtime * [Config] Revise batch size in wang-gp's config (#1384) revise batch size in wang-gp's config * [Fix]: add type and change default number of preprocess_div2k_dataset.py (#1380) * [Fix]: add type and change default number of preprocess_div2k_dataset.py * using mmengine.scandir instead of mmcv.scandir Co-authored-by: zenggyh1900 * [Feature] Support qualitative comparison tools (#1303) * Add base gui * support patch compare * support slider compare * readme * add recording prompt * fix lint * fix comments Co-authored-by: unknown * [Docs] Revise docs (change PackGenInputs and GenDataSample to mmediting ones) (#1382) revise docs (change PackGenInputs and GenDataSample to mmediting ones) Co-authored-by: Yanhong Zeng * [Config] Revise Pix2Pix edges2shoes config (#1391) * revise config for p2p-edge2shoes * update batch size setting * rename config name and revise readme * [Bug] fix rdn and srcnn train configs (#1392) * fix srcnn * fix rdn * [Fix] Fix test/val pipeline of pegan configs (#1393) fix ppegan configs * [Fix] Modify Readme of S3 (#1398) modify readme * [Fix] Correct fid of ggan (#1397) fix readme of ggan * [Feature] support instance_aware_colorization inference (#1370) * add Instance-aware Image Colorization * update configs * update docstring if instance-aware image colorization * add unit test of instance_aware_colorization * use mmdet Co-authored-by: ruoning * [Bug] fix cain config (#1404) * fix srcnn * [Bug] fix cain config * [Fix] Revise config and pretrain model loading in esrgan (#1407) revise config and pretrain model loading in esrgan * [Fix] Fix lsgan config (#1409) fix lsgan config * [Enhancement] Support `try_import` for `mmdet` (#1408) * add try-import for mmdet * revise import logic * add unit test for try_import Co-authored-by: Yanhong Zeng Co-authored-by: Yifei Yang <2744335995@qq.com> * [Enhancement] Set ``real_feat`` to cpu in inception_utils (#1415) fix s2 configs * [Enhancement] git ignore slurm generated files (#1416) * improve git ignore * add a blank line * [Fix] modify readme and configs of stylegan2&pegan (#1418) modify readme and configs of stylegan2&pegan * [Enhancement] Support try-import for `clip` (#1420) * support try-import for clip * update ci * [Enhancement]: Improve the rendering of Docs-API (#1373) * [Enhancement]: Improve the rendering of Docs-API * fix lint Co-authored-by: root Co-authored-by: Yanhong Zeng * [Fix] Complete requirements (#1419) * add requirements * fix lint Co-authored-by: Yanhong Zeng * [Doc] Update changelog and README for 1.0.0rc3. (#1421) * update changelog and README * revise change log * [Bug] Install clip in merge stage test (#1423) install clip in merge stage test * [Fix] Install clip in windows CI (#1424) install clip in windows CI Co-authored-by: Yanhong Zeng Co-authored-by: Yifei Yang <2744335995@qq.com> Co-authored-by: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Co-authored-by: Qunliang Xing Co-authored-by: Yang Gao Co-authored-by: ruoning <44117949+ruoningYu@users.noreply.github.com> Co-authored-by: unknown Co-authored-by: root * [Doc] fix readthedoc requirements (#1437) * [Fix] fix srgan train config (#1441) * fix srcnn * [Fix] fix srgan train config * [Enhancement] Fix 'after_test_ite' of vis hook + support 'max_save_at_test' (#1430) * fix 'after_test_ite' of vis hook + support 'max_save_at_test' * delete comment in unit test * [Feature] Support NAFNet model (#1369) * NAFNet feature * NAFNet and Real-ESRGAN * NAFNet for denoising cfg * Modify NAFNet Gopro Config * NAFNet Deblurring Config * Debug removal * NAFNet Feature * NAFNet Feature Support * NAFNet Feature Support * NAFNet code check finished * NAFNet unit tests * NAFNet unit test * Docstring for NAFNet * NAFNet unit tests * NAFNet * NAFNet unit tests * NAFNet unit tests * PSNRLoss * NAFNet unit tests * NAFNet Readme * add NAFNet into __init__ * NAFNet baseline * NAFNet cfgs for test * NAFNet readme * NAFNet Readme and Configs * Rename files * BaseModule * clear undesired comments * NAFNet Readme * NAFNet Readme * NAFNet components * NAFNet UTs Co-authored-by: Yanhong Zeng * [Doc] fix readthedoc requirements (#1448) * [Doc] fix readthedoc requirements * fix readthedoc * [Fix] Revise unit test of log processor (#1459) revise unit test of log processor * [Refactor] Replace UnconditionalImageDataset with BasicImageDataset (#1456) replace uncond to basic Co-authored-by: LeoXing1996 * [Docs] Refine dev-1.x docs (#1461) * fix bug * fix bug-v2 * Update docs/en/2_get_started.md Co-authored-by: 赵昌健 Co-authored-by: Yifei Yang <2744335995@qq.com> * [Doc] Refine User guides (#1462) * update user_guides doc * fix lint Co-authored-by: ruixiangzhang Co-authored-by: plyfager <2744335995@qq.com> * update user guides (#1463) Co-authored-by: Yifei Yang <2744335995@qq.com> * [Enhancement] Refactor high-level APIs (#1410) * add high-level inference api and run conditional model good. * [high-level api] run unconditional model. * [high-level api] add matting inferencer. * [high-level api] add inpainting inferencer. * [high-level api] add translation inferencer. * [high-level api] add restoration inferencer. * [high-level api] add inference functions * [high-level api] add video interpolation inference * [high-level api] add video restoration inferencer * [high-level api] pass linter check * [hight-level api] append linter check * [high-level api] delete old interface py code * [high-level api] remove unused code. * [high-level api] add comments for inferences. * [high-level api] delete unused parameters and add extra parameters. * [high-level api] add inference tutorial. * [high-level api] add unit test for inference_functions * [high-level api] fix path error. * [high-level api] delete old unit test file. * [high-level api] add ut for edit and conditional inferncer. * [high-level api] fix edit ut bug and add ut of base_inference, inpainting. * [high-level api] fix edit.py ut and add two uts. * [high-level api] add result_out_dir to UTs and add two new uts. * [high-level api] fix unconditional ut out of ram and add two uts. * [high-level api] try to satisfy ut code coverage. * [high-level api] use pytest.raises to catch ut error. * [high-level api] add more test case in inference_functions * [high-level api] add video restoration test case. * [high-level api] video interpolation support dir input output and add ut case * [high-level api] video restoration support input_dir and add uts. * [high-level api] add more uts for inference funcs. * [high-level api] fix bug in inference_functions * [high-level api] add more uts. * [high-level api] make colorization inference be tested. * [high-level api] roll back last commit. * [high-level api] delete unused code. * [high-level api] remove default value. * [high-level api] rename version to setting. * [high-level api] add examples in edit.py and remove duplicated funcs. * [high-level api] add log for functions not used. * [high-level api] load mean std from cfg and use basedataelement * [high-level api] do unittest with cu102 version. * [high-level api] add more uts. * [high-level api] revert change in da2557b * [high-level api] add uts. * [high-level api] replace ckpt to http url./ * [high-level api] read config from metafile and download ckpt automatically. * [high-level api] make default setting all to 0. * [high-level api] add content in ipynb * [high-level api] add ut for test_edit modification. * [high-level api] fix task in scripts and metafiles * [high-level api] read task name from metafile * [high-level api] reproduce nafnet metafile * [high-level api] put good example to inference ipynb * [high-level api] revert inpainting demo to global local. * [high-level api] add model setting and extra parameters in ipynb * [high-level api] add README.md and more instructions in ipynb. * [high-level api] append to last commit. * [high-level api] fix typo. * [high-level api] add ut to refresh building. * [high-level api] fix readme review comments. * [high-level api] refresh readme. * [high-level api] refresh demo readme and fix typo * [high-level api] resolve review comment * [high-level api] fix type. * [high-level api] revert change. * [high-level api] misc change. * [high-level api] fix type again. Co-authored-by: liuwenran * [Fix] fix tdan train config (#1457) * fix srcnn * [Fix] fix tdan train config * add 'DIM online merge config demo' (#783) * add 'DIM online merge config demo' * rename * fix config Co-authored-by: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Co-authored-by: Z-Fran <1396925302@qq.com> * [Fix] Adopt ut with newest mmengine (#1471) adopt ut with newest mmengine * [Doc] update qq group link (#1473) * [bug] Update base_conditional_gan.py (#1474) Update base_conditional_gan.py * [bug] Update inference_functions.py (#1470) * Update inference_functions.py remove repeated const * pass linter check. Co-authored-by: rangoliu * [bug] fix 1.x face demo readme config error (#1469) Update 3_inference.md config * [Fix] fix pconv train config (#1467) * fix srcnn * [Fix] fix pconv train config * rename * [Fix] fix tdan gpu info (#1486) * fix srcnn * [Fix] fix tdan gpu info * merge dev-1.x * [Fix] Wrong path resulsting in pre-commit error in Python 3.9 (#1488) fix relative path error in `update_model_index.py` * [Fix] fix basicvsr train config (#1485) * fix srcnn * [Fix] fix basicvsr train config * [Feature] Support disco-diffusion text-2-image (#1234) * going through adm unconditional sampling * add config and code for test * fix lint * modify unet * format adm * support adm 512 * fix lint * support cls-g sampling * support ddim sampling * init disco * support disco-diffusion text2image * support secondary model in disco-diffusion (#1368) * support init_image as input * init docstring * refactor disco * fix lint * fix lint * remove disco bug * remove data_preprocessor * complete docstring of disco and partial guider * complete docstring for guider * refine secondary model * fix lint * move cutter and loss config to infer * fix adm and unet * rename config * support portrait generator config * fix clip wrapper * move unet to DDPM * rename clip_ext * adjust requirements * try_import * add dist.get_rank() == 0 as additional condition * add resize_right to requirements * remove disco_baseline * update url * fix a disco typo * add imagenet 256 config * Make Disco's readme simple * rename disco to disco_diffusion * add adm readme * fix lint * support directly init disco with instance module * add ut of disco * fix init * fix lint * improve docstring coverage * fix lint * fix docstring * fix lint * add credits * mv losses * fix lint * rename diffuser * fix lint * delete null * rm raise error * fix comment Co-authored-by: yanniangu <83209866+yanniangu@users.noreply.github.com> * [Feature] Support EG3D (#1494) * [Enhancement] Support conditional input for StyleGAN modules (#1443) * support conditional input for stylegan v2 discriminator + Mapping Network * revise docstring * add unit test for stylegan2 discriminator + revise some variable name * add unit test for stylegan3's mapping network * support no noise injection in ModConv + support no upsample in ModToRGB * revise some variable name in stylegan3's mapping network * support conditional input in stylegan2's generator and add unit test * revise unit test of stylegan2's generator * cover more line in stylegan3's mapping network * cover more line in stylegan2's module * remove some comment from stylegan2's generator * revise add noise behvior of stylegan2's generator * revise typing hint of base cond gan * revise as comment * rename 'cond' to 'label' to align with conditional GAN's interface + revise some docstring * support update w_avg with ema in StyleGAN2's generator * fix bug in w_avg's EMA * support update_ws arg in StyleGAN2's forward * revise stylegan2 and stylegan3 as comment * revise stylegan3 module * revise behavior of pixel norm in StyleGAN2's generator * revise stylegan2 and stylegan3 as comment * [Feature] Support conditional FID for EG3D (#1447) * support conditional FID for EG3D * remove useless code form conditional FID * add unit test for CondFid * fix fid * import condFID in mmedit.evaluation.__init__ * remove conditional FID and support need_cond in GenerativeMetrics * remove force_recal_inception * revise fid * rename need_cond to need_cond_input as comment * add log when need_cond_input is True + not convert cond type to torch.float32 * [Feature] Support camera class for EG3D (#1446) * add camera for eg3d * revise docstring of camera * add unit test for camera * revise uniform sampling in camera * revise camera as comment * move normalize_vecs to tensor_utils * [Feature] Support EG3D renderer (#1454) * support EG3D renderer * revise renderer + add unit test for renderer * revise render and math_utils as comment * revise docstring of EG3DRenderer * [Feature] Support ray sampler for EG3D (#1455) * support ray sampler * add unit test for ray sampler * adopt meshgrid for different torch version * [Feature] Add EG3D modules (#1458) * add EG3D modules * disable antialias in F.interpolation to adopt torch<1.11 * remove useless comment from EG3D module * [Feature] Support TriPlane Generator for EG3D. (#1464) * add EG3D's generator * support render_kwargs in TriPlaneGenerator's forward * support randomize_noise in eg3d generator * revise comment for eg3d generator * reduce the number of sampling points to reduce test time * support change hidden channels and output channels for super resolution model * [Feature] Add eg3d discriminator (#1493) * add eg3d discriminator * rename eg3d_discriminator to dual_discriminator * revert init file for eg3d-disc * adopt discriminator's interpolation to differert torch version * [Feature] Support EG3D model and High-level API (#1482) * support EG3D model * support high-level API for EG3D * add docstring for eg3d.interpolation * adopt EG3D with revised camera * revise demo + support user defined arguments for high-level API * support set random seed in high-level API * add EG3D to __init__ * update readme * rename math-utils to eg3d-utils + complete docstring for EG3D model * resort init * adopt interpolation with lower version of torch * add imageio-ffmpeg to requirements * add configs for EG3D * update f-string in edit * move imageio-ffmpeg to optional.txt and add try-import for imageio * install imageio-ffmpeg in CI * add model checkpoint url to README * revise demo README + rename num-frames to num-images * revise configs * [Fix] Support arccos in camera for torch <= 1.6 (#1498) * support arccos in camera for torch <= 1.6 * skip some ut on windows CI * revise unit tests * [Enhanchment] Fix unit test of EG3D Render for torch < 1.8.0 (#1499) adopt torch.nan_to_num for torch < 1.8.0 + mock torch version in unit test to cover more lines * [Enhancement] Mock LPIPS module in PPL metric (#1490) * mock LPIPS module in PPL metric * mock cpu test * [feature] add t2i infer. (#1504) [t2i infer] add t2i infer. Co-authored-by: liuwenran * [Docs] Add a notebook for Disco Diffusion (#1497) * support disco notebook * fix disco weights url * fix tutorials notebook * add tutorials to readme * Fix tutorials for colab * fix colab of disco * fix installing mmedit * fix notebook * fix clip wrapper * fix readme * rename config * fix lint * prepare for release * [Enhancement] Add EG3D and Disco to README (#1505) * prepare for release * fix comments * fix readme * fix readme * fix readme zh * Fix disco notebook (#1507) fix notebook * [Enhancement] Fix unit test for disco diffusion (#1511) fix unit test for disco diffusion * [Enhancement] Add torch1.13 checking in CI (#1509) add torch1.13 checking in CI * [Enhance] set the default 404 page for readthedocs (#1513) * enable 404 extension * update conf.py * fix extensions * add notfoundpage in conf * update requirements * fix typo * [Enhanchement] Revise test requirements and CI (#1514) * revise test requirements and CI * remove open-clip from tests.txt * [Enhance] Recursive generate summary and docstring for API Reference (#1517) * remove apis * enable recursive api rendering * fix template * fix rendering for models * fix lint * using autoapi instead of autodoc * use autoapi instead of autodocs * fix lint Co-authored-by: zengyh1900 * [Fix] fix documentation link checker (#1522) fix incorrect command * [Doc] improve the structure of documentation (#1521) refactor doc structure * [Doc] improve toctree and update model zoo and dataset zoo (#1525) * update circleci * update model zoo * update model zoo * move changelog.md * fix lint * fix index toctree * [Enhance] enable projects (#1526) * update projects * fix typo * fix typo * update workflow: lint_only for projects * update community Co-authored-by: Yshuo-Li <1375829094@qq.com> Co-authored-by: wangruohui <5826-wangruohui@users.noreply.gitlab.sh.sensetime.com> Co-authored-by: wangruohui <12756472+wangruohui@users.noreply.github.com> Co-authored-by: ys-li <56712176+Yshuo-Li@users.noreply.github.com> Co-authored-by: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Co-authored-by: 张劲东 Co-authored-by: LeoXing1996 Co-authored-by: LeoXing1996 Co-authored-by: Yifei Yang <2744335995@qq.com> Co-authored-by: Z-Fran Co-authored-by: VongolaWu Co-authored-by: lvhan028 Co-authored-by: Qunliang Xing Co-authored-by: Yang Gao Co-authored-by: ruoning <44117949+ruoningYu@users.noreply.github.com> Co-authored-by: unknown Co-authored-by: ruoning Co-authored-by: root Co-authored-by: ChangjianZhao <57378777+ChangjianZhao@users.noreply.github.com> Co-authored-by: 赵昌健 Co-authored-by: Ruixiang Zhang <347321512@qq.com> Co-authored-by: ruixiangzhang Co-authored-by: Jack Co-authored-by: rangoliu Co-authored-by: liuwenran Co-authored-by: CCODING Co-authored-by: Z-Fran <1396925302@qq.com> Co-authored-by: vansin Co-authored-by: RoseZhao929 <119066755+RoseZhao929@users.noreply.github.com> Co-authored-by: shaocongliu Co-authored-by: TheBlackBox <31633173+LigZhong@users.noreply.github.com> Co-authored-by: liangzelong Co-authored-by: yanniangu <83209866+yanniangu@users.noreply.github.com> Co-authored-by: zengyh1900 --- docs/en/community/contributing.md | 275 ++++++++++++++++++++++++ docs/en/community/contribution_guide.md | 68 ------ docs/en/community/projects.md | 29 +-- docs/en/index.rst | 2 +- 4 files changed, 292 insertions(+), 82 deletions(-) create mode 100644 docs/en/community/contributing.md delete mode 100644 docs/en/community/contribution_guide.md diff --git a/docs/en/community/contributing.md b/docs/en/community/contributing.md new file mode 100644 index 0000000000..bce2e9a914 --- /dev/null +++ b/docs/en/community/contributing.md @@ -0,0 +1,275 @@ +# Contributing to MMEditing + +Welcome to the MMEditing community, we are committed to building a toolbox for cutting-edge image, video and 3D content generation, editing and processing techniques. + +This section introduces following contents: + +- [Pull Request Workflow](#pull-request-workflow) + - [1. fork and clone](#1-fork-and-clone) + - [2. configure pre-commit](#2-configure-pre-commit) + - [3. create a development branch](#3-create-a-development-branch) + - [4. commit the code and pass the unit test](#4-commit-the-code-and-pass-the-unit-test) + - [5. push the code to remote](#5-push-the-code-to-remote) + - [6. create a pull request](#6-create-a-pull-request) + - [7. resolve conflicts](#7-resolve-conflicts) +- [Guidance](#guidance) + - [unit test](#unit-test) + - [document rendering](#document-rendering) +- [Code Style](#code-style) + - [Python](#python) + - [C++ and CUDA](#c-and-cuda) + - [PR Specs](#pr-specs) + +All kinds of contributions are welcomed, including but not limited to + +**Fix bug** + +You can directly post a Pull Request to fix typo in code or documents + +The steps to fix the bug of code implementation are as follows. + +1. If the modification involve significant changes, you should create an issue first and describe the error information and how to trigger the bug. Other developers will discuss with you and propose an proper solution. + +2. Posting a pull request after fixing the bug and adding corresponding unit test. + +**New Feature or Enhancement** + +1. If the modification involve significant changes, you should create an issue to discuss with our developers to propose an proper design. +2. Post a Pull Request after implementing the new feature or enhancement and add corresponding unit test. + +**Document** + +You can directly post a pull request to fix documents. If you want to add a document, you should first create an issue to check if it is reasonable. + +### Pull Request Workflow + +If you're not familiar with Pull Request, don't worry! The following guidance will tell you how to create a Pull Request step by step. If you want to dive into the develop mode of Pull Request, you can refer to the [official documents](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests) + +#### 1. Fork and clone + +If you are posting a pull request for the first time, you should fork the OpenMMLab repositories by clicking the **Fork** button in the top right corner of the GitHub page, and the forked repositories will appear under your GitHub profile. + + + +Then, you can clone the repositories to local: + +```shell +git clone git@github.com:{username}/mmediting.git +``` + +After that, you should ddd official repository as the upstream repository + +```bash +git remote add upstream git@github.com:open-mmlab/mmediting +``` + +Check whether remote repository has been added successfully by `git remote -v` + +```bash +origin git@github.com:{username}/mmediting.git (fetch) +origin git@github.com:{username}/mmediting.git (push) +upstream git@github.com:open-mmlab/mmediting (fetch) +upstream git@github.com:open-mmlab/mmediting (push) +``` + +```{note} +Here's a brief introduction to origin and upstream. When we use "git clone", we create an "origin" remote by default, which points to the repository cloned from. As for "upstream", we add it ourselves to point to the target repository. Of course, if you don't like the name "upstream", you could name it as you wish. Usually, we'll push the code to "origin". If the pushed code conflicts with the latest code in official("upstream"), we should pull the latest code from upstream to resolve the conflicts, and then push to "origin" again. The posted Pull Request will be updated automatically. +``` + +#### 2. Configure pre-commit + +You should configure [pre-commit](https://pre-commit.com/#intro) in the local development environment to make sure the code style matches that of OpenMMLab. **Note**: The following code should be executed under the mmediting directory. + +```shell +pip install -U pre-commit +pre-commit install +``` + +Check that pre-commit is configured successfully, and install the hooks defined in `.pre-commit-config.yaml`. + +```shell +pre-commit run --all-files +``` + + + + + +```{note} +Chinese users may fail to download the pre-commit hooks due to the network issue. In this case, you could download these hooks from gitee by setting the .pre-commit-config-zh-cn.yaml + +pre-commit install -c .pre-commit-config-zh-cn.yaml +pre-commit run --all-files -c .pre-commit-config-zh-cn.yaml +``` + +If the installation process is interrupted, you can repeatedly run `pre-commit run ... ` to continue the installation. + +If the code does not conform to the code style specification, pre-commit will raise a warning and fixes some of the errors automatically. + + + +If we want to commit our code bypassing the pre-commit hook, we can use the `--no-verify` option(**only for temporarily commit**. + +```shell +git commit -m "xxx" --no-verify +``` + +#### 3. Create a development branch + +After configuring the pre-commit, we should create a branch based on the master branch to develop the new feature or fix the bug. The proposed branch name is `username/pr_name` + +```shell +git checkout -b yhc/refactor_contributing_doc +``` + +In subsequent development, if the master branch of the local repository is behind the master branch of "upstream", we need to pull the upstream for synchronization, and then execute the above command: + +```shell +git pull upstream master +``` + +#### 4. Commit the code and pass the unit test + +- MMEditing introduces mypy to do static type checking to increase the robustness of the code. Therefore, we need to add Type Hints to our code and pass the mypy check. If you are not familiar with Type Hints, you can refer to [this tutorial](https://docs.python.org/3/library/typing.html). + +- The committed code should pass through the unit test + + ```shell + # Pass all unit tests + pytest tests + + # Pass the unit test of runner + pytest tests/test_runner/test_runner.py + ``` + + If the unit test fails for lack of dependencies, you can install the dependencies referring to the [guidance](#unit-test) + +- If the documents are modified/added, we should check the rendering result referring to [guidance](#document-rendering) + +#### 5. Push the code to remote + +We could push the local commits to remote after passing through the check of unit test and pre-commit. You can associate the local branch with remote branch by adding `-u` option. + +```shell +git push -u origin {branch_name} +``` + +This will allow you to use the `git push` command to push code directly next time, without having to specify a branch or the remote repository. + +#### 6. Create a Pull Request + +(1) Create a pull request in GitHub's Pull request interface + + + +(2) Modify the PR description according to the guidelines so that other developers can better understand your changes + + + +Find more details about Pull Request description in [pull request guidelines](#pr-specs). + +**note** + +(a) The Pull Request description should contain the reason for the change, the content of the change, and the impact of the change, and be associated with the relevant Issue (see [documentation](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) + +(b) If it is your first contribution, please sign the CLA + + + +(c) Check whether the Pull Request pass through the CI + + + +MMEditing will run unit test for the posted Pull Request on different platforms (Linux, Window, Mac), based on different versions of Python, PyTorch, CUDA to make sure the code is correct. We can see the specific test information by clicking `Details` in the above image so that we can modify the code. + +(3) If the Pull Request passes the CI, then you can wait for the review from other developers. You'll modify the code based on the reviewer's comments, and repeat the steps [4](#4-commit-the-code-and-pass-the-unit-test)-[5](#5-push-the-code-to-remote) until all reviewers approve it. Then, we will merge it ASAP. + + + +#### 7. Resolve conflicts + +If your local branch conflicts with the latest master branch of "upstream", you'll need to resolove them. There are two ways to do this: + +```shell +git fetch --all --prune +git rebase upstream/master +``` + +or + +```shell +git fetch --all --prune +git merge upstream/master +``` + +If you are very good at handling conflicts, then you can use rebase to resolve conflicts, as this will keep your commit logs tidy. If you are not familiar with `rebase`, then you can use `merge` to resolve conflicts. + +### Guidance + +#### Unit test + +We should make sure the committed code will not decrease the coverage of unit test, we could run the following command to check the coverage of unit test: + +```shell +python -m coverage run -m pytest /path/to/test_file +python -m coverage html +# check file in htmlcov/index.html +``` + +#### Document rendering + +If the documents are modified/added, we should check the rendering result. We could install the dependencies and run the following command to render the documents and check the results: + +```shell +pip install -r requirements/docs.txt +cd docs/zh_cn/ +# or docs/en +make html +# check file in ./docs/zh_cn/_build/html/index.html +``` + +### Code style + +#### Python + +We adopt [PEP8](https://www.python.org/dev/peps/pep-0008/) as the preferred code style. + +We use the following tools for linting and formatting: + +- [flake8](https://github.com/PyCQA/flake8): A wrapper around some linter tools. +- [isort](https://github.com/timothycrosley/isort): A Python utility to sort imports. +- [yapf](https://github.com/google/yapf): A formatter for Python files. +- [codespell](https://github.com/codespell-project/codespell): A Python utility to fix common misspellings in text files. +- [mdformat](https://github.com/executablebooks/mdformat): Mdformat is an opinionated Markdown formatter that can be used to enforce a consistent style in Markdown files. +- [docformatter](https://github.com/myint/docformatter): A formatter to format docstring. + +Style configurations of yapf and isort can be found in [setup.cfg](../../../setup.cfg). + +We use [pre-commit hook](https://pre-commit.com/) that checks and formats for `flake8`, `yapf`, `isort`, `trailing whitespaces`, `markdown files`, +fixes `end-of-files`, `double-quoted-strings`, `python-encoding-pragma`, `mixed-line-ending`, sorts `requirments.txt` automatically on every commit. +The config for a pre-commit hook is stored in [.pre-commit-config](../../../.pre-commit-config.yaml). + +#### C++ and CUDA + +We follow the [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html). + +### PR Specs + +1. Use [pre-commit](https://pre-commit.com) hook to avoid issues of code style + +2. One short-time branch should be matched with only one PR + +3. Accomplish a detailed change in one PR. Avoid large PR + + - Bad: Support Faster R-CNN + - Acceptable: Add a box head to Faster R-CNN + - Good: Add a parameter to box head to support custom conv-layer number + +4. Provide clear and significant commit message + +5. Provide clear and meaningful PR description + + - Task name should be clarified in title. The general format is: \[Prefix\] Short description of the PR (Suffix) + - Prefix: add new feature \[Feature\], fix bug \[Fix\], related to documents \[Docs\], in developing \[WIP\] (which will not be reviewed temporarily) + - Introduce main changes, results and influences on other modules in short description + - Associate related issues and pull requests with a milestone diff --git a/docs/en/community/contribution_guide.md b/docs/en/community/contribution_guide.md deleted file mode 100644 index a7669e771b..0000000000 --- a/docs/en/community/contribution_guide.md +++ /dev/null @@ -1,68 +0,0 @@ -# Contributing to MMEditing - -This section introduces following contents: - -- [Workflow](#workflow) -- [Code style](#code-style) - - [Python](#python) - - [C++ and CUDA](#c-and-cuda) - -All kinds of contributions are welcome, including but not limited to the following. - -- Fix typo or bugs -- Add documentation or translate the documentation into other languages -- Add new features and components - -## Workflow - -1. fork and pull the latest MMEditing repository (MMEditing) -2. checkout a new branch (do not use master branch for PRs) -3. commit your changes -4. create a PR - -```{note} -If you plan to add some new features that involve large changes, it is encouraged to open an issue for discussion first. -``` - -## Code style - -### Python - -We adopt [PEP8](https://www.python.org/dev/peps/pep-0008/) as the preferred code style. - -We use the following tools for linting and formatting: - -- [flake8](https://github.com/PyCQA/flake8): A wrapper around some linter tools. -- [isort](https://github.com/timothycrosley/isort): A Python utility to sort imports. -- [yapf](https://github.com/google/yapf): A formatter for Python files. -- [codespell](https://github.com/codespell-project/codespell): A Python utility to fix common misspellings in text files. -- [mdformat](https://github.com/executablebooks/mdformat): Mdformat is an opinionated Markdown formatter that can be used to enforce a consistent style in Markdown files. -- [docformatter](https://github.com/myint/docformatter): A formatter to format docstring. - -Style configurations can be found in [setup.cfg](https://github.com/open-mmlab/mmediting/blob/1.x/setup.cfg). - -We use [pre-commit hook](https://pre-commit.com/) that checks and formats for `flake8`, `yapf`, `isort`, `trailing whitespaces`, `markdown files`, -fixes `end-of-files`, `double-quoted-strings`, `python-encoding-pragma`, `mixed-line-ending`, sorts `requirments.txt` automatically on every commit. -The config for a pre-commit hook is stored in [.pre-commit-config](https://github.com/open-mmlab/mmediting/blob/1.x/.pre-commit-config.yaml). - -After you clone the repository, you will need to install initialize pre-commit hook. - -```shell -pip install -U pre-commit -``` - -From the repository folder - -```shell -pre-commit install -``` - -After this on every commit check code linters and formatter will be enforced. - -```{important} -Before you create a PR, make sure that your code lints and is formatted by yapf. -``` - -### C++ and CUDA - -We follow the [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html). diff --git a/docs/en/community/projects.md b/docs/en/community/projects.md index 9adf606d79..fe234251c6 100644 --- a/docs/en/community/projects.md +++ b/docs/en/community/projects.md @@ -1,14 +1,26 @@ # Projects based on MMEditing -There are many projects built upon MMEditing. +There are many awesome projects built upon MMEditing. We list some of them as examples of how to extend MMEditing for your own projects. As the page might not be completed, please feel free to create a PR to update this page. -## Research papers +We also welcome any pull request to contribute your projects in the [projects of MMEditing](https://github.com/open-mmlab/mmediting/tree/dev-1.x/projects). + +## Projects as an extension + +Some projects extend the boundary of MMEditing for deployment or other research fields. +They reveal the potential of what MMEditing can do. We list several of them as below. + +- [PowerVQE](https://github.com/ryanxingql/powervqe): Open framework for quality enhancement of compressed videos based on PyTorch and MMEditing. +- [VR-Baseline](https://github.com/linjing7/VR-Baseline): Video Restoration Toolbox. +- [Manga-Colorization-with-CycleGAN](https://github.com/chandlerbing65nm/Manga-Colorization-with-CycleGAN): Colorizing Black&White Japanese Manga using Generative Adversarial Network. + +## Projects of papers There are also projects released with papers. -Some of the papers are published in top-tier conferences (CVPR, ECCV, and NeurIPS). -Methods already supported and maintained by MMEditing are not listed. +Some of the papers are published in top-tier conferences (CVPR, ICCV, and ECCV), the others are also highly influential. +To make this list also a reference for the community to develop and compare new object detection algorithms, we list them following the time order of top-tier conferences. +Methods already supported and maintained by MMDetection are not listed. - Towards Interpretable Video Super-Resolution via Alternating Optimization, ECCV 2022 [\[paper\]](https://arxiv.org/abs/2207.10765)[\[github\]](https://github.com/caojiezhang/DAVSR) @@ -35,12 +47,3 @@ Methods already supported and maintained by MMEditing are not listed. - A Multi-Modality Ovarian Tumor Ultrasound Image Dataset for Unsupervised Cross-Domain Semantic Segmentation, arXiv 2022 [\[paper\]](https://arxiv.org/pdf/2207.06799.pdf)[\[github\]](https://github.com/cv516buaa/mmotu_ds2net) - Arbitrary-Scale Image Synthesis, CVPR 2022 [\[paper\]](https://arxiv.org/pdf/2204.02273.pdf)[\[github\]](https://github.com/vglsd/ScaleParty) - -## Open-source projects - -Some open-source projects extend MMEditing for more functions and fields. -They reveal the potential of what MMEditing can do. We list several of them as below. - -- [PowerVQE](https://github.com/ryanxingql/powervqe): Open framework for quality enhancement of compressed videos based on PyTorch and MMEditing. -- [VR-Baseline](https://github.com/linjing7/VR-Baseline): Video Restoration Toolbox. -- [Manga-Colorization-with-CycleGAN](https://github.com/chandlerbing65nm/Manga-Colorization-with-CycleGAN): Colorizing Black&White Japanese Manga using Generative Adversarial Network. diff --git a/docs/en/index.rst b/docs/en/index.rst index 44b45f6d90..37bf3068e5 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -38,7 +38,7 @@ Documentation :maxdepth: 1 :caption: Community - community/contribution_guide.md + community/contributing.md community/projects.md From 112a22642c401f5996946eb01fa18651873f7ef6 Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Tue, 13 Dec 2022 19:34:48 +0800 Subject: [PATCH 12/44] [Enhancement] Fix text2image inferencer + disco diffusion GPU test (#1523) fix text2image inferencer + disco diffusion GPU test --- .../models/editors/disco_diffusion/guider.py | 14 ++- .../test_text2image_inferencers.py | 112 +++++++++++++++--- .../test_disco_diffusion.py | 55 +++++++-- 3 files changed, 148 insertions(+), 33 deletions(-) diff --git a/mmedit/models/editors/disco_diffusion/guider.py b/mmedit/models/editors/disco_diffusion/guider.py index b1c425dd3b..03adda874c 100644 --- a/mmedit/models/editors/disco_diffusion/guider.py +++ b/mmedit/models/editors/disco_diffusion/guider.py @@ -10,7 +10,9 @@ import torch.nn.functional as F import torchvision.transforms as T import torchvision.transforms.functional as TF +from mmengine.utils import digit_version from resize_right import resize +from torchvision import __version__ as TORCHVISION_VERSION from mmedit.models.losses import tv_loss from .secondary_model import alpha_sigma_to_t @@ -206,13 +208,17 @@ def __init__(self, self.IC_Size_Pow = IC_Size_Pow self.IC_Grey_P = IC_Grey_P + random_affine_args = dict(degrees=10, translate=(0.05, 0.05)) + if digit_version(TORCHVISION_VERSION) >= digit_version('0.9.0'): + random_affine_args['interpolation'] = T.InterpolationMode.BILINEAR + else: + from PIL import Image + random_affine_args['resample'] = Image.NEAREST + self.augs = T.Compose([ T.RandomHorizontalFlip(p=0.5), T.Lambda(lambda x: x + torch.randn_like(x) * 0.01), - T.RandomAffine( - degrees=10, - translate=(0.05, 0.05), - interpolation=T.InterpolationMode.BILINEAR), + T.RandomAffine(**random_affine_args), T.Lambda(lambda x: x + torch.randn_like(x) * 0.01), T.RandomGrayscale(p=0.1), T.Lambda(lambda x: x + torch.randn_like(x) * 0.01), diff --git a/tests/test_apis/test_inferencers/test_text2image_inferencers.py b/tests/test_apis/test_inferencers/test_text2image_inferencers.py index e70913c460..265238ed97 100644 --- a/tests/test_apis/test_inferencers/test_text2image_inferencers.py +++ b/tests/test_apis/test_inferencers/test_text2image_inferencers.py @@ -1,33 +1,107 @@ # Copyright (c) OpenMMLab. All rights reserved. import os.path as osp +import unittest +from unittest import TestCase +from unittest.mock import patch -import pytest import torch +import torch.nn as nn +from mmengine.utils import digit_version +from torchvision.version import __version__ as TV_VERSION from mmedit.apis.inferencers.text2image_inferencer import Text2ImageInferencer +from mmedit.models import DDIMScheduler, DenoisingUnet, DiscoDiffusion from mmedit.utils import register_all_modules register_all_modules() -@pytest.mark.skipif(not torch.cuda.is_available(), reason='requires cuda') -def test_translation_inferencer(): - cfg = osp.join( - osp.dirname(__file__), '..', '..', '..', 'configs', 'disco_diffusion', - 'disco-diffusion_adm-u-finetuned_imagenet-512x512.py') - text = {0: ['sad']} - result_out_dir = osp.join( - osp.dirname(__file__), '..', '..', 'data', 'disco_result.png') +class clip_mock(nn.Module): - inferencer_instance = \ - Text2ImageInferencer( - cfg, None, extra_parameters={'num_inference_steps': 2}) - inferencer_instance(text=text) - inference_result = inferencer_instance( - text=text, result_out_dir=result_out_dir) - result_img = inference_result[1] - assert result_img[0].cpu().numpy().shape == (3, 512, 512) + def __init__(self, device='cuda'): + super().__init__() + self.register_buffer('tensor', torch.randn([1, 512])) + def encode_image(self, inputs): + return inputs.mean() * self.tensor.repeat(inputs.shape[0], 1).to( + inputs.device) -if __name__ == '__main__': - test_translation_inferencer() + def encode_text(self, inputs): + return self.tensor.repeat(inputs.shape[0], 1).to(inputs.device) + + def forward(self, x): + return x + + +class clip_mock_wrapper(nn.Module): + + def __init__(self): + super().__init__() + self.model = clip_mock() + + def forward(self, x): + return x + + +class TestTranslationInferencer(TestCase): + + def setUp(self): + self.unet32 = DenoisingUnet( + image_size=32, + in_channels=3, + base_channels=8, + resblocks_per_downsample=2, + attention_res=(8, ), + norm_cfg=dict(type='GN32', num_groups=8), + dropout=0.0, + num_classes=0, + use_fp16=True, + resblock_updown=True, + attention_cfg=dict( + type='MultiHeadAttentionBlock', + num_heads=2, + num_head_channels=8, + use_new_attention_order=False), + use_scale_shift_norm=True) + # mock clip + self.clip_models = [clip_mock_wrapper(), clip_mock_wrapper()] + # diffusion_scheduler + self.diffusion_scheduler = DDIMScheduler( + variance_type='learned_range', + beta_schedule='linear', + clip_sample=False) + + unet32 = self.unet32 + diffusion_scheduler = self.diffusion_scheduler + clip_models = self.clip_models + self.disco_diffusion = DiscoDiffusion( + unet=unet32, + diffusion_scheduler=diffusion_scheduler, + secondary_model=None, + clip_models=clip_models, + use_fp16=True).cuda() + + @unittest.skipIf( + digit_version(TV_VERSION) <= digit_version('0.7.0'), + reason='torchvision version limiation') + @unittest.skipIf(not torch.cuda.is_available(), reason='requires cuda') + def test_translation(self): + cfg_root = osp.join( + osp.dirname(__file__), '..', '..', '..', 'configs', + 'disco_diffusion') + cfg = osp.join(cfg_root, + 'disco-diffusion_adm-u-finetuned_imagenet-512x512.py') + text = {0: ['sad']} + result_out_dir = osp.join( + osp.dirname(__file__), '..', '..', 'data', 'disco_result.png') + + with patch.object(Text2ImageInferencer, '_init_model'): + inferencer_instance = Text2ImageInferencer( + cfg, None, extra_parameters={'num_inference_steps': 2}) + # mock model + inferencer_instance.model = self.disco_diffusion + inferencer_instance(text=text) + inference_result = inferencer_instance( + text=text, result_out_dir=result_out_dir) + result_img = inference_result[1] + assert result_img[0].cpu().numpy().shape == (3, 32, 32) diff --git a/tests/test_models/test_editors/test_disco_diffusion/test_disco_diffusion.py b/tests/test_models/test_editors/test_disco_diffusion/test_disco_diffusion.py index 9c44b7d760..7a56a6603a 100644 --- a/tests/test_models/test_editors/test_disco_diffusion/test_disco_diffusion.py +++ b/tests/test_models/test_editors/test_disco_diffusion/test_disco_diffusion.py @@ -1,10 +1,13 @@ # Copyright (c) OpenMMLab. All rights reserved. +import unittest from copy import deepcopy from unittest import TestCase +from unittest.mock import patch -import pytest import torch import torch.nn as nn +from mmengine.utils import digit_version +from torchvision.version import __version__ as TV_VERSION from mmedit.models import DDIMScheduler, DenoisingUnet, DiscoDiffusion from mmedit.utils import register_all_modules @@ -79,7 +82,10 @@ def test_init(self): clip_models=clip_models, use_fp16=True) - @pytest.mark.skipif(not torch.cuda.is_available(), reason='requires cuda') + @unittest.skipIf( + digit_version(TV_VERSION) <= digit_version('0.7.0'), + reason='torchvision version limitation') + @unittest.skipIf(not torch.cuda.is_available(), reason='requires cuda') def test_infer(self): unet32 = deepcopy(self.unet32) diffusion_scheduler = deepcopy(self.diffusion_scheduler) @@ -99,7 +105,7 @@ def test_infer(self): image = self.disco_diffusion.infer( text_prompts=text_prompts, show_progress=True, - num_inference_steps=5, + num_inference_steps=2, eta=0.8)['samples'] assert image.shape == (1, 3, 32, 32) # test with different text prompts @@ -111,7 +117,7 @@ def test_infer(self): image = self.disco_diffusion.infer( text_prompts=text_prompts, show_progress=True, - num_inference_steps=5, + num_inference_steps=2, eta=0.8)['samples'] assert image.shape == (1, 3, 32, 32) @@ -126,7 +132,7 @@ def test_infer(self): text_prompts=text_prompts, init_image=init_image, show_progress=True, - num_inference_steps=5, + num_inference_steps=2, eta=0.8)['samples'] assert image.shape == (1, 3, 32, 32) @@ -139,7 +145,7 @@ def test_infer(self): width=128, text_prompts=text_prompts, show_progress=True, - num_inference_steps=5, + num_inference_steps=2, eta=0.8)['samples'] assert image.shape == (1, 3, 64, 128) @@ -147,7 +153,7 @@ def test_infer(self): image = self.disco_diffusion.infer( text_prompts=text_prompts, show_progress=True, - num_inference_steps=5, + num_inference_steps=2, clip_guidance_scale=8000, eta=0.8)['samples'] assert image.shape == (1, 3, 32, 32) @@ -159,7 +165,7 @@ def test_infer(self): image = self.disco_diffusion.infer( text_prompts=text_prompts, show_progress=True, - num_inference_steps=5, + num_inference_steps=2, eta=0.8, tv_scale=tv_scale, sat_scale=sat_scale, @@ -175,7 +181,7 @@ def test_infer(self): image = self.disco_diffusion.infer( text_prompts=text_prompts, show_progress=True, - num_inference_steps=5, + num_inference_steps=2, eta=0.8, cut_overview=cut_overview, cut_innercut=cut_innercut, @@ -207,6 +213,35 @@ def test_infer(self): image = self.disco_diffusion.infer( text_prompts=text_prompts, show_progress=True, - num_inference_steps=5, + num_inference_steps=2, eta=0.8)['samples'] assert image.shape == (1, 3, 64, 64) + + class affineMock(nn.Module): + + def __init__(self, *args, **kwargs): + super().__init__() + + def forward(self, x): + return x + + mock_path = ('mmedit.models.editors.disco_diffusion.guider.' + 'TORCHVISION_VERSION') + affine_mock_path = ('mmedit.models.editors.disco_diffusion.guider.T.' + 'RandomAffine') + with patch(affine_mock_path, new=affineMock): + with patch(mock_path, '0.8.1'): + image = self.disco_diffusion.infer( + text_prompts=text_prompts, + show_progress=True, + num_inference_steps=2, + eta=0.8)['samples'] + assert image.shape == (1, 3, 64, 64) + + with patch(mock_path, '0.9.0'): + image = self.disco_diffusion.infer( + text_prompts=text_prompts, + show_progress=True, + num_inference_steps=2, + eta=0.8)['samples'] + assert image.shape == (1, 3, 64, 64) From 69675c3ae35ca7b67d750d28c0811ac1cc1c9595 Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Tue, 13 Dec 2022 20:15:28 +0800 Subject: [PATCH 13/44] [Feature] Support Json-annotation to `BasicConditonalDataset` (#1524) * support json (dict-like) annotation for BasicConditionalDataset * remove comment in basic_conditional_dataset * add docstring and doc description for BasicConditionalDataset * revise cond dataset as comment * upload test data for cond dataset --- docs/en/howto/dataset.md | 138 ++++++++++++++++++ mmedit/datasets/basic_conditional_dataset.py | 50 ++++++- tests/data/dataset/anno.json | 14 ++ tests/data/dataset/wrong.yml | 0 .../test_basic_conditional_dataset.py | 16 ++ 5 files changed, 211 insertions(+), 7 deletions(-) create mode 100644 tests/data/dataset/anno.json create mode 100644 tests/data/dataset/wrong.yml diff --git a/docs/en/howto/dataset.md b/docs/en/howto/dataset.md index c2805aac5f..11086661fe 100644 --- a/docs/en/howto/dataset.md +++ b/docs/en/howto/dataset.md @@ -198,6 +198,144 @@ dataset = BasicFramesDataset( img=['img1.png', 'img3.png'], gt=['img2.png'])) ``` +### BasicConditonalDataset + +**BasicConditonalDataset** `mmedit.datasets.BasicConditonalDataset` is designed for conditional GANs (e.g., SAGAN, BigGAN). This dataset support load label for the annotation file. `BasicConditonalDataset` support three kinds of annotation as follow: + +#### 1. Annotation file read by line (e.g., txt) + +Sample files structure: + +``` + data_prefix/ + ├── folder_1 + │ ├── xxx.png + │ ├── xxy.png + │ └── ... + └── folder_2 + ├── 123.png + ├── nsdf3.png + └── ... +``` + +Sample annotation file (the first column is the image path and the second column is the index of category): + +``` + folder_1/xxx.png 0 + folder_1/xxy.png 1 + folder_2/123.png 5 + folder_2/nsdf3.png 3 + ... +``` + +Config example for ImageNet dataset: + +```python +dataset=dict( + type='BasicConditionalDataset, + data_root='./data/imagenet/', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=train_pipeline), +``` + +#### 2. Dict-based annotation file (e.g., json): + +Sample files structure: + +``` + data_prefix/ + ├── folder_1 + │ ├── xxx.png + │ ├── xxy.png + │ └── ... + └── folder_2 + ├── 123.png + ├── nsdf3.png + └── ... +``` + +Sample annotation file (the key is the image path and the value column +is the label): + +``` + { + "folder_1/xxx.png": [1, 2, 3, 4], + "folder_1/xxy.png": [2, 4, 1, 0], + "folder_2/123.png": [0, 9, 8, 1], + "folder_2/nsdf3.png", [1, 0, 0, 2], + ... + } +``` + +Config example for EG3D (shapenet-car) dataset: + +```python +dataset = dict( + type='BasicConditionalDataset', + data_root='./data/eg3d/shapenet-car', + ann_file='annotation.json', + pipeline=train_pipeline) +``` + +In this kind of annotation, labels can be any type and not restricted to an index. + +#### 3. Folder-based annotation (no annotation file need): + +Sample files structure: + +``` + data_prefix/ + ├── class_x + │ ├── xxx.png + │ ├── xxy.png + │ └── ... + │ └── xxz.png + └── class_y + ├── 123.png + ├── nsdf3.png + ├── ... + └── asd932_.png +``` + +If the annotation file is specified, the dataset will be generated by the first two ways, otherwise, try the third way. + +### ImageNet Dataset and CIFAR10 Dataset + +**ImageNet Dataset**`mmedit.datasets.ImageNet` and **CIFAR10 Dataset**`mmedit.datasets.CIFAR10` are datasets specific designed for ImageNet and CIFAR10 datasets. Both two datasets are encapsulation of `BasicConditionalDataset`. You can used them to load data from ImageNet dataset and CIFAR10 dataset easily. + +Config example for ImageNet: + +```python +pipeline = [ + dict(type='LoadImageFromFile', key='img'), + dict(type='RandomCropLongEdge', keys=['img']), + dict(type='Resize', scale=(128, 128), keys=['img'], backend='pillow'), + dict(type='Flip', keys=['img'], flip_ratio=0.5, direction='horizontal'), + dict(type='PackEditInputs') +] + +dataset=dict( + type='ImageNet', + data_root='./data/imagenet/', + ann_file='meta/train.txt', + data_prefix='train', + pipeline=pipeline), +``` + +Config example for CIFAR10: + +```python +pipeline = [dict(type='PackEditInputs')] + +dataset = dict( + type='CIFAR10', + data_root='./data', + data_prefix='cifar10', + test_mode=False, + pipeline=pipeline) +``` + ### AdobeComp1kDataset **AdobeComp1kDataset** `mmedit.datasets.AdobeComp1kDataset` diff --git a/mmedit/datasets/basic_conditional_dataset.py b/mmedit/datasets/basic_conditional_dataset.py index df0c371d73..6c2732a50f 100644 --- a/mmedit/datasets/basic_conditional_dataset.py +++ b/mmedit/datasets/basic_conditional_dataset.py @@ -13,15 +13,15 @@ @DATASETS.register_module() class BasicConditionalDataset(BaseDataset): - """Custom dataset for conditional GAN. This class is the combination of - `BaseDataset` (https://github.com/open- + """Custom dataset for conditional GAN. This class is based on the + combination of `BaseDataset` (https://github.com/open- mmlab/mmclassification/blob/1.x/mmcls/datasets/base_dataset.py) # noqa and `CustomDataset` (https://github.com/open- mmlab/mmclassification/blob/1.x/mmcls/datasets/custom.py). # noqa. The dataset supports two kinds of annotation format. - 1. An annotation file is provided, and each line indicates a sample: + 1. A annotation file read by line (e.g., txt) is provided, and each line indicates a sample: The sample files: :: @@ -47,7 +47,35 @@ class BasicConditionalDataset(BaseDataset): Please specify the name of categories by the argument ``classes`` or ``metainfo``. - 2. The samples are arranged in the specific way: :: + 2. A dict-based annotation file (e.g., json) is provided, key and value + indicate the path and label of the sample: + + The sample files: :: + + data_prefix/ + ├── folder_1 + │ ├── xxx.png + │ ├── xxy.png + │ └── ... + └── folder_2 + ├── 123.png + ├── nsdf3.png + └── ... + + The annotation file (the key is the image path and the value column + is the label): :: + + { + "folder_1/xxx.png": [1, 2, 3, 4], + "folder_1/xxy.png": [2, 4, 1, 0], + "folder_2/123.png": [0, 9, 8, 1], + "folder_2/nsdf3.png", [1, 0, 0, 2], + ... + } + + In this kind of annotation, labels can be any type and not restricted to an index. + + 3. The samples are arranged in the specific way: :: data_prefix/ ├── class_x @@ -62,7 +90,7 @@ class BasicConditionalDataset(BaseDataset): └── asd932_.png If the ``ann_file`` is specified, the dataset will be generated by the - first way, otherwise, try the second way. + first two ways, otherwise, try the third way. Args: ann_file (str): Annotation file path. Defaults to ''. @@ -156,9 +184,14 @@ def load_data_list(self): if not self.ann_file: samples = self._find_samples(file_client) - else: + elif self.ann_file.endswith('json'): + samples = mmengine.fileio.io.load(self.ann_file) + samples = [[name, label] for name, label in samples.items()] + elif self.ann_file.endswith('txt'): lines = mmengine.list_from_file(self.ann_file) samples = [x.strip().rsplit(' ', 1) for x in lines] + else: + raise TypeError('Only support \'json\' and \'txt\' as annotation.') def add_prefix(filename, prefix=''): if not prefix: @@ -169,7 +202,10 @@ def add_prefix(filename, prefix=''): data_list = [] for filename, gt_label in samples: img_path = add_prefix(filename, self.img_prefix) - info = {'img_path': img_path, 'gt_label': int(gt_label)} + # convert digit label to int + if isinstance(gt_label, str): + gt_label = int(gt_label) if gt_label.isdigit() else gt_label + info = {'img_path': img_path, 'gt_label': gt_label} data_list.append(info) return data_list diff --git a/tests/data/dataset/anno.json b/tests/data/dataset/anno.json new file mode 100644 index 0000000000..d1cdadedfa --- /dev/null +++ b/tests/data/dataset/anno.json @@ -0,0 +1,14 @@ +{ + "a/1.JPG": [ + 1, + 2, + 3, + 4 + ], + "b/2.jpeg": [ + 1, + 4, + 5, + 3 + ] +} \ No newline at end of file diff --git a/tests/data/dataset/wrong.yml b/tests/data/dataset/wrong.yml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/test_datasets/test_basic_conditional_dataset.py b/tests/test_datasets/test_basic_conditional_dataset.py index 16b6205d4c..85e34cdfac 100644 --- a/tests/test_datasets/test_basic_conditional_dataset.py +++ b/tests/test_datasets/test_basic_conditional_dataset.py @@ -32,6 +32,10 @@ def test_init(self): self.assertEqual(dataset.CLASSES, ('bus', 'car')) self.assertEqual(dataset.class_to_idx, {'bus': 0, 'car': 1}) + ann_file = osp.abspath(osp.join(DATA_DIR, 'wrong.yml')) + with self.assertRaises(TypeError): + BasicConditionalDataset(data_root=DATA_DIR, ann_file=ann_file) + gt_labels = dataset.get_gt_labels() print(type(gt_labels)) self.assertTrue((gt_labels == np.array([0, 1, 1])).all()) @@ -79,3 +83,15 @@ def test_init(self): self.assertFalse(dataset._fully_initialized) self.assertIn("Haven't been initialized", repr(dataset)) self.assertIn('With transforms:', repr(dataset)) + + # test load label from json file + ann_file = osp.abspath(osp.join(DATA_DIR, 'anno.json')) + dataset = BasicConditionalDataset( + data_root=DATA_DIR, + ann_file=ann_file, + lazy_init=True, + pipeline=[dict(type='PackEditInputs')]) + self.assertEqual(dataset[0]['data_samples'].gt_label.label.tolist(), + [1, 2, 3, 4]) + self.assertEqual(dataset[1]['data_samples'].gt_label.label.tolist(), + [1, 4, 5, 3]) From 37fdec7ec37ec3263b456d2f5e2bce44ba72ba08 Mon Sep 17 00:00:00 2001 From: VongolaWu Date: Wed, 14 Dec 2022 11:13:51 +0800 Subject: [PATCH 14/44] Add NAFNet to README file --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 06d9cf809b..b16ead5cfb 100644 --- a/README.md +++ b/README.md @@ -282,6 +282,12 @@ Supported algorithms: +Image Restoration + +- ✅ [NAFNet](configs/nafnet/README.md) + + + Please refer to [model_zoo](https://mmediting.readthedocs.io/en/1.x/3_model_zoo.html) for more details. ## Contributing From 0cf81776c9623783e7674f0b1807102b905c538b Mon Sep 17 00:00:00 2001 From: Yifei Yang <2744335995@qq.com> Date: Wed, 14 Dec 2022 13:28:13 +0800 Subject: [PATCH 15/44] [Feature] support mscoco dataset (#1520) * support reading mscoco dataset with caption * fix lint * add unit test * fix isort * fix lint * fix lint --- mmedit/datasets/__init__.py | 15 +-- mmedit/datasets/mscoco_dataset.py | 101 ++++++++++++++++++ .../coco/annotations/captions_train2014.json | 3 + .../coco/annotations/captions_val2014.json | 3 + .../train2014/COCO_train2014_000000000009.jpg | Bin 0 -> 224297 bytes .../val2014/COCO_val2014_000000000042.jpg | Bin 0 -> 213308 bytes tests/test_datasets/test_mscoco_dataset.py | 31 ++++++ 7 files changed, 143 insertions(+), 10 deletions(-) create mode 100644 mmedit/datasets/mscoco_dataset.py create mode 100644 tests/data/coco/annotations/captions_train2014.json create mode 100644 tests/data/coco/annotations/captions_val2014.json create mode 100644 tests/data/coco/train2014/COCO_train2014_000000000009.jpg create mode 100644 tests/data/coco/val2014/COCO_val2014_000000000042.jpg create mode 100644 tests/test_datasets/test_mscoco_dataset.py diff --git a/mmedit/datasets/__init__.py b/mmedit/datasets/__init__.py index dd8a74e5da..91de4a8ac9 100644 --- a/mmedit/datasets/__init__.py +++ b/mmedit/datasets/__init__.py @@ -6,19 +6,14 @@ from .comp1k_dataset import AdobeComp1kDataset from .grow_scale_image_dataset import GrowScaleImgDataset from .imagenet_dataset import ImageNet +from .mscoco_dataset import MSCoCoDataset from .paired_image_dataset import PairedImageDataset from .singan_dataset import SinGANDataset from .unpaired_image_dataset import UnpairedImageDataset __all__ = [ - 'AdobeComp1kDataset', - 'BasicImageDataset', - 'BasicFramesDataset', - 'BasicConditionalDataset', - 'UnpairedImageDataset', - 'PairedImageDataset', - 'ImageNet', - 'CIFAR10', - 'GrowScaleImgDataset', - 'SinGANDataset', + 'AdobeComp1kDataset', 'BasicImageDataset', 'BasicFramesDataset', + 'BasicConditionalDataset', 'UnpairedImageDataset', 'PairedImageDataset', + 'ImageNet', 'CIFAR10', 'GrowScaleImgDataset', 'SinGANDataset', + 'MSCoCoDataset' ] diff --git a/mmedit/datasets/mscoco_dataset.py b/mmedit/datasets/mscoco_dataset.py new file mode 100644 index 0000000000..0ef12cd1c0 --- /dev/null +++ b/mmedit/datasets/mscoco_dataset.py @@ -0,0 +1,101 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os +import random +from typing import Optional, Sequence, Union + +import mmengine +from mmengine import FileClient + +from mmedit.registry import DATASETS +from .basic_conditional_dataset import BasicConditionalDataset + + +@DATASETS.register_module() +@DATASETS.register_module('MSCOCO') +class MSCoCoDataset(BasicConditionalDataset): + """MSCoCo 2014 dataset. + + Args: + ann_file (str): Annotation file path. Defaults to ''. + metainfo (dict, optional): Meta information for dataset, such as class + information. Defaults to None. + data_root (str): The root directory for ``data_prefix`` and + ``ann_file``. Defaults to ''. + drop_caption_rate (float, optional): Rate of dropping caption, + used for training. Defaults to 0.0. + phase (str, optional): Subdataset used for certain phase, can be set + to `train`, `test` and `val`. Defaults to 'train'. + year (int, optional): Version of CoCo dataset, can be set to 2014 + and 2017. Defaults to 2014. + data_prefix (str | dict): Prefix for the data. Defaults to ''. + extensions (Sequence[str]): A sequence of allowed extensions. Defaults + to ('.jpg', '.jpeg', '.png', '.ppm', '.bmp', '.pgm', '.tif'). + lazy_init (bool): Whether to load annotation during instantiation. + In some cases, such as visualization, only the meta information of + the dataset is needed, which is not necessary to load annotation + file. ``Basedataset`` can skip load annotations to save time by set + ``lazy_init=False``. Defaults to False. + **kwargs: Other keyword arguments in :class:`BaseDataset`. + """ + METAINFO = dict(dataset_type='text_image_dataset', task_name='editing') + + def __init__(self, + ann_file: str = '', + metainfo: Optional[dict] = None, + data_root: str = '', + drop_caption_rate=0.0, + phase='train', + year=2014, + data_prefix: Union[str, dict] = '', + extensions: Sequence[str] = ('.jpg', '.jpeg', '.png', '.ppm', + '.bmp', '.pgm', '.tif'), + lazy_init: bool = False, + classes: Union[str, Sequence[str], None] = None, + **kwargs): + ann_file = os.path.join('annotations', 'captions_' + phase + + f'{year}.json') if ann_file == '' else ann_file + self.image_prename = 'COCO_' + phase + f'{year}_' + self.phase = phase + self.drop_rate = drop_caption_rate + self.year = year + assert self.year == 2014, 'We only support CoCo2014 now.' + + super().__init__( + ann_file=ann_file, + metainfo=metainfo, + data_root=data_root, + data_prefix=data_prefix, + extensions=extensions, + lazy_init=lazy_init, + classes=classes, + **kwargs) + + def load_data_list(self): + """Load image paths and gt_labels.""" + if self.img_prefix: + file_client = FileClient.infer_client(uri=self.img_prefix) + json_file = mmengine.fileio.io.load(self.ann_file) + + def add_prefix(filename, prefix=''): + if not prefix: + return filename + else: + return file_client.join_path(prefix, filename) + + data_list = [] + for item in json_file['annotations']: + image_name = self.image_prename + str( + item['image_id']).zfill(12) + '.jpg' + img_path = add_prefix( + os.path.join(self.phase + str(self.year), image_name), + self.img_prefix) + caption = item['caption'].lower() + info = { + 'img_path': + img_path, + 'gt_label': + caption if (self.phase != 'train' or self.drop_rate < 1e-6 + or random.random() >= self.drop_rate) else '' + } + data_list.append(info) + return data_list diff --git a/tests/data/coco/annotations/captions_train2014.json b/tests/data/coco/annotations/captions_train2014.json new file mode 100644 index 0000000000..466f72b6c5 --- /dev/null +++ b/tests/data/coco/annotations/captions_train2014.json @@ -0,0 +1,3 @@ +{ + "annotations": [{"image_id": 9, "caption": "a good meal"}] +} \ No newline at end of file diff --git a/tests/data/coco/annotations/captions_val2014.json b/tests/data/coco/annotations/captions_val2014.json new file mode 100644 index 0000000000..dba978c89f --- /dev/null +++ b/tests/data/coco/annotations/captions_val2014.json @@ -0,0 +1,3 @@ +{ + "annotations": [{"image_id": 42, "caption": "a pair of slippers"}] +} \ No newline at end of file diff --git a/tests/data/coco/train2014/COCO_train2014_000000000009.jpg b/tests/data/coco/train2014/COCO_train2014_000000000009.jpg new file mode 100644 index 0000000000000000000000000000000000000000..83d12e57f215028285cac44d9c088489fb51e8b6 GIT binary patch literal 224297 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�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 PSC4qJn`siHxbIEBf5 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 Y5(kApolV$qp>@={;W+hy?;UIZ*-IymAOHXW literal 0 HcmV?d00001 diff --git a/tests/data/coco/val2014/COCO_val2014_000000000042.jpg b/tests/data/coco/val2014/COCO_val2014_000000000042.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f03e8e170acfb655a9f5fc14b093edc56119ead GIT binary patch literal 213308 zcmbrl1zeO}+b??0Ff`I2%>V;KBO%@0F?36JcXtX%cXtRV(kdd-qBJNihzLkZ=NX@8 z@8^Brea`otv-erdZ_WR{)>Z3T>xOFu_h0VU0DNV6C3ye@0s)H1AK-o+$3RI&##|Gj zA+Mw=him`<97R1F_wYKrHLgHv7cJ}jj|3g1S zVq#0DKNt-8gFTTBA~D$?Z1*>2|BL5uEcpjpySQ2-dH(q9ZtY_I2lpd!yswW95~HXh zajdU{jUN)vATi9@$Hf7OFOZnn#m2%503bMj=-xI~_DK8)iE%u25Hd(C3IG^5cK?Pg z{|$TF_#^!U02w#;08a-ydv7SS6$_MGNJtQ>XyfN>u_>;|cY0x3IE-a{RB8`2Se& z-`x5)KiCmAwls+fAfpEpmRcI)qXkHpCKzv};}z|WA6U@r$d z=pV8SLI-N)UX(0)9X+5COyjPk~e*3&;mbfJ&eaXaZV*4&V*&9vB2Z0u#V2un4RHo4_t`2%G`e z$X{gWpa&o#5IKkz#0X*o@qh$D;vhMYDhL5G1U&)Sfm}g8pkPoG=qV^2ln*Kc)q!4u zxU?wmZSP(1)RsrjPO~H0x4{#tj8k_>o1($=L zgWJLH!5_i1;5G0r_!I>|!A2oPp+n(75k!$e(Lgamu|@Gj2}Man$wnzhX+r5n8A6#x zSws1SatT3$5J8|24u}Xu5uyvRf_OkeAxV&YNG+rt(hr%2e1jZ9?oc0~QlYY;3Zp8a z8lc*t`k}_6W}{Z4wxJH7&Z2Ijo}rfCWW*H4)WEdH48VMbS&7+=IgYuBd5uMY1;-M@(!p}XionXnYQh@8TEhB`jg3u@ zErhLw?SLJQos0bfdl>s0_9YG>4l9lfjtPzrP6|#9PA|?^oZk-~JYaet`M~Ib_k)xN zbq_u~Sb1=PON7gbtAuNf8-`ne+m1VhyN`#7$A~9|XNDJumyP!dZyfIzJ|;dBz6`zv zekgtcei!~c{wVym zM3qDXM4QBD#BgFIVn^bq#ErzCi4RE#N%%3(NZyjHk)n_?kt&folRhJDA)O<= zdPx0H>Y>fUgojNJryib@QIbiL*^niYHIvPfU6Dh{<;b1L)5tr>mnk3=tQ1-leiX$N z0~Eg~i77=Wttb;ITPPQ(z*MYM2&y2e3aT-xQ)(J&1!{NdJn9eBzi3ElBxxLJGHH5f zwrPoI#c3UAGil$^?m$VPQc!1TF0>zdNJmAdNasUWM)#TSnjTKCOCL$!Oux*4#URLF z%aF;?$8ZRvg{i@UVGXbaModOQMtjB_#v#UYCODHmQyfzV(@!`VTnQcsZ-6f`KVX(% z_Fyh&o?$^_5oB>HF2o;6Y)~

Qi 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

J=(WZbs9+JCn2= z&jv~7+B#X0WYVAb^#TxJZCW=}u;xFQRpioJe1LK~s9{pKi4t zo75CZVM=Z4##ZBD3T&x9;~_9(-{0C}rC>dq1Z!Pp)N9q<&A!=ebdA@l=wXYg0>qO}?svp5Dk(D#N4#0FYagB|s#T zw~TYgS_vH2DRJU!&03j@@sDO_P5%J19mS@-YI>%Ymu>!uacbEFDn8W0i6=N5XVWCp zx#EgD?5$zhA$WH0J^hRBpwj}|OIfF@YfV#%Qo#xHoJ=Sr<^&Kkz=6+5fqNaYC9pBg zS5vI-v={!~)b|TZQ&K#SredMQHWE~pkf4>yq9O+Za5=>E{O0pV@m0Aoc_d8!jPCU| zvwr7mHx#o*l>oINM3zqCcH#jZp^kIZIJpO&miZB|u{;@kV3eb*KXpKAM$Xwue! zQsB9*Z7JG{goOYUl@L=UJGmf2vUx>YGI zKCTiG8Rh`n@ zQcyuSIV2J>JyAH13^pUmt^7Nxwn+dbHq;l6*SOu@(|1K~oocDiscFQJ(?VujS|S37 z0DgU3Odc_tg=B)ecAGFQwHY<_-rd?u+q&boUB|gKdTE6QDrvU=03~HccY7Vu0VW3@ zze=Hn(Z6KJA~rlxPR5DxvwrT+ZS0o5>{ifg8jmr5O5vqSUZ>iaDl0(Bu^`X3M?`8_ zPJDci?t;U^V`L3vI8V7cj+5pqCFsi|V2DQV=9DRHy!An-m%5PG&^%;?6-rtDDh>PET_ z^`WTs0yS&utZP&$$wTU>Q-KjDXh@L~6bwX9_Ug@vs96?LY~3!}Yr3$@Pj_^U>9tz# z^!2P$22!;aSz3^;24G0`>gg7$*AG`k%X4^kXx+^T-{PVldu%U5Xj=S= zkouC!mO&*XD?3c{`4KtkW=x^)^c7&z@a1biomcQ&SAM9Si0=NM)z|$|d=!;BVzJfz zC~B!HOHBj!5D8Mb97w=E$Ezldl+br6R(~padjF=qG?<1QGl3)*924U8%?OI??Q^$U zii(!)ZMnB}rd0%PB4Yz=5sZBFWH3G39*6-eiBoU2y`$|FcxIyMsBSISpeug&)HWeP zakm782pkRE4D~FUYwp67$OBW#J5}1NMSs;kbylHi)FHZMGj%N#I8N_U_y-*QxapP- z6UNR!(+N^fMNsx?g*K$zbQPAcBh64@_ z*IWClr!2EUZDiCGx{!bPX&XTyI8g$9Qb0XPovPsAjZ;*} z`!)nFmHy2g2TLcQ1L9NB+YZzB>sZ`TLs#0%j)kZ57LjzmI)=i6q^)UaDQZ?%Bp=Vo zJ#$S<#!VU)To3ad?Yl?RkUu5dxPSO};t6Ht%xHy!sj%bn0i^Hq+ucju4d9PUR_Zn@ zJEN?qwffwZrrAufWmZGZw)1{U(Hj6*2~gZ(P$g5D5x_Xao~hXKdg_(Iz?6-1y|8T8I{L=Y zkg(xONdwM+uSPw9GCj;hlQUq#k;3UJ)p5NB)HAqN)?SpqHoY~}je?XQ6(K6%XZlPL zF*uMQ<{Lgjdi7l2B1bXYttcM<0HbVodVuS+=|xcqTLO`-i)la|*bp}p{Zsz{uTF3p z00e}pOs6>g7Zb(ih<4A$w)Vg z6EuqsQ_}}6OM=xv+M>i5B}OyMZ^4L|;7%u@Nj^*)*k4eJMyTGYb+lA6>QZ6-q&gG^ zWZ)6b#1m9SJS+-q{F0dR(*sFN%an3dme~uM@I!1oy&TT zvHECsnbOhNr&QvW0ZI3it0W)nOn%)*m5M6DGah@{6`Z~tdym|i2$UhZ>k99N%ubeMEpMG zXU#WhezLl;l(;^n)~P4TNN|FdK@++&=|3d$L;yO4kQ=bRlPG~erF&y_&$O33_exO- zN>r_(phw*%0!TQ(10+fJw_q}vK}6}VsY;9lsZOSygj1~w8`bGMKuO?}CILR9fE0gj zj^(}jsA6}rAWgY~%Vz#sS;ABh#XA5#^2*ZU6Od$+w|?M2gdbK0V18Ga zN$iY{VnX=qRV#f7c8pasw5)}sl%OO|-Z(!5jQoSt&BLL(#E&5<)7k1)=mY8+XgCY# zCP)(klTc?k=b=3{NK7yfbAtgb^lJb$couwYEr6~YN_>&y; zx>ydS^h#T6L)_u6|Z^)*(iZrT*%kf#z9c2vT?y6IGEEyrSMYg>S%@B$rA0L%&dVDUNX3~8A)wZrJFIeLChnC50;JckaBX{R*& z`j4N{No_0L)LE$Q+J8{dFq>sM)TZhh8wm;=DH8;MoDsz1j<1|EEINB#Mn<-tgC=bbonotEjlv(hCJ5KDp{(>@D|B(2%A3 znS!An-p8uH5^*M8t0$F`Ib#OHdwqT<^j?VJN%ZaI=-qD+|^MfbSBVN}pPx|2lo zrD<(wJvC+0cROco^zDk-sZ`p{1!tC%<*#WYQ zPZBvAW0kfQ$A-21tO*;Ji6@rv(ZJCcvHt)H=SRC8pwoKGyY%l{>Z)k;3-^kuFRw$5 zd9JXPZb3><-b}0onDms%J9_hGv467k_ zgSIwpLrX=c*srQ}VN6rCPLjiAl%(uiyMa=kaFonI=ke8kT`C7xr)B8Q3fA)H1^G0B zty(3@JEav4t6gQ3DQHbaGEfCeDI{e`RuLgUjnIAI`}WTae}`RLQ{>E&qJwX}cJBKD zxde4PQu43y3I70yR|s&ECDQcQoXqiUsOyq9gGZg`Vq4U;pqto{x|(-GN1}UWO-rF{ zRCa2ouB|X%S^=$L2y7_|6$EZ6c0#iNLWf_VTrI-**u{~tfvsq&8+2dKFB|c;r>o`3 zov2RfrjfJ(*lEhLn-6qS{tWci9D!h~|H z5IS|loHM87vz|y8=K(;Lf`1f82l%PPnoEAkrs^|633ZmoE85#VPbhE}d!GH%^Qk+7 zYtqajh0T4ZEGwvONnv%AZlQF*0H)hhfkiR^fJ`U}z`*Os+-HHP=x=LsG8)!C`DvB_ zzMnDdz4_q&pQmx7Ws^?RCCQdPQz!Fn)<*8--0pAccUiRC)tdIau+6(p-E6CAHA1m! z53x(R0Vq=1a41R4fTPS$Ot^Amn-KHMWR2eAujNU{9OziwKKHi~lVW8zZcy%**2wh( z?Z4=m?)Ug&qNDyHc+qRLQ`Iz*w^(WQrMiU)Qqnw1Iprm+y}S8df)hJ{xmqFM|*L2mP46>Lt4^kNf>CaNukeoL_Cx1Z9xSz{WGuA zx|eBPNhw=v1uJbs1SoP2Bd-T>4xc8UE8;sAk_h;Y{{U6{Yr}e^S@`kfz-^Cca3k1@ zA0uDceX6$G?-upjZuBf%C{&qKZV3eY8TK-nkvGyedE)8U^GGZPK&mj@xd@jc)N4gFELk4Y@r zj>Liq9ZHS*vD(W;Yt@aur|Dl;n3W~o6(4E-lfg1(Fn#B%)DY3=yeXM0tv#KTZjR=M zE9h(LZTA2|)P@@iE_@G>Adr8~IqNwtr7oSj)QqL3zE?a=1-hr|6m~Xh))TpVqEwkO za!h9=eDsiw)y^l-3TJpzzg6gd>Q+!)rY(T4F$jT@B;*sH!TfZaGMeHoFvVd%B`y0Q*j78wq+Zn8x|N#cyxh9B zz}W}XnBy`e$s!U4XRP952@zQtJc5w-aW!{_zRWjWq+ZeXTZKc7t);56-d|;skVe^v z+yY=9#vt{afYy3YakbBHFj9}UeVXj1blwoBFb=ld-PUb9m{lca)PKHr@_^ay=b^<4&7fV zH9a8n6I*P2#dW#lk{|$mX#fK;?K!~etM*8o_1-XbNf^MZFUBW;-D9GtF8=_*Yb)*7 zQAVeBHcD8pXnKlZ`nQ0j;xoENan@(hqaLb9o*{7*RT$|#Q>go2s;jJb^H1mXl zc8F0{Wq1=2@$P!5yH4dhD?>Fv_WG6W_M5$Zq}EN@bT@dYsx{>!=}4omp<9T4nm?$V z5`%*n`*G8JIDsF`2{v1wcOU4c1AUQks}0`g+Tm=fwld$Gh80?&Qc)X*;EuExq;@WHWwEp&2xEi|op-nELu{ox$sodQ%%|IZ5A99tG%!BSZ`RMo_?p?x1 zn#Q_Liybik0BP86j^jw(4O=g`S5$>0CFzvOK==OA2SmUv+pQ#&0YO3@?e@1!+q;RU zDO0Dc_wVI6x`(Qn^L^wWRz0!rz!T7U&YVi#PMy(Mo>Q3bGpdTdD7-%Quf!D_S_}UG zW|hdGq$xB`*w^&s*GT|>EwpVh1e1Y~GoHF;fs*Mdp2~@>;<2E)a*yNBz>|HLuee{d zH5Q=ybU5PbscVPxn`lT<+iZck2@oYD%x;cjpnZY%yyEN*{19i&AyfD z%e#cE`C<^zNXb?|826Ay3F)Rjl6&-3+?_x;&`XxuTSXGnK*@D0JCq>FBmS{HGRKFU?xTKDt;&-2 z8(jkys)D-dYK5Leu}2} z^X-KxRPMThg9^%&xWG(-3M9|(h7qx>Z6)&L7j;q>wOYk?i>)eeb}MGIp-D>C)k-({ zWE8`&5#mfHk(}e$h0$+@eRbNsZKgEse`~E;b4T1!N|tNw zEz_kBG@uFIgs1-iC>y3sAK$Mvc(tQUb6b)Dpep-c!ul_K_-n@6ZlkA|;B_0a!?TCI zj)Z^IEK+)P#+$oc=#f_CWnDACgn-H3q^e?4kR?h#XaHx3%=P8YG2zK_nn!=n=(|3R zt>a?ZG#We50=_2teN^Y{pMl*qLrtVL)~eOovgdYN4b{|J)lQ0bWl01#k>({M-{yU> z)whIv62!rLd6_c3^6X1`G#_f~w?po{v&Wys7Jgux2Lm0E$7D6e-1-Ku{kCex+jQN3 zJSyE;Y^P-{)V#~o%1LOUB_O24dQx*aLE4}}gPyN?W-H@(E>vw}QH}Arp?S3Ht1Vr= zotG}J)7P!g)2n&F2{Kd+5hr%(DLerL9y)EVVR@{ut6V*n*q!QINUb%ml+dL$pd~6w z!gixz&PWDet02fbxQU*Bk%;)6(R6ronEIlCHT&WH8>!JvUfXUZrwDB-1f;-L=$y%e zF@wQQdXox5U${c**+8?Zg&J2;{Xue-*WVkZd(^X&1S@b+BuuFLoZ%*MWo{`uu3eQd z=OCvA#*HJYrl6?$u#KxQorS_ljnf4{ka969!6O9b0M;O$+ubMMtQ1#j8n$kZxm4=P zP*SCBgwE9zq~$;arXWb0S+%R2dM2=@uSe9iZoD;DcGIrBK~X#Q35b)-k5J-% zag*beI9O3RppsUt+fCD2>0P{9AM@;KY%glcT-~_I+DEV{Q1*!5PE#qShSJMEq3TR6b@>g%r+38t;6s->z) zOK$}dq{2s~Kz~T&dWbm3$6LnRG!`TloeDc=pH7sQN0e5Sr2v9H*phw@;xY#Y0G^-1 z*0chnaUrKK*o!+iUn2&y^idqXD4=T}r&VA%1>SR(pVZcLYe$@z+rvNAI5Fo4fY65Fjx8VIyo zqH2w@{sU@T)GjG00Yr_9GBQ6tuW087k%^q*ET&j95NU7sF{+ndEg@-olpwj~Dc$QW zsWFgpNuFmCI2{Jo9l=iBDe4p~?k$Mg+HGQ)x|>ZvDBefdWR&BQU=@3E4t=Zn>@gb) zrf5Cw^=5^;JxJ?o4lbgOrDzENPS*lY?f^gf$5t0<;%&m_tktB)achFGUd;IA zxzkprhqyH%#Vg8Xii&oMP_IxRyPObY@skG_={9bh_)Udy(zTyA(@NW0?M9gK3u@9= zTis3al7f__>UU_X9c3#e5=IB8M(79PJ^D9F)y#M9Q_PJRPHo*k1qgg^_wQ0^`}H?! zJAbe4^;$B5+Qkx@YNA6h1OEWS z#vIrm>$=`AG3FvL_O!IOr#J)>2scNe_90g7w(qKMH;YvxHMd)>#bH#`%_a4ur+I}X z5PdVrh@XDAJ`WI0G~y9%bC>CEPK~Ev!0F~=8pgDeNT2{4pO6W{yJ+g0Hl%KWdY$^a zrMYaO_bHm(-81O`gd%Z*NZfErc=+~r4F3QP85wvi$j!8pOE*Hm{42XQIY<=pRf+DWIV zNbCOz&buBUK0#5$`ugAJC(CN`v?%B92^!?i5bhTBcqv~p$2x_ghrL-kE2WnHet7H+3oD7x z6o#8hkD8|;A_7#DourfM1`J1BiMpV~ZAJ#$0oivaGEG)PE=$QSHe5+0pN-$uNB-e= zHrsKnqoA?YH&Lf+Y8;|v%4c_)TEwepS{%%&TNDT*?O4w}SM|;)jhu%a;JL<)Z(i%s zJ{EXal_;J0@IEmU1KZ39<`yfj!}SUPcPiUYYu49#Ix(>TrAj+vbE+Gbu1_i_xALN=Ey#w7qmLZRoIz%%Iz?e-BO+d?QKwa41>8S^@1e&Vm(lOS>a<$ z5V^p8>in1GPyQ>qAKSQZOnheD46kt=>CEN7p#fGcZ6zgZZ(8abZD?>LGr$FDgSdkS zkssf#+m9%(QvP{0XaihYk2`(e4%>Fxowh1FQA1UzT7-YaEvzi^qUPX4<04Lfv6g0Y zw!#ke7@g)onurpX>hsN=S_R=Q++`a1PyAW0JzO9^~1z=XGtV&s!o*?4)Snv{hJ8UtrK#D{RnKZYQkEQDSwt!K zTu?JAFcK5&2qzN)a+fC{kxAw?wOH?mtx2eRU!~Py)UCNiTlB4=(CjD7d|;(1IXM78 znCGJLb2%!|*$gkT6h`qs+p4?e%F^xC&noA0edpUlC{EVVB1~|kr_-O`ud?N7^&{}; zHuvHfqT zyB*uU)jM$17ELu*T>UDRrj&#(qNI_WoRoqlVg^1sHRYw7B;}54*DJm)JI$i%YpbtX z1XJ26sK1n|MEYQr6DcAB#w12g596f~>80+vM@gUMvt;Y|JJWi{S6FPl((ZjRsB7%8 z+uj>pEzTWMXVx%bGsw?9bq*QPEL(!-97U}g?2twIH;H zf)dzIE)kC{AZ1g=J^JW5GQ*0`Q0d)Jr_AQrT|bBK2D%@$GfVRL9E`XgFr1`T zwJ1*H0;Oa}_V%r0jzdb-gBxBg%J=*jYQE>_eNStyws#t~qOs(WR@G8`;ZTou)Rmu7 zXM-X>W2vz+q~;Ws>o`#u$UB98+Fpr=RK~g0tXWs5oKKTl-7Ox^Cv(E-D zWCNPi`b3iClGiqfKw5XRww~i%ZaRvt_G{`^poW}mr201#JQySZtbG0lQE5^(bH7wp zqbsq+6tAeeZ)($a9Z6}>DWs^>2AzM-ebA5nQcpwi2!;`92mio>`mhnGBV%~RYlIi zl8FUZJ?OowZkLP2o5{CU)YFPK>Dom7Dz@)g0O3+IBjH1((Zsc1U_6riMq1p~Z-4443nozn;2Q-|Cl-IM7cr_Vz6qf}Q^eLWqqG)Ys) zP*Q>+wQfiXBz^fw1Q{8`NF7NFLk8(w?>xqWeyDqWX|SP+=kD#$1cM=Nhhy^s{h#{1b>HYaXj=39j_+ya2mfh~A;%^Xj4M~O*Q?Yv{YhfDqM0?OC7=R}^4f}2 z2?^W`D4&9%#AdZFkYaww=W4v|0F?(;=wjng^*T_>+HuX{6PCn@_mu9~!^;1;paG;eok_)IDlLMF}lMp~oL5b1rtJw=4P$eH4dUZo|&ndQx zDnqI}eG3Yb*#O6l}P2lpwb002H#=9BtVNQbymoa!D`-CJE{$Lhhju$bkE( z8sSp3CYR|Dl(^@rTug;32$2&Ul1a$~%uh_>jDP`C0oiTnY6q&WHTM@-VQB~h?SPO^ zrA8D9KKU`9%oZ@lM&*2+WS=#bl9t|eq&iAhzX?`wpfV4nL{1O19*8a@V4#vQ)Ra=g z%pr7z)|^8s8ysvTlJfWG<6wklx^(#|b0kdcpYp zy4FSzdZ^?J8x7Ubp-$7Nsc27@6#_~Kgp9A+pe<=xwAp0s{nJ51EA@PDKW6yF|s3MWIidv+7E0S445}MSF6xfBujYGC20eo?AfZh~~7hOLAp(RH>%eyMS~` zhym8hr*Q>8)UXaLUm#N~D8-u@N-B^x; z{W0$^&{}mTZ?)|urHZ8ah(Cbw zM|AIZgY=Qt){8cryJ?+&YrpEcrdLsV7e`XXJ5Y`5TP}ci1j!J3W5nJR&6AE~ib2de z-oxqFb+?9}$EKO~#_9R`d!xs$Sp2$kfxVhVhLQ1T+t~F{55rGy?s{*$y55eSlTT}k ztvPC~b=PU?6ysndBq{1sk1=5-a3c_YIzi!Q4}F(bY-XJ9mTZpJS8x6-IN~Y%I+IXm zn;dghG062t$Au32Q0}1Du z#QB6gicn*~;@!!ldvn!Vjom+|DX3Um8kT~&x^%FH(v-TToyD-&93%i^o^c1Drq#oC zB{G9bbB&NxlG7cyahq+gQg=F!OfK{aT%xzo(jk>Nq2-i^if3^9pDN~$$pLpsk^Ul_7!N>&4?r>JZ+(@NTaH)n+A3HLb0O&I2iaVM>= z&7t8L9~&!s1E=6VKEv=;)8Bs)mmOnL=78;+^?$>b>Y6VwqLsZkETDg+nU#N3{7+tf z;?6cQ%5XI2TaLto`2+f&!`*(ne-0nR9C&!&`In1g3}Z($aY!nw{{XotHC0}g8wTv} zvR1HY8*PG{NomTa>l&)DCHkAP%W&H@&c@WJre!G-Ng$NK$mxciriQhVlU%!>-5121 zZv33Q%!rsB=hSWOOczJJnjf7~irT{V&Y;v)_ZCV`9^lg|*|e#&fRwF#%7__0{{X*U zbMXgPk1tSjo4ZG(eF@*{zeYR^;K{Tt0vtKd^Br$+?9%EyzfPY!TDD7NO~$>Obt47m z-B3b6h$<=o9$>dh2oHo>5(PUxK>p z0h#sE&+1cEt|?n_`dvj&OpsjkRP7PD!H{S20Y2jgsiI*GqNlbwD;;n3YCCV8PEZKOz~Lc}P=fZ>I}Zy+e4{J(Rj4&s@t?w&k>nh6>V^ zA=U^a6sb7O@+JWJCKEl>S3rj#7O7j>?-qKphUsm)UGCv}R*^vk^8m7VBo$2l+>sIR za%A+e=2GyJCKKN=eYPwx}aj4j|n}c6eg)uH2>N2I~OyuSVv~;3Io?}YO%-1z6 zXx`ynnbfsf$GMvEcZ$RWHq|*F+O2vGoRWkW{hMUC_JuiLcVu`)leJrO^f|pK*Izr%*dge^e3h zM=4sQB%d=FN@tP4=l8Up zOla=aOHj=73h4X8SBE_}*gYf}Z46v>t#U(`ONx*J)?j}r2atro{mxIcb8TZ&bne^k zkMh!R?{y^ui5q|^C;q?Vs>{JUlD_5(G8H`a8rgnY!4L@REf&5}6U9%6tu@+B6{u|N z(Lbv-oka_wt5qsDtte6y3Y{bDNtn;iO)>4EAEvV93Ws~R&Fe|{X6>hVw1%Bs75x{# zF20Su>ok<-a9Y8_ibA}(C)lVMfO<)-gUexd%^Gpa0*YzuH+sBGKX2E`v)I~G?x)DF zsHNJvhEhm{tL`cw0Vx^86y$YO!qMb=i3j}rRiohIYMT4CHOlt^ z!0B`#DM0oO8!k2Wb|QooAJ2?pNsPL9MB+I;Xj%x{H;+avDQxD&GMmDO%4W zK;T4-k~;crG=}b>gH!VzN+jrB%2W1>U0r*6u_yJRT^oQQ2?lr;(_ToZng+#_^A6bbgnmy@JP87N;v-P4qxr%hq+8b57M( z)oMCNwHnz|$!+I$`HJKc0hynOAe`d{{ifnbN}}pAvAq{QUH0)cc<$9^uhAN&!KSF` zsnFxduVq;;H@XsLC)fn$K^YxcAjXle2ePSV=CQ!FQYNOc)zsIUr_fVb+zVJzX%HC- zUgH^p6s)HLV3Edpy<^EuRYS<*MJ>_lYTFG5)S-8D)Oo4$+;z`D+(0{|a3dsps2`4) zoQGD+Q-nI&T(9naqP>AjPk*g#*9tzD%2xMWB~n00B2Uccba64zr!axC6k-Pyg;!Ci z9%1L+Rn@xG2LV&aB^!!BlAnVh%!o249Y-EdF}0-FHPH{-sxK*|t5s812R$li)3}fL zN=$M_1eqX={@@;@bk*@jVq&^G8{-NImQ5k z&q+9+1DYecjx2*zyQ8D6rmm%@uA+IWnm3w5%({aqakU9bf%qVU*Bi=V4&4`E?z64X zgq1i$XaZD800H?uYRqz1*1wRKkfNH#5{6o*aFn=qmk^|sz?E*yl}6w&elh^?VjR-~m~N&s330Wy+QJ%kce4rV`nxq;}lwzMoRQ`J;1p-wZo#iz<~ zE|>u9-Re9jl2x4X7>MgFWdIbM;*&k9svon|(pS^Cgg%nCh;70YL#DX#GdfYRZEaS1(3Vy8jM=lf;)jn$l!jCMhx8^vQ zR04#^f_*@NFhBsGeIJSnCRwT5EyvYVmY;FTS~*jsgd`A!AeCYXKA=;?OhLwaiabya z^;^X`J0X2dX&0Ir#_GP6FYO^GV!~S^JExiC5DzAP2S-3dPU=S+*#&9ag+f%jC3~*7 zSO{B6LdjF@OaTHxDFGx5oD-aMOt~9SQbQ?eOROc(hZ3ZPEk+U&3cSSSA zJq#Qa=4%Jt4Bi`9ta_vB-(@N?`jFau(VXCu#H$4DAWkG6riO4fT1x(jt+=f$q#}~7 z+LV%ZDGrjC6rxUJaQP=VfsxVXVO>-nVsP{t3wG*?s)wEgI$c7D9)cqhtScaLJ`N|M zvE(;P=SpolZPQg$wzaxz7+0YqYeh=(u>7;MH%7SmamRg|lP!y(GVx1)| z6+PoS!#nAd*C4J~5N>4^CMiAwu_#>wT&^){#V-m8DHM66%|6 zAuyQ9Gnv{j2>gL0_3?-hvIz#!N>M{d-MAebCtVgf`6>u@Y?w;KvW z0jkDc3#e0XvbYOYAPxXC!bFigaypIRjh6A9=&aOq&eK;s@|-?dS#b>oDLz!sr7{Fg z$R9Y7ks`V<<7G21pk8poGK{qB11**q) zVNTcYvX45d&<a0<@66ZrE!7OWb&)v2wzr&gu*_uK8^UAd?ssoBzJdP$**=-I z)LrRZp%)QSwL3`B11L-oP63ns=iH4;#uvU9z{mg&1YQ3C!liH@{vFs_cBhZ2W$JH} z%6nc~BMlBMAl35{0j|ANX7Cv06W#u|(No4y;+4liwJ!ZFudN zvBxpw0ciJUyFIJyT_s&cqpzX9YnKVzOG=WzS)i! zJTbt-6nX62*6uV1)98};rTk4DYDVEc*vB|>#L!&l9^B@)?dczyXuF@?N_x5~of)LV zBHrfFU0Q-y^^RwEmZK`ztSL(6L_`FP)Hw6R$ixrRFbAX>bNiow_#WohqrZnQ;dd(^ zGCnQhR}(vcF~dff4&l-R{dLi!X7}9e#aivPH(IJ%ItEtdTZ`J#QK%2{(cI4_E)p**&L^-eYITmBgjBYK?xs7RRE_a z3le=t+JC>Gw4NSr3?qAS>+sv4`4!Tu;Qr^y9ReAfM)Y6JSv9RF%AK>iZXH zJ4stdV!8QMwA9K=uLYTYu1Jc5NRy1opZs-J}sgFoQM=dPaJx-ZI^@(DC|U!6q- zbu~>TLdvOXK?+eDl!G`}pSL;2BOd)i=Wl3PPcT_KTJwjnAPXtgCMV&1nmrsVRz(w2dk1Ctyd>^?eZ z-8dSt469nm?uMb&SF2r@Rau+1P$e$7^QEnbME!uMa%LwppJT*dVgW<`stM|X^zMkT z_Y1fcG>t#yx}~Ifsa&lai3BA3kW9pkA86=^u>tC_E@-O-NQL-k);6n!4RtL#wT%?W zS_aozK_~A)i91360Q!Bw>EAkevuI6EOz1)yQSu6qm5`vK z3`R&Fwjwz;yhiekm3J}a#?!OguEKY3TU{Qy-)+}DDP~w6ZDmOyl#u|Xpk{W!JOL#0 z(~i;ew70t z`g&Qb#;W0ZO2(XUljeo)4RB}&M`C3NErmzl+U_b^BL#@(PQ*{;IWji&iqhxwk z>qHknDNj2;^KpJJPA&y`9L>U8vXE%eGHAn%xM8#lqa}Iz!1zZ#U{r(}fMgGw(RebQY@z zFKwxH{u`J{9_Mu%{{Z}K*z|qg-C=gyOJULNH!WPMS~TeiPD*we^-K_80|fr{GpHEN z4VCG*0piMdw6Bc{H*Rd)t98DfZpMau#?2e)aZZ9{dW4ZV90Mcv>F%G9WZa}$hC5m* z5qCSqmc7)ra{aA#;ir_zLn=$E4k>0mWk5jrBiK%UWYzKm8%s?iPA+w-zSUjCqtkV^ z?Ll}&EA@|852#?O6sAsAoxt)>w9G{HMabR!#a{zUMRr#C;RC!{c8SYP!?*gGHI_H1 zR@2mvB}iR6^OP){7>;5=03NJ5Hfd(Ss+PB-Gb3kwyRvv}o!_Dt+B^M5rMJCRNQKiW;PO|y z(5#j2_?+Y48IF?28~niHIxn6WIw>jH-B9kn^QkS@3N1}yT1$;RPOz}aNRm*r#{<~l zl0Q9NG{;$@s~WqxTg(dQ7xh`!UBT=}eXH!$`ml*fv>XkDg>rX9<2?$@*56dpTy9aaNA13wzt>*s^!=w# zIdQr@P?P4m(A~7F?o1E>FiDaEM9%}Dva={qD4Y!}xY-JHwc9;GM@>gxbETy%Erhgb z>cUcy2^)z-kPbID;2h1aFfGRY3*sEbdPp>(9XWnwADn^Rah%%{)y|J0SawIhZ&|+ zf(!*18+P;6OI_j)e?(^1`0;IIQs}OcofFzU9cZxI7^kpli*-6FE%ZoQmQdKjP>sZ? zT*Q)pC#se<3-TllV6uuYprSW;JLhnE();WsbauBlCYgk(K)P`rVIOh9^zojp**ZIL zv5UyLIuD=r{dy~x2Jq3($!lfWA@`3>y}o3x=0M#Z*AP~fCC3OGdEyCNP5|_iFag^D z#ExQP4K@OTc+G5SCyF$w6$w*KgS|kdNF#Ex0azf8WnVC62e7Q2!O3KiI_V*?Y^XH# z52BuhNh&A^OGQgaA`*8%iIG0yWJv>lWK#D92G$4@zTtew3R+Q zTUDZ^(o(s-OL1#b*4o>jPYIBioyVDvfHTKJ2Zrv6WPojJe@NeJE!E0lr^%sF*yuSb zaU&^-i84mt`HvEM!F`&g9D|tbo{yoRsAY$ns#QZPS{g>ws4og62}veFgaCN;NX+## zMzMUG7T={| zJ*X8UDX6$mG!OGIw^ODM5Y`kZU-q(rViNxGC?EUbpzVd(G=n-G}ly$ zR*Du%R8+D2^O60-PJfPRbfrkwCZ0{_JDU1KpbL1 zxq@?!oMT0OR_$-NPnE5wnQ2QO?|Ygh?SKU|QejH;5CMP(zB4?Yn@0icp>Xwl7W&v( zZE0z46r`tfnH!*BDbJ8fun8m)?Vg!Ij!#vIrVI;R)*fZ|ceP5O;)+%ZLP<^uNFo&@ zJP8|Q98W~P64mxR{KVSzXL7MM6wi+{cu{Y08;8gRDr~xHRd6rFtUb7g%p600m(bZ8TNtGnBBehUppWUp(^TXi(8i^i%TrCZD=+^ zOMpZm0u&BG0F^->9GQWnaB2k2>bpqS4M3~9DHf+G-C-&6lma&e0ujQ+AU>ozqL8pjNdq3l?jjHFA`ZhPqhw#26Md|hHtU6IT&4~%mez!M zt;~(aR0s5&NhdRpY3gAxb7(CKcC}MI`J-N*?sdtMhEl~-XsZb-RH;QisTi3vKlJGo z(Q_ajlw)!qu-*c8IPwysAnxF!9LXjGAMHIP%Elhb-=gcUjP+74N9tRZGTJt}_$W#W znw1btgZ7x*AOL;8$4K&^YsV|ah3Ov;yhX{vnX}=_=%oJub4h9G?mGQb{bKGdEn`88 zw(50xij}1$LvC`QJ%&HDPgJdMhlH)TO&@N@`+XPbCxw5-+Uo>QTYfd57U2VdZu&`t)BxD%?gZSxO8Bc(hkNbb06@QaV zizWw0GXt36L><8gu^z=+7iv6yX#GW}m!&*MX&TFoz*7AxZ`R}jE1aIkxoFmyM2yMBeYoXF70o(eTS~_(%L-A3gxE?3_J7#UhtP0f~(!aA@0DbtRp?;76b`;J}#=dSyo zG#4v^ZJJ##srq|WB9xkXQb11s`GKRn{z537|{>!>+yhW$!7_Q9Jq!F|8ajuOWN%>#7pr_w$drfK5Em0Iuw|&%4 zEo_oyUZ9c=#Eb-=`HYwc5<2vzjl=M1u?9EP?&te_7lJ%i@#1|=&yF`3@w+qM;_r8U zL$a1vE1iR~8fv<}_We24-%PJL!rA~id*ZK5b8{*CSy`i{>zzf7(M)~?>}(9me)}E(H6OxacG)@;%Cq0=$W{T}5JHTAKkc8}pr%r=`=zUGYTR*YT3HGRg*djRAdm`&xBYM@q2vh2 z-C=A$ZVsWwZO^$tppu=a5|Ch>ut^aFkrDp@r&>W62Fm&BZGN9^yQ6!m=BT(Lrm?yz zO1gwou)qHRFrdjPf%t`fL~)tv?kmYO0vc)p!ha~dOkb$`vv#}J-)>huFrPlDnn&MI zZG@>LfT1UPfy8?gj*K|q?o#2Xo1&PVSL07z-D)f9s;-pw)(Vi8n_;+3LwWoC!P_uQ zalzg$EpAenZd|{*_>mPunr=?>#cc$ljJ)J&o1IcK7wF@Yi*w zQ+ItmtgLP&A@>R>g2K!aR7w=Am>BlkKaQFSdzGuF_ETd^{;Qr8ZWg!dt2K4b+R9r& zdAF^PB{b<+!6ZxqM92fBOLO3B_tsvji&8MZpD7F9u4(2t+#gGv%1!%7U61&m7DE5^t6b6Aew6DQ~vIy z06iuXDIac6Nwp0rvW{kYPwVqaGBN30KX3JAn^Ut-Q>XPUZQ7k|DxlC-RC%=ok|479 zR@WNN2r33sk<~Xp0nzOvYvK@ISsfF+(Mdu{LYrI(K_hYuaA2SN^nzH3Q?#vmdI}mh z>ffiQWryk)<~+2Fy10o~$&RD7@BnTQ*0j(XTVL5~>^h#>)qM-ZkW@^zxWbZWkDwSB*_+a@P7& zvs#k2n%iw#D0P=wYyg!M2ub!%Oiu?tze)8RpD?G|SP{1U)1lmpt>)d_W`%MoYbYJ6 zN~pz3Ka{iNsV*P^i8(mWKd`IjU^zywrG<`38yga>athZ_Bitm)JG~+ibd?*s~l9}@u5_c&e zfwp*KC*a z_MO~h6Zywb(Eu@mda4Gg0q0!w>CGc%e$-1&))(qoK6_}$ZE6y!B2Gxkzan>Mrcyc0 zH+vu(8+-Il4vg$YNN`oEs+yYClAwnj1wL>qC(PIhI5~*U2+Z^}vh#{kM0s6dOdSc? z8!b!iThUC-{<*&?LH87tuuxOIU&{hgkO{^F<_r1GOiNK?B}XI(NuyC)n>~V`N1^M9#0j8mekKtH1G8 z1Tvk4Nd%bNFaRU{P#}!+)9o)2=W>^7nu`m1(w4o5{U>}v_qMKzu7ZY(wwguigXYv+ ziQHNAkfxhRCvk}-Ml*?lHizZMj~Omp*CtZ;&|NBcKK(VkH~2@lQr#?iQiELgS;PZb zs_#_jsH-c-rkN^~(<1OE7|HQa4f{oVC2tsQH0pp~jn>%8EYNW>fr zfCe+tT#Z5iPGt1fH@RJ#6H1+tf2ZSa_ieXdkHe=`{Q5N=1-72)a;LV|D&cQw)wUg} zYs)T_#4BomQRQYtVJPHht~V?^!rEzbcya@`K=nv3XOd$xjy_s56}7SyNJyd+ zb=)w+7Ka)oA>#2V^AM62gp<7~QhmKSkV1fvLB~W%6I&V%SJyzACUn}bJ-*fVn{(-T z>s?ROr1@f8Kpvt&g>HpL=)fH0bx6#~4S4}J!pHL)%!h3ObyO`=sZToU$!vveQ(-Fg zY*7l7nSt<;wC5+UpqrdoLgdBB?ZVAgUwJK7R5lakr3DH~R1}jWlQSsS0kN>JosZ2a=3tP(lt=eZ=SAF`Y7-P1#9|@=X*=ctuft_o2E< zP=%=p4Xa|N0VF0ea57*4JEI)|if^)H{AN{xg_If%xR&j7o>CiH;Z08SxDpfy18*4; zcUmWU6^BDCRggY?+Ii5|X;ghp9`5DJ7kyJ5|7u$>T77 zbMj6r_eI6aTcW)OSx{E}E3O(>9Y|7vb1P2c!oTzc43EcFJb4>R7oDgl>c>=+)Fg+^ zMMH&PHV}nMWPaO~1}8jB`}E!kcCru;bAnK)reM_s6}rP}Qj%JTQ>2~Jnfr2}CLjU9 zfB|PD14~Cj=bg&aRaH8lMM9mVr!9o}XhI~e2PJ%@%0zH85tt-0UTaevcQjZj-qN~p z>y^Y)?el0nvafI9|B~o#m zNJC16xPt95m3o0xwNFsn)T$H|HUucRp(IR#Vh+?y7(9D)ig|&4$hepqC@nYZ9jd8% zrPn-w2yH3cb|pV>GDb2oCTIK&7)j{1bJP3b?@&`y+#aK>dZ0Aw!ngTkZ`w?iOq>8` z5I85P3{Kl*Y)%9x7rC~PO>%anwv?va5>%1qnD-JUV*(B%gCO*NEPSdN&2&{W;`>g9 zYAhF`0^e!Js9gbDlprNZ1PBH*#tfMEh$n~*hg6bcONxgywM$`ax)hZuwfahuR8$Y- z3I71Ev~-qcf>+Q=TirUA4ODH<)A{QSBtda#AQYI86k`H&IQIGJMA&5X3gx5gZis~< zEqca^^u-!(3S0A!sbN7%C)=KLi2P1^O_Pp6=)0#2ae!$QQSH9E@n#9S+AeCWZ7Yzp zw3Y4#Bq_7Nz~pB!9al0SYrQgy1$tkC{7=*{Tpxiuq9(7D)z?m+_D@!t?mecyn74b| zK~Pjum8aAR-Ufa-=Ztgj)kiagLyL@06nCOJe2@2EqMjRn84#Ev#@C>8ov<>ngMROG z4R7ukdh`j}wotoxOOM(R?Q?DAWrXhy{#6`%^YPU|ygMsj(vRi;04v+N7aD0=q)nd( zA&(9gDZ>7(Cc*d-f0D>8&m{%bQ@RkpPW7Xo*!%nEoPIizO$u$#Dc`!VL`9Q-=gE9D z)d?jbrjnxf$T6p>C$YiCnKQdAD8NxLO~l2z1QY^;6hAId;Z zMDupPv-H}Axn}hBb8R&T$wUt^IXF-zL?u`dMkl8lPlgz*K5k3P{v81P_a6_%aK1JE zB2Ft^7L?8VJ=^{b_xYcqnz{?OO0RyB(W5NBV@Y58!{q=r7LkQ5LIyo1PqciVx^^qz z#&0BT4Id@qJ~;6=D>d$$HfKuz0CyX&mtZ~ulksxYS~s-z!%szBOJA#w ziis_@6*A&PG4z$sYcqRDz4bGC8sJ8kmE;{PskJR*JI)C6ow}AO-55h4#WGO&@Taa(c|2i z?{=M|lFVR8bNk9Fj@7e0f!)_*bCj1Zg-@>i>u9sTaDsLJ|E-6&HhJl4SM^Ml> zE&-O*QbypR?bA%XB#Sh>%H30(^-&Gfl%Wl%EkMdrk}!WD@e&pP08W!T7!IK{gEH0% zN_vOt7-5!F@LIO{2?VWQ@_`5B5B_n`2TyT31kICx0ktuEOW=`rlPqPLDO#S)pyZcUKUm;FGyA zzx;dyCq<<(ok|XENF9@>-4D}8v0cXVZaNQExuf+m+E`OhqjM^7&QL)9SluU_Nx^_b zqZOT!!!4T%lYCBolU^pfV%^&JZqttIjUvTt4dT5qL#{B7?~&|a%13uoafym@W?i{4kvVy)w$*zXjIZ& zt?C^4?1utdn3<26{{TGVIugTnD9GPJig0xGy4X?(uN1BTR6pL-nMz072NU_nOd*_I zDS-!~ek?Tiq%^0gwKd+Jm^Rs|SDc3dKqJdkPx^tA1|oWCjKED5tgfc@PW6qgde-Ob z?~b8LTP)O-v|ZTgDe}@poxxC?`(l3<9Cil~5QibHJFVKA9pZ-i z@|^VSNCjS~JAGJ)naP%NVl)c{1wKbNRck&4{{U1E5Izd)Z5DfWsC&CzncTHpG0r$HiAZ9(K@CxU-hYUElaU@t4`Z8(o~UcaO2!u~!--l(%}f zR4FFsrmD8esVi9@coIh8_Y9p0sL%q+Q((RW^xmqIgO6jP&adIJcsfC%LZXRFC?CcsWjk>^oa*~#Hxx~)QYg{ zNk7SK1cSObM4x>6c;NL{)njPAmHz-wls&ed-6=;w+}7>&6{>F2+&f}QY1E)w7dBB4 zqF}<#6ETq-VD(DLVdmLe@Y}MUJ+xl5*ZL)TPg2{{U3H{<)6&-vJnD2Ne5Xmy1i&~m z@f~dzi{|X*JGBolq3D7;P2;N7r1kxGYWt+cGFmkvj-KSn+Lzl&JABlG1Jn`;Ffeyc zI>g)v!|M;+A>GBrn>n@>m}^eu-a9v@bkB6OtsR-$73B(X)E4%&P>2c}RtD89fO1L5 zj;{PS!~R1ns-y7_5c$WL3Q!wT_<_(=I-TC*T5W7;n(DVzO?tIcx)RNGJIPQ~wqR{g zIrbiqL7uN-K2bqXq|I+Nxk^6>9pBL1vCJE2L4 zFd)D@^dx*g6wc;7mQx_Qh0*#4Swz&Y6WE@i)xPEwGgOmB%}clK_~W! z&%E0q!x1o2ujJ<$4TQwotW?@=ozR zWl38#9gh8Uw6&)ws_(D)gghzAR+m&HNJSV1jrf8M>0w2R&KcyEwF?WA1t4FSd~p)mF>o#OZOVOJ2k4A z0B&%BKY%^Y7#&uwT&X=G?H`SY*bUSN?~jYii}ZILC!$iDBC8t=8r7t!_E4j=ttlAJ zKr;|YoF1+kR||%?K5feAx^D=R2ihNYfKctPLTOu54yLNU?(0d~(+Ms)QsEd{h#8V+ zcQ_n_*FwiFjMI80`MOoPHC@`(H``sAR!ePNGB4F7EmS4;OG25Vc|m}ZkP1Ycl0D?~ zuZVJ?b2&_nX&cp#&d>H%o)6OIhEn##=K?DEPxeciI`5@!S~}mRG{s6TEYWOLNmTy; zyi{P2e*r|3j&a2G=dLN^99)^5reQod#rL^Q@9prTz5Ew{;l3Hk#jQgvrM_oCMG!sy zy*dL+hpzDV2SDnr4cg0{HEy3rb(cg}cW&JD)4YHS;!+>v-DV1`gvSvj|QQ%JGPg_K6BM5r}NlFM}) zL48PU6sal9?lN}dNzO@#1awwAByj{SiSqh%O_y^^NqU)11`|M#7NrJ(LoIJfp`eg9!B6}!KGcOI6U4+Afz=N; zPI)ED%cEtqdJ2n4U+~N8_DhW#ZL4)*#@TsFB`t`A5(Jd}$&7$h0Er{1F(c(|CECkR zJ&$xo@o}ae3n8Zx%9~P@t*BD62m(Prx%>%&Iwi6YQl^gNq}n=~>m}Wrg%voYsx7T; zw$r0>(j*jw=2AiX;6!o3=%=uKqJj;$XPTTH4U-Gu7g#e_U0$_;?5OQ(-_5TbnTjBRhYw#6XGYsTv5~YaFz8 zUg_%UTYUxP3O1o4^S_F$>ucRnx38^V_c?mhnhA^asEC7&T z=iu~vBIHA4xxgZR%U3f?u5FZeB~&Se0D-g+RUnxD@^G*E^@*k0k$BG}T9*C5v7(W5 zwQRjwrK!09{j(q!GXTl=NXQ>DIwu|05m^*lYQDSu+m&|;jr&DA^fvnK?bI~7ncCXH zf(rQg>S(|x$vpAS_D>VJTsjf4{8P_r@1DIH zdZv-;3pLoOOKHSDzzS|e?%JKAVou;a&JRZYo+oq*)f@}s&an5jlH?Z;`nNxcvbJco zwxhq*)45koLh=xVsHG);%ulP+f$j)1?VctCbLntD?}gtR3x zM$I+1O4KQwpcS(Xr9^-Nl?i}wqI2#2;hQ!lR^t7aE8>3;!zkoSXV{Z@jpw=~=}Yo;kxRaC(BBzl&8y;1Tco}1%ovQBA&{{YUbnreJkg@cZA zH7SH_->*`Afa*!Dfa+Bj_nXAWa{Je-S!ei-R+X@{pzX5Qx3{%*Y{47e<9P;i#C|8P zlcVV@$D(&|UM%q!#%c9dI};Q6c+Tx!rw-i5+qeLais>(7QvtfGYrxI1MEvdB`tEG*iK;D59Ba3I7<~Nq;j)i%bP{nhJG`d>uFNa?YzAQ8o z+Q+jxi%DKA_o`p1N?3IjHoJps+@rY=s3uMT$H3{pD}4EZ84Jo@%!|&Nedh~sTcOsy13rP{+oK+T3k}z zxz(uAoL$y$C6&`;5}uu?fmN!kr1T7|~- z*05?8v+kl+a87uRlg+Qp@@>?l4EQ0Q;CL7C%dhQApntZujVoKRO|xBO29fqANr;py zCSgfEVjXf;y7{l>vgm~>@7KNod!O1TYp&WF_gCCq9txaLX{fHHXnQK0VZtMnOv#jv ztr$E&*N`4JS!p0zr;ih!4Lm-0fw#V`QKXyE9m0Sbz1x`$K3;{Lt3p6agZ@>=?vswJ zK1_2r(uj@rsV}(y0H>dEdqH-mpuf`4>fH@c;bMyKPJrtxJHocQNIqJ`&T)l7!Ron} zqqrLZGjyYr0o6Kvu>CV_-Oji++BChT3-v$e77oRopa4opgqg}rPtHeLL8m+$rK@Hm zbtoEp-d7 zzEoEVvY`{P4Wt4kM1J6OtZVR%%7yUE{hAe=cz*pYH6Md3^_RLnAGMZ~vFd6N8@t)4 zsA>|%tG9wnl(h>}khS`WZDlf*B`|V&U7M@HKcET0&%QV0k6Wl3~=5Jmuwl+BAm&&&IMDCQD6eAC?8(6pgxDRBl0RG1)x z!5`bI{PC8#8V!pJB9S6M6Bz0sXso6;zn!tScQ?1Xmdjk)7PZj6+5*!c%1F=Sj;uOf zT^dof#g66+`MY@jvg*FhYArjcC|aYdRl2F`YLHPd$#{rS&nets@iFX2S=BJy;9M6& z&~t9LOWqsr77cT6v^3U}YTs1zK|X16Ld;IUGawZV35-kw)j9YE{Y$A}Oh}@qBbB!v z(%bdcy1UfTTP!HH25IS(rgY2K#4d5`}A%ce69;Q>;zh&J0o`9`}l)RHFf2k zJ!`7CDyiF&-4feL$%x8{1Yn%OIXyYbZL~BhgxInYtV70kjr2Wc?U!Wx0jO?FcI!sa zqTZT-l|_57t^Q(W6p~TyW6Q*pBWYK)3@6#FZ zMqq*ol4Nc^=RW-(_TWmd%YdY9FL^Z!dRE(`Dqd9`si_3x`of;Z7LClQ4f@cKU}hpfDg0!?iRQ)w-?b zyon1~t|P+#0O&E_KjHTK-+Hy>7Lcr4f}qe)xwO-hB&39lnIIBkee={qT*PPICcX(| z=6Bm#uRpUNroUjjO-)9(tQPzA;jEg6Dbh(-$Wam`Kskd0u=spc zJ!`)6>W<-Fbr!hSRnD_zw<*-n(6-_7Ons>UNZ&K+n86dzU0V-C$Hs3f2TuO~05#HZ zxIQ*W7~Q}-rZYrbhNXR7%-7z1zfL3hsAWrnmeOGfNC#;Lc1OMja!x0at=ubitt&C( z5Hu+v+S|Idoo(B>HB7wqo|kJDkm3j`F(F%jClMUU#1qwLD_Z+K%I<+F(ljr%JT<@Z z@!Mprcc4bAcC8l*HtLY@1>|os3b-3dBY-i-9eM9tam;hwHvIR08(x*tp4wdp#}AxtscH-lTZ}EtX1A5Uz3bywQ-JywR&8mA>r z6@>s4gpvd%cAe5O89vYP3wd`5UTINI>D_8QNqefVXsM+v6te2TX+)VM5z2^ z$ulf~I1Q3Bkw@T%UMzbREaiuW=9zfMX+p)H36>(ei+{ z#mp^#GHx%O+0mNTww|w0X{yHyWi9Wdt0@jD5A~>+9Y*o5-^k`+eR{)9ZF!rwMMD z+!D&2IUyk=VQ?S`9^gsA`MOX$ri`A3=tofaa__wrD|MB+2BM~wO2tL0r4MZ}JN6{c z$&fdCf!mquZ}g%RpJ@&Wwz=rNV{8JVrplX9YgMOh;20H&I8*NwjBCPi3XITWdldeyL$-P$a`}pmxMgWP>s! zNtx)zyjMjAK^+=a3!3QDK-0xWwxXc{45hIi;En0`AOcUe1_WnNX=@XY&0}h*lR-@L zC@qje)hj!lL6UF?&*Xdl0P8|eM0+N!*1M`IL#S!Gg$?5 zvXY--P7fvs{m3Kp)Uvm2f+d*-tvU8JTdgfy7`iH!;)=(~epC}AqtbS$kOoN+lOTW( zMq=ZFD1|%2YSzn_%8P6F8)c@Fj`L@62rasnM&u|cq`*;_GM_->Xy}*6%4jGVI0Iml zE>>HMlr_yb#m1S&cNbeL1Ox#kd65zbf&`K=((I?+%V1jZVFu`n?PvR4Y^ADbA;uJ- z7V08SV*{T|k9WH7Px0#owMcnM2}G$*G(v%i089dt5gGeH2L$xe zDr;yhZ*YRxP3)$FC#!pI;fl?6yM@$L`gRP_Quu$*9lA>9mkyzr|@+PbQ~;&#{@ zr*7(8E-fJOTIKRW({VlA1R7I_Luy#L7YscN5fb!2&=Y9z?!27Ngnn4V*$(&JreDvGaY1%GUdpOYh*U(Co*1dM=ry@mtv7V{rvPmK*+vw5+_>Z)n#=wI_0`RT6#5 zr_@LgMgfHJ9St;76W3+Y^zJy$kaD_rAEJ<2Q^XdZv(r+$r+ay$s4Cb&N*!^K^NLsz zvS5jU0FGdulS`*MTMsAbRpS-XksWV-^=`IX_SY{#vf6eQD7_7d6Y4?$ zKH?;R2|p9lO*4hd$MV`;e_z=z)^$xYO=acG)_3(gay|f(Pr`zHJ1y8=<@biG=ybbP zma_79m$&XvkVg{-B>U!mW_w=^_*@V3GTl|!Qu2?9pT#ylGklE#E`N8t5C{JN7GCw# z7aqMrX*^JVjos|+l^tJjd#6LFdxhHSl?R@@Bh7lc#1b;6kOcWsr2hageWUIXo~*gr zOCTJv3ITZ6RO5`TMrTiy^7p%`C-n9o4&9YBYre{B9?+q>d!?=J;P$2Q^(d&Pc!y|| zsX|tzB1#q_cL53*Jt+kM+_FuSk8VXmDXlkUUF)l@bc&~?rPPe4{pQ?43dK9jgX%=W zXD|UXCJxPU2V}-68u7VS72x0X3h(!X?LfuDP3n};($rIz-l27Be%pRgSb*awlEcv{ zE+7M(gA>ynIm<{0De*(M3$pJ3->LrqhW`K(HybXL)|ECs-FHf*ru^$=(bPD_YLzBw zYKYjdWWd6s5j{GdcRmuGV=E%e1Z~uPq<|r69z|@7FNQ zl2bP{ok2vv&>Kn;cwE;_J#w;X%FCTP?+sil=-qF5mr+wrnxySaW*nq^Pw&$mMUQg} z&%^sDA&spxtR1pdgP+e-$y-h+=76%81LLUHX?*mb$M);x@mQ7+2qffjn2x1njvW># zD5Kv`2;HmiOBL5gsF9_0qSB(9of-l|$|L^(j@W?YexDV3#Jl&w(;Ne2XiKYqFvCVOURBXoQ+7bbhc{+90L zg}T?%qjbihwk7vkVfJobTZOQ%N{Unj$beD~4wlaS19_BWMUeoy!DuQOSk8+Z$UlS2XO3 z={0VqtqduS+-eGK${~MQRZh@s4|57s&*P=iGKSlunLCTRB8J_(t(BK4ZIn+>q!*Ux zkCO>bc<4qrgSb<)IQCGJUky>)jdb%@$0=``IqS&2(>+N}T5^Jpp#42%CcsEgSDK|2 z;QEF!JzR9|S)w3ys{X|REMz%L4%$_#{hxnNJU`wnb+1_zOMz-y86(MBjQz@GOsLLe zo~pWwEb|Wgqp`{5quDsfQivd?I#7sMUuh4v>kfU3NkJUoaWv08NI zpMA6n^dP-Zl9abk3YCMwP=W6`Kett#M+7&b>biDV>UtnQ7(Mpx7j?CUqSKmjclzxr z!3gpjSq!OZCvl8|eJ9)79CW`I7*^<+a_p#4L2cJfG=``unXLqJO3fL?aor)RX5 zEjx9rakiIHa<5L-SS``{u2d;Nk3tj)AcGj^6P~pU0PMcV(nL(>aNF=!*Vz960ln4l zUHeRFO(UjnH9E53L#eb>QaaU5Gg1eb@)iP_NPtfLrY8nuw2EdmyQhr+= z0O)1ePRUW)b%%)R9Y5Yq;I zWqX#JJ*vlUq_bHqbT*4MJ85d3mX)Nm(31mTYN(k; z)s-0wR?uK2KOX})>x=Pk8oDWbj92bDk?-uRdKU>tkl(as$9&xZ_V-?N`zKG^+p$nG z@@U(V+j1pCCo$>wIOGqR>z&WU88aW|IJhhRHiwG<1_p-x68$k*s4EVXsR;on-MKLb zKKpt7@zia5q&LwQD?k-n6i-WDDpXrr&H0HU6xut)8h+B#%0B}Noq+ke- zR^gsOA_lplid&VQN#z@aA5W=n;H866bXW`W!AS$uqDcx&M1jUk!1*0c=ex37&3hFg zGU(l-l#a0C5b{=(oP_{EF|?d>JZ;4ELmWt33gz84HC61Ywd&e5R5wnK zTWXN6EEzMDh!7L%jwdIth`pALX}yBqUGk;Y-BWF*r38ZFg7A_SK^s6moRJxUJY%c| z*2`x-!)3b8s9P+B23t)VZJp^^{+aug843VM=V=qvfvRRWRrgDlJ#|u)QmUHwTR`$# zPnP2@k&u5d0gcKAC;tFUv9xVW>9*NFx>v;4bL_&HTDyaJWjjDpT&PoxmXW{!;0z=g znD(D--tkH}vRo7Uru={R+Rm2QtGU{>H4ufko3kxCheSd1RJq)JJAi{A4hJwt34Xy6 z{JYsXR=*q?68>r0?mvgV-(J+E2HmNnrwuyfh)D}b1aJXS5fCyk3T_9uSY}BZqRJh6 z;B&dFY+STXw$PLLz_V{EoC_WrV0*Cia9c9veG>r>@T-_7L;iwuW47Z3HR~ z$Iz#TGkm zF*|+9&mSE7^(*m3ZPi96u7zS}$`v(Kw3T7!nj|5$AUn4^cML>ClQEO=)>|DOTD9}t zd#(DrcA{G7DvcY|%_m?Er8se0at7lkAjhx(ff(yn!&@(g`vh2**I|8aDJ0Z5*lpCL zq!qYG^nfIuV~G>Q9=?&hy;e!xB~x4xQXOuxiEcKR0><@Z6q0uUGLs4lpbP zDND;v-4ukUyJ)(-1m$})^z7VOVJK-R0AUOD5>y5V0O#ZrB0403?bNZeo1zz9yRE$W z_tjDtsLd+r-jG|~4gpuR2pLc^CkGu1_Hs>?7z7SrnF_~^zTn!_>t0KaDX{X8L>z4? z7#WfM=d695%^N93PpXxP+5Gz532tenxm$0B8&1{jQV<#d%xCU1IRMH2sOxLmle};o zEkldjRU-cYQBUr|_?)HD7J(El$~$aboL1T}slh1AxAiwo;$R zv7Bd^pPqtbcCI))O*1GI^H9}ZJe0D%oPiN1k?))g;l3uE9(U-haq;Ys zH<^ZrPlkoi8k12v+jQYu*C;3oJ9gqHj1rzbhB~|HoF|PT9L%(bRPm!(`L*E^Ay+4N;6MvQ~=(t9^#ZQ_; zB#!2Hxi)_ix+Cz**-CD}3u~R%(#$1>78qjx0BENF0CiU6`c+oQm9qv0@wpk2Q_oDL zW0=}!RnB!B^DWZ2S|O%2R-9&nrHgIi$yUfhTtZN`pJb0{kWz8iJj#w%$Y1#&V3o|J zL;g5_M4KkHRpYu|7MZc>oBQf7UUY-uD7N1~P*?l9h$5Ne5fSC6?U?7FUnFicHYwa$ zjvWf*pTE8Yb(e27wQ97DhUMD6=hL|DO~XuFX?(g;k+@4~SlSYxq5<_bpcRqSZD#b3 zk5Cq%Jw}L#rpg1a#(b2SnMQtnC;j-zQ^xpk- zb$@A{w&*VD+^!n;MVf}`>Fsw4kN4YkF-kyPJ!6X6>JUP`4rIs@Bd@g$3Ot5gQTIw5 z(#Kd`0Co?*U83%7kGDPP?cMg%O=P^@yuYb+1q(y8w{I`XeG~k*JgTSLCpa16dRwUC z)GlG@2FfOyAzZ*95D1gTPyPDkc`dREX4ADVWmCC1nCNiAvP#0e=n7B*e}1-W4Xikj zg>M(pKxJphZ6nm8p%I_YRvaBSo{b@Soa3?wukIZi6pDHG*g{OGC=hm|{QLg^>G9L( zv_KteQwxf#Pt*s+zL~Ig>3S)oQr+(N$Hg-=-%`^~w8~*lJd&e;fRJQlNa@}r41ieb zn_=NevWT6V@6|1zPrQp&B?IXc@KaTHru8`h`DH-iL==>s43YEGcFt)Tk&J49Q`@)x zF>RGrM&GN{4Pt-93Qt=8(Vtg}B+M#y#6lKUj5(*{JhAK%-atUNwQc^@SXQ>meE zcy+q9TTiMf+kT1+I@Jj7TS!=073U>YFISnN%aHV4@;4U(q!f_z=(eTeC zBK?)0LV&ogPHes)HI1s8{<;_FsU1^cU&=~M5V_-zbmDRdgCI)Gr!~WM({Qm|06o)1 zbJp6D=*38`yVfm1NmBAs6n+#EBxJyX03>{Lhb8=-6BlBdLv7U6yz3>^RXVZiPxAo_ z2iSW=d-K8honerXzg0YNG;ZLP=xy~^3c7Zh+#Yd3w8J1JUjV4%pZbq(viCdar)E?! z8*=UI{{Rk;>BHSEE!-*(6#dHWn^s)|Pi<2cM{l%24^_Ujf*+-2#O@$ThfHM1A=_J9cTHP$ZiqUsE}eikJyO5) zp|O+u@H%s+=`v34RtxpTND)JDPWQ|g`7&1B*DkW z&s}Fm;LLVK&yi*S06Gh`@Xv?1&chj5fR{V9)eon-1+VX}kb2Q;Pj_^ky5V%VQ*9L# zO@zME2@n*q5CB)qNX&3z$>qkFG8dNb((MNhgE)DX2KpLC>5q3$x1%%#`JFp+c8ce7 zTg#++p+C(#m$@Z-pzcT@AB=GVF~t0I%{v>-m|Kaaj+gJhWzlp^FEd!k5QhNPjot0- zw{;u4J*Q5B)EbWAc6oOz?Zm5nQ`H6UEh2F?L)?BWqYD*MXozpI}gEi z+&>E@jxi(U1P;Jgbt2b7km72YdveJH`*~z0Cj@{XgP(ug^+GOl-Otn&ZRV?C?3EjR zra;_;ts`#eP?pjNR}m*M_%p}LEO01TLl|$VrMTrr_g!tRgs2pcF&k8~AC6)t=RFqb zd)m>Fa)HhN01M3>(G=fNT~gz1QXvP;SXl%>&glTh#DAWn`$2ZfEXb*~_1%9h-=$Mi zvZu{X8cyccqT)bl>a>ZcmV$|+%5m9H^HLB}u#jVFd4iDy{{Vm^js-&RQ zx&mrl*aRijZYc>ECm_y$>;&%Udn2NeuPrt@rGUDY#W8Q`mf4jhrLEfY(Gsc9+bK0Phyf(0 z%m^SHdmp%vRA=YhdtgJKQ2_d)kniMWG0%bs!LD%qoM8!|gdSjFa&le873O z-9qPvi%U#u%aserq<#99fL6kUIUpp&kpu|`20@ZJ&rHk5EtQzETuPF@7T0mT_>k>A zmFkC|6&LzepYtkZH6*-}L=r*ADOAi1XQY#~IBc55A?QlIu*PE;rm5I8A9 zfgv;V?=kO-Oj>#6vVv}+Y9F@)2j74TVMyCqoJs%4y?f&+(J}0OaKos z26F|+ga*YyHhBwj`PuH^>C`6ae$aaNPB*Z5tE#cor3psTK~j|7#7RNG_a-N)pNJ1d z9C@zngXykf-&h-6@kn(l2~$gFVvjx6_K3e$ei`F@Hs^QriW1++pWq4(5j||lW=_oH>kdMsrLRiCUOZ9 zCO}kj3F%%&3FuQ;vV~ou%55gX-F~r+NYjWc6?rQ{i<=KC0!c`fdqR2mC#*$;Ku-D+7|&7|PIq>@Nc84wO2{{UknsUe7gMH41icFHI_ zXSOT7J)_hMNny5bZ3==2z?meDc|`s`L=KVb5p(Rmz} zrXEK0`N>f9pb`!N;DTq}w9nILL-qgxu zQG5iQMC#nm>!Y}L7&Gka(sB_ zst}G{malDZl-Je0Lvs|&Rue9vP)gEBAiw~}9^C%`j+f=aM#s8!fg@klKQ?aNQB+h0 z?bVeOVbv_Q+i<4Rq6rd(NP`23KlSKbctkL} zYkOOz>m)qA1$bI$pOx)%`Gfp5_}(bqZ9KZ6H;$ z3PAgCQVes?R~N`Y0a3DME_JC%QQfUgY||~>tShwZI%HL)wYfx6^Ju5za`yWH>NB1( z?b2+&NiI`i#2hz78ZM&VYf(|#9bInIHy6XTkLl{VlB;EE*XrKVW>`@tloAY?9Uy+8 z6NziZl-5lt#eu+VpX~wS8jxyAeHE@P*9{e^md^hG;nyv@TsTbAJUtZ&3dG@1K`9*| z)NmT%ZR(?LF&zRY@6Uz)!1%b*PifBR=?WX7lG@WnaAPV)ft+!jE`KDT#9(yR2xR4S@n#Tkt zQaS0S2CUKpO43614V5)sycAPje4(T6R~=cSDeH)RWw71eh0*{c)Dm9XGqA#mK?F?o zZ_}L|qQZ%qtDCVZH1{XNp108{T|T;|r)h>;TXcGwotFh0OF=tZsvtsEK}JZC{{T*` zhXa&sRPEK;{fg;F^cL=oqgM7qy*-BRouZcaQ=_#j7wcD$fTcY_TTG^EU1-OxD0L05 zYL6trz?zP^j__=If1kQO7d67l>=Q{}DK$Qru;1uvKCYgsmA3+ZUHy}D7$_hq|@VAPbxH>R4PIFUZf0EITJ{i*||csYg_e=vPe%!ib!Pw{QyM)}xV zx~w|Fn&E1?twb|U6gSkVJSiCgN&Taf)s|gOnkiebFc~Jwu&p}VSNAhmr&(VOs{AKy zJvCDaEz-3=YDcv0B645}=w?n{ZCO9lSk`n_58DUm>Di!qv$r}^X)+vbhSdN}s~?i} zp^#JVI@20A%I;I~Q~DY`DmM4exE8B7W#}$iqN29u&8t(cjJOs9wJkFHs7VLidlCeX zaX&F*((qi#$>=C3@13+lGVrr?X6TyNn5zL4rx?ZXD)AePv1}X}cQcymeC@Dn1 zOKCGQRRaV`BdF!YcIVkil+hbYina^a=vVrhY0ler>$^7}4;6KKUsP06F-Rz{OjK4| zMMwN6t~Aa1saaT51xZQ?NLJYZj?&hOR2-fyV0nxk!s_Gnu>SzViP|p>KkVmvJYNeh zdOOnBmsde!NGh|~oa7ZDU;bgy{-yeU2T;v8RLxI_A1SEL%c#0)W@(vfnwgfVshdbb z8*Kq8LPjAVU=P6QRI?IkR*AjJ+W-vn)C&b+R49l9$5O`;E8tW{@dM(cPWGNU6W!Vq8HfM9(`~v748^CjFWXmHiMj*HmK~j+8h)=04tMW>LB5)7C zJyG=xn46INw@3qPt%?KR{OX6(+dHwFgvg0;KE}@d6WM;$8h=t#o4qC0;?3|q<(eg@ zb4h3e>lg$XN?}slmSguEWO-$wnfd;FzTE`iwbFK!c=4>KoWR3_MhLY3mxf69W#Xy**ZT2x7%BD zCHjX!Z8ILMNl}ks&r)eRY}r`?INP^>`BmN~)?vWIbdtJ_Y(4(~!-?TA5OIEkFr~ zASe3749cT!0U!WEED={~5$jq9Xm8bQDTf?oYg!u)g{C0w$be@U1W(W4On?AD$l86R z8fDTlmy5~?stOJ-)&|KXBu;%&4n&OS6k9`$B$85|N=X6)C=hXuB=xe;$9p$*y0ZN% zA5Xk4kSwZ5J4%NxD6E`GiRX@{jld48=^{L<^Hl9EnsMZkRD=BYPzs7a)(OP=SCjt$ zPko&?vep>uWw_lPJ8jcA7qR6er78|(=tvlWClFu`bMMgn)NK^`dn}7(m2XWx#HA@p zR+iFWCv*Y=etl69#O8V_q~Ee#F6U%{TF;YlvbNskGOCu6qS*nlna3tSKZ1GdS>IL> zIB{81ufes$PucuZc1q!SsiUM#HmSF`SbZfWY^C6$wJ4896Tvwc)tIBWAA^6O8O?Mn9^0sBG;yxSUVS3l!6xej3^*T2~haUpc(}Lhk=#9 zb(zoA%f;=IrJGiQ)mm$`T7Al4Ol_KO&rM9%lZXLZ6s4#Ev?!DB06^$zoZjkZ##|^Z zYCqMp$HHDqs_&+xxKcErRMmSll?ZVI{YhJUNf?pTEXfylveYo6MSiI_KH<|jL*h@u zw}rm^p-mRuthi}rXltJhll;L|OcJ1=n9d_VI5m^B3kz`F?QVbVAM}pyn(65Er-mN* z_;tA|n4+SyL~4^$PPb4002MT~DJ1YzP?P;5Cnv2u@b$Bz`Xa;nY<91`R!SPr0iHH{ zece0PoU-1E*A1snUYt^ZAuYPI|zu}`?R`%n> z7i{%6Y;_|KI*OWWqbh67A1tmsx0`@+l@L*x_7eS?x+q@bd#yL`DXn6$R=TuX>o)o- z8AK)A4^xOv34)+bC+2#Q*n!Pja}l~}Zhhd?`eNeMk5M$1!(dCOAf@g^fFsfl;UAJZ zt7SAs>j};*fPxc|rhB)h?lkT^@O`HfDsf3!^(O<>@}netkKd_b%LQ#IEjtwACaIbw zePsp4va*qK;u6XG!JV*Da9{%mfKSMlVm1&7QAaz0Hdp5LWnwDU&BmoAKWPpqt_(p6 zSF(QLG4B|hjWhzOsQ9wYCd*S&AL2AM_UCDzsHCWFr3{xKd7*QU^nsZJ=kXm^Gck$k znPO)E;lEXQz6(3kM|`8Uwo)mZNsyJO1R*5G)XW1Uen|uO>Z_ZILFljedXsrYm1pX& zqt%y7#qznfO<$6VCHamNrKF?7woR zbrh6p{vCg5v`J+sUeqmHNy-&Iqk;}1Bd9U*TIbVI++)FcI1FRwVQ)CG@gCtuuLwQ6 zZspqF5O+tZRH|wnFv%seZ!BKo;tbXVuv&p#PhPbA6?aaH==KLipDP% z_MSysLLNw%BpBE^nIryy%#MM}#j{AQJ2;9eZ}u}(TXiyNo2x1n;Ck3ngtXwmOcQ`( z22a1wRd5{~iscSydllRE4Z1pOYgE;=)U_09V{+7xHWQC;b0;VE$0T0#jLHBcIq@CJ zyblMOn$v1#r%$Epb;{7zIkXoo;wCs=%EMpqT4m!k{{8JE+yJdsp0E*;d!; zt5Z#Di%nmWx|@!dQZ09YlzLWPrz$k{l7W%63OF4{JGq)c>JvRWUFkC#TTEAKYtEs& z=$&z2s;ep8a+uNESxp`C*|h;_Q`VQDR3?9}nC37Hk=HoZG*`;vSmF=CbZskFWGo!b z<_mRw(br(NW!6i#cW<_}Y^Ij6@|PQ^wm-aWORcB}sg?+tASgf};ySCv27WXAx!=sw z-~9d6m!D6}Z!|3BBeI*_uv8T1ouj{N=N3QhkgrW8pl8U+|5yQ-^1*7&*&$mkQutD9M z6qU^_H0{EVUL=1{9}eCos$162S)c9CbsF{4YHJf|Vf8pNpQ~a#x}<~b;GCFHnd%H} zN?dnx+8ZNHWUb}`ilg5U-U|EY*o`?|ru(I)DZ8uM8rsh~=c=tVLF#WMDk?y%rcf?2 zM(vWROmMNsT?0qr@gNM7s;y<|lEiPaj^C!HlhR%vyjS-JS^Yx|=^a(0?=%+Vw1g&& zDQ(8q%94c021M@?Ke&#I)#MX4n0>!g+e^wdy6h9S*BV>CfVNjs)CziK`RXf33D|tq z6;1~Sa6NJzRiDjpR;Yn3LYfCrUGM$P?wV>Y%v~(@_UI{S(N2Pvo8FfkFr$U3K%kN_ z!0BTN8;#KpVI5GmlfG!4`;Av&)LK<`ZB1>cQ*Sd;#>d)D;u5G(|#;QWIvfTUw3Fr)gvwlQ|AJr73WKr)Z2|9K4_p zC|w&!!gO?0k?@t`XG!a;RU}?1+^T6Q^C?t(x0^8nCz3Lq+!61=C29Hf)i;zLis}1T zt1Wd@fu^fareaV@6ZXOX01$bD9~^ac#L5o|PDCyulbdVT_l+?5Zr5|FsixfGkkc(C zNlK3V2cWk<4`lMk5G3s=1YbT4_itex{;A z*>mcPP03c!WW?hG`_H)j`mfKX7dC)PIVjOghlu{-+t{MgI(>_=s5RBi)w-5Wex98{ z)skWa6eMTdj;7Ld!YsM8RDv7a1p~Z8+^qVawRU|ce!17uwkWD~1#;U~#fp`vxX4ry zGF(6+e;((jl12rT%NrD)ict6yw_Gg!r*m6Y-5*<*HxSAvcGR-M650x9J5N8E>c6SA zk~lSHW;7|CYE|yOzNWEPD&Hw#At`ZTD1$jj2j8TVi1dR{n3r*_9e2Qigkh{6u|_65jplJ z9Ur6f28&%?k7P{dD(ZhoFVVxk9xJu>jPEybbbZ6OorAVkHD0Tw;kC5w?4a*LDA*ts zqEZxAVKE0gk4-akBWp;#*FNIjC}0LC&i?=f{Sa)HIy)7T+hL?ru2IskigbCWaVSWD z59|l+)jKC6ew(f~97(jYl%)|nVtNJA6V+yxLPACeAD*=VWe?x=6{Aer>TdVTg*Cc? zp(=63KtF-*PvCTZ2AwWMf+&T!_6VFjDY7IHK+@+P!~EG+$8)@0+_h!i{cF+Af3uyv zwE}ByC15{Tw3sQ9KuRVsB%JlrF?dt#gUrY~kH9N_F9*umgi`L}tNTq|tNZ1vuJ=X{ zmuO4h{$TD%ToM2t6k@@P!qfE&e=^F*!^=!szdRs9f*q(#tcl^^s-CbNYw{$FB zrm#5eJq5kgw9`oeJAfdq#VQGpO2Ah*CNK%7aTl95XosUkAUJk9Q8xv-F`Tt`wT~Yi@&$S;uZJ99R^7z z8n#H=eqWz+)9@gu)7^LOb$U*`SsSi5hE$i(Xn;!4a!kju2cAdfI`iKU%v{1o$Kbso zfkf_YJiV)_)D@arPMu`aOa&eK2k!JKVkNiam<;R^?#dGc$Uy*(zz8TaC4<>Pnl7)ouC8@?0dPNs;by zJ^(TQ0Div3#(Zue-smkw?30zvZuFdL2a?l{wiM!&c9po5jF^GA;LoR?Kke0~87NY$ zWU~HCHA0?jEyou^ln78NDmzdH6r}z?KfguA3!HkW;s6R3xa0k2d{HaA9ptq3b5B;h z_MOuXELAOn0$r{kDM|PWKrkaDs$k&t**rbbKa^hT^?u9Eo;GnHWX*?g7&kqQ{5~G` zsFW!Pr1PCsLywWPt$UD|Ap4W*{;~l707!_EdR2!JXrgysP=)qwZQC6Vt>&6XmZubV zGD1Q;qls4R$&LG@jycHbh>^pgSe{ZVl}E1l+8;Hv7jxvPH3*k>pa5Wykdi<0lK|wI zo}-bZEV27<)iq4NPeiosd75P@X(2>}?=vKwv6PX{2jKJ2p{)Xf-L4?mDRPI)Qo$up zHRx?1kWeN`g?y5CL4lu+HXyAXARSV%N0hdU&$9AhsYHyZ5)x8I+!+}JjF5QeY()!IZf?jbg2MdiA?0~frU_-ldAOLcBBZJS} z#@6u)-@4mN#=TBcR?@gC6q4hz>Q+J9KiptJ0(~Hp^Sg~HNZOW5cE;1c{pB+YLxpPf z8HB;$DhzOB5AGwfR0WhM1W8T^X-}=9+a#p=o5H17m2JpO#}oa5BP?yGxqB?t4Yu28 zWkpIuSeGG60Kfr95C9}hVh7`up^tEeL8eX4l%ch$lIl>hg9&g5l>C?q1LG2M zdWozK*rTJiosrEGVe8WsZN6y(BqWfP5Q#VdK{5U~0F%>97&`?XT+SlZ#&|L9o{8

vaT&( zt937Mbw&GDYD%Tu^*zGi^=(yDsXk$Fm97N9Ze#!i1n@D`K6xb_9A%*h)-a|j9c72b zN*hvAg+?4ow!%=NWh0sY0KOxwBsIOMtgXP~zEx7HXxdtmR>^t6x65%RKH1=HkgR(E zbI>i6T@@jOo|~+fdSBu9M=f;jTP`lK08~+|DJqy$04 za8x*zAOJ!XsF8!rk|i!_f5Z6JA7jbLpi6}3brLV%MKFP_>(5!8O;+#aKNvDTVl z{i>L;+(Cr0bp zn^g*4Q#AFyV@pu-MM8YHaB)A9KoSQLGI};L*NZ4I%+e6Wfv(|bE7C5VyRW=ks%Vy% z4Kw0FR^iKF6yzMiGbb~Sg_}!b#=$zp)%g!qYu*+-Vd?!^Xtc+0ZZ_*CuzlaBsi&`a zB^4`DaI`IDLo!D)37)B%#*A1jF0;a%LmkmJrN?+YIcPWZzND~!3|&!9td=WPLHYagW3CwYOT0i z?3MHgVQnZXrIJq76vhZb_YNWqkWPA5lJ>qm_oe2oe+)8R_CQ*Xu#^Vc(h0F6avK_EQ)P4NWebc!A z01alYir(!jO7rR1SxrKT8+RB2B7WgA4nU5Ck02jSsH4Ms4>cyUSaxpJTUlY(`cBzR z{?<0|O4+GK(sl#os5pQWhYB{qK>)~^80%cTTWO^48ex0(LzMJd(KOV^?p3DYae0q9 zs(bA_p_}CyU)ad1Bg?B#sDRx{WP$e+$_cPZX$}dLIl+&%9g@w?pH}JJJ6Bn1uQmE< zw&|a(t7Wy#A{1b^TS=EFlpql53YsLyDIHgHFv~@?T5)pP;5pO(0NbrcbJdPqo<+M* zv2>+js#<%kB~R1bn@Av)A<##ffh78Zl2S8PdieNGm!2!Qfa4X?lhs=XDREboJmMi zYD&b!ZFX%S6$RFUJa!#`#8A9Oo8sx%Ioq|thtRb6T*t`u}5WesY|+E95^ z{{UlZ+(=T;1{EZH+q7)=xE8$KCGW#)O@UUYzPG5>gRs_`O$$W*#aAnX>ZpCDc7~|D z^{A;s`cgnosC$0>SG8I)yXco0WlcA(Pr&)F|^%(&In*3cA(>098eAL#Ns>)Ri@MFX^K+Y3dUUDQb|s09#NZ0+M6i2_K%S`BU>AVs}@j z!^yB&=qa@qZ!hiY9V=0DwLXOfG`2RRl253pPuqwj{Qm%$vGPk-#~hHYqr(sCLUg5N z4UfAt%AsulQhjr2C8hJUlmYy+kZ15`t9F^G(V|k>*;`i1_j^sw8No+*7#E;P9jU zCNh7&P8m6Hwv-sI>E^cGwOt!+CY4l)QT6$&R4HVWBWU}KDna~wbjByRoyDa&?PVKJ zrh?RW646EO<5N(Dq{E2xrLakXxRv z0`hk=M#v66q$`cqgwsnsPU0RV}Qat25QUv;pQg05S%-Lj+Y_iXe|jQ&MZZT9Avali_KmH;bIpJJj< zT=yqDnF$IB98SR(-*ujd?Zuj^@2Kwf+ie{%D{*ePlm^ohNhHK`o`H}_Dc@kDW-%pm z3;LD*q-yUY&i1>p`kuX=K7~5fea4ODp|z+$DB22S5J;Ik{yNrdwnExsvuWBvaprQ4 zy^;MV{7Uz;viDy90O-oS30nPCI^MKfYODOJ`=AMe5U|>tX=Df+)#@OEMDi7;S* zkU+tXn?EoyoUK9YTw^4_#Sc$)(M25%ExwkXf`XQohJ};{+GUgkHrfDyl%xOv9|NTl zWVyvri6^SvNq^pbbl6N#jr*SD{OhIkUep{FrttQZe7&4T?k3Bf z@aeVm9TX_>E!_kpfsz0Np1EfpYLdCEf+6>g z{r-!d@T=jHNit-wK>2n*_D`2^b!$Ev`yZ$DR+vk4y1MMjQr$x<2vZ<{R^p`MO0YO2 zqz(^DIFE>iji!Ra1kUNT*&CDap}0QiZW_`b#2T>^S%H^(hR`?40j{L`ZbF0lSGt!i zIe2qX(b3VreRi32-%#R8+z3gZFr*n#m8nzl9FBN|{wn74^HW{%BEKNJi##U45tcBy ztv!ML&g;bu{n>_SKp5+mQKM1Y-;&tbH(n$#!G zTZwI?gt$~0RI6y@DDfbie*JvOTV+CVy}!b+Uv8FqYhA+Qb*%a}QB1V0)vXPb`b_db zF%!vxJ~7jbNn3SEUTd2ZJzW&v&wXOdEKhK)-KZ$q^&B%MJule#-HXm))n{BF=_oXDMKTd>s zf&mJG0H0RUsNj+|@+8QDiu2%ylypextyo*_1SO@U1iX@jgqf0%)DO(@xP@eaJwp(1 zD1R)SyDhCxV_vh;cLjZ7De8j=eW^#NHWGL+NJ$9<5=cDeW2vPZ+SriMUDQvdZ|Fp@ zcY>G+9<9m*%5X;1{{T@WV3WW-2qGi8gPWUjm1&(rRKb$M5T^pv7T>LDND!oBg(^Zs zK<7UFNXzb}m7%l&323^uoplNgA;RLEQ=&mJl4Jr&36Tc_21IrDD86D=fu60`rzx9s zsZ6xv(8=7VTN_zKo(aa&?teTUdXcwENsaVM%qgEO4yEQ@Q2{{&g%;B@gPpj5C)kiA z41D&LhS4+@=%-VDL#Rx7Eo=*JB`W@%+)9renf~TJjkb4Fv;Zk(btz$OyqeDIB_nLiVN!m3{<#MoLZ<@uQdhHGzP)!x zxf(yWnlg&AL(2w|webk`|R?#Q!91or_MXN`Po2nNv?dVmMexsV+!=m*M zYP=NaTiLj1e$v}Ts^s+?CA+qzc%^lf1gTq3mSMlbxa9Q5PMyj^cN&@o6a$Va0Hw9^ zoWUF8Xv7HsXQ>G%WxtZzN#SJErm6SZrc^j_b8ffsco=ZLedDx+cGx+I42}~Mr4e1I236}VkKjuZK`teUrQ@= zA!ExT0?f%fv%o1BTfa2exuR#8rwsyOEpG= zSK3f&nR$)p(dV++X}~#y!8w{q2<4l*O&^gX^fZ2mY2xK^XS$_3CGx#3Thm;JTCPG3 zI@(d*<6AINNC06Hfrt8DiBhplvDnoLCE9~XCU=mbY-P9*=Sm|E~@R_ z*|x5&K9*9wt-KZKSuj)t40HZ}&qhG<0@d-3>fbyw_?EM3ds1|+uz9Hf{?JO=$#j*s%)aJoyRIEh}}(4mkWiWIY*gnT>fp%;1dee%^`S^Os7^)Dq$Q*|_oR6N`QFf%EWkvvJ{9;V9261I<3zBW{l zxGOC15#ye#UtP41hkpM6UKK^C7Npwkm&%nP2z{~!*6LQQg}_J(_Zwzl6V3JQEVSD~ z>Y4`Rl*h#U$)(t8}zZKr);h7=+`fbFskngx4B>O*vj)hd%FE`-7w@ ztJ}CFT^^@WwuOY2!hji)WZ+^r2lnZno1V})Z7s-yoRT^zYo$Aoy*))yq-g5iN-8Q= zGO4$G*Vk8l*8&M!?)KuJ7;$&>-5`iQHN>1nY5yqsa|ru zBz%CVCnqt-OtkGu&UhfD*_vwuRlVpdW#yZD;^|h3a+XVQoHUasHF<_~WfIoWZ&hEQ7bQZ*M)H zUXMD8@nop2b>AdxZMQ>i(v9I>TTYNlkW8z~RHqO`94eO?j}`}1;vB*{6`w@e=`8P6 zYCSVUXQHXAxTHT$%PMZ#^46WIN`VLXeOXWeLVTsF4mWg`Y&HW#Y>gSNAy3ZI>Mc8} z?TVyo)mdi0+vc9OlBuxOMJj~hNd%;%!68W{BxH3^)uViFuze+L*+b0~^Zx+uGJPkWL@V>vbDqxVw!zE06<7DuQ&9Im#J!fosv5PmbI}aH zUfQU_o|2RW0-eLsrLD%35O(v`y8|7Kk8bNOYn0>eS95gVX?s}Sns(&R`&{0g-A6?L zxZ;~=1Go$(RU)yR=-qRuVVW!tK~L= z)fyjH-DyP)0xpRR)hSB=ttd)KDM%SohF}o`?iLKDjCk#;O%F-ulW@2S*80NrueCM% zS8AK0sPKILK2ja~LX=6Zk*s{^G@jtr4<8J~_2wJ)r$_`y_)$N8F7Ms`TR01gZK^;#*AZ zm;@4nVIn}m>fNX7V)s@2ta4Pr*B`8Zg&NM&YA^O9S2m4JR@-#cAp#V^TEIJ!aS0ib zJaAykT)l0ayCreq8{IXXp#4$&GxqmPYkFHYp{2R&dz*>0*{NQHA1xF7*Jl8&WlkLA zZRvbk(@C{EutE8zlSuxe9h%YA6t>&GuWwRTQ`{-)YfBX2;(wZ5SZ@RnrH0Z+#t7%F zr`DTWtz*+Uij{rA{ds$VsA(Os_Gh#gCo1-NZB|@d4Yo`Xz&HXyGXP9}I;mx95rRuX zXw3@xs{HOBh%Xf$B~4vVc6I%IC6Q`FpTh0WDYimlXJ{f*&Icq67>=v6>TWv#je|*z zo0UC06@Hfe#P6MDk5g*fHAio|V8h9ER|?jMe!ZiWHp4OrkZ`qeJbUyvm|lHKJl#={ zx0StDS6#R5rjqSOk+kTo5o|@W$41a;w1P=g0qQ5@#!p*GlY0eAmF3RnDZ)x4o`WT6 zOVJ@e9bsi^RaLV~PW@F&?NZY;lH-mzpp>B?NhJFS9Q7+AB+~c;b=^Q7{{Z-_sin78 z=}yx)r!O@M`eaw8B$Z+SlR#|0TL*#v05?A#-F96E!-ujFlbf+U8{g)Cvg$aV98DHD z$j;ciqkE5u?ey#Jpig=A{V#3%ds@}j^5w%(KEPY+d1SclLX+uH3NoyN>iC{P>g|m9 zaSz0FU1P(Z78v;hB=i9GO#c9DFB*5Z{j9IE z1{agEH^hBjOv1<`-<3xW&zAK+cW>R??j6p>S#GzNYpE953VHR6?HuhX8%Mvfi8!ZC zBVO+@#B8}Uaq=5%4L9;CDEAx0YP-MPi}mWbRaq%~^2HS!>DXGQ8(?i5V>l^!5< z=C2pCCCJTe(R!n6YwDMzUe zgb(M8l@pKjgMw!q0(v*fAJU_36Yx?WPHIXD#@lTV2C39Yam2V`StoAUBP5PN-6P&e z_{iXC5+h*UKH7ilDd~_ARMkp;=};S`JOV%dO3x!0$?2vvE^xGyEzJdH)>^Yl_WuA* zUNv^7t*5hFs3})g`|EH7!ctUcoSlYwfED;19}Xed0Fq~FErvHdoxerK=Z~+|Be{Mh z^}W+W_Wt{H(Vd%RX<>xZsJ8ve6g_UZR1}0nkOoYJ5_bSCdTyF%IQ3j3iulRyl*Y$; zehLQmBgT(ap!XzD~7sqM(AnvzAOCIDaW2x zaE$sz=2C*(#Z zbYOw*md*)vlA|uG)5z1Bru%HGbLr(}OsOso7nG!& zsM=385U@5ot)RB5*mNPrlG!i`0Kps-{Mj(U`B)qN|&o3h-e0Sl%>Yo~K@KuQ@= zNdw+YKv%fN2e|jz#V?|6_O`9zN@1rQd7{cv7O0ge0uQ99lOxk5Cxh`lYtKfM@w)db zVyMuUUUr>TAtVI=l!YNG`-%#FQb<1h^|*EHw{aa-avT03M6wcGDe}Mz3X-K|JB(n+ zGZDwc9h}+=W}6`^Q&m(j+etzcwB@0^l@}bGW7;HRJbrqB6hx3V>~&g|wa&Xv60a>U zHn67>#B=R}n$i`stvm~Vx;U#L@8h)<$($wRH0YSwSq@_wqj|CzRsH9}(5(l?N z;?v#HeJdK#cCVN8y0qDQ8DsB9kNtOGcIT%1VQW(sI%gJ^(OIeL_p?IRAxbGy_mC$5 zn82Ifn%^v0=&M6U#eWDp{8F&#wa@|sgaM5TLHpuAJi zS6Ibma%~kRe6ZreUlWwUi8Jc|0Gn@L1Z$crs>uB^->X_0OLXN%TS<6=FiaqrnF?GV zlLwGGDll9swo6|qX;OEw-Vc0B_=WACdpoz;uG?Joc82ZUr5AlkQ%dV?Id5ZXl(Lkq zK)A3F;>uAZ1Ssc%b1_>O1?Gv^d{(Z?y@HLdIJRYgij@G;R@?|nsGZ)Bd679x#2#az zG9OeCxZ!-ID0;oBpQ%x4WCW-Q&e4tD`6Dm@&j*o7wL9hmWJJ;_Y0$M*wrc3fLJAb@ zEG!xHqaD7&bIATJ^}7&!!%A)M2Q%*gs7#0? z5)9znh`;pDBiRE!NpymhUFvr2$=7$*EwtcLFHqbz`Ke6o^VCzga0y97{zQqMnNC~* zAq|Zaw<{GwM z8?Q8KgzjpjHc4e(sT+o46V}zsu}dd&gR0cw@U`NSj^Rg7rZqe9PH9jWQ8IwC08)s+ zP=U0A9>+fJais(-vD7T7L#S0i%GFJ9Q>KVAl%XhWsM3`xL+z|i=t|;vIUd8NR)(5( zkeE$JqHWr)_fBlLF=)FqxudD48*@IHlfl{ngXsoNP6o-uY@&!-!U36AJf|F8G1`@<%sDAe$^3;8)n6M&bTf0SKlI))ZYs?OUf*8X*(-T ze??n$PMM~-+N-GU)>`^x)YDWq{KobyCu@i^g?{Ich@PpggvRR~75@MpCdk{R3ww#$ zx(BFhEEnr_MZi=SP_4m4EA5b#L~aowUx0H5qaw)WWfGKU;<<#7q3(*T*4`QQ%MPL1 z+T9xMN&{6PN(pTGPQ?I7+%xJN@&T0&g?vtl+|5wIAv+a(o*s3ck?x%}C4D_ecD34l zt*w=WmcavoIOIp*egWw0JeItG<)%Z8dU`3ZU@UMBm$y2-6v@o zpJ;*aJzH^M4I`By%$U&%TK4z2l=r*6Z3D}zp`&dmEqSmIrwM|A?YAZeBo1-a=S`Y` zYM|xfU9AtAnHgRd(rC87&>Dke@ zT}P@Fj>=zm8(dK6Z6$crRgSXTEHJeazheeH$Gi@y z5MpyW={JskdT8#cOT$*7r|u7a@A|sB^2N55s-LU6y81T?s!DZ*s$4vOG%^g%5TWzc zguFGJx7j;`5WHAX^TscJ^^bP@zjL;BnxFXHikZbS{lP63(6prH98_TKAOnMr3cBX{ z*EF+o$IvdL!`gIFLCo%@NpB0fO#xkAK|t zdEuN<93Z@Im1{5Ol!kO%qJFNO&D0(+yRA`d(z?y9NHkl{T32skt9bg2$INjtB7dew z0&+<`GSu;-nT4Sdqp{IDnaYM0Y^}9E^EV{8%ZX7)-Rel%VgUjG1vv!cBj2uPo2B`E zS3t$jWA;icEeTT6w+LE_eJh0mGGm!1F_G^%=cHK>(deE);rCMNJmny^kEc~&AQ0M! zT1@(2&fq~2fM=*-$SpRrE0@adEeqd*ife=Q52ned zu8ky>?WaKnK!MEjA~XJ@9B{%WxxErhoO9UO%k-zc>Q36! z>b(AWp z2yF=oN)k8;0|0(H5%O9@O`9uh3_;IP+WC1}qmH&{UnciocPmSF=G?0NM_$WS3J1uf zN`ZQzUco5j=iiQ=X<96q4yFY(5IN?Ws!zpdiOoxTX2ouDwcAFMcHr8ar>8r9pamF4 z?C&^}CI|KtCj$0~S!*8&zw0o1#`yoqx z#@9(u{YI?TWbDjN~3o8jj}-=@&wFJTyHm1npwebMPP?khZ_{II-OlRlwab* zUDDH3>CVqsYL;wvgb(5lGyed^sVM{nK>!5uW;svCR38%fxUwOE82i**Ps5-ex@F<7 z51f~sN>k99AE`f}3Nl%ZX4dV^tziHZ?P* zQF#ka^t{WdArhWJ1R2V5bAvpdmATYari1zm8*2>}aEZIPCotxwQ0)76hH#TQV8l3Pan0EH;bkRu#pndpphy`g4dAvgWwrG2ZW zpTE*H-Ah%p42M_cjmlaj8vq6fh*WzSkS0_vWGAgCSn41Y)PMsN^z9EOocWF@>{jng z5{>?lMhQF+ekAm*t|+2!b+U?oE$0id}6j6sBf(pLB@;h~(}(M_Pb;EgVJLw)!O$RJ8h&tTvKL!uOZej3_|>029VB2Oxno zZZ%~{Ab(-9RAmmSibma|U{t!2*>r-r0G#c}2kyrrK01^UYgu9=Vmhxi?lJUKQt}Wz zJCKx!DUG2joaCtd?vXJaWyM3zK(A$vmbJFoO-V=8DQMb-xN?#Ro-kAo#D4uoMGHjk zM=|PGn$@)8%Sfq9r~z9@Pp^_W2Pc_VxR7}3Eny{Lr+tyugt63I-ld_Y1iw>O8YoLi zd23k$0)1PFfxzecb!pPET2APE>Gmz9eg6QcBeb3uJSlig{XZ;qEZcQkv?sbf&ZlKx z%zEos2hh_xOdahql_(^DLX-*OIodfGTiby_A_JvJ9c-=p_{zYG1)?VbMs#21Y{6MXJA zm#)@U&fjRwJxHf1Ub|gtmFrrHN=m~?A!>yH5=k;gSBxztS4YbgT{+h4pc`J>@7uP; za~>ksT@0g_-nQzWAJntK-iG}vdr9JUm$Y5*)|x7Vx;loBPH6t$wRc;E{WydrRj*f1 zsnjLS$wJp2n38={t2G#;!(-Yk@{2u#y@%7S9l9vAY`L;>UdlYJJAA({(Q?gATJ1~Z zDYNEmAgx=7**@yd)PW<6K;tK>bdIyK>A2w5>v>PITc;GLSZ`uemB`3crAi`3M;VAG z^U-**5)_Y&xa^dgsBxtwZBnU7%1omLL;@5y8HB{{GZ^+g7Wj7fp&hcnU(jZm8ZW$l zBK%HWZpThodtusrNq(rfsUu}AQ?$ybVMvoIR`sd`PU#(MsAG>LMgHeBes+H#R9L&a znDz(sRNJSu9aUm(HPug>pOpL07f`hBb=3k^7JbGXGbD*PBRvzE;Z;bycL3WeA>6Nu zx@t?^VOe^S)ht09$xjIgj#K~xY)t-osb!mW1VA8_X@940>Dk@y)IVEVDW15}_PfKr zk*0d5TIyv?*zQ3`;rbzd z)7iU)&S!Nklvi4sit5$9bgWy&Ve$}D_&KR`^Y~%DAY??utY}EO_bH>tyIv~ zbv1OfRJM8|_9+@F^4VU%B>m$wG$ZdA5fP4ef3*vw~9}_v@YJHNdW$rDuQ_MEa_m zN%u!WQ);aXbhGOXJzRq2HEko_V`^5}3S97@LPr3DKetIa4^;K?HfHXi=Ww)zQYb1k zwy3nM+mzuXt)P^+sOJQP!647)5M*@4^7?3{lHk{<1i|*FUuxeA`t62Z^KN=FrDA8V(8N2Gpn5s}iE`I{wogNp{wGMEljhgoTaLyX3pEL+!H9++tOPAf}#~Zkp=ji-LUTu^DfKAJ1Z`uau_xpinGXizh;VBjk}fM@rPrIvnCy382-$6%85KX@)L zHAz`vMQz%Z0e3n>fKTFw%SMBW+7NP8Rw$f!t@{AC4JJ@>xQ`1S1RkHX3cDHQj4kz!EWC|!=7R& zTXbP>xaQS5M*e9-QPqu4*^?iL?swtQ=*4N_8VR zIe-a-`|;6vT91<*0;9&k^CSeWA2eRN)*4S!)avVf(P_L@I9#hz)#-go1gyHA2|JEB z$vn?h$hd+){;JmfF@`!FRLpAEp?pT#*KxF>lTUXcw1q!PwWNJn3XRR}Ba)fh7{rq> zT{3254bqX0_#JejrlZm~tqpKh1^$MmFC|3<(n#Dr{qumK6YW2al4^QUV|kh`)tgJy zn*RVv>Ja*Fl(iKOw!|ySPyi@IB0-q_#ANb4z3CGI)3{dH=(7I+1XA0|ZG@#ReKOEf zvk3K_q?v<)LXZCdEcDYA#_S+vhnVi9pKH6~<+b*0y2s6`r${22;DhDV(Ik7NNrezU zCLFuf*qwPT8?ddD6P=ooAv7g4;!66H(*={R&jf09DLq zo-<-FvGiDXRmh?{hXo`1UHXW3lT+KNsob_`D!QbA9i?%lGU7m=aTriMobquesM^xf ztk@hq9!RE|Qei$W`~LuOWldXXdv`@rg(RiMS}PnF22}z=W8)$K>dl9y`ISxz&x_#H z(;95!@F__iCj3+_my*3*V`kp@9+oMPg4%~06jTT@G6YQfW2PVZZrw$}9DEt_Kli5x z-~m%x!heIm7+y0f=&rigTIMF+u{=kD@GP&a~jacV*vNFTSmVD0<-(XB1Dq|*`^UzlZ1IF&&B$-t0!fdYR$Lm^{Y2uw_T!>Ts5Fx#}^p@!V2 zLgW_1zOoOxcSOkmgYg+NB0OhPly87lJF3*~XK3yH#-KG6cJ$jXNpVjyqxQM~057CS zBn2o0%!!_QYWIgWk~y$i4>LO`!=v@Sv+Q;KtvRV^swwPgbtnd=6p&OBnMA4p^sDVL z_dw|eRx8P%kHyu*4)xtB>!)kzbtRIP4n#$RqKo>Q`1X-g zjIC1IWnn&E(AY>mqE(#i5)ZUQ@z(Y1tCP;|ZPG=bxX!Z6O|@B8wn{*BNFgNTa6MM9$Oo#fKh(bVb-jm2T#afKSw&Oo3MH`WTmU6tnGi`x$RZeZZ5363U6>fxtp#L=Ze&X?4I>l~&^(@r;ROJIZm zcbJt4K}ix)0r|up2SN)WR&8Km#Jtc$Z-r8$%xwjv?DG`>paaI-r786DJQLJi4(lYX z`vpK@^3Zs&5P}jOc6Ou!3F835iOkO5nCO^gqQ2(X+Su+TAJpiYYNJlD{kFA94yiJH zwuWOQ#g{KgfL1|>Iqk*hy$4ffss5OjuC=7Bchqyy=^M6?bgSczgjo}xg8cIn%(eP&nm3jmrNN`C_yEuFqFtUl_LQ}rXa>T#By$j zYk9ZnYf6Hl*Hh)?FQrIqsR@mvBi;aJ>rqk#mvx2rSbY^>ME(5rl@ttl(D>o zl}Ps>59xu)CyX4Pr@?PIQOw>zuIu!7@aLzyz2cJ7s=JbdOW7{n+iJDmtE_coG~EpX zJivviLP>GJ(g4OugE;E-frwb%U@cd&GC_KY{w90beDNvb54(Ns)Mw4Q>McQ2b5m6c zlSfFULloeY;Vre~q7#4;Cp{B5<`hw3p-0kyhFMq&M%MswWD*s@5`J(d0mqO`yq{);(VHFoXVzTEe_v)z*LUv}`xMcD4>>7LK&3!iZ{1*Yez z*`@lc{d+4*Yn|mQQw{GRl@C&aa7gQ?x;P_&%$OGWl-;jz2g9HwpVe_(=00qmy$a+v z#gB<@^mw!H2C(lxezhHDpw~5TIE5$7ifemmTqd1_gAKBjf{>9Q@@7w5?^Dd?Yhh@n zx1b#d%jey6ofArCJ4=Aw)oMIbS0!s%X~xppR;8vF>s%Og)BMoDe~ zZK1_Blq|BM^J-F68GsT(kO}?AA}~GhUBM*_MS-=Y3reY!U2!fYb!h}jl2f=8nMx$b zxzEYO@Ct$Cnm|n5$qN4fyKuWlgul?wy}ie}HvLAq@7}Sb(Kf_w+*-0*RGNyVlLyjN zl7fCzGbaQ}{{S-~t?a?g^*ayI$!i_UWcM_vMf=OvO&M8nai;}cUz*|&pb1Q#0Qd*- zAQJ`*bS86$Em|rgZM5%xo?Zz1f#cJ}7Mbk6n0>81rkM)3>YYsb!*sfC&d`^tpI-og z2u$*#J`YvM;&(A|ALqeJTxz;2o$>klhxW%y_O6Tc)bJHboh9K9OocUfzEgmj&f;7f zKh3MES~6Hui7SHvL?&>Qr>A(@acA@A-Twff_8+jDtfjq<@8bgYLNov0%zDkJSqJzPX_$=e?x@Sb3oWWv{jYoNaf{wnmZaxYf4Q)bzqEv?;T$Y?jXM*VEXojtfqXpsGbh z?x3tR%guRe`&4)dQQbUX^p6+?(0$~PBy@Z@?d1om+H98;F=wZ})~2IdcS`$mw$`C5X%$ba>Fza*%vA^_c=ZhG2z#6rha1W*^0!1t5I^#!uh_Kna@)S`*EOH7Jk3UN`nMGd6-)OMLC zxzfux5UAv7Ks^gZ8KUM}6v)YO%4Ti$cbQn#s2)hRxr+82pQRBs|e zfGNkiR~~h2j}5Vkt<|ehc5_AEDc#o>8`Z+=LeOfZs#2^n@=Sye>DeQKC)3npM-TOo ziHj(((^ju_bq1HNv@22HG{sJ_zA)04WU;aXu2d){QiLbm;O97x+oNOB%gAFzm99pm zU z2_t!p;DS1Xvbkt^Y>|zUG6+4vu%R3yEnBDgR|p`ddXf*WaR>4H4uglC9#ldys`KH?1g1gJL>}+< zD_HiP@le%!72m=_(pXwONd^xXGl&>J<_}d(dqCu;GopKS1as61L_D_`#3zN4HhRHdq>}| z-WR*TtuuXaQ`zqbv^th+JzkZNNe!UMha3Pa+n%g0ra@ZPvNtXS?Lv7{uy8tS zrs;CzNF$B5f6e|%Yhc;5SwFcg;5%;)MKm+X{ zPxTIZ>wGuDF}6mTh5O%6lIVO1!XqzHjgvQ-m$)NukyZZyr@O0l?gw)3dT&ml4BAr( ztEiQNr*~u-18VSOf<1&!T`xB*F`S^UP;q{t9v%>hn;n3zz;qu(;`blCnnSgked|p# z%+)nS%EIWWoh9d#1`-p3p}A2a2RZlZq;+5)vPZ*s-cwFPlzzGQzPm+scK6-O>IJh= zT@qQbTU<#CY&cX9NI!u)z5wY@5OFJU@r>e;hudF{oIabW#B{X2bCJXF+F z-fndl8>Z^lAAMCd4iv1Z<*0>9fR0rLagZi@@z%2=@+NeWo@Wzeo~3#tO@WX?*y9w? zHUqHsMU)n#eN92ArEoCXk^)I1BxWKf0D44mGm$mij8=oNPqCiDi>;K1MEOc3Dq2>g zM$L)!D9#Kh$m5cJBcKdLqhO|gDm$}LGWwcwqk2>m>T$ufK$tPij|{y z*oPEWR78@JJw*MW?#!qU&rI-L%qWDSP+PJ??muYlTI#`8(WgkR2;PUl5?eU~Cm(1t zkdmSV5!2Z)!C@gG$$hve0b#pqPSRc6HLX^r-lUbOx`xVf54Z$Q(K*KgBaW$$#blq$ zJ2|($`=^+>a^pMA2HJajDdnJhkzm(UETP{$tC4LfC|JpGphzVnAj#w8%n~{Y-^vzu zS61gYA)d%@xw<{OmAUn`Yo={ZAzP3L8{lvODFBa5jtKV|Jr{|T*(}mcm552Os;9W7 zr$|&)haRXyC~YLH0f3)M$EptC3H`vI!Ls1twc9GrV;t23`}eFV^#+%%wbd=RT0(rr zR^c?fe@lF zAZ}Iw_996gbzL4Jdao*R9EX~es_lPi4Y`J{m)cWQ>YGx^-auMFDa=U#K`DVUL027g z%|0$b3g#Jh>#(8{l)ylBz>I__1UaxMC?xtOc8%Lrw;b^XI;lcvRVw8D?IWw{TC5E{ zNR{nnVQ9)x24n~-&j~UF5;}%ZEq#tj7QV4laDs<-Xs30i`ZvJ&7vhy&1m z*&Fvk2lvldEm%1XyFC_-WeYz+P}nr-U^ub03QDs$DmfqloR~ZkXRNt}ZLt;(#eG#p zOH{?B)-8LGgXK7+1t{=To(2RH8Oo&Rp`*q;%2NpeYk^PaAq%#yo~5-Z#W;{e$N=Iq zI}fECXXm28t<;Py4HgouIzeWoRL;Ll@`lwRNn33O!mvzz-rnQ!@N^)p<7jZOy|UG9 zEns+kB}x|95~Qg4sZczpa3sJZ1fC`c>s~^o0=`RH?!z?bYUfCOX%eNMP%>gd!RA5Z zl0fI7-p5s1V`8i&ts6{k^((3(tqDp_!nHx)I0UPYNhALN<$^kWqT+&g31)1*l0xXF zr6a+g=^0UI4b)ou!{RRK%G6tsy(XB$VxtMs|^&VOL$Wf4@rG2Q}PDwmS zpTIo^=TKY3!E0GAZ(4m0ytOq16pSbzVoo_GKM-Pb^9el>PuLn(8TxAYJf!if;)752 z^HbhNo$Xb=jr;bnxuNL#8zmwOj;J`SCBl6HM1Nnm9a%J(C>OY2u=ga;8+=t$Th9@+ zG#%GTnq$JR=zHUTLU+5i{th)?dOK0w4LhVRcNE-FbhsklP}M7PUa4*6t%ulBf~;pYEx!w-!mSn6=*;qJ5VXo7>n{@@bTmrV`>6 zwkH@eeTX4hgD0w%Lp^4`E2QEN<%O?M^((@w%5Tit>6HLfOo>qhOaMUqXO4Q;%I-oX zjRSPCLbp*$q&AgP?P(=Q+6q<)2_TL*AmA7|GtWmt1ywEIF+B1Llr_M^9! z)ZKkHF)h2g&kQ2`V!_Pr!@-{{~as5R81JXZ2eyS|EtcLp!`BZj}&-Vkp z8vg*ceUt62hPPI0>-}3acKQYx-d}K-1g1&aljsT1?ib8{OdY}S#oxvv+u-3j__ zcz1jB!SMO0s4Kie-oBRO-ra3(P)DCoQ@mMPaWnjeWR;{DB_JQUT}gr(Jxh1HdQ>m1 zwT%vjwK&rXZmzJQAxk@g-8;C0keH8rADPG6uAl>Hsu=Nw*a{$3R5^RNR94o4OOjfE zPxl01lkNHIo@Gwwnosed-8MS}ENRA(RyqC=ddgP)^WPgX~~_#2Q!~KzjUNgLM~S2B2xV(6iP_{ z08iXK!JK5pM~QKPZH3UdW?D3Rs88RH#tjWoN2&CkSh#2l!i)CG_$q7&2gy?SN|TU5 zGl`FL%pZn2g?V#NVY+NPU#3D9qCs=4NsYR(T@2{j<6kA~#1xNfwM4d-Hw8Sz?|w*9ppXO!nIze?{bU*iRx)&O4S=pa%}v?P z$>_>WVRNjtYn^ho3sjCi+B~#6kpNM#l(Q2OpHYE4L40*qv{)z!H1c*(gSj3cF8#x- zb*qhKEmg*;r%&+Ks#KIxHkDydsCrVEP#F2oz#dHC@$*Mx>E*i+i~9-TX8m{6>((01 zqP6`#<8sQv3PpQL22u{`NtcsQP` zSR7IIY>_D34#~!`!viZ6z)fF&i0H2~xtO!Cq{AuJLg}LRuAGkf&A# z@29x7pZKhm3_2xAnI8trt~(D=j80Fd{nhGe_HgbO8oZ+N^Y_jgiuYrc9ivqbj-(&04}l}!@eN-`5sPVWw~pd>6{$r$U9YdS07bshdb z>(D$c#F1vj&cpKwp=G8VSye;nM%X@-fCsVsN7?{C_8nES31|S7b7R`-qQ5zCRUJcB zO%j^5xE>EQyn_;*fO~p)o<#h0J_dW^eUhY-INT_!BkUK6tv9Xhw7sbB+J3T~O@=6L zZnRXkCLs<9ox6nocIVu6)3iR zS}kc0{{Xu~r70qJBPSU?{={%cL~HyCSWNi4$JV{9UteV=hsHt75oI4&zrXybxu)sv zw}+Tzi*vOuIm%Z61x_Rk6CnHJh{s&_8%&aC@}QLwX~LqIDB>{o*Qajzbs zxL>W6cAE)!6$P`fhRlu9K>q+%XXY>@_1AcJfc&%1n%%vZIpQuhW7}BA>bfiNY5G`S zyM)andTQEq#*zsiQ+=&ufZ<30rJzK(PU3li`Hro*+MXs1CN_Nn<~iA~mBqx_E3SPV zVLD4m>8&g)Ub%k{p<;wSr0p)Hv;=}j><3(PKPWm!Ja;HT&D^4ZnIS|DmAT~gTZQif ztryE0lu02aC#hqMmGZ9-8o#K2X?!5sDQK%ybzZ-(3QY~ZooU+HAJ*!p07(A;<~nZ{ z2w)D7P*%Dgs(%PT_=^;3R?x2}s;Y!~k-&@4ZBaCqRKtFAMV-O5Y*8n4r*cw+ zkGs$eC#uvLE+txE#YK#^kn7DVnbuxPx5TL^E8mT(JjQ1@u<|p-vH-%A5FYL!daCnskM!DjbrdA!+v${{Vg)J4|G)_CQGD z!A>0&aO=L(YQD;9L|fUbd+8RG8funQ5RnQKl*lO)o=l&>>z`{Hd{MZzV@xULn>@{L zG&D#E^GWwP`;|M^T}s7cq$W$n*(FH|Qe4_#Z5yHnV0)gc*!Zr-cQH27Y#sLnSn;!) zl0y#89Y)=I?xIhL`yB;Ex}xVs$!XO#y{Zwnd~G>U9+{Dhk_=`#=o%JlWHdS@8vYZb zh`4oBAKV(sgxoHT*0|#-ONc;iL`f-J%AlEoR%4$~5NEE7iqPUauR8H8(jH(GWp38< z`liyQHieZfTT`&8EERE`q$KW4!3Ig@XRC&X_rP2~Tf}u0VYX|DRV^!Y^vyE=0G2lr zuz*sKQbYm{0#kwvfC&KSuAvLt$Qw(X=101%Q&OhXrxj9$>%5gP>Xeq-3EF~IpeJ&D zWkYc!5d$-hei(l8r91}pNo!lpR)=Yl+iMLRHcC>W*(xBaNFePSL5bo=Jx6=3p?1kD z%q^`7E>nalXj&U>F|=+{w-v-GSmTHZm?Nn{u84_b<`fa#9c#Z$O;ok1*D2IeP*nwM z0b&W9jL1H~#O8V^FwiM5$RMVUs}%#hd^?q zB>G!YK!t|UjNpmDADs0cH)WFWC=t5Ubqj4@RYzLNnDwO%sXJDskQ8JHkGSGF$0VMl zWp_jLb%M93DlRHlmi;r1He5tv3RU*1X9>hAM32n%8-s4?6xqe8!{DdGrT4@qe0x#Y zy)8uIubQg-&AqM7dXj~@Jk`2LNeMzXD1!i`86z=q(4q|-@8}ZT=?QHDtRMA_?^+2-9YK52`S~yxATj=zq0l!r#gwomEQq4n+IDn-9;8M~Ql#rDG4h;2c zc2C)z6Q0spX2=B5uT9s?{tKJy4|CpmTmfwwByNkfhlagZ`YV2!{w=9H)vJ4UzZSja zdYeJ%rYv_*`?U5m2Ccz_r~ulXN{nEsAd@4hr_W|n+vQn}mPw)kBv1mtCbvG_6c|wR z5a(5z_WAZ)rM}7#mO@g5HL*c$A4y6F0Z?-UMtzmfw^jMY?*H56^Tv+s!a(>D2s`Iq{3%-Am%H#;1t?01!HgshWgeH6>lfkpdoViZ;P& zk%WmdlrqauC*1zP%vhNWVkUGOD2$|oEBdQ9?bDib^q%m$V(~kut1MOCKKqkxbse>~ zRJNC0(E5GE>|N2;y_|FsQVigT{=SY8u-GUVvbWt(wyD(`in_l40I&7s+M@TW?(e;D zxK~y>S5Z>ygsE<=Nnf7!nrIr7DM4+d+08lP<4K4Q) z;{+(3;5fKR1t5Epa!3Xv->Vj#I4Uf#K(%2S9<1MJZS`WQ));+0Wj~bx$RzqeCNgIu zf}U_Xw8bZ2lo4*-6zX~tdbLzNZSs)q8HS!Rk2FlE0wQ*dgyfO^q~9o!Yca?Gq!Dh@ zZ__9_b7Gta_Z0b{LWKI;B|L%&5MadOMgz;m^H^9qruuGYmmqLbMb8M9jWcS}9kJFm z@4eXW=Q1u9Dvv5vrY`D4r3qQUK~YLXjtJm@M>EgGG0Iw3dBVXnVzyTGAy)3S@Vk2K zJ?~W8wf#D6?^;|wmjY&~F)b;*z)Dt>f}h=Ao~Rn+FKoQ2){}_C7c;uu6&|$u4Q=j? z#gz)h)dv)!qDm4@P676kM0<$I={_4te(8=;Z!aiUU8TH9-+Vt>^u@LNr|~T~u!cT~ z;v5MC4_GJOXCE=i$5&iv0B9vtC4jm6D-hEi&F$}e^vl*-s=5cRs$m}|%YP$SuOouj1*Ky|FhPV6Oep&rEY zJ^EPr9U1pgzZ^Iy)l=fTxZ1(i9jm?FZFSToX$@9XZheLdyhIR2UUKJn1US0MC5 zN2j!!Rv+Lx$*gsjrB&lx`L&uRp~X7}xdBB+Axi-I(I8|PfI4%5s)A^vU!=5+mqL1H zUTDf{J57$qb8Ri8DYTu%Qldd2Koh|}!vJTiHa=qrQGcembV)tr@j2U0&uMFpsMh!D z8VXuwTzLa{N1Ko^k%=d0k8{&Gat9@a8-N~%bzFCTpuRsfhl_n=iVm<0IM#Uh6O6FrZlLiar%cFs8NBmCP%h+A5bLzbDlCf zravotD%8lwEh%T<-^PCcxIjn0c>EamTFKo`(P~PIP1%Q#Dru6qV!4n+w(2Gnk^#h? zCxO+2NY|f^Y;HS`byVU$7K=6?E#i-2I~Ck5w)xdA|WWmhA%^B)DwEO(OWx;aBeulHaqXpd& z9iD;bDrneklH$t1LeL4?u`vQYj~?<2a~%Eouq`2+!UEv4|Kx_gFCS zF^POEYf0LGQ$moA+&+QQUngU zc1CNQ;^J)kqZ-|*C~QJvW1xw?t6&$^tS7I4SxGmG)wacNsk&XN(M3kmRJADNz!G2# zsKDT7qw#QEA)&cZNboi)p!<>fi_-TRuT|LlNlSOJXj@aRQ`g_BSuML*v`+Li*@A}S z`j0d1)$d8+_Ox?KnqXmhq*CP<#YcQ@z9DEYr0)^ zZ>F-;JgS zwp|OuE*LnBeDaT5{{Rp@xA!}!?`EMDDS5>uEv+fq;Bb0C189YCAejT_Be~e20GG9=}HMF zbB&axM^4)=Aq8$OtztI3c9_5+3KN{kOaf$l^Pnc#$07(ErkR#^~ zv1fN=B$3)l)*3R`+zS)*H!5Zss%!-?=iTK33`|O(%6L4<#~mr+EH_OF+jTylljTSQ zx+;V3R)f~Pzq%}2%^fu(3JP_%WH#awpaZDg5J(Gw{%|DnH}L?|{{WYgEw1TZz3=y~ zot4GBG;>d#ifPT>z5TwwuXKdf^1<9|Yg$WFJeF3vbh5*c;M%zW?@I6tEP`|SKHWOO zm6zsYI2L>j{s-A_E?^AuazPI64&Rsj(y6Z#9t-=Crfv`F-5Wz+t1PQ^%u^^A8bDA~ zB})5(Ou}&zPdMuJrSVukmv#DA>JQ|(rx0*ArOs#F{{Zs8(v?(dCEoP)a^1X8y=ip2%$wZ#Of^(iS@5)g+}vQp9k1P#~{lAMFd{==cF866VVn=VxYPT$hD(p03Nq2#2c zYx|@m9!gSUh@LYiV**l{AuT9FR8p})Sj%mpFT;fa#3#!F4$yE(D#;K>Bq#wAaXvX| zF6^Ynl=MSsxz!fwexk0a6%v#Dv`Utwl|V=!m0={0X#zd^9icLgU4@0MQF?g!>v>Ep zd0}Z&i~d*yKo}4J1elIf@5T7fT8Tacv`%;hq zdm?*94PAX&5bZ&zOHMYon+bwuLU!UeK_`P8h>7ZaTyrC;mXgy&o~x*@(j!eU7SCa-|UMR;;+SGM?^8k4sFDwO7WeV80RJH9$8Q{UkKGDJHmYI*{ zNCE><%JQNmb;JJv;iL3A@E292JU4i;*S;Zb-YY5WR2L0be$uy_gDp_h)wCTHvr4d( z?LkkZB}9aRNuHf!=jWS#FCb-_=H|0q>}|hgK%XBQAP+Z~lijsnB}6}|)qjP$j}SJ5 zcslQ2ce~};@nxoY7cFOBQ&m$#ShcNAQ=!L@mkL6BwPzzE-1Q!Ir!%7lU^)H-k>B5b zipinrERXJ8e0uZ>x;~AXmK9XBnsVAyf~ORfw<8f8D3Jj0WP4=wS2J&F?#k-E(m4MB z)+IF!)xM&T+hJe)O{p>o0txkFfCOjUW6U2S^O7Y+0GLorQ9^v;9_B&amDqn!(bndJ)`r1%ASM%x& z@C`iY-aL>b$%+HfpuGN#{L-nVb7OqX?@b@6T-n>I#fH$``lvT>amA!ViyzI8u_AJ0 zg##Z7iS|B6a=ehDCB`~Lo!;+OzVGI{yZ3jvHO;2r>kLp^*)B_TG_>som|=v>B?&@G zKpdY|2|YyovqS>1kBZ)H)Gh9|v-A%XPTOzoT#L$3TGox~An!>d1QUz^IUICGp5n)E*%gr( zEv04snY{gV1x>Z;(97d$*m)kLq!oWK!8rs#CJsQysXbos{bGz4AtPsPVyYdv+?-9OvA#bPQyfLxfYwmcsST^&4xsW=g|5~$`% z&+pX>i*X1ok-gWUJT=zaByPrkVX}O?mD)Qm>T}`0SJ?Y+d1bE>J*}o8bgOVStw}-> zeE^TXHY6oS?Oq2YbUYXl=3)RqE=x82MqDh{7Q4~)T1~8>{Pt*D{)g!S#1pv!kY_uE}QL%}t?rNlR+5r2 zfT#p~{`zU!nRB}Apv}^DBq{NuJXv4uE4OJL?j_r$xw?I{m#SoyDM%k_cme|QoPiPo zhqp|1IQgUIX;sFbE!?h0nuD`?GrBhPYOOgg+yAtTNslpKBd%6Sq&jCEF& zIBZeT@)9XG`ggQ?*F;r5{(;qcr%a=I5{hbCg@(Z-9h(V+!A?eEN%lQr3Cm8!HI5NN zlfurh@dcr@#rslJ>noc!`Wi>-opr|2k_VPZGG<92jiZAEL%QzMZ {rL*Uz_|st1Og!PBxH5l_y<AGf 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 XLcetd5J%5A>a{rm#?e@fC4c|fHsX3p literal 0 HcmV?d00001 diff --git a/tests/test_datasets/test_mscoco_dataset.py b/tests/test_datasets/test_mscoco_dataset.py new file mode 100644 index 0000000000..5ebc1a7b01 --- /dev/null +++ b/tests/test_datasets/test_mscoco_dataset.py @@ -0,0 +1,31 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os +from pathlib import Path + +from mmedit.datasets import MSCoCoDataset + + +class TestMSCoCoDatasets: + + @classmethod + def setup_class(cls): + cls.data_root = Path(__file__).parent.parent / 'data' / 'coco' + + def test_mscoco(self): + + # test basic usage + dataset = MSCoCoDataset(data_root=self.data_root, pipeline=[]) + assert dataset[0] == dict( + gt_label='a good meal', + img_path=os.path.join(self.data_root, 'train2014', + 'COCO_train2014_000000000009.jpg'), + sample_idx=0) + + # test with different phase + dataset = MSCoCoDataset( + data_root=self.data_root, phase='val', pipeline=[]) + assert dataset[0] == dict( + gt_label='a pair of slippers', + img_path=os.path.join(self.data_root, 'val2014', + 'COCO_val2014_000000000042.jpg'), + sample_idx=0) From b8397d326a3240435f8aa5dbfa441133d2a66cae Mon Sep 17 00:00:00 2001 From: Yanhong Zeng Date: Wed, 14 Dec 2022 14:17:42 +0800 Subject: [PATCH 16/44] [Doc] improve Chinese documents (#1532) * refactor doctreee * refactor doctree * update zh-cn * update model zoo * fix invalid link * add caption for faq and changelog --- README_zh-CN.md | 8 +- docs/en/.dev_scripts/update_dataset_zoo.py | 2 +- docs/en/.dev_scripts/update_model_zoo.py | 36 +- docs/en/get_started/install.md | 1 - docs/en/index.rst | 5 +- docs/en/user_guides/deploy.md | 2 +- docs/en/user_guides/metrics.md | 2 +- docs/en/user_guides/useful_tools.md | 2 +- docs/en/user_guides/visualization.md | 2 +- docs/zh_cn/.dev_scripts/update_dataset_zoo.py | 51 + docs/zh_cn/.dev_scripts/update_model_zoo.py | 194 ++++ docs/zh_cn/.gitignore | 2 + docs/zh_cn/Makefile | 3 + docs/zh_cn/advanced_guides/data_flow.md | 1 + .../advanced_guides/data_preprocessor.md | 1 + docs/zh_cn/advanced_guides/evaluator.md | 1 + docs/zh_cn/advanced_guides/index.rst | 7 - docs/zh_cn/advanced_guides/structures.md | 1 + docs/zh_cn/api.rst | 99 -- docs/zh_cn/{notes => }/changelog.md | 0 docs/zh_cn/community/contributing.md | 875 ++++++++++++++++++ docs/zh_cn/{notes => community}/projects.md | 0 docs/zh_cn/conf.py | 49 +- docs/zh_cn/config.md | 23 - docs/zh_cn/demo.md | 237 ----- docs/zh_cn/{notes => }/faq.md | 0 docs/zh_cn/get_started.md | 1 - docs/zh_cn/{ => get_started}/install.md | 2 + docs/zh_cn/{ => get_started}/overview.md | 0 docs/zh_cn/{ => get_started}/quick_run.md | 4 +- .../{advanced_guides => howto}/dataset.md | 0 .../{advanced_guides => howto}/losses.md | 0 .../customize_models.md => howto/models.md} | 0 .../{advanced_guides => howto}/transforms.md | 0 docs/zh_cn/index.rst | 111 ++- docs/zh_cn/merge_docs.sh | 38 - docs/zh_cn/migration.md | 1 - docs/zh_cn/migration/amp.md | 1 + docs/zh_cn/migration/data.md | 1 + docs/zh_cn/migration/distributed_train.md | 1 + docs/zh_cn/migration/eval_test.md | 1 + docs/zh_cn/migration/models.md | 1 + docs/zh_cn/migration/optimizers.md | 1 + docs/zh_cn/migration/overview.md | 1 + docs/zh_cn/migration/runtime.md | 1 + docs/zh_cn/migration/schedule.md | 1 + docs/zh_cn/migration/visualization.md | 1 + docs/zh_cn/model_zoo.md | 1 - docs/zh_cn/notes.md | 3 - docs/zh_cn/notes/contribution_guide.md | 1 - docs/zh_cn/tools_scripts.md | 351 ------- docs/zh_cn/user_guides/config.md | 676 +++++++++++++- .../user_guides/configs/config_generation.md | 164 ---- .../user_guides/configs/config_inpainting.md | 155 ---- .../user_guides/configs/config_matting.md | 167 ---- .../user_guides/configs/config_restoration.md | 162 ---- docs/zh_cn/user_guides/dataset_prepare.md | 1 + .../user_guides/datasets/dataset_prepare.md | 1 - docs/zh_cn/user_guides/deploy.md | 1 + docs/zh_cn/user_guides/inference.md | 238 ++++- docs/zh_cn/user_guides/metrics.md | 1 + docs/zh_cn/user_guides/train_test.md | 2 +- docs/zh_cn/user_guides/useful_tools.md | 352 ++++++- docs/zh_cn/user_guides/visualization.md | 2 +- 64 files changed, 2578 insertions(+), 1471 deletions(-) create mode 100644 docs/zh_cn/.dev_scripts/update_dataset_zoo.py create mode 100755 docs/zh_cn/.dev_scripts/update_model_zoo.py create mode 100644 docs/zh_cn/.gitignore create mode 100644 docs/zh_cn/advanced_guides/data_flow.md create mode 100644 docs/zh_cn/advanced_guides/data_preprocessor.md create mode 100644 docs/zh_cn/advanced_guides/evaluator.md delete mode 100644 docs/zh_cn/advanced_guides/index.rst create mode 100644 docs/zh_cn/advanced_guides/structures.md delete mode 100644 docs/zh_cn/api.rst rename docs/zh_cn/{notes => }/changelog.md (100%) create mode 100644 docs/zh_cn/community/contributing.md rename docs/zh_cn/{notes => community}/projects.md (100%) delete mode 100644 docs/zh_cn/config.md delete mode 100644 docs/zh_cn/demo.md rename docs/zh_cn/{notes => }/faq.md (100%) delete mode 100644 docs/zh_cn/get_started.md rename docs/zh_cn/{ => get_started}/install.md (99%) rename docs/zh_cn/{ => get_started}/overview.md (100%) rename docs/zh_cn/{ => get_started}/quick_run.md (98%) rename docs/zh_cn/{advanced_guides => howto}/dataset.md (100%) rename docs/zh_cn/{advanced_guides => howto}/losses.md (100%) rename docs/zh_cn/{advanced_guides/models/customize_models.md => howto/models.md} (100%) rename docs/zh_cn/{advanced_guides => howto}/transforms.md (100%) delete mode 100755 docs/zh_cn/merge_docs.sh delete mode 100644 docs/zh_cn/migration.md create mode 100644 docs/zh_cn/migration/amp.md create mode 100644 docs/zh_cn/migration/data.md create mode 100644 docs/zh_cn/migration/distributed_train.md create mode 100644 docs/zh_cn/migration/eval_test.md create mode 100644 docs/zh_cn/migration/models.md create mode 100644 docs/zh_cn/migration/optimizers.md create mode 100644 docs/zh_cn/migration/overview.md create mode 100644 docs/zh_cn/migration/runtime.md create mode 100644 docs/zh_cn/migration/schedule.md create mode 100644 docs/zh_cn/migration/visualization.md delete mode 100644 docs/zh_cn/model_zoo.md delete mode 100644 docs/zh_cn/notes.md delete mode 100644 docs/zh_cn/notes/contribution_guide.md delete mode 100644 docs/zh_cn/tools_scripts.md delete mode 100644 docs/zh_cn/user_guides/configs/config_generation.md delete mode 100644 docs/zh_cn/user_guides/configs/config_inpainting.md delete mode 100644 docs/zh_cn/user_guides/configs/config_matting.md delete mode 100644 docs/zh_cn/user_guides/configs/config_restoration.md create mode 100644 docs/zh_cn/user_guides/dataset_prepare.md delete mode 100644 docs/zh_cn/user_guides/datasets/dataset_prepare.md create mode 100644 docs/zh_cn/user_guides/deploy.md create mode 100644 docs/zh_cn/user_guides/metrics.md diff --git a/README_zh-CN.md b/README_zh-CN.md index 2319802e7d..b1836aa84a 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -29,7 +29,7 @@ [📘使用文档](https://mmediting.readthedocs.io/zh_CN/1.x/) | [🛠️安装教程](https://mmediting.readthedocs.io/zh_CN/1.x/2_get_started.htmll) | [👀模型库](https://mmediting.readthedocs.io/zh_CN/1.x/3_model_zoo.html) | -[🆕更新记录](docs/zh_cn/community/changelog.md) | +[🆕更新记录](docs/zh_cn/changelog.md) | [🚀进行中的项目](https://github.com/open-mmlab/mmediting/projects) | [🤔提出问题](https://github.com/open-mmlab/mmediting/issues) @@ -124,7 +124,7 @@ MMEditing 缜密地设计新的框架并将其精心实现,希望能够为您 - 修复 FLAVR 的注册问题。 - 修正 RDB 模型中的通道数。 -如果像了解更多版本更新细节和历史信息,请阅读[更新日志](docs/en/community/changelog.md)。 +如果像了解更多版本更新细节和历史信息,请阅读[更新日志](docs/en/changelog.md)。 ## 安装 @@ -151,11 +151,11 @@ cd mmediting pip3 install -e . ``` -更详细的安装指南请参考 [get_started.md](docs/zh_cn/2_get_started.md) 。 +更详细的安装指南请参考 [installation](docs/zh_cn/get_started/install.md) 。 ## 开始使用 -请参考[使用教程](docs/zh_cn/2_get_started.md)和[功能演示](docs/zh_cn/user_guides/3_inference.md)获取MMEditing的基本用法。 +请参考[使用教程](docs/zh_cn/get_started/install.md)和[功能演示](docs/zh_cn/get_started/quick_run.md)获取MMEditing的基本用法。 ## 模型库 diff --git a/docs/en/.dev_scripts/update_dataset_zoo.py b/docs/en/.dev_scripts/update_dataset_zoo.py index 66dedb7f40..07060dab11 100644 --- a/docs/en/.dev_scripts/update_dataset_zoo.py +++ b/docs/en/.dev_scripts/update_dataset_zoo.py @@ -25,7 +25,7 @@ def update_dataset_zoo(): """ subfolders = os.listdir(source_dir) - for subf in tqdm(subfolders): + for subf in tqdm(subfolders, desc='update dataset zoo'): target_subf = subf.replace('-', '_').lower() target_readme = os.path.join(target_dir, target_subf + '.md') diff --git a/docs/en/.dev_scripts/update_model_zoo.py b/docs/en/.dev_scripts/update_model_zoo.py index 773397f152..2025223cf3 100755 --- a/docs/en/.dev_scripts/update_model_zoo.py +++ b/docs/en/.dev_scripts/update_model_zoo.py @@ -21,16 +21,19 @@ def anchor(name): name.strip().lower())).strip('-') -def summarize(stats, name, task='all'): +def summarize(stats, name): allpapers = func.reduce(lambda a, b: a.union(b), - [p for p, _, _, _, _, _ in stats]) + [p for p, _, _, _, _, _, _ in stats]) allconfigs = func.reduce(lambda a, b: a.union(b), - [c for _, c, _, _, _, _ in stats]) + [c for _, c, _, _, _, _, _ in stats]) allckpts = func.reduce(lambda a, b: a.union(b), - [c for _, _, c, _, _, _ in stats]) + [c for _, _, c, _, _, _, _ in stats]) alltasks = func.reduce(lambda a, b: a.union(b), - [t for _, _, _, t, _, _ in stats]) - task_desc = '\n - '.join(list(alltasks)) + [t for _, _, _, t, _, _, _ in stats]) + task_desc = '\n'.join([ + f" - [{task}]({task.replace('-', '_').replace(' ', '_').lower()}.md)" # noqa + for task in list(alltasks) + ]) # Overview papertypes, papercounts = np.unique([t for t, _ in allpapers], @@ -55,9 +58,9 @@ def summarize(stats, name, task='all'): if name == 'Overview': summary += f""" * Tasks: - - {task_desc} +{task_desc} - """ +""" return summary @@ -138,7 +141,8 @@ def update_model_zoo(): """ # * We should have: {len(glob.glob(osp.join(dirname(f), '*.py')))} - stats.append((papers, configs, ckpts, tasks, year, statsmsg)) + content = content.replace('# ', '## ') + stats.append((papers, configs, ckpts, tasks, year, statsmsg, content)) # overview overview = summarize(stats, 'Overview') @@ -146,7 +150,7 @@ def update_model_zoo(): f.write(overview) alltasks = func.reduce(lambda a, b: a.union(b), - [t for _, _, _, t, _, _ in stats]) + [t for _, _, _, t, _, _, _ in stats]) # index.rst indexmsg = """ @@ -166,13 +170,15 @@ def update_model_zoo(): # task-specific for task in alltasks: - filtered_model = [(paper, config, ckpt, tasks, year, x) - for paper, config, ckpt, tasks, year, x in stats - if task in tasks] - filtered_model = sorted(filtered_model, key=lambda x: x[-2])[::-1] + filtered_model = [ + (paper, config, ckpt, tasks, year, x, content) + for paper, config, ckpt, tasks, year, x, content in stats + if task in tasks + ] + filtered_model = sorted(filtered_model, key=lambda x: x[-3])[::-1] overview = summarize(filtered_model, task) - msglist = '\n'.join(x for _, _, _, _, _, x in filtered_model) + msglist = '\n'.join(x for _, _, _, _, _, _, x in filtered_model) task = task.replace(' ', '_').replace('-', '_').lower() with open(osp.join(target_dir, f'{task}.md'), 'w') as f: f.write(overview + '\n' + msglist) diff --git a/docs/en/get_started/install.md b/docs/en/get_started/install.md index e2651cb393..78fc8d1be3 100644 --- a/docs/en/get_started/install.md +++ b/docs/en/get_started/install.md @@ -7,7 +7,6 @@ In this section, you will know about: - [Best practices](#best-practices) - [Customize installation](#customize-installation) - [Developing with multiple MMEditing versions](#developing-with-multiple-mmediting-versions) -- [Quick run](#quick-run) ## Installation diff --git a/docs/en/index.rst b/docs/en/index.rst index 37bf3068e5..73cc96cb0b 100644 --- a/docs/en/index.rst +++ b/docs/en/index.rst @@ -63,7 +63,6 @@ Documentation user_guides/visualization.md user_guides/useful_tools.md user_guides/deploy.md - user_guides/faq.md .. toctree:: @@ -90,6 +89,8 @@ Documentation howto/losses.md .. toctree:: + :maxdepth: 1 + :caption: FAQ faq.md @@ -107,6 +108,8 @@ Documentation dataset_zoo/index.rst .. toctree:: + :maxdepth: 1 + :caption: Changelog changelog.md diff --git a/docs/en/user_guides/deploy.md b/docs/en/user_guides/deploy.md index c9e50cf168..8031cb171c 100644 --- a/docs/en/user_guides/deploy.md +++ b/docs/en/user_guides/deploy.md @@ -1,4 +1,4 @@ -# Tutorial 7: Deploy models in MMEditing +# Tutorial 8: Deploy models in MMEditing [MMDeploy](https://github.com/open-mmlab/mmdeploy) is an open-source deep learning model deployment toolset. MMDeploy supports deploying models in MMEditing. Please refer to [MMDeploy](https://github.com/open-mmlab/mmdeploy) for more information. diff --git a/docs/en/user_guides/metrics.md b/docs/en/user_guides/metrics.md index 1ce00355eb..500bd4f07e 100644 --- a/docs/en/user_guides/metrics.md +++ b/docs/en/user_guides/metrics.md @@ -1,4 +1,4 @@ -# Tutorial 8: Using metrics in MMEditing +# Tutorial 5: Using metrics in MMEditing MMEditing supports **17 metrics** to assess the quality of models. diff --git a/docs/en/user_guides/useful_tools.md b/docs/en/user_guides/useful_tools.md index ea7c759e4e..9e62ceece6 100644 --- a/docs/en/user_guides/useful_tools.md +++ b/docs/en/user_guides/useful_tools.md @@ -1,4 +1,4 @@ -# Tutorial 6: Useful tools +# Tutorial 7: Useful tools We provide lots of useful tools under `tools/` directory. diff --git a/docs/en/user_guides/visualization.md b/docs/en/user_guides/visualization.md index 0edf3bea05..31a0326cff 100644 --- a/docs/en/user_guides/visualization.md +++ b/docs/en/user_guides/visualization.md @@ -1,4 +1,4 @@ -# Tutorial 5: Visualization +# Tutorial 6: Visualization The visualization of images is an important way to measure the quality of image processing, editing and synthesis. Using `visualizer` in config file can save visual results when training or testing. You can follow [MMEngine Documents](https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/visualization.md) to learn the usage of visualization. MMEditing provides a rich set of visualization functions. diff --git a/docs/zh_cn/.dev_scripts/update_dataset_zoo.py b/docs/zh_cn/.dev_scripts/update_dataset_zoo.py new file mode 100644 index 0000000000..3383a0187c --- /dev/null +++ b/docs/zh_cn/.dev_scripts/update_dataset_zoo.py @@ -0,0 +1,51 @@ +import os + +from tqdm import tqdm + + +def update_dataset_zoo(): + + target_dir = 'dataset_zoo' + source_dir = '../../tools/dataset_converters' + os.makedirs(target_dir, exist_ok=True) + + # generate overview + overviewmsg = """ +# 概览 + +""" + + # generate index.rst + rstmsg = """ +.. toctree:: + :maxdepth: 1 + :caption: Dataset Zoo + + overview.md +""" + + subfolders = os.listdir(source_dir) + for subf in tqdm(subfolders, desc='update dataset zoo'): + + target_subf = subf.replace('-', '_').lower() + target_readme = os.path.join(target_dir, target_subf + '.md') + source_readme = os.path.join(source_dir, subf, 'README_zh-CN.md') + if not os.path.exists(source_readme): + continue + + overviewmsg += f'\n- [{subf}]({target_subf}.md)' + rstmsg += f'\n {target_subf}.md' + + # generate all tasks dataset_zoo + command = f'cat {source_readme} > {target_readme}' + os.popen(command) + + with open(os.path.join(target_dir, 'overview.md'), 'w') as f: + f.write(overviewmsg) + + with open(os.path.join(target_dir, 'index.rst'), 'w') as f: + f.write(rstmsg) + + +if __name__ == '__main__': + update_dataset_zoo() diff --git a/docs/zh_cn/.dev_scripts/update_model_zoo.py b/docs/zh_cn/.dev_scripts/update_model_zoo.py new file mode 100755 index 0000000000..c780bb314e --- /dev/null +++ b/docs/zh_cn/.dev_scripts/update_model_zoo.py @@ -0,0 +1,194 @@ +#!/usr/bin/env python +# Copyright (c) OpenMMLab. All rights reserved. + +import functools as func +import glob +import os +import os.path as osp +import re +from os.path import basename, dirname + +import numpy as np +import titlecase +from tqdm import tqdm + +github_link = 'https://github.com/open-mmlab/mmediting/blob/1.x/' + + +def anchor(name): + return re.sub(r'-+', '-', + re.sub(r'[^a-zA-Z0-9\+]', '-', + name.strip().lower())).strip('-') + + +def summarize(stats, name): + allpapers = func.reduce(lambda a, b: a.union(b), + [p for p, _, _, _, _, _, _ in stats]) + allconfigs = func.reduce(lambda a, b: a.union(b), + [c for _, c, _, _, _, _, _ in stats]) + allckpts = func.reduce(lambda a, b: a.union(b), + [c for _, _, c, _, _, _, _ in stats]) + alltasks = func.reduce(lambda a, b: a.union(b), + [t for _, _, _, t, _, _, _ in stats]) + task_desc = '\n'.join([ + f" - [{task}]({task.replace('-', '_').replace(' ', '_').lower()}.md)" # noqa + for task in list(alltasks) + ]) + + # Overview + papertypes, papercounts = np.unique([t for t, _ in allpapers], + return_counts=True) + countstr = '\n'.join( + [f' - {t}: {c}' for t, c in zip(papertypes, papercounts)]) + countstr = '\n'.join([f' - ALGORITHM: {len(stats)}']) + + summary = f"""# {name} +""" + + if name != 'Overview': + summary += '\n## 概览' + + summary += f""" +* 预训练权重个数: {len(allckpts)} +* 配置文件个数: {len(allconfigs)} +* 论文个数: {len(allpapers)} +{countstr} + """ + + if name == 'Overview': + summary += f""" +* 任务: +{task_desc} + +""" + + return summary + + +# Count algorithms +def update_model_zoo(): + + target_dir = 'model_zoo' + + os.makedirs(target_dir, exist_ok=True) + + root_dir = dirname(dirname(dirname(dirname(osp.abspath(__file__))))) + files = sorted(glob.glob(osp.join(root_dir, 'configs/*/README_zh-CN.md'))) + stats = [] + + for f in tqdm(files, desc='update model zoo'): + with open(f, 'r') as content_file: + content = content_file.read() + + # title + title = content.split('\n')[0].replace('#', '') + year = title.split('\'')[-1].split(')')[0] + + # count papers + papers = set( + (papertype, + titlecase.titlecase(paper.lower().strip()).replace('+', r'\+')) + for (papertype, paper) in re.findall( + r'\s*\n.*?\btitle\s*=\s*{(.*?)}', + content, re.DOTALL)) + + # paper links + revcontent = '\n'.join(list(reversed(content.splitlines()))) + paperlinks = {} + for _, p in papers: + paper_link = osp.join(github_link, 'configs', basename(dirname(f)), + 'README_zh-CN.md') + # print(p, paper_link) + paperlinks[p] = ' '.join( + (f'[⇨]({paper_link}#{anchor(paperlink)})' + for paperlink in re.findall( + rf'\btitle\s*=\s*{{\s*{p}\s*}}.*?\n## (.*?)\s*[,;]?\s*\n', + revcontent, re.DOTALL | re.IGNORECASE))) + # print(' ', paperlinks[p]) + paperlist = '\n'.join( + sorted(f' - [{t}] {x} ({paperlinks[x]})' for t, x in papers)) + + # count configs + configs = set(x.lower().strip() + for x in re.findall(r'/configs/.*?\.py', content)) + + # count ckpts + ckpts = list( + x.lower().strip() + for x in re.findall(r'\[model\]\(https\:\/\/.*\.pth', content)) + ckpts.extend( + x.lower().strip() + for x in re.findall(r'\[ckpt\]\(https\:\/\/.*\.pth', content)) + ckpts.extend( + x.lower().strip() + for x in re.findall(r'\[模型\]\(https\:\/\/.*\.pth', content)) + ckpts.extend( + x.lower().strip() + for x in re.findall(r'\[权重\]\(https\:\/\/.*\.pth', content)) + ckpts = set(ckpts) + + # count tasks + task_desc = list( + set(x.lower().strip() + for x in re.findall(r'\*\*任务\*\*: .*', content))) + tasks = set() + if len(task_desc) > 0: + tasks = set(task_desc[0].split('**任务**: ')[1].split(', ')) + + statsmsg = f"""## {title}""" + if len(tasks) > 0: + statsmsg += f"\n* Tasks: {','.join(list(tasks))}" + statsmsg += f""" + +* 预训练权重个数: {len(ckpts)} +* 配置文件个数: {len(configs)} +* 论文个数: {len(papers)} +{paperlist} + +""" + # * We should have: {len(glob.glob(osp.join(dirname(f), '*.py')))} + content = content.replace('# ', '## ') + stats.append((papers, configs, ckpts, tasks, year, statsmsg, content)) + + # overview + overview = summarize(stats, '概览') + with open(osp.join(target_dir, 'overview.md'), 'w') as f: + f.write(overview) + + alltasks = func.reduce(lambda a, b: a.union(b), + [t for _, _, _, t, _, _, _ in stats]) + + # index.rst + indexmsg = """ +.. toctree:: + :maxdepth: 1 + :caption: 模型库 + + overview.md +""" + + for task in alltasks: + task = task.replace(' ', '_').replace('-', '_').lower() + indexmsg += f' {task}.md\n' + + with open(osp.join(target_dir, 'index.rst'), 'w') as f: + f.write(indexmsg) + + # task-specific + for task in alltasks: + filtered_model = [ + (paper, config, ckpt, tasks, year, x, content) + for paper, config, ckpt, tasks, year, x, content in stats + if task in tasks + ] + filtered_model = sorted(filtered_model, key=lambda x: x[-3])[::-1] + overview = summarize(filtered_model, task) + + msglist = '\n'.join(x for _, _, _, _, _, _, x in filtered_model) + task = task.replace(' ', '_').replace('-', '_').lower() + with open(osp.join(target_dir, f'{task}.md'), 'w') as f: + f.write(overview + '\n' + msglist) + + +if __name__ == '__main__': + update_model_zoo() diff --git a/docs/zh_cn/.gitignore b/docs/zh_cn/.gitignore new file mode 100644 index 0000000000..825514f423 --- /dev/null +++ b/docs/zh_cn/.gitignore @@ -0,0 +1,2 @@ +model_zoo +dataset_zoo diff --git a/docs/zh_cn/Makefile b/docs/zh_cn/Makefile index d4bb2cbb9e..56ae5906ce 100644 --- a/docs/zh_cn/Makefile +++ b/docs/zh_cn/Makefile @@ -17,4 +17,7 @@ help: # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile + rm -rf _build + rm -rf model_zoo + rm -rf dataset_zoo @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/zh_cn/advanced_guides/data_flow.md b/docs/zh_cn/advanced_guides/data_flow.md new file mode 100644 index 0000000000..ccc734f77f --- /dev/null +++ b/docs/zh_cn/advanced_guides/data_flow.md @@ -0,0 +1 @@ +# 数据流(待更新) diff --git a/docs/zh_cn/advanced_guides/data_preprocessor.md b/docs/zh_cn/advanced_guides/data_preprocessor.md new file mode 100644 index 0000000000..b944a828f3 --- /dev/null +++ b/docs/zh_cn/advanced_guides/data_preprocessor.md @@ -0,0 +1 @@ +# 数据预处理器(待更新) diff --git a/docs/zh_cn/advanced_guides/evaluator.md b/docs/zh_cn/advanced_guides/evaluator.md new file mode 100644 index 0000000000..87a5701991 --- /dev/null +++ b/docs/zh_cn/advanced_guides/evaluator.md @@ -0,0 +1 @@ +# 评估器(待更新) diff --git a/docs/zh_cn/advanced_guides/index.rst b/docs/zh_cn/advanced_guides/index.rst deleted file mode 100644 index dab3050979..0000000000 --- a/docs/zh_cn/advanced_guides/index.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. toctree:: - :maxdepth: 2 - - models/customize_models.md - dataset.md - transforms.md - losses.md diff --git a/docs/zh_cn/advanced_guides/structures.md b/docs/zh_cn/advanced_guides/structures.md new file mode 100644 index 0000000000..c2118c34a3 --- /dev/null +++ b/docs/zh_cn/advanced_guides/structures.md @@ -0,0 +1 @@ +# 数据结构(待更新) diff --git a/docs/zh_cn/api.rst b/docs/zh_cn/api.rst deleted file mode 100644 index 8fe6a7c0c6..0000000000 --- a/docs/zh_cn/api.rst +++ /dev/null @@ -1,99 +0,0 @@ -mmedit.apis ---------------- -.. automodule:: mmedit.apis - :members: - - -mmedit.datasets -------------------------- - -datasets -^^^^^^^^^^ -.. automodule:: mmedit.datasets - :members: - -transforms -^^^^^^^^^^ -.. automodule:: mmedit.datasets.transforms - :members: - - -mmedit.engine --------------- - -hooks -^^^^^^^^^^ -.. automodule:: mmedit.engine.hooks - :members: - -optimizers -^^^^^^^^^^ -.. automodule:: mmedit.engine.optimizers - :members: - -schedulers -^^^^^^^^^^ -.. automodule:: mmedit.engine.schedulers - :members: - - -mmedit.evaluation ------------------- - -metrics -^^^^^^^^^^ -.. automodule:: mmedit.evaluation.metrics - :members: - - -functional -^^^^^^^^^^ -.. automodule:: mmedit.evaluation.functional - :members: - - -mmedit.models --------------- - -base_models -^^^^^^^ -.. automodule:: mmedit.models.base_models - :members: - -data_preprocessors -^^^^^^^ -.. automodule:: mmedit.models.data_preprocessors - :members: - -layers -^^^^^^^^^^^^ -.. automodule:: mmedit.models.layers - :members: - -losses -^^^^^^^^^^^^ -.. automodule:: mmedit.models.losses - :members: - -utils -^^^^^^^^^^^^ -.. automodule:: mmedit.models.utils - :members: - -editors -^^^^^^^^^^^^ -.. automodule:: mmedit.models.editors - :members: - - -mmedit.visualization --------------------- - -.. automodule:: mmedit.visualization - :members: - -mmedit.utils --------------------- - -.. automodule:: mmedit.utils - :members: diff --git a/docs/zh_cn/notes/changelog.md b/docs/zh_cn/changelog.md similarity index 100% rename from docs/zh_cn/notes/changelog.md rename to docs/zh_cn/changelog.md diff --git a/docs/zh_cn/community/contributing.md b/docs/zh_cn/community/contributing.md new file mode 100644 index 0000000000..b446d27cc2 --- /dev/null +++ b/docs/zh_cn/community/contributing.md @@ -0,0 +1,875 @@ +# 贡献代码 + +欢迎加入 MMEditing 社区,我们致力于打造最前沿的计算机视觉基础库,我们欢迎任何类型的贡献,包括但不限于 + +**修复错误** + +修复代码实现错误的步骤如下: + +1. 如果提交的代码改动较大,建议先提交 issue,并正确描述 issue 的现象、原因和复现方式,讨论后确认修复方案。 +2. 修复错误并补充相应的单元测试,提交拉取请求。 + +**新增功能或组件** + +1. 如果新功能或模块涉及较大的代码改动,建议先提交 issue,确认功能的必要性。 +2. 实现新增功能并添单元测试,提交拉取请求。 + +**文档补充** + +修复文档可以直接提交拉取请求 + +添加文档或将文档翻译成其他语言步骤如下 + +1. 提交 issue,确认添加文档的必要性。 +2. 添加文档,提交拉取请求。 + +### 拉取请求工作流 + +如果你对拉取请求不了解,没关系,接下来的内容将会从零开始,一步一步地指引你如何创建一个拉取请求。如果你想深入了解拉取请求的开发模式,可以参考 github [官方文档](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests) + +#### 1. 复刻仓库 + +当你第一次提交拉取请求时,先复刻 OpenMMLab 原代码库,点击 GitHub 页面右上角的 **Fork** 按钮,复刻后的代码库将会出现在你的 GitHub 个人主页下。 + + + +将代码克隆到本地 + +```shell +git clone git@github.com:{username}/mmediting.git +``` + +添加原代码库为上游代码库 + +```bash +git remote add upstream git@github.com:open-mmlab/mmediting +``` + +检查 remote 是否添加成功,在终端输入 `git remote -v` + +```bash +origin git@github.com:{username}/mmediting.git (fetch) +origin git@github.com:{username}/mmediting.git (push) +upstream git@github.com:open-mmlab/mmediting (fetch) +upstream git@github.com:open-mmlab/mmediting (push) +``` + +```{note} +这里对 origin 和 upstream 进行一个简单的介绍,当我们使用 git clone 来克隆代码时,会默认创建一个 origin 的 remote,它指向我们克隆的代码库地址,而 upstream 则是我们自己添加的,用来指向原始代码库地址。当然如果你不喜欢他叫 upstream,也可以自己修改,比如叫 open-mmlab。我们通常向 origin 提交代码(即 fork 下来的远程仓库),然后向 upstream 提交一个 pull request。如果提交的代码和最新的代码发生冲突,再从 upstream 拉取最新的代码,和本地分支解决冲突,再提交到 origin。 +``` + +#### 2. 配置 pre-commit + +在本地开发环境中,我们使用 [pre-commit](https://pre-commit.com/#intro) 来检查代码风格,以确保代码风格的统一。在提交代码,需要先安装 pre-commit(需要在 mmediting 目录下执行): + +```shell +pip install -U pre-commit +pre-commit install +``` + +检查 pre-commit 是否配置成功,并安装 `.pre-commit-config.yaml` 中的钩子: + +```shell +pre-commit run --all-files +``` + + + + + +```{note} +如果你是中国用户,由于网络原因,可能会出现安装失败的情况,这时可以使用国内源 + +pre-commit install -c .pre-commit-config-zh-cn.yaml + +pre-commit run --all-files -c .pre-commit-config-zh-cn.yaml +``` + +如果安装过程被中断,可以重复执行 `pre-commit run ...` 继续安装。 + +如果提交的代码不符合代码风格规范,pre-commit 会发出警告,并自动修复部分错误。 + + + +如果我们想临时绕开 pre-commit 的检查提交一次代码,可以在 `git commit` 时加上 `--no-verify`(需要保证最后推送至远程仓库的代码能够通过 pre-commit 检查)。 + +```shell +git commit -m "xxx" --no-verify +``` + +#### 3. 创建开发分支 + +安装完 pre-commit 之后,我们需要基于 master 创建开发分支,建议的分支命名规则为 `username/pr_name`。 + +```shell +git checkout -b yhc/refactor_contributing_doc +``` + +在后续的开发中,如果本地仓库的 master 分支落后于 upstream 的 master 分支,我们需要先拉取 upstream 的代码进行同步,再执行上面的命令 + +```shell +git pull upstream master +``` + +#### 4. 提交代码并在本地通过单元测试 + +- mmediting 引入了 mypy 来做静态类型检查,以增加代码的鲁棒性。因此我们在提交代码时,需要补充 Type Hints。具体规则可以参考[教程](https://zhuanlan.zhihu.com/p/519335398)。 + +- 提交的代码同样需要通过单元测试 + + ```shell + # 通过全量单元测试 + pytest tests + + # 我们需要保证提交的代码能够通过修改模块的单元测试,以 runner 为例 + pytest tests/test_runner/test_runner.py + ``` + + 如果你由于缺少依赖无法运行修改模块的单元测试,可以参考[指引-单元测试](#单元测试) + +- 如果修改/添加了文档,参考[指引](#文档渲染)确认文档渲染正常。 + +#### 5. 推送代码到远程 + +代码通过单元测试和 pre-commit 检查后,将代码推送到远程仓库,如果是第一次推送,可以在 `git push` 后加上 `-u` 参数以关联远程分支 + +```shell +git push -u origin {branch_name} +``` + +这样下次就可以直接使用 `git push` 命令推送代码了,而无需指定分支和远程仓库。 + +#### 6. 提交拉取请求(PR) + +(1) 在 GitHub 的 Pull request 界面创建拉取请求 + + +(2) 根据指引修改 PR 描述,以便于其他开发者更好地理解你的修改 + + + +描述规范详见[拉取请求规范](#拉取请求规范) + +  + +**注意事项** + +(a) PR 描述应该包含修改理由、修改内容以及修改后带来的影响,并关联相关 Issue(具体方式见[文档](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)) + +(b) 如果是第一次为 OpenMMLab 做贡献,需要签署 CLA + + + +(c) 检查提交的 PR 是否通过 CI(集成测试) + + + +mmediting 会在不同的平台(Linux、Window、Mac),基于不同版本的 Python、PyTorch、CUDA 对提交的代码进行单元测试,以保证代码的正确性,如果有任何一个没有通过,我们可点击上图中的 `Details` 来查看具体的测试信息,以便于我们修改代码。 + +(3) 如果 PR 通过了 CI,那么就可以等待其他开发者的 review,并根据 reviewer 的意见,修改代码,并重复 [4](#4-提交代码并本地通过单元测试)-[5](#5-推送代码到远程) 步骤,直到 reviewer 同意合入 PR。 + + + +所有 reviewer 同意合入 PR 后,我们会尽快将 PR 合并到主分支。 + +#### 7. 解决冲突 + +随着时间的推移,我们的代码库会不断更新,这时候,如果你的 PR 与主分支存在冲突,你需要解决冲突,解决冲突的方式有两种: + +```shell +git fetch --all --prune +git rebase upstream/master +``` + +或者 + +```shell +git fetch --all --prune +git merge upstream/master +``` + +如果你非常善于处理冲突,那么可以使用 rebase 的方式来解决冲突,因为这能够保证你的 commit log 的整洁。如果你不太熟悉 `rebase` 的使用,那么可以使用 `merge` 的方式来解决冲突。 + +### 指引 + +#### 单元测试 + +在提交修复代码错误或新增特性的拉取请求时,我们应该尽可能的让单元测试覆盖所有提交的代码,计算单元测试覆盖率的方法如下 + +```shell +python -m coverage run -m pytest /path/to/test_file +python -m coverage html +# check file in htmlcov/index.html +``` + +#### 文档渲染 + +在提交修复代码错误或新增特性的拉取请求时,可能会需要修改/新增模块的 docstring。我们需要确认渲染后的文档样式是正确的。 +本地生成渲染后的文档的方法如下 + +```shell +pip install -r requirements/docs.txt +cd docs/zh_cn/ +# or docs/en +make html +# check file in ./docs/zh_cn/_build/html/index.html +``` + +### 代码风格 + +#### Python + +[PEP8](https://www.python.org/dev/peps/pep-0008/) 作为 OpenMMLab 算法库首选的代码规范,我们使用以下工具检查和格式化代码 + +- [flake8](https://github.com/PyCQA/flake8): Python 官方发布的代码规范检查工具,是多个检查工具的封装 +- [isort](https://github.com/timothycrosley/isort): 自动调整模块导入顺序的工具 +- [yapf](https://github.com/google/yapf): Google 发布的代码规范检查工具 +- [codespell](https://github.com/codespell-project/codespell): 检查单词拼写是否有误 +- [mdformat](https://github.com/executablebooks/mdformat): 检查 markdown 文件的工具 +- [docformatter](https://github.com/myint/docformatter): 格式化 docstring 的工具 + +yapf 和 isort 的配置可以在 [setup.cfg](../../setup.cfg) 找到 + +通过配置 [pre-commit hook](https://pre-commit.com/) ,我们可以在提交代码时自动检查和格式化 `flake8`、`yapf`、`isort`、`trailing whitespaces`、`markdown files`,修复 `end-of-files`、`double-quoted-strings`、`python-encoding-pragma`、`mixed-line-ending`,调整 `requirments.txt` 的包顺序。 +pre-commit 钩子的配置可以在 [.pre-commit-config](../../.pre-commit-config.yaml) 找到。 + +pre-commit 具体的安装使用方式见[拉取请求](#2-配置-pre-commit)。 + +更具体的规范请参考 [OpenMMLab 代码规范](#代码风格)。 + +#### C++ and CUDA + +C++ 和 CUDA 的代码规范遵从 [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) + +### 拉取请求规范 + +1. 使用 [pre-commit hook](https://pre-commit.com),尽量减少代码风格相关问题 + +2. 一个`拉取请求`对应一个短期分支 + +3. 粒度要细,一个`拉取请求`只做一件事情,避免超大的`拉取请求` + + - Bad:实现 Faster R-CNN + - Acceptable:给 Faster R-CNN 添加一个 box head + - Good:给 box head 增加一个参数来支持自定义的 conv 层数 + +4. 每次 Commit 时需要提供清晰且有意义 commit 信息 + +5. 提供清晰且有意义的`拉取请求`描述 + + - 标题写明白任务名称,一般格式:\[Prefix\] Short description of the pull request (Suffix) + - prefix: 新增功能 \[Feature\], 修 bug \[Fix\], 文档相关 \[Docs\], 开发中 \[WIP\] (暂时不会被review) + - 描述里介绍`拉取请求`的主要修改内容,结果,以及对其他部分的影响, 参考`拉取请求`模板 + - 关联相关的`议题` (issue) 和其他`拉取请求` + +6. 如果引入了其他三方库,或借鉴了三方库的代码,请确认他们的许可证和 mmediting 兼容,并在借鉴的代码上补充 `This code is inspired from http://` + +## 代码规范 + +### 代码规范标准 + +#### PEP 8 —— Python 官方代码规范 + +[Python 官方的代码风格指南](https://www.python.org/dev/peps/pep-0008/),包含了以下几个方面的内容: + +- 代码布局,介绍了 Python 中空行、断行以及导入相关的代码风格规范。比如一个常见的问题:当我的代码较长,无法在一行写下时,何处可以断行? + +- 表达式,介绍了 Python 中表达式空格相关的一些风格规范。 + +- 尾随逗号相关的规范。当列表较长,无法一行写下而写成如下逐行列表时,推荐在末项后加逗号,从而便于追加选项、版本控制等。 + + ```python + # Correct: + FILES = ['setup.cfg', 'tox.ini'] + # Correct: + FILES = [ + 'setup.cfg', + 'tox.ini', + ] + # Wrong: + FILES = ['setup.cfg', 'tox.ini',] + # Wrong: + FILES = [ + 'setup.cfg', + 'tox.ini' + ] + ``` + +- 命名相关规范、注释相关规范、类型注解相关规范,我们将在后续章节中做详细介绍。 + + "A style guide is about consistency. Consistency with this style guide is important. Consistency within a project is more important. Consistency within one module or function is the most important." PEP 8 -- Style Guide for Python Code + +:::{note} +PEP 8 的代码规范并不是绝对的,项目内的一致性要优先于 PEP 8 的规范。OpenMMLab 各个项目都在 setup.cfg 设定了一些代码规范的设置,请遵照这些设置。一个例子是在 PEP 8 中有如下一个例子: + +```python +# Correct: +hypot2 = x*x + y*y +# Wrong: +hypot2 = x * x + y * y +``` + +这一规范是为了指示不同优先级,但 OpenMMLab 的设置中通常没有启用 yapf 的 `ARITHMETIC_PRECEDENCE_INDICATION` 选项,因而格式规范工具不会按照推荐样式格式化,以设置为准。 +::: + +#### Google 开源项目风格指南 + +[Google 使用的编程风格指南](https://google.github.io/styleguide/pyguide.html),包括了 Python 相关的章节。相较于 PEP 8,该指南提供了更为详尽的代码指南。该指南包括了语言规范和风格规范两个部分。 + +其中,语言规范对 Python 中很多语言特性进行了优缺点的分析,并给出了使用指导意见,如异常、Lambda 表达式、列表推导式、metaclass 等。 + +风格规范的内容与 PEP 8 较为接近,大部分约定建立在 PEP 8 的基础上,也有一些更为详细的约定,如函数长度、TODO 注释、文件与 socket 对象的访问等。 + +推荐将该指南作为参考进行开发,但不必严格遵照,一来该指南存在一些 Python 2 兼容需求,例如指南中要求所有无基类的类应当显式地继承 Object, 而在仅使用 Python 3 的环境中,这一要求是不必要的,依本项目中的惯例即可。二来 OpenMMLab 的项目作为框架级的开源软件,不必对一些高级技巧过于避讳,尤其是 MMCV。但尝试使用这些技巧前应当认真考虑是否真的有必要,并寻求其他开发人员的广泛评估。 + +另外需要注意的一处规范是关于包的导入,在该指南中,要求导入本地包时必须使用路径全称,且导入的每一个模块都应当单独成行,通常这是不必要的,而且也不符合目前项目的开发惯例,此处进行如下约定: + +```python +# Correct +from mmedit.cnn.bricks import (Conv2d, build_norm_layer, DropPath, MaxPool2d, + Linear) +from ..utils import ext_loader + +# Wrong +from mmedit.cnn.bricks import Conv2d, build_norm_layer, DropPath, MaxPool2d, \ + Linear # 使用括号进行连接,而不是反斜杠 +from ...utils import is_str # 最多向上回溯一层,过多的回溯容易导致结构混乱 +``` + +OpenMMLab 项目使用 pre-commit 工具自动格式化代码,详情见[贡献代码](./contributing.md#代码风格)。 + +### 命名规范 + +#### 命名规范的重要性 + +优秀的命名是良好代码可读的基础。基础的命名规范对各类变量的命名做了要求,使读者可以方便地根据代码名了解变量是一个类 / 局部变量 / 全局变量等。而优秀的命名则需要代码作者对于变量的功能有清晰的认识,以及良好的表达能力,从而使读者根据名称就能了解其含义,甚至帮助了解该段代码的功能。 + +#### 基础命名规范 + +| 类型 | 公有 | 私有 | +| --------------- | ---------------- | ------------------ | +| 模块 | lower_with_under | \_lower_with_under | +| 包 | lower_with_under | | +| 类 | CapWords | \_CapWords | +| 异常 | CapWordsError | | +| 函数(方法) | lower_with_under | \_lower_with_under | +| 函数 / 方法参数 | lower_with_under | | +| 全局 / 类内常量 | CAPS_WITH_UNDER | \_CAPS_WITH_UNDER | +| 全局 / 类内变量 | lower_with_under | \_lower_with_under | +| 变量 | lower_with_under | \_lower_with_under | +| 局部变量 | lower_with_under | | + +注意: + +- 尽量避免变量名与保留字冲突,特殊情况下如不可避免,可使用一个后置下划线,如 class\_ +- 尽量不要使用过于简单的命名,除了约定俗成的循环变量 i,文件变量 f,错误变量 e 等。 +- 不会被用到的变量可以命名为 \_,逻辑检查器会将其忽略。 + +#### 命名技巧 + +良好的变量命名需要保证三点: + +1. 含义准确,没有歧义 +2. 长短适中 +3. 前后统一 + +```python +# Wrong +class Masks(metaclass=ABCMeta): # 命名无法表现基类;Instance or Semantic? + pass + +# Correct +class BaseInstanceMasks(metaclass=ABCMeta): + pass + +# Wrong,不同地方含义相同的变量尽量用统一的命名 +def __init__(self, inplanes, planes): + pass + +def __init__(self, in_channels, out_channels): + pass +``` + +常见的函数命名方法: + +- 动宾命名法:crop_img, init_weights +- 动宾倒置命名法:imread, bbox_flip + +注意函数命名与参数的顺序,保证主语在前,符合语言习惯: + +- check_keys_exist(key, container) +- check_keys_contain(container, key) + +注意避免非常规或统一约定的缩写,如 nb -> num_blocks,in_nc -> in_channels + +### docstring 规范 + +#### 为什么要写 docstring + +docstring 是对一个类、一个函数功能与 API 接口的详细描述,有两个功能,一是帮助其他开发者了解代码功能,方便 debug 和复用代码;二是在 Readthedocs 文档中自动生成相关的 API reference 文档,帮助不了解源代码的社区用户使用相关功能。 + +#### 如何写 docstring + +与注释不同,一份规范的 docstring 有着严格的格式要求,以便于 Python 解释器以及 sphinx 进行文档解析,详细的 docstring 约定参见 [PEP 257](https://www.python.org/dev/peps/pep-0257/)。此处以例子的形式介绍各种文档的标准格式,参考格式为 [Google 风格](https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/#comments)。 + +1. 模块文档 + + 代码风格规范推荐为每一个模块(即 Python 文件)编写一个 docstring,但目前 OpenMMLab 项目大部分没有此类 docstring,因此不做硬性要求。 + + ```python + """A one line summary of the module or program, terminated by a period. + + Leave one blank line. The rest of this docstring should contain an + overall description of the module or program. Optionally, it may also + contain a brief description of exported classes and functions and/or usage + examples. + + Typical usage example: + + foo = ClassFoo() + bar = foo.FunctionBar() + """ + ``` + +2. 类文档 + + 类文档是我们最常需要编写的,此处,按照 OpenMMLab 的惯例,我们使用了与 Google 风格不同的写法。如下例所示,文档中没有使用 Attributes 描述类属性,而是使用 Args 描述 __init__ 函数的参数。 + + 在 Args 中,遵照 `parameter (type): Description.` 的格式,描述每一个参数类型和功能。其中,多种类型可使用 `(float or str)` 的写法,可以为 None 的参数可以写为 `(int, optional)`。 + + ```python + class BaseRunner(metaclass=ABCMeta): + """The base class of Runner, a training helper for PyTorch. + + All subclasses should implement the following APIs: + + - ``run()`` + - ``train()`` + - ``val()`` + - ``save_checkpoint()`` + + Args: + model (:obj:`torch.nn.Module`): The model to be run. + batch_processor (callable, optional): A callable method that process + a data batch. The interface of this method should be + ``batch_processor(model, data, train_mode) -> dict``. + Defaults to None. + optimizer (dict or :obj:`torch.optim.Optimizer`, optional): It can be + either an optimizer (in most cases) or a dict of optimizers + (in models that requires more than one optimizer, e.g., GAN). + Defaults to None. + work_dir (str, optional): The working directory to save checkpoints + and logs. Defaults to None. + logger (:obj:`logging.Logger`): Logger used during training. + Defaults to None. (The default value is just for backward + compatibility) + meta (dict, optional): A dict records some import information such as + environment info and seed, which will be logged in logger hook. + Defaults to None. + max_epochs (int, optional): Total training epochs. Defaults to None. + max_iters (int, optional): Total training iterations. Defaults to None. + """ + + def __init__(self, + model, + batch_processor=None, + optimizer=None, + work_dir=None, + logger=None, + meta=None, + max_iters=None, + max_epochs=None): + ... + ``` + + 另外,在一些算法实现的主体类中,建议加入原论文的链接;如果参考了其他开源代码的实现,则应加入 modified from,而如果是直接复制了其他代码库的实现,则应加入 copied from ,并注意源码的 License。如有必要,也可以通过 .. math:: 来加入数学公式 + + ```python + # 参考实现 + # This func is modified from `detectron2 + # `_. + + # 复制代码 + # This code was copied from the `ubelt + # library`_. + + # 引用论文 & 添加公式 + class LabelSmoothLoss(nn.Module): + r"""Initializer for the label smoothed cross entropy loss. + + Refers to `Rethinking the Inception Architecture for Computer Vision + `_. + + This decreases gap between output scores and encourages generalization. + Labels provided to forward can be one-hot like vectors (NxC) or class + indices (Nx1). + And this accepts linear combination of one-hot like labels from mixup or + cutmix except multi-label task. + + Args: + label_smooth_val (float): The degree of label smoothing. + num_classes (int, optional): Number of classes. Defaults to None. + mode (str): Refers to notes, Options are "original", "classy_vision", + "multi_label". Defaults to "classy_vision". + reduction (str): The method used to reduce the loss. + Options are "none", "mean" and "sum". Defaults to 'mean'. + loss_weight (float): Weight of the loss. Defaults to 1.0. + + Note: + if the ``mode`` is "original", this will use the same label smooth + method as the original paper as: + + .. math:: + (1-\epsilon)\delta_{k, y} + \frac{\epsilon}{K} + + where :math:`\epsilon` is the ``label_smooth_val``, :math:`K` is + the ``num_classes`` and :math:`\delta_{k,y}` is Dirac delta, + which equals 1 for k=y and 0 otherwise. + + if the ``mode`` is "classy_vision", this will use the same label + smooth method as the `facebookresearch/ClassyVision + `_ repo as: + + .. math:: + \frac{\delta_{k, y} + \epsilon/K}{1+\epsilon} + + if the ``mode`` is "multi_label", this will accept labels from + multi-label task and smoothing them as: + + .. math:: + (1-2\epsilon)\delta_{k, y} + \epsilon + ``` + +```{note} +注意 \`\`here\`\`、\`here\`、"here" 三种引号功能是不同。 + +在 reStructured 语法中,\`\`here\`\` 表示一段代码;\`here\` 表示斜体;"here" 无特殊含义,一般可用来表示字符串。其中 \`here\` 的用法与 Markdown 中不同,需要多加留意。 +另外还有 :obj:\`type\` 这种更规范的表示类的写法,但鉴于长度,不做特别要求,一般仅用于表示非常用类型。 +``` + +3. 方法(函数)文档 + + 函数文档与类文档的结构基本一致,但需要加入返回值文档。对于较为复杂的函数和类,可以使用 Examples 字段加入示例;如果需要对参数加入一些较长的备注,可以加入 Note 字段进行说明。 + + 对于使用较为复杂的类或函数,比起看大段大段的说明文字和参数文档,添加合适的示例更能帮助用户迅速了解其用法。需要注意的是,这些示例最好是能够直接在 Python 交互式环境中运行的,并给出一些相对应的结果。如果存在多个示例,可以使用注释简单说明每段示例,也能起到分隔作用。 + + ```python + def import_modules_from_strings(imports, allow_failed_imports=False): + """Import modules from the given list of strings. + + Args: + imports (list | str | None): The given module names to be imported. + allow_failed_imports (bool): If True, the failed imports will return + None. Otherwise, an ImportError is raise. Defaults to False. + + Returns: + List[module] | module | None: The imported modules. + All these three lines in docstring will be compiled into the same + line in readthedocs. + + Examples: + >>> osp, sys = import_modules_from_strings( + ... ['os.path', 'sys']) + >>> import os.path as osp_ + >>> import sys as sys_ + >>> assert osp == osp_ + >>> assert sys == sys_ + """ + ... + ``` + + 如果函数接口在某个版本发生了变化,需要在 docstring 中加入相关的说明,必要时添加 Note 或者 Warning 进行说明,例如: + + ```python + class CheckpointHook(Hook): + """Save checkpoints periodically. + + Args: + out_dir (str, optional): The root directory to save checkpoints. If + not specified, ``runner.work_dir`` will be used by default. If + specified, the ``out_dir`` will be the concatenation of + ``out_dir`` and the last level directory of ``runner.work_dir``. + Defaults to None. `Changed in version 1.3.15.` + file_client_args (dict, optional): Arguments to instantiate a + FileClient. See :class:`mmedit.fileio.FileClient` for details. + Defaults to None. `New in version 1.3.15.` + + Warning: + Before v1.3.15, the ``out_dir`` argument indicates the path where the + checkpoint is stored. However, in v1.3.15 and later, ``out_dir`` + indicates the root directory and the final path to save checkpoint is + the concatenation of out_dir and the last level directory of + ``runner.work_dir``. Suppose the value of ``out_dir`` is + "/path/of/A" and the value of ``runner.work_dir`` is "/path/of/B", + then the final path will be "/path/of/A/B". + ``` + + 如果参数或返回值里带有需要展开描述字段的 dict,则应该采用如下格式: + + ```python + def func(x): + r""" + Args: + x (None): A dict with 2 keys, ``padded_targets``, and ``targets``. + + - ``targets`` (list[Tensor]): A list of tensors. + Each tensor has the shape of :math:`(T_i)`. Each + element is the index of a character. + - ``padded_targets`` (Tensor): A tensor of shape :math:`(N)`. + Each item is the length of a word. + + Returns: + dict: A dict with 2 keys, ``padded_targets``, and ``targets``. + + - ``targets`` (list[Tensor]): A list of tensors. + Each tensor has the shape of :math:`(T_i)`. Each + element is the index of a character. + - ``padded_targets`` (Tensor): A tensor of shape :math:`(N)`. + Each item is the length of a word. + """ + return x + ``` + +```{important} +为了生成 readthedocs 文档,文档的编写需要按照 ReStructrued 文档格式,否则会产生文档渲染错误,在提交 PR 前,最好生成并预览一下文档效果。 +语法规范参考: + +- [reStructuredText Primer - Sphinx documentation](https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html#) +- [Example Google Style Python Docstrings ‒ napoleon 0.7 documentation](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html#example-google) +``` + +### 注释规范 + +#### 为什么要写注释 + +对于一个开源项目,团队合作以及社区之间的合作是必不可少的,因而尤其要重视合理的注释。不写注释的代码,很有可能过几个月自己也难以理解,造成额外的阅读和修改成本。 + +#### 如何写注释 + +最需要写注释的是代码中那些技巧性的部分。如果你在下次代码审查的时候必须解释一下,那么你应该现在就给它写注释。对于复杂的操作,应该在其操作开始前写上若干行注释。对于不是一目了然的代码,应在其行尾添加注释。 +—— Google 开源项目风格指南 + +```python +# We use a weighted dictionary search to find out where i is in +# the array. We extrapolate position based on the largest num +# in the array and the array size and then do binary search to +# get the exact number. +if i & (i-1) == 0: # True if i is 0 or a power of 2. +``` + +为了提高可读性, 注释应该至少离开代码2个空格. +另一方面, 绝不要描述代码. 假设阅读代码的人比你更懂Python, 他只是不知道你的代码要做什么. +—— Google 开源项目风格指南 + +```python +# Wrong: +# Now go through the b array and make sure whenever i occurs +# the next element is i+1 + +# Wrong: +if i & (i-1) == 0: # True if i bitwise and i-1 is 0. +``` + +在注释中,可以使用 Markdown 语法,因为开发人员通常熟悉 Markdown 语法,这样可以便于交流理解,如可使用单反引号表示代码和变量(注意不要和 docstring 中的 ReStructured 语法混淆) + +```python +# `_reversed_padding_repeated_twice` is the padding to be passed to +# `F.pad` if needed (e.g., for non-zero padding types that are +# implemented as two ops: padding + conv). `F.pad` accepts paddings in +# reverse order than the dimension. +self._reversed_padding_repeated_twice = _reverse_repeat_tuple(self.padding, 2) +``` + +#### 注释示例 + +1. 出自 `mmcv/utils/registry.py`,对于较为复杂的逻辑结构,通过注释,明确了优先级关系。 + + ```python + # self.build_func will be set with the following priority: + # 1. build_func + # 2. parent.build_func + # 3. build_from_cfg + if build_func is None: + if parent is not None: + self.build_func = parent.build_func + else: + self.build_func = build_from_cfg + else: + self.build_func = build_func + ``` + +2. 出自 `mmcv/runner/checkpoint.py`,对于 bug 修复中的一些特殊处理,可以附带相关的 issue 链接,帮助其他人了解 bug 背景。 + + ```python + def _save_ckpt(checkpoint, file): + # The 1.6 release of PyTorch switched torch.save to use a new + # zipfile-based file format. It will cause RuntimeError when a + # checkpoint was saved in high version (PyTorch version>=1.6.0) but + # loaded in low version (PyTorch version<1.6.0). More details at + # https://github.com/open-mmlab/mmpose/issues/904 + if digit_version(TORCH_VERSION) >= digit_version('1.6.0'): + torch.save(checkpoint, file, _use_new_zipfile_serialization=False) + else: + torch.save(checkpoint, file) + ``` + +### 类型注解 + +#### 为什么要写类型注解 + +类型注解是对函数中变量的类型做限定或提示,为代码的安全性提供保障、增强代码的可读性、避免出现类型相关的错误。 +Python 没有对类型做强制限制,类型注解只起到一个提示作用,通常你的 IDE 会解析这些类型注解,然后在你调用相关代码时对类型做提示。另外也有类型注解检查工具,这些工具会根据类型注解,对代码中可能出现的问题进行检查,减少 bug 的出现。 +需要注意的是,通常我们不需要注释模块中的所有函数: + +1. 公共的 API 需要注释 +2. 在代码的安全性,清晰性和灵活性上进行权衡是否注释 +3. 对于容易出现类型相关的错误的代码进行注释 +4. 难以理解的代码请进行注释 +5. 若代码中的类型已经稳定,可以进行注释. 对于一份成熟的代码,多数情况下,即使注释了所有的函数,也不会丧失太多的灵活性. + +#### 如何写类型注解 + +1. 函数 / 方法类型注解,通常不对 self 和 cls 注释。 + + ```python + from typing import Optional, List, Tuple + + # 全部位于一行 + def my_method(self, first_var: int) -> int: + pass + + # 另起一行 + def my_method( + self, first_var: int, + second_var: float) -> Tuple[MyLongType1, MyLongType1, MyLongType1]: + pass + + # 单独成行(具体的应用场合与行宽有关,建议结合 yapf 自动化格式使用) + def my_method( + self, first_var: int, second_var: float + ) -> Tuple[MyLongType1, MyLongType1, MyLongType1]: + pass + + # 引用尚未被定义的类型 + class MyClass: + def __init__(self, + stack: List["MyClass"]) -> None: + pass + ``` + + 注:类型注解中的类型可以是 Python 内置类型,也可以是自定义类,还可以使用 Python 提供的 wrapper 类对类型注解进行装饰,一些常见的注解如下: + + ```python + # 数值类型 + from numbers import Number + + # 可选类型,指参数可以为 None + from typing import Optional + def foo(var: Optional[int] = None): + pass + + # 联合类型,指同时接受多种类型 + from typing import Union + def foo(var: Union[float, str]): + pass + + from typing import Sequence # 序列类型 + from typing import Iterable # 可迭代类型 + from typing import Any # 任意类型 + from typing import Callable # 可调用类型 + + from typing import List, Dict # 列表和字典的泛型类型 + from typing import Tuple # 元组的特殊格式 + # 虽然在 Python 3.9 中,list, tuple 和 dict 本身已支持泛型,但为了支持之前的版本 + # 我们在进行类型注解时还是需要使用 List, Tuple, Dict 类型 + # 另外,在对参数类型进行注解时,尽量使用 Sequence & Iterable & Mapping + # List, Tuple, Dict 主要用于返回值类型注解 + # 参见 https://docs.python.org/3/library/typing.html#typing.List + ``` + +2. 变量类型注解,一般用于难以直接推断其类型时 + + ```python + # Recommend: 带类型注解的赋值 + a: Foo = SomeUndecoratedFunction() + a: List[int]: [1, 2, 3] # List 只支持单一类型泛型,可使用 Union + b: Tuple[int, int] = (1, 2) # 长度固定为 2 + c: Tuple[int, ...] = (1, 2, 3) # 变长 + d: Dict[str, int] = {'a': 1, 'b': 2} + + # Not Recommend:行尾类型注释 + # 虽然这种方式被写在了 Google 开源指南中,但这是一种为了支持 Python 2.7 版本 + # 而补充的注释方式,鉴于我们只支持 Python 3, 为了风格统一,不推荐使用这种方式。 + a = SomeUndecoratedFunction() # type: Foo + a = [1, 2, 3] # type: List[int] + b = (1, 2, 3) # type: Tuple[int, ...] + c = (1, "2", 3.5) # type: Tuple[int, Text, float] + ``` + +3. 泛型 + + 上文中我们知道,typing 中提供了 list 和 dict 的泛型类型,那么我们自己是否可以定义类似的泛型呢? + + ```python + from typing import TypeVar, Generic + + KT = TypeVar('KT') + VT = TypeVar('VT') + + class Mapping(Generic[KT, VT]): + def __init__(self, data: Dict[KT, VT]): + self._data = data + + def __getitem__(self, key: KT) -> VT: + return self._data[key] + ``` + + 使用上述方法,我们定义了一个拥有泛型能力的映射类,实际用法如下: + + ```python + mapping = Mapping[str, float]({'a': 0.5}) + value: float = example['a'] + ``` + + 另外,我们也可以利用 TypeVar 在函数签名中指定联动的多个类型: + + ```python + from typing import TypeVar, List + + T = TypeVar('T') # Can be anything + A = TypeVar('A', str, bytes) # Must be str or bytes + + + def repeat(x: T, n: int) -> List[T]: + """Return a list containing n references to x.""" + return [x]*n + + + def longest(x: A, y: A) -> A: + """Return the longest of two strings.""" + return x if len(x) >= len(y) else y + ``` + +更多关于类型注解的写法请参考 [typing](https://docs.python.org/3/library/typing.html)。 + +#### 类型注解检查工具 + +[mypy](https://mypy.readthedocs.io/en/stable/) 是一个 Python 静态类型检查工具。根据你的类型注解,mypy 会检查传参、赋值等操作是否符合类型注解,从而避免可能出现的 bug。 + +例如如下的一个 Python 脚本文件 test.py: + +```python +def foo(var: int) -> float: + return float(var) + +a: str = foo('2.0') +b: int = foo('3.0') # type: ignore +``` + +运行 mypy test.py 可以得到如下检查结果,分别指出了第 4 行在函数调用和返回值赋值两处类型错误。而第 5 行同样存在两个类型错误,由于使用了 type: ignore 而被忽略了,只有部分特殊情况可能需要此类忽略。 + +``` +test.py:4: error: Incompatible types in assignment (expression has type "float", variable has type "int") +test.py:4: error: Argument 1 to "foo" has incompatible type "str"; expected "int" +Found 2 errors in 1 file (checked 1 source file) +``` diff --git a/docs/zh_cn/notes/projects.md b/docs/zh_cn/community/projects.md similarity index 100% rename from docs/zh_cn/notes/projects.md rename to docs/zh_cn/community/projects.md diff --git a/docs/zh_cn/conf.py b/docs/zh_cn/conf.py index de81ed9666..beb21b8c3d 100644 --- a/docs/zh_cn/conf.py +++ b/docs/zh_cn/conf.py @@ -31,19 +31,44 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.autodoc', + 'sphinx.ext.intersphinx', 'sphinx.ext.napoleon', 'sphinx.ext.viewcode', + 'sphinx.ext.autosectionlabel', 'sphinx_markdown_tables', 'sphinx_copybutton', - 'myst_parser', 'sphinx_tabs.tabs', - 'notfound.extension', + 'myst_parser', ] +extensions.append('notfound.extension') # enable customizing not-found page + +extensions.append('autoapi.extension') +autoapi_type = 'python' +autoapi_dirs = ['../../mmedit'] +autoapi_add_toctree_entry = False +autoapi_template_dir = '_templates' +# autoapi_options = ['members', 'undoc-members', 'show-module-summary'] + +# # Core library for html generation from docstrings +# extensions.append('sphinx.ext.autodoc') +# extensions.append('sphinx.ext.autodoc.typehints') +# # Enable 'expensive' imports for sphinx_autodoc_typehints +# set_type_checking_flag = True +# # Sphinx-native method. Not as good as sphinx_autodoc_typehints +# autodoc_typehints = "description" + +# extensions.append('sphinx.ext.autosummary') # Create neat summary tables +# autosummary_generate = True # Turn on sphinx.ext.autosummary +# # Add __init__ doc (ie. params) to class summaries +# autoclass_content = 'both' +# autodoc_skip_member = [] +# # If no docstring, inherit from base class +# autodoc_inherit_docstrings = True + autodoc_mock_imports = [ - 'mmedit.version', 'mmcv.ops.ModulatedDeformConv2d', - 'mmcv.ops.modulated_deform_conv2d', 'mmcv._ext' + 'mmedit.version', 'mmcv._ext', 'mmcv.ops.ModulatedDeformConv2d', + 'mmcv.ops.modulated_deform_conv2d', 'clip', 'resize_right', 'pandas' ] source_suffix = { @@ -56,7 +81,7 @@ copybutton_prompt_is_regexp = True # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ['../en/_templates'] # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -109,6 +134,7 @@ html_css_files = ['css/readthedocs.css'] myst_enable_extensions = ['colon_fence'] +myst_heading_anchors = 3 language = 'zh_CN' @@ -118,9 +144,16 @@ def builder_inited_handler(app): - # subprocess.run(['./merge_docs.sh']) - subprocess.run(['./stat.py']) + subprocess.run(['python', './.dev_scripts/update_model_zoo.py']) + subprocess.run(['python', './.dev_scripts/update_dataset_zoo.py']) + + +def skip_member(app, what, name, obj, skip, options): + if what == 'package' or what == 'module': + skip = True + return skip def setup(app): app.connect('builder-inited', builder_inited_handler) + app.connect('autoapi-skip-member', skip_member) diff --git a/docs/zh_cn/config.md b/docs/zh_cn/config.md deleted file mode 100644 index 6be88c4c47..0000000000 --- a/docs/zh_cn/config.md +++ /dev/null @@ -1,23 +0,0 @@ -# 教程 1: 了解配置文件 - -mmedit 采用基于 python 文件的配置系统,您可以在 `$MMEditing/configs` 下查看预置的配置文件。 - -## 配置文件命名风格 - -配置文件按照下面的风格命名。我们建议社区贡献者使用同样的风格。 - -```bash -{model}_[model setting]_{backbone}_[refiner]_[norm setting]_[misc]_[gpu x batch_per_gpu]_{schedule}_{dataset} -``` - -`{xxx}` 是必填字段,`[yyy]` 是可选的。 - -- `{model}`: 模型种类,例如 `srcnn`, `dim` 等等。 -- `[model setting]`: 特定设置一些模型,例如,输入图像 `resolution` , 训练 `stage name`。 -- `{backbone}`: 主干网络种类,例如 `r50` (ResNet-50)、`x101` (ResNeXt-101)。 -- `{refiner}`: 精炼器种类,例如 `pln` 简单精炼器模型 -- `[norm_setting]`: 指定归一化设置,默认为批归一化,其他归一化可以设为: `bn`(批归一化), `gn` (组归一化), `syncbn` (同步批归一化)。 -- `[misc]`: 模型中各式各样的设置/插件,例如 `dconv`, `gcb`, `attention`, `mstrain`。 -- `[gpu x batch_per_gpu]`: GPU数目 和每个 GPU 的样本数, 默认为 `8x2 `。 -- `{schedule}`: 训练策略,如 `20k`, `100k` 等,意思是 `20k` 或 `100k` 迭代轮数。 -- `{dataset}`: 数据集,如 `places`(图像补全)、`comp1k`(抠图)、`div2k`(图像恢复)和 `paired`(图像生成)。 diff --git a/docs/zh_cn/demo.md b/docs/zh_cn/demo.md deleted file mode 100644 index 8c00b9282f..0000000000 --- a/docs/zh_cn/demo.md +++ /dev/null @@ -1,237 +0,0 @@ -### 演示 - -我们针对特定任务提供了一些脚本,可以对单张图像进行推理。 - -#### 图像补全 - -您可以使用以下命令,输入一张测试图像以及缺损部位的遮罩图像,实现对测试图像的补全。 - -```shell -python demo/inpainting_demo.py \ - ${CONFIG_FILE} \ - ${CHECKPOINT_FILE} \ - ${MASKED_IMAGE_FILE} \ - ${MASK_FILE} \ - ${SAVE_FILE} \ - [--imshow] \ - [--device ${GPU_ID}] -``` - -如果指定了 --imshow ,演示程序将使用 opencv 显示图像。例子: - -```shell -python demo/inpainting_demo.py \ - configs/global_local/gl_8xb12_celeba-256x256.py \ - https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_celeba_20200619-5af0493f.pth \ - tests/data/inpainting/celeba_test.png \ - tests/data/inpainting/bbox_mask.png \ - tests/data/inpainting/inpainting_celeba.png -``` - -补全结果将保存在 `tests/data/inpainting/inpainting_celeba.png` 中。 - -#### 抠图 - -您可以使用以下命令,输入一张测试图像以及对应的三元图(trimap),实现对测试图像的抠图。 - -```shell -python demo/matting_demo.py \ - ${CONFIG_FILE} \ - ${CHECKPOINT_FILE} \ - ${IMAGE_FILE} \ - ${TRIMAP_FILE} \ - ${SAVE_FILE} \ - [--imshow] \ - [--device ${GPU_ID}] -``` - -如果指定了 --imshow ,演示程序将使用 opencv 显示图像。例子: - -```shell -python demo/matting_demo.py \ - configs/dim/dim_stage3-v16-pln_1000k-1xb1_comp1k.py \ - https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_SAD-50.6_20200609_111851-647f24b6.pth \ - tests/data/matting_dataset/merged/GT05.jpg \ - tests/data/matting_dataset/trimap/GT05.png \ - tests/data/matting_dataset/pred/GT05.png -``` - -预测的 alpha 遮罩将保存在 `tests/data/matting_dataset/pred/GT05.png` 中。 - -#### 图像超分辨率 - -您可以使用以下命令来测试要恢复的图像。 - -```shell -python demo/restoration_demo.py \ - ${CONFIG_FILE} \ - ${CHECKPOINT_FILE} \ - ${IMAGE_FILE} \ - ${SAVE_FILE} \ - [--imshow] \ - [--device ${GPU_ID}] \ - [--ref-path ${REF_PATH}] -``` - -如果指定了 `--imshow` ,演示程序将使用 opencv 显示图像。例子: - -```shell -python demo/restoration_demo.py \ - configs/esrgan/esrgan_x4c64b23g32_400k-1xb16_div2k.py \ - https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth \ - tests/data/image/lq/baboon_x4.png \ - demo/demo_out_baboon.png -``` - -您可以通过提供 `--ref-path` 参数来测试基于参考的超分辨率算法。例子: - -```shell -python demo/restoration_demo.py \ - configs/ttsr/ttsr-gan_x4c64b16_500k-1xb9_CUFED.py \ - https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-gan_x4_c64b16_g1_500k_CUFED_20210626-2ab28ca0.pth \ - tests/data/frames/sequence/gt/sequence_1/00000000.png \ - demo/demo_out.png \ - --ref-path tests/data/frames/sequence/gt/sequence_1/00000001.png -``` - -#### 人脸图像超分辨率 - -您可以使用以下命令来测试要恢复的人脸图像。 - -```shell -python demo/restoration_face_demo.py \ - ${CONFIG_FILE} \ - ${CHECKPOINT_FILE} \ - ${IMAGE_FILE} \ - ${SAVE_FILE} \ - [--upscale-factor] \ - [--face-size] \ - [--imshow] \ - [--device ${GPU_ID}] -``` - -如果指定了 --imshow ,演示程序将使用 opencv 显示图像。例子: - -```shell -python demo/restoration_face_demo.py \ - configs/glean/glean_in128out1024_300k-4xb2_ffhq-celeba-hq.py \ - https://download.openmmlab.com/mmediting/restorers/glean/glean_in128out1024_4x2_300k_ffhq_celebahq_20210812-acbcb04f.pth \ - tests/data/image/face/000001.png \ - tests/data/image/face/pred.png \ - --upscale-factor 4 -``` - -#### 视频超分辨率 - -您可以使用以下命令来测试视频以进行恢复。 - -```shell -python demo/restoration_video_demo.py \ - ${CONFIG_FILE} \ - ${CHECKPOINT_FILE} \ - ${INPUT_DIR} \ - ${OUTPUT_DIR} \ - [--window-size=${WINDOW_SIZE}] \ - [--device ${GPU_ID}] -``` - -它同时支持滑动窗口框架和循环框架。 例子: - -EDVR: - -```shell -python demo/restoration_video_demo.py \ - configs/edvr/edvrm_wotsa_reds_600k-8xb8.py \ - https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth \ - data/Vid4/BIx4/calendar/ \ - demo/output \ - --window-size=5 -``` - -BasicVSR: - -```shell -python demo/restoration_video_demo.py \ - configs/basicvsr/basicvsr_2xb4_reds4.py \ - https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth \ - data/Vid4/BIx4/calendar/ \ - demo/output -``` - -复原的视频将保存在 ` demo/output/` 中。 - -#### 视频插帧 - -您可以使用以下命令来测试视频插帧。 - -```shell -python demo/video_interpolation_demo.py \ - ${CONFIG_FILE} \ - ${CHECKPOINT_FILE} \ - ${INPUT_DIR} \ - ${OUTPUT_DIR} \ - [--fps-multiplier ${FPS_MULTIPLIER}] \ - [--fps ${FPS}] -``` - -`${INPUT_DIR}` 和 `${OUTPUT_DIR}` 可以是视频文件路径或存放一系列有序图像的文件夹。 -若 `${OUTPUT_DIR}` 是视频文件地址,其帧率可由输入视频帧率和 `fps_multiplier` 共同决定,也可由 `fps` 直接给定(其中前者优先级更高)。例子: - -由输入视频帧率和 `fps_multiplier` 共同决定输出视频的帧率: - -```shell -python demo/video_interpolation_demo.py \ - configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py \ - https://download.openmmlab.com/mmediting/video_interpolators/cain/cain_b5_320k_vimeo-triple_20220117-647f3de2.pth \ - tests/data/frames/test_inference.mp4 \ - tests/data/frames/test_inference_vfi_out.mp4 \ - --fps-multiplier 2.0 -``` - -由 `fps` 直接给定输出视频的帧率: - -```shell -python demo/video_interpolation_demo.py \ - configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py \ - https://download.openmmlab.com/mmediting/video_interpolators/cain/cain_b5_320k_vimeo-triple_20220117-647f3de2.pth \ - tests/data/frames/test_inference.mp4 \ - tests/data/frames/test_inference_vfi_out.mp4 \ - --fps 60.0 -``` - -#### 图像生成 - -```shell -python demo/generation_demo.py \ - ${CONFIG_FILE} \ - ${CHECKPOINT_FILE} \ - ${IMAGE_FILE} \ - ${SAVE_FILE} \ - [--unpaired-path ${UNPAIRED_IMAGE_FILE}] \ - [--imshow] \ - [--device ${GPU_ID}] -``` - -如果指定了 `--unpaired-path` (用于 CycleGAN),模型将执行未配对的图像到图像的转换。 如果指定了 `--imshow` ,演示也将使用opencv显示图像。 例子: - -针对配对数据: - -```shell -python demo/generation_demo.py \ - configs/example_config.py \ - work_dirs/example_exp/example_model_20200202.pth \ - demo/demo.jpg \ - demo/demo_out.jpg -``` - -针对未配对数据(用 opencv 显示图像): - -```shell -python demo/generation_demo.py 、 - configs/example_config.py \ - work_dirs/example_exp/example_model_20200202.pth \ - demo/demo.jpg \ - demo/demo_out.jpg \ - --unpaired-path demo/demo_unpaired.jpg \ - --imshow -``` diff --git a/docs/zh_cn/notes/faq.md b/docs/zh_cn/faq.md similarity index 100% rename from docs/zh_cn/notes/faq.md rename to docs/zh_cn/faq.md diff --git a/docs/zh_cn/get_started.md b/docs/zh_cn/get_started.md deleted file mode 100644 index 4572c593f1..0000000000 --- a/docs/zh_cn/get_started.md +++ /dev/null @@ -1 +0,0 @@ -# 入门指引(待更新) diff --git a/docs/zh_cn/install.md b/docs/zh_cn/get_started/install.md similarity index 99% rename from docs/zh_cn/install.md rename to docs/zh_cn/get_started/install.md index a213d7b7cc..fb02528651 100644 --- a/docs/zh_cn/install.md +++ b/docs/zh_cn/get_started/install.md @@ -1,3 +1,5 @@ +# 安装 (待更新) + ```{warning} 中文版本的安装文档过于陈旧,请参考英文版本。 如果您希望帮助翻译英文版安装文档,请通过issue联系我们 diff --git a/docs/zh_cn/overview.md b/docs/zh_cn/get_started/overview.md similarity index 100% rename from docs/zh_cn/overview.md rename to docs/zh_cn/get_started/overview.md diff --git a/docs/zh_cn/quick_run.md b/docs/zh_cn/get_started/quick_run.md similarity index 98% rename from docs/zh_cn/quick_run.md rename to docs/zh_cn/get_started/quick_run.md index eef7d7543b..0552ef67ef 100644 --- a/docs/zh_cn/quick_run.md +++ b/docs/zh_cn/get_started/quick_run.md @@ -1,3 +1,5 @@ +# 快速运行 (待更新) + ## 使用预训练模型进行推理 我们提供用于在完整数据集上进行预训练模型评估和特定任务图像演示的测试脚本。 @@ -52,7 +54,7 @@ GPUS=8 ./tools/slurm_test.sh dev test configs/example_config.py work_dirs/exampl - `--deterministic`: 与 `--seed` 相关,此参数决定是否为 CUDNN 后端设置确定性的选项。如果指定该参数,会将 `torch.backends.cudnn.deterministic` 设置为 `True`,将 `torch.backends.cudnn.benchmark` 设置为 `False`。 - `--cfg-options`: 如果指明,这里的键值对将会被合并到配置文件中。 -注:目前,我们不使用像 [MMDetection](https://github.com/open-mmlab/mmdetection) 那样的 `--eval` 参数来指定评估指标。 评估指标在配置文件中给出(参见 [config.md](config.md))。 +注:目前,我们不使用像 [MMDetection](https://github.com/open-mmlab/mmdetection) 那样的 `--eval` 参数来指定评估指标。 评估指标在配置文件中给出(参见 [config.md](../user_guides/config.md))。 ## 训练一个模型 diff --git a/docs/zh_cn/advanced_guides/dataset.md b/docs/zh_cn/howto/dataset.md similarity index 100% rename from docs/zh_cn/advanced_guides/dataset.md rename to docs/zh_cn/howto/dataset.md diff --git a/docs/zh_cn/advanced_guides/losses.md b/docs/zh_cn/howto/losses.md similarity index 100% rename from docs/zh_cn/advanced_guides/losses.md rename to docs/zh_cn/howto/losses.md diff --git a/docs/zh_cn/advanced_guides/models/customize_models.md b/docs/zh_cn/howto/models.md similarity index 100% rename from docs/zh_cn/advanced_guides/models/customize_models.md rename to docs/zh_cn/howto/models.md diff --git a/docs/zh_cn/advanced_guides/transforms.md b/docs/zh_cn/howto/transforms.md similarity index 100% rename from docs/zh_cn/advanced_guides/transforms.md rename to docs/zh_cn/howto/transforms.md diff --git a/docs/zh_cn/index.rst b/docs/zh_cn/index.rst index 528bdf98c5..7a8e14da6e 100644 --- a/docs/zh_cn/index.rst +++ b/docs/zh_cn/index.rst @@ -4,53 +4,124 @@ 您可以在页面左下角切换中英文文档。 .. note:: - 目前英文版有更多的内容,如果您希望帮助我们翻译一部分文档,可以通过issue联系我们。 + 目前英文版有更多的内容,欢迎加入我们一起提升中文文档! + 您可以通过 issue,discussion 或者我们的社区群来联系我们! + .. toctree:: - :maxdepth: 3 - :caption: 开始你的第一步 + :maxdepth: 1 + :caption: MMEditing 社区 + + community/contributing.md + community/projects.md - 概述 - 入门指引 .. toctree:: - :maxdepth: 2 - :caption: 使用指南 + :maxdepth: 1 + :caption: 新手入门 + + 概述 + 安装 + 快速运行 - user_guides/index.rst + +.. toctree:: + :maxdepth: 1 + :caption: 基础教程 + + user_guides/config.md + user_guides/dataset_prepare.md + user_guides/inference.md + user_guides/train_test.md + user_guides/metrics.md + user_guides/visualization.md + user_guides/useful_tools.md + user_guides/deploy.md .. toctree:: :maxdepth: 2 :caption: 进阶教程 - advanced_guides/index.rst + advanced_guides/evaluator.md + advanced_guides/structures.md + advanced_guides/data_preprocessor.md + advanced_guides/data_flow.md .. toctree:: :maxdepth: 1 - :caption: 迁移 + :caption: 开发指南 + + howto/models.md + howto/dataset.md + howto/transforms.md + howto/losses.md - migration.md .. toctree:: :maxdepth: 1 - :caption: 接口文档(英文) + :caption: 常见问题 + + faq.md - api.rst .. toctree:: - :maxdepth: 1 + :maxdepth: 2 :caption: 模型库 - model_zoo.md + model_zoo/index.rst + + +.. toctree:: + :maxdepth: 1 + :caption: 数据集库 + + dataset_zoo/index.rst + +.. toctree:: + :maxdepth: 1 + :caption: 变更日志 + + changelog.md + + +.. toctree:: + :maxdepth: 2 + :caption: 接口文档(英文) + + mmedit.apis.inferencers + mmedit.structures + mmedit.datasets + mmedit.datasets.transforms + mmedit.evaluation + mmedit.visualization + mmedit.engine.hooks + mmedit.engine.logging + mmedit.engine.optimizers + mmedit.engine.runner + mmedit.engine.schedulers + mmedit.models.base_archs + mmedit.models.base_models + mmedit.models.losses + mmedit.models.data_preprocessors + mmedit.models.utils + mmedit.models.editors + mmedit.utils .. toctree:: :maxdepth: 1 - :caption: 说明 + :caption: 迁移指南 + + migration/overview.md + migration/runtime.md + migration/models.md + migration/eval_test.md + migration/schedule.md + migration/data.md + migration/distributed_train.md + migration/optimizers.md + migration/visualization.md + migration/amp.md - notes/contribution_guide.md - notes/projects.md - notes/changelog.md - notes/faq.md .. toctree:: :caption: 语言切换 diff --git a/docs/zh_cn/merge_docs.sh b/docs/zh_cn/merge_docs.sh deleted file mode 100755 index 7477f7e88c..0000000000 --- a/docs/zh_cn/merge_docs.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env bash - -sed -i '$a\\n


\n' ../../configs/inpainting/*/README_zh-CN.md -sed -i '$a\\n

\n' ../../configs/*/README_zh-CN.md -sed -i '$a\\n

\n' ../../configs/restorers/*/README_zh-CN.md -sed -i '$a\\n

\n' ../../configs/synthesizers/*/README_zh-CN.md - -# gather models -cat ../../configs/inpainting/*/README_zh-CN.md | sed "s/md###t/html#t/g" | sed "s/#/#&/" | sed '1i\# 补全模型' | sed 's/](\/docs\//](/g' | sed 's=](/=](https://github.com/open-mmlab/mmediting/tree/master/=g' >inpainting_models.md -cat ../../configs/*/README_zh-CN.md | sed "s/md###t/html#t/g" | sed "s/#/#&/" | sed '1i\# 抠图模型' | sed 's/](\/docs\//](/g' | sed 's=](/=](https://github.com/open-mmlab/mmediting/tree/master/=g' >mattors_models.md -cat ../../configs/restorers/*/README_zh-CN.md | sed "s/md###t/html#t/g" | sed "s/#/#&/" | sed '1i\# 超分辨率模型' | sed 's/](\/docs\//](/g' | sed 's=](/=](https://github.com/open-mmlab/mmediting/tree/master/=g' >restorers_models.md -cat ../../configs/synthesizers/*/README_zh-CN.md | sed "s/md###t/html#t/g" | sed "s/#/#&/" | sed '1i\# 生成模型' | sed 's/](\/docs\//](/g' | sed 's=](/=](https://github.com/open-mmlab/mmediting/tree/master/=g' >synthesizers_models.md - -# gather datasets -cat ../../tools/data/generation/README_zh-CN.md > generation_datasets.md -cat ../../tools/data/inpainting/README_zh-CN.md > inpainting_datasets.md -cat ../../tools/data/matting/README_zh-CN.md > matting_datasets.md -cat ../../tools/data/super-resolution/README_zh-CN.md > sr_datasets.md -cat ../../tools/data/video-interpolation/README.md > vfi_datasets.md - -sed -i 's=(paired-pix2pix/README_zh-CN.md)=(#paired-dataset-for-pix2pix)=g' generation_datasets.md -sed -i 's=(unpaired-cyclegan/README_zh-CN.md)=(#unpaired-dataset-for-cyclegan)=g' generation_datasets.md -sed -i 's=(paris-street-view/README_zh-CN.md)=(#paris-street-view-dataset)=g' inpainting_datasets.md -sed -i 's=(celeba-hq/README_zh-CN.md)=(#celeba-hq-dataset)=g' inpainting_datasets.md -sed -i 's=(places365/README_zh-CN.md)=(#places365-dataset)=g' inpainting_datasets.md -sed -i 's=(comp1k/README_zh-CN.md)=(#composition-1k-dataset)=g' matting_datasets.md -sed -i 's=(div2k/README_zh-CN.md)=(#div2k-dataset)=g' sr_datasets.md -sed -i 's=(reds/README_zh-CN.md)=(#reds-dataset)=g' sr_datasets.md -sed -i 's=(vimeo90k/README_zh-CN.md)=(#vimeo90k-dataset)=g' sr_datasets.md -sed -i 's=(vimeo90k-triplet/README.md)=(#vimeo90k-triplet-dataset)=g' vfi_datasets.md - -cat ../../tools/data/generation/*/README_zh-CN.md | sed 's/# Preparing/# /g' | sed "s/#/#&/" | sed 's/](\/docs\//](/g' | sed 's=](/=](https://github.com/open-mmlab/mmediting/tree/master/=g' >> generation_datasets.md -cat ../../tools/data/inpainting/*/README_zh-CN.md | sed 's/# Preparing/# /g' | sed "s/#/#&/" | sed 's/](\/docs\//](/g' | sed 's=](/=](https://github.com/open-mmlab/mmediting/tree/master/=g' >> inpainting_datasets.md -cat ../../tools/data/matting/*/README_zh-CN.md | sed 's/# Preparing/# /g' | sed "s/#/#&/" | sed 's/](\/docs\//](/g' | sed 's=](/=](https://github.com/open-mmlab/mmediting/tree/master/=g' >> matting_datasets.md -cat ../../tools/data/super-resolution/*/README_zh-CN.md | sed 's/# Preparing/# /g' | sed "s/#/#&/" | sed 's/](\/docs\//](/g' | sed 's=](/=](https://github.com/open-mmlab/mmediting/tree/master/=g' >> sr_datasets.md - -# merge configs -cat configs/config_*.md | sed "s/#/#&/" >> config.md diff --git a/docs/zh_cn/migration.md b/docs/zh_cn/migration.md deleted file mode 100644 index 46892c7bd9..0000000000 --- a/docs/zh_cn/migration.md +++ /dev/null @@ -1 +0,0 @@ -# 迁移(待更新) diff --git a/docs/zh_cn/migration/amp.md b/docs/zh_cn/migration/amp.md new file mode 100644 index 0000000000..b1f944aff7 --- /dev/null +++ b/docs/zh_cn/migration/amp.md @@ -0,0 +1 @@ +# 混合精度训练的迁移(待更新) diff --git a/docs/zh_cn/migration/data.md b/docs/zh_cn/migration/data.md new file mode 100644 index 0000000000..e73a39f1cc --- /dev/null +++ b/docs/zh_cn/migration/data.md @@ -0,0 +1 @@ +# 数据的迁移(待更新) diff --git a/docs/zh_cn/migration/distributed_train.md b/docs/zh_cn/migration/distributed_train.md new file mode 100644 index 0000000000..2cde55e005 --- /dev/null +++ b/docs/zh_cn/migration/distributed_train.md @@ -0,0 +1 @@ +# 分布式训练的迁移(待更新) diff --git a/docs/zh_cn/migration/eval_test.md b/docs/zh_cn/migration/eval_test.md new file mode 100644 index 0000000000..e403806d33 --- /dev/null +++ b/docs/zh_cn/migration/eval_test.md @@ -0,0 +1 @@ +# 评测与测试的迁移(待更新) diff --git a/docs/zh_cn/migration/models.md b/docs/zh_cn/migration/models.md new file mode 100644 index 0000000000..8704a85160 --- /dev/null +++ b/docs/zh_cn/migration/models.md @@ -0,0 +1 @@ +# 模型的迁移(待更新) diff --git a/docs/zh_cn/migration/optimizers.md b/docs/zh_cn/migration/optimizers.md new file mode 100644 index 0000000000..36f4737860 --- /dev/null +++ b/docs/zh_cn/migration/optimizers.md @@ -0,0 +1 @@ +# 优化器的迁移(待更新) diff --git a/docs/zh_cn/migration/overview.md b/docs/zh_cn/migration/overview.md new file mode 100644 index 0000000000..1d98fbb249 --- /dev/null +++ b/docs/zh_cn/migration/overview.md @@ -0,0 +1 @@ +# 概览(待更新) diff --git a/docs/zh_cn/migration/runtime.md b/docs/zh_cn/migration/runtime.md new file mode 100644 index 0000000000..f9a370a95a --- /dev/null +++ b/docs/zh_cn/migration/runtime.md @@ -0,0 +1 @@ +# 运行设置的迁移(待更新) diff --git a/docs/zh_cn/migration/schedule.md b/docs/zh_cn/migration/schedule.md new file mode 100644 index 0000000000..1c51265be7 --- /dev/null +++ b/docs/zh_cn/migration/schedule.md @@ -0,0 +1 @@ +# 调度器的迁移(待更新) diff --git a/docs/zh_cn/migration/visualization.md b/docs/zh_cn/migration/visualization.md new file mode 100644 index 0000000000..a2035e155c --- /dev/null +++ b/docs/zh_cn/migration/visualization.md @@ -0,0 +1 @@ +# 可视化的迁移(待更新) diff --git a/docs/zh_cn/model_zoo.md b/docs/zh_cn/model_zoo.md deleted file mode 100644 index 6314b361a2..0000000000 --- a/docs/zh_cn/model_zoo.md +++ /dev/null @@ -1 +0,0 @@ -# 总览(待更新) diff --git a/docs/zh_cn/notes.md b/docs/zh_cn/notes.md deleted file mode 100644 index b1459db891..0000000000 --- a/docs/zh_cn/notes.md +++ /dev/null @@ -1,3 +0,0 @@ -## 基准 - -详情请参阅 [model_zoo](https://mmediting.readthedocs.io/en/latest/modelzoo.html)。 diff --git a/docs/zh_cn/notes/contribution_guide.md b/docs/zh_cn/notes/contribution_guide.md deleted file mode 100644 index d1cf43e8e1..0000000000 --- a/docs/zh_cn/notes/contribution_guide.md +++ /dev/null @@ -1 +0,0 @@ -# 贡献指南(待更新) diff --git a/docs/zh_cn/tools_scripts.md b/docs/zh_cn/tools_scripts.md deleted file mode 100644 index 8be45280fe..0000000000 --- a/docs/zh_cn/tools_scripts.md +++ /dev/null @@ -1,351 +0,0 @@ -## 实用工具 - -我们在 `tools/` 目录下提供了很多有用的工具。 - -### 获取 FLOP 和参数量(实验性) - -我们提供了一个改编自 [flops-counter.pytorch](https://github.com/sovrasov/flops-counter.pytorch) 的脚本来计算模型的 FLOP 和参数量。 - -```shell -python tools/get_flops.py ${CONFIG_FILE} [--shape ${INPUT_SHAPE}] -``` - -例如, - -```shell -python tools/get_flops.py configs/resotorer/srresnet.py --shape 40 40 -``` - -你会得到以下的结果。 - -``` -============================== -Input shape: (3, 40, 40) -Flops: 4.07 GMac -Params: 1.52 M -============================== -``` - -**注**:此工具仍处于实验阶段,我们不保证数字正确。 您可以将结果用于简单的比较,但在技术报告或论文中采用它之前,请仔细检查它。 - -(1) FLOPs 与输入形状有关,而参数量与输入形状无关。默认输入形状为 (1, 3, 250, 250)。 -(2) 一些运算符不计入 FLOP,如 GN 和自定义运算符。 -你可以通过修改 [`mmcv/cnn/utils/flops_counter.py`](https://github.com/open-mmlab/mmcv/blob/master/mmcv/cnn/utils/flops_counter.py) 来添加对新运算符的支持。 - -### 发布模型 - -在将模型上传到 AWS 之前,您可能需要 -(1) 将模型权重转换为 CPU tensors, (2) 删除优化器状态,和 -(3) 计算模型权重文件的哈希并将哈希 ID 附加到文件名。 - -```shell -python tools/publish_model.py ${INPUT_FILENAME} ${OUTPUT_FILENAME} -``` - -例如, - -```shell -python tools/publish_model.py work_dirs/example_exp/latest.pth example_model_20200202.pth -``` - -最终输出文件名将是 `example_model_20200202-{hash id}.pth`. - -### 转换为 ONNX(实验性) - -我们提供了一个脚本将模型转换为 [ONNX](https://github.com/onnx/onnx) 格式。 转换后的模型可以通过 [Netron](https://github.com/lutzroeder/netron) 等工具进行可视化。此外,我们还支持比较 Pytorch 和 ONNX 模型之间的输出结果。 - -```bash -python tools/pytorch2onnx.py - ${CFG_PATH} \ - ${CHECKPOINT_PATH} \ - ${MODEL_TYPE} \ - ${IMAGE_PATH} \ - --trimap-path ${TRIMAP_PATH} \ - --output-file ${OUTPUT_ONNX} \ - --show \ - --verify \ - --dynamic-export -``` - -参数说明: - -- `config` : 模型配置文件的路径。 -- `checkpoint` : 模型模型权重文件的路径。 -- `model_type` : 配置文件的模型类型,选项: `inpainting`, `mattor`, `restorer`, `synthesizer`。 -- `image_path` : 输入图像文件的路径。 -- `--trimap-path` : 输入三元图文件的路径,用于 mattor 模型。 -- `--output-file`: 输出 ONNX 模型的路径。默认为 `tmp.onnx`。 -- `--opset-version` : ONNX opset 版本。默认为 11。 -- `--show`: 确定是否打印导出模型的架构。默认为 `False`。 -- `--verify`: 确定是否验证导出模型的正确性。默认为 `False`。 -- `--dynamic-export`: 确定是否导出具有动态输入和输出形状的 ONNX 模型。默认为 `False`。 - -**注**:此工具仍处于试验阶段。目前不支持某些自定义运算符。我们现在只支持 `mattor` 和 `restorer`。 - -#### 支持导出到 ONNX 的模型列表 - -下表列出了保证可导出到 ONNX 并可在 ONNX Runtime 中运行的模型。 - -| 模型 | 配置 | 动态形状 | 批量推理 | 备注 | -| :------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------: | :------: | :--: | -| ESRGAN | [esrgan_x4c64b23g32_g1_400k_div2k.py](https://github.com/open-mmlab/mmediting/blob/master/configs/restorers/esrgan/esrgan_x4c64b23g32_g1_400k_div2k.py) | Y | Y | | -| ESRGAN | [esrgan_psnr_x4c64b23g32_g1_1000k_div2k.py](https://github.com/open-mmlab/mmediting/blob/master/configs/restorers/esrgan/esrgan_psnr_x4c64b23g32_g1_1000k_div2k.py) | Y | Y | | -| SRCNN | [srcnn_x4k915_g1_1000k_div2k.py](https://github.com/open-mmlab/mmediting/blob/master/configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py) | Y | Y | | -| DIM | [dim_stage3_v16_pln_1x1_1000k_comp1k.py](https://github.com/open-mmlab/mmediting/blob/master/configs/dim/dim_stage3_v16_pln_1x1_1000k_comp1k.py) | Y | Y | | -| GCA | [gca_r34_4x10_200k_comp1k.py](https://github.com/open-mmlab/mmediting/blob/master/configs/gca/gca_r34_4x10_200k_comp1k.py) | N | Y | | -| IndexNet | [indexnet_mobv2_1x16_78k_comp1k.py](https://github.com/open-mmlab/mmediting/blob/master/configs/indexnet/indexnet_mobv2_1x16_78k_comp1k.py) | Y | Y | | - -**注**: - -- *以上所有模型均使用 Pytorch==1.6.0 和 onnxruntime==1.5.1* -- 如果您遇到上面列出的模型的任何问题,请创建一个 issue,我们会尽快处理。对于列表中未包含的型号,请尝试自行解决。 -- 由于此功能是实验性的并且可能会快速更改,请始终尝试使用最新的 `mmcv` 和 `mmedit`。 - -### 将 ONNX 转换为 TensorRT(实验性) - -我们还提供了将 [ONNX](https://github.com/onnx/onnx) 模型转换为 [TensorRT](https://github.com/NVIDIA/TensorRT) 格式的脚本。 此外,我们支持比较 ONNX 和 TensorRT 模型之间的输出结果。 - -```bash -python tools/onnx2tensorrt.py - ${CFG_PATH} \ - ${MODEL_TYPE} \ - ${IMAGE_PATH} \ - ${INPUT_ONNX} \ - --trt-file ${OUT_TENSORRT} \ - --max-shape INT INT INT INT \ - --min-shape INT INT INT INT \ - --workspace-size INT \ - --fp16 \ - --show \ - --verify \ - --verbose -``` - -参数说明: - -- `config` : 模型配置文件的路径。 -- `model_type` :配置文件的模型类型,选项: `inpainting`, `mattor`, `restorer`, `synthesizer`。 -- `img_path` : 输入图像文件的路径。 -- `onnx_file` : 输入 ONNX 文件的路径。 -- `--trt-file` : 输出 TensorRT 模型的路径。默认为 `tmp.trt`。 -- `--max-shape` : 模型输入的最大形状。 -- `--min-shape` : 模型输入的最小形状。 -- `--workspace-size`: 以 GiB 为单位的最大工作空间大小。默认为 1 GiB。 -- `--fp16`: 确定是否以 fp16 模式导出 TensorRT。默认为 `False`。 -- `--show`: 确定是否显示 ONNX 和 TensorRT 的输出。默认为 `False`。 -- `--verify`: 确定是否验证导出模型的正确性。默认为 `False`。 -- `--verbose`: 确定在创建 TensorRT 引擎时是否详细记录日志消息。默认为 `False`。 - -**注**:此工具仍处于试验阶段。 目前不支持某些自定义运算符。 我们现在只支持 `restorer`。 在生成 SRCNN 的 ONNX 文件时,将 SCRNN 模型中的 'bicubic' 替换为 'bilinear' \[此处\](https://github.com/open-mmlab/mmediting/blob/764e6065e315b7d0033762038fcbf0bb1c570d4d/mmedit.bones/modelsrnn py#L40)。 因为 TensorRT 目前不支持 bicubic 插值,最终性能将下降约 4%。 - -#### 支持导出到 TensorRT 的模型列表 - -下表列出了保证可导出到 TensorRT 引擎并可在 TensorRT 中运行的模型。 - -| 模型 | 配置 | 动态形状 | 批量推理 | 备注 | -| :----: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :------: | :------: | :-----------------------------------: | -| ESRGAN | [esrgan_x4c64b23g32_g1_400k_div2k.py](https://github.com/open-mmlab/mmediting/blob/master/configs/restorers/esrgan/esrgan_x4c64b23g32_g1_400k_div2k.py) | Y | Y | | -| ESRGAN | [esrgan_psnr_x4c64b23g32_g1_1000k_div2k.py](https://github.com/open-mmlab/mmediting/blob/master/configs/restorers/esrgan/esrgan_psnr_x4c64b23g32_g1_1000k_div2k.py) | Y | Y | | -| SRCNN | [srcnn_x4k915_g1_1000k_div2k.py](https://github.com/open-mmlab/mmediting/blob/master/configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py) | Y | Y | 'bicubic' 上采样必须替换为 'bilinear' | - -**注**: - -- *以上所有模型均使用 Pytorch==1.8.1、onnxruntime==1.7.0 和 tensorrt==7.2.3.4 进行测试* -- 如果您遇到上面列出的模型的任何问题,请创建一个问题,我们会尽快处理。 对于列表中未包含的型号,请尝试自行解决。 -- 由于此功能是实验性的并且可能会快速更改,因此请始终尝试使用最新的 `mmcv` 和 `mmedit`。 - -### 评估 ONNX 和 TensorRT 模型(实验性) - -我们在 `tools/deploy_test.py` 中提供了评估 TensorRT 和 ONNX 模型的方法。 - -#### 先决条件 - -要评估 ONNX 和 TensorRT 模型,应先安装 onnx、onnxruntime 和 TensorRT。遵循 [mmcv 中的 ONNXRuntime](https://mmcv.readthedocs.io/en/latest/onnxruntime_op.html) 和 \[mmcv 中的 TensorRT 插件\](https://github.com/open-mmlab/mmcv/blob/master/docs/tensorrt_plugin.md%EF%BC%89%E4%BD%BF%E7%94%A8 ONNXRuntime 自定义操作和 TensorRT 插件安装 `mmcv-full`。 - -#### 用法 - -```bash -python tools/deploy_test.py \ - ${CONFIG_FILE} \ - ${MODEL_PATH} \ - ${BACKEND} \ - --out ${OUTPUT_FILE} \ - --save-path ${SAVE_PATH} \ - ----cfg-options ${CFG_OPTIONS} \ -``` - -#### 参数说明: - -- `config`: 模型配置文件的路径。 -- `model`: TensorRT 或 ONNX 模型文件的路径。 -- `backend`: 用于测试的后端,选择 tensorrt 或 onnxruntime。 -- `--out`: pickle 格式的输出结果文件的路径。 -- `--save-path`: 存储图像的路径,如果没有给出,则不会保存图像。 -- `--cfg-options`: 覆盖使用的配置文件中的一些设置,`xxx=yyy` 格式的键值对将被合并到配置文件中。 - -#### 结果和模型 - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ModelConfigDatasetMetricPyTorchONNX RuntimeTensorRT FP32TensorRT FP16
ESRGAN - esrgan_x4c64b23g32_g1_400k_div2k.py - Set5PSNR28.270028.261928.261928.2616
SSIM0.77780.77840.77840.7783
Set14PSNR24.632824.629024.629024.6274
SSIM0.64910.64940.64940.6494
DIV2KPSNR26.653126.653226.653226.6532
SSIM0.73400.73400.73400.7340
ESRGAN - esrgan_psnr_x4c64b23g32_g1_1000k_div2k.py - Set5PSNR30.642830.630730.630730.6305
SSIM0.85590.85650.85650.8566
Set14PSNR27.054327.042227.042227.0411
SSIM0.74470.74500.74500.7449
DIV2KPSNR29.335429.335429.335429.3339
SSIM0.82630.82630.82630.8263
SRCNN - srcnn_x4k915_g1_1000k_div2k.py - Set5PSNR28.431628.412027.214427.2127
SSIM0.80990.81060.77820.7781
Set14PSNR25.648625.636724.861324.8599
SSIM0.70140.70150.66740.6673
DIV2KPSNR27.746027.746026.989126.9862
SSIM0.78540.785430.76050.7604
- -**注**: - -- 所有 ONNX 和 TensorRT 模型都使用数据集上的动态形状进行评估,图像根据原始配置文件进行预处理。 -- 此工具仍处于试验阶段,我们目前仅支持 `restorer`。 diff --git a/docs/zh_cn/user_guides/config.md b/docs/zh_cn/user_guides/config.md index c4aa1e3768..d147aa5c29 100644 --- a/docs/zh_cn/user_guides/config.md +++ b/docs/zh_cn/user_guides/config.md @@ -1 +1,675 @@ -# 配置文件(待更新) +# 教程 1: 了解配置文件(待更新) + +mmedit 采用基于 python 文件的配置系统,您可以在 `$MMEditing/configs` 下查看预置的配置文件。 + +## 配置文件命名风格 + +配置文件按照下面的风格命名。我们建议社区贡献者使用同样的风格。 + +```bash +{model}_[model setting]_{backbone}_[refiner]_[norm setting]_[misc]_[gpu x batch_per_gpu]_{schedule}_{dataset} +``` + +`{xxx}` 是必填字段,`[yyy]` 是可选的。 + +- `{model}`: 模型种类,例如 `srcnn`, `dim` 等等。 +- `[model setting]`: 特定设置一些模型,例如,输入图像 `resolution` , 训练 `stage name`。 +- `{backbone}`: 主干网络种类,例如 `r50` (ResNet-50)、`x101` (ResNeXt-101)。 +- `{refiner}`: 精炼器种类,例如 `pln` 简单精炼器模型 +- `[norm_setting]`: 指定归一化设置,默认为批归一化,其他归一化可以设为: `bn`(批归一化), `gn` (组归一化), `syncbn` (同步批归一化)。 +- `[misc]`: 模型中各式各样的设置/插件,例如 `dconv`, `gcb`, `attention`, `mstrain`。 +- `[gpu x batch_per_gpu]`: GPU数目 和每个 GPU 的样本数, 默认为 `8x2 `。 +- `{schedule}`: 训练策略,如 `20k`, `100k` 等,意思是 `20k` 或 `100k` 迭代轮数。 +- `{dataset}`: 数据集,如 `places`(图像补全)、`comp1k`(抠图)、`div2k`(图像恢复)和 `paired`(图像生成)。 + +## 配置文件 - 生成 + +与 [MMDetection](https://github.com/open-mmlab/mmdetection) 一样,我们将模块化和继承设计融入我们的配置系统,以方便进行各种实验。 + +## 示例 - pix2pix + +为了帮助用户对完整的配置和生成系统中的模块有一个基本的了解,我们对 pix2pix 的配置做如下简要说明。 +更详细的用法和各个模块对应的替代方案,请参考 API 文档。 + +```python +# 模型设置 +model = dict( + type='Pix2Pix', # 合成器名称 + generator=dict( + type='UnetGenerator', # 生成器名称 + in_channels=3, # 生成器的输入通道数 + out_channels=3, # 生成器的输出通道数 + num_down=8, # # 生成器中下采样的次数 + base_channels=64, # 生成器最后卷积层的通道数 + norm_cfg=dict(type='BN'), # 归一化层的配置 + use_dropout=True, # 是否在生成器中使用 dropout + init_cfg=dict(type='normal', gain=0.02)), # 初始化配置 + discriminator=dict( + type='PatchDiscriminator', # 判别器的名称 + in_channels=6, # 判别器的输入通道数 + base_channels=64, # 判别器第一卷积层的通道数 + num_conv=3, # 判别器中堆叠的中间卷积层(不包括输入和输出卷积层)的数量 + norm_cfg=dict(type='BN'), # 归一化层的配置 + init_cfg=dict(type='normal', gain=0.02)), # 初始化配置 + gan_loss=dict( + type='GANLoss', # GAN 损失的名称 + gan_type='vanilla', # GAN 损失的类型 + real_label_val=1.0, # GAN 损失函数中真实标签的值 + fake_label_val=0.0, # GAN 损失函数中伪造标签的值 + loss_weight=1.0), # GAN 损失函数的权重 + pixel_loss=dict(type='L1Loss', loss_weight=100.0, reduction='mean')) +# 模型训练和测试设置 +train_cfg = dict( + direction='b2a') # pix2pix 的图像到图像的转换方向 (模型训练的方向,和测试方向一致)。模型默认: a2b +test_cfg = dict( + direction='b2a', # pix2pix 的图像到图像的转换方向 (模型测试的方向,和训练方向一致)。模型默认: a2b + show_input=True) # 保存 pix2pix 的测试图像时是否显示输入的真实图像 + +# 数据设置 +train_dataset_type = 'GenerationPairedDataset' # 训练数据集的类型 +val_dataset_type = 'GenerationPairedDataset' # 验证/测试数据集类型 +img_norm_cfg = dict(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) # 输入图像归一化配置 +train_pipeline = [ + dict( + type='LoadPairedImageFromFile', # 从文件路径加载图像对 + io_backend='disk', # 存储图像的 IO 后端 + key='pair', # 查找对应路径的关键词 + flag='color'), # 加载图像标志 + dict( + type='Resize', # 图像大小调整 + keys=['img_a', 'img_b'], # 要调整大小的图像的关键词 + scale=(286, 286), # 调整图像大小的比例 + interpolation='bicubic'), # 调整图像大小时用于插值的算法 + dict( + type='FixedCrop', # 固定裁剪,在特定位置将配对图像裁剪为特定大小以训练 pix2pix + keys=['img_a', 'img_b'], # 要裁剪的图像的关键词 + crop_size=(256, 256)), # 裁剪图像的大小 + dict( + type='Flip', # 翻转图像 + keys=['img_a', 'img_b'], # 要翻转的图像的关键词 + direction='horizontal'), # 水平或垂直翻转图像 + dict( + type='RescaleToZeroOne', # 将图像从 [0, 255] 缩放到 [0, 1] + keys=['img_a', 'img_b']), # 要重新缩放的图像的关键词 + dict( + type='Normalize', # 图像归一化 + keys=['img_a', 'img_b'], # 要归一化的图像的关键词 + to_rgb=True, # 是否将图像通道从 BGR 转换为 RGB + **img_norm_cfg), # 图像归一化配置(`img_norm_cfg` 的定义见上文) + dict( + type='ToTensor', # 将图像转化为 Tensor + keys=['img_a', 'img_b']), # 要从图像转换为 Tensor 的图像的关键词 + dict( + type='Collect', # 决定数据中哪些键应该传递给合成器 + keys=['img_a', 'img_b'], # 图像的关键词 + meta_keys=['img_a_path', 'img_b_path']) # 图片的元关键词 +] +test_pipeline = [ + dict( + type='LoadPairedImageFromFile', # 从文件路径加载图像对 + io_backend='disk', # 存储图像的 IO 后端 + key='pair', # 查找对应路径的关键词 + flag='color'), # 加载图像标志 + dict( + type='Resize', # 图像大小调整 + keys=['img_a', 'img_b'], # 要调整大小的图像的关键词 + scale=(256, 256), # 调整图像大小的比例 + interpolation='bicubic'), # 调整图像大小时用于插值的算法 + dict( + type='RescaleToZeroOne', # 将图像从 [0, 255] 缩放到 [0, 1] + keys=['img_a', 'img_b']), # 要重新缩放的图像的关键词 + dict( + type='Normalize', # 图像归一化 + keys=['img_a', 'img_b'], # 要归一化的图像的关键词 + to_rgb=True, # 是否将图像通道从 BGR 转换为 RGB + **img_norm_cfg), # 图像归一化配置(`img_norm_cfg` 的定义见上文) + dict( + type='ToTensor', # 将图像转化为 Tensor + keys=['img_a', 'img_b']), # 要从图像转换为 Tensor 的图像的关键词 + dict( + type='Collect', # 决定数据中哪些键应该传递给合成器 + keys=['img_a', 'img_b'], # 图像的关键词 + meta_keys=['img_a_path', 'img_b_path']) # 图片的元关键词 +] +data_root = 'data/pix2pix/facades' # 数据的根路径 +data = dict( + samples_per_gpu=1, # 单个 GPU 的批量大小 + workers_per_gpu=4, # 为每个 GPU 预取数据的 Worker 数 + drop_last=True, # 是否丢弃训练中的最后一批数据 + val_samples_per_gpu=1, # 验证中单个 GPU 的批量大小 + val_workers_per_gpu=0, # 在验证中为每个 GPU 预取数据的 Worker 数 + train=dict( # 训练数据集配置 + type=train_dataset_type, + dataroot=data_root, + pipeline=train_pipeline, + test_mode=False), + val=dict( # 验证数据集配置 + type=val_dataset_type, + dataroot=data_root, + pipeline=test_pipeline, + test_mode=True), + test=dict( # 测试数据集配置 + type=val_dataset_type, + dataroot=data_root, + pipeline=test_pipeline, + test_mode=True)) + +# 优化器 +optimizers = dict( # 用于构建优化器的配置,支持 PyTorch 中所有优化器,且参数与 PyTorch 中对应优化器相同 + generator=dict(type='Adam', lr=2e-4, betas=(0.5, 0.999)), + discriminator=dict(type='Adam', lr=2e-4, betas=(0.5, 0.999))) + +# 学习策略 +lr_config = dict(policy='Fixed', by_epoch=False) # 用于注册 LrUpdater 钩子的学习率调度程序配置 + +# 检查点保存 +checkpoint_config = dict(interval=4000, save_optimizer=True, by_epoch=False) # 配置检查点钩子,实现参考 https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/checkpoint.py +evaluation = dict( # 构建验证钩子的配置 + interval=4000, # 验证区间 + save_image=True) # 是否保存图片 +log_config = dict( # 配置注册记录器钩子 + interval=100, # 打印日志的时间间隔 + hooks=[ + dict(type='TextLoggerHook', by_epoch=False), # 用于记录训练过程的记录器 + # dict(type='TensorboardLoggerHook') # 还支持 Tensorboard 记录器 + ]) +visual_config = None # 构建可视化钩子的配置 + +# 运行设置 +total_iters = 80000 # 训练模型的总迭代次数 +cudnn_benchmark = True # 设置 cudnn_benchmark +dist_params = dict(backend='nccl') # 设置分布式训练的参数,端口也可以设置 +log_level = 'INFO' # 日志级别 +load_from = None # 从给定路径加载模型作为预训练模型。 这不会恢复训练 +resume_from = None # 从给定路径恢复检查点,当检查点被保存时,训练将从该 epoch 恢复 +workflow = [('train', 1)] # runner 的工作流程。 [('train', 1)] 表示只有一个工作流程,名为 'train' 的工作流程执行一次。 训练当前生成模型时保持不变 +exp_name = 'pix2pix_facades' # 实验名称 +work_dir = f'./work_dirs/{exp_name}' # 保存当前实验的模型检查点和日志的目录 +``` + +## 配置文件 - 补全 + +## 配置名称样式 + +与 [MMDetection](https://github.com/open-mmlab/mmdetection) 一样,我们将模块化和继承设计融入我们的配置系统,以方便进行各种实验。 + +## 配置字段说明 + +为了帮助用户对完整的配置和修复系统中的模块有一个基本的了解,我们对 Global&Local 的配置作如下简要说明。更详细的用法和各个模块对应的替代方案,请参考 API 文档。 + +```python +model = dict( + type='GLInpaintor', # 补全器的名称 + encdec=dict( + type='GLEncoderDecoder', # 编码器-解码器的名称 + encoder=dict(type='GLEncoder', norm_cfg=dict(type='SyncBN')), # 编码器的配置 + decoder=dict(type='GLDecoder', norm_cfg=dict(type='SyncBN')), # 解码器的配置 + dilation_neck=dict( + type='GLDilationNeck', norm_cfg=dict(type='SyncBN'))), # 扩颈的配置 + disc=dict( + type='GLDiscs', # 判别器的名称 + global_disc_cfg=dict( + in_channels=3, # 判别器的输入通道数 + max_channels=512, # 判别器中的最大通道数 + fc_in_channels=512 * 4 * 4, # 最后一个全连接层的输入通道 + fc_out_channels=1024, # 最后一个全连接层的输出通道 + num_convs=6, # 判别器中使用的卷积数量 + norm_cfg=dict(type='SyncBN') # 归一化层的配置 + ), + local_disc_cfg=dict( + in_channels=3, # 判别器的输入通道数 + max_channels=512, # 判别器中的最大通道数 + fc_in_channels=512 * 4 * 4, # 最后一个全连接层的输入通道 + fc_out_channels=1024, # 最后一个全连接层的输出通道 + num_convs=5, # 判别器中使用的卷积数量 + norm_cfg=dict(type='SyncBN') # 归一化层的配置 + ), + ), + loss_gan=dict( + type='GANLoss', # GAN 损失的名称 + gan_type='vanilla', # GAN 损失的类型 + loss_weight=0.001 # GAN 损失函数的权重 + ), + loss_l1_hole=dict( + type='L1Loss', # L1 损失的类型 + loss_weight=1.0 # L1 损失函数的权重 + ), + pretrained=None) # 预训练权重的路径 + +train_cfg = dict( + disc_step=1, # 训练生成器之前训练判别器的迭代次数 + iter_tc=90000, # 预热生成器的迭代次数 + iter_td=100000, # 预热判别器的迭代次数 + start_iter=0, # 开始的迭代 + local_size=(128, 128)) # 图像块的大小 +test_cfg = dict(metrics=['l1']) # 测试的配置 + +dataset_type = 'ImgInpaintingDataset' # 数据集类型 +input_shape = (256, 256) # 输入图像的形状 + +train_pipeline = [ + dict(type='LoadImageFromFile', key='gt_img'), # 加载图片的配置 + dict( + type='LoadMask', # 加载掩码 + mask_mode='bbox', # 掩码的类型 + mask_config=dict( + max_bbox_shape=(128, 128), # 检测框的形状 + max_bbox_delta=40, # 检测框高宽的变化 + min_margin=20, # 检测框到图片边界的最小距离 + img_shape=input_shape)), # 输入图像的形状 + dict( + type='Crop', # 裁剪 + keys=['gt_img'], # 要裁剪的图像的关键词 + crop_size=(384, 384), # 裁剪图像块的大小 + random_crop=True, # 是否使用随机裁剪 + ), + dict( + type='Resize', # 图像大小调整 + keys=['gt_img'], # 要调整大小的图像的关键词 + scale=input_shape, # 调整图像大小的比例 + keep_ratio=False, # 调整大小时是否保持比例 + ), + dict( + type='Normalize', # 图像归一化 + keys=['gt_img'], # 要归一化的图像的关键词 + mean=[127.5] * 3, # 归一化中使用的均值 + std=[127.5] * 3, # 归一化中使用的标准差 + to_rgb=False), # 是否将图像通道从 BGR 转换为 RGB + dict(type='GetMaskedImage'), # 获取被掩盖的图像 + dict( + type='Collect', # 决定数据中哪些键应该传递给合成器 + keys=['gt_img', 'masked_img', 'mask', 'mask_bbox'], # 要收集的数据的关键词 + meta_keys=['gt_img_path']), # 要收集的数据的元关键词 + dict(type='ToTensor', keys=['gt_img', 'masked_img', 'mask']), # 将图像转化为 Tensor + dict(type='ToTensor', keys=['mask_bbox']) # 转化为 Tensor +] + +test_pipeline = train_pipeline # 构建测试/验证流程 + +data_root = 'data/places365' # 数据根目录 + +data = dict( + samples_per_gpu=12, # 单个 GPU 的批量大小 + workers_per_gpu=8, # 为每个 GPU 预取数据的 Worker 数 + val_samples_per_gpu=1, # 验证中单个 GPU 的批量大小 + val_workers_per_gpu=8, # 在验证中为每个 GPU 预取数据的 Worker 数 + drop_last=True, # 是否丢弃训练中的最后一批数据 + train=dict( # 训练数据集配置 + type=dataset_type, + ann_file=f'{data_root}/train_places_img_list_total.txt', + data_prefix=data_root, + pipeline=train_pipeline, + test_mode=False), + val=dict( # 验证数据集配置 + type=dataset_type, + ann_file=f'{data_root}/val_places_img_list.txt', + data_prefix=data_root, + pipeline=test_pipeline, + test_mode=True)) + +optimizers = dict( # 用于构建优化器的配置,支持 PyTorch 中所有优化器,且参数与 PyTorch 中对应优化器相同 + generator=dict(type='Adam', lr=0.0004), disc=dict(type='Adam', lr=0.0004)) + +lr_config = dict(policy='Fixed', by_epoch=False) # 用于注册 LrUpdater 钩子的学习率调度程序配置 + +checkpoint_config = dict(by_epoch=False, interval=50000) # 配置检查点钩子,实现参考 https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/checkpoint.py +log_config = dict( # 配置注册记录器钩子 + interval=100, # 打印日志的时间间隔 + hooks=[ + dict(type='TextLoggerHook', by_epoch=False), + # dict(type='TensorboardLoggerHook'), # 支持 Tensorboard 记录器 + # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit')) + ]) # 用于记录训练过程的记录器 + +visual_config = dict( # 构建可视化钩子的配置 + type='VisualizationHook', + output_dir='visual', + interval=1000, + res_name_list=[ + 'gt_img', 'masked_img', 'fake_res', 'fake_img', 'fake_gt_local' + ], +) # 用于可视化训练过程的记录器。 + +evaluation = dict(interval=50000) # 构建验证钩子的配置 + +total_iters = 500002 +dist_params = dict(backend='nccl') # 设置分布式训练的参数,端口也可以设置 +log_level = 'INFO' # 日志级别 +work_dir = None # 保存当前实验的模型检查点和日志的目录 +load_from = None # 从给定路径加载模型作为预训练模型。 这不会恢复训练 +resume_from = None # 从给定路径恢复检查点,当检查点被保存时,训练将从该 epoch 恢复 +workflow = [('train', 10000)] # runner 的工作流程。 [('train', 1)] 表示只有一个工作流程,名为 'train' 的工作流程执行一次。 训练当前生成模型时保持不变 +exp_name = 'gl_places' # 实验名称 +find_unused_parameters = False # 是否在分布式训练中查找未使用的参数 +``` + +## 配置文件 - 抠图 + +与 [MMDetection](https://github.com/open-mmlab/mmdetection) 一样,我们将模块化和继承设计融入我们的配置系统,以方便进行各种实验。 + +## 例子 - Deep Image Matting Model + +为了帮助用户对一个完整的配置有一个基本的了解,我们对我们实现的原始 DIM 模型的配置做一个简短的评论,如下所示。 更详细的用法和各个模块对应的替代方案,请参考 API 文档。 + +```python +# 模型配置 +model = dict( + type='DIM', # 模型的名称(我们称之为抠图器) + backbone=dict( # 主干网络的配置 + type='SimpleEncoderDecoder', # 主干网络的类型 + encoder=dict( # 编码器的配置 + type='VGG16'), # 编码器的类型 + decoder=dict( # 解码器的配置 + type='PlainDecoder')), # 解码器的类型 + pretrained='./weights/vgg_state_dict.pth', # 编码器的预训练权重 + loss_alpha=dict( # alpha 损失的配置 + type='CharbonnierLoss', # 预测的 alpha 遮罩的损失类型 + loss_weight=0.5), # alpha 损失的权重 + loss_comp=dict( # 组合损失的配置 + type='CharbonnierCompLoss', # 组合损失的类型 + loss_weight=0.5)) # 组合损失的权重 +train_cfg = dict( # 训练 DIM 模型的配置 + train_backbone=True, # 在 DIM stage 1 中,会对主干网络进行训练 + train_refiner=False) # 在 DIM stage 1 中,不会对精炼器进行训练 +test_cfg = dict( # 测试 DIM 模型的配置 + refine=False, # 是否使用精炼器输出作为输出,在 stage 1 中,我们不使用它 + metrics=['SAD', 'MSE', 'GRAD', 'CONN']) # 测试时使用的指标 + +# 数据配置 +dataset_type = 'AdobeComp1kDataset' # 数据集类型,这将用于定义数据集 +data_root = 'data/adobe_composition-1k' # 数据的根目录 +img_norm_cfg = dict( # 归一化输入图像的配置 + mean=[0.485, 0.456, 0.406], # 归一化中使用的均值 + std=[0.229, 0.224, 0.225], # 归一化中使用的标准差 + to_rgb=True) # 是否将图像通道从 BGR 转换为 RGB +train_pipeline = [ # 训练数据处理流程 + dict( + type='LoadImageFromFile', # 从文件加载 alpha 遮罩 + key='alpha', # 注释文件中 alpha 遮罩的键关键词。流程将从路径 “alpha_path” 中读取 alpha 遮罩 + flag='grayscale'), # 加载灰度图像,形状为(高度、宽度) + dict( + type='LoadImageFromFile', # 从文件中加载图像 + key='fg'), # 要加载的图像的关键词。流程将从路径 “fg_path” 读取 fg + dict( + type='LoadImageFromFile', # 从文件中加载图像 + key='bg'), # 要加载的图像的关键词。流程将从路径 “bg_path” 读取 bg + dict( + type='LoadImageFromFile', # 从文件中加载图像 + key='merged'), # 要加载的图像的关键词。流程将从路径 “merged_path” 读取并合并 + dict( + type='CropAroundUnknown', # 在未知区域(半透明区域)周围裁剪图像 + keys=['alpha', 'merged', 'ori_merged', 'fg', 'bg'], # 要裁剪的图像 + crop_sizes=[320, 480, 640]), # 裁剪大小 + dict( + type='Flip', # 翻转图像 + keys=['alpha', 'merged', 'ori_merged', 'fg', 'bg']), # 要翻转的图像 + dict( + type='Resize', # 图像大小调整 + keys=['alpha', 'merged', 'ori_merged', 'fg', 'bg'], # 图像调整大小的图像 + scale=(320, 320), # 目标大小 + keep_ratio=False), # 是否保持高宽比例 + dict( + type='GenerateTrimap', # 从 alpha 遮罩生成三元图。 + kernel_size=(1, 30)), # 腐蚀/扩张内核大小的范围 + dict( + type='RescaleToZeroOne', # 将图像从 [0, 255] 缩放到 [0, 1] + keys=['merged', 'alpha', 'ori_merged', 'fg', 'bg']), # 要重新缩放的图像 + dict( + type='Normalize', # 图像归一化 + keys=['merged'], # 要归一化的图像 + **img_norm_cfg), # 图像归一化配置(`img_norm_cfg` 的定义见上文) + dict( + type='Collect', # 决定数据中哪些键应该传递给合成器 + keys=['merged', 'alpha', 'trimap', 'ori_merged', 'fg', 'bg'], # 图像的关键词 + meta_keys=[]), # 图片的元关键词,这里不需要元信息。 + dict( + type='ToTensor', # 将图像转化为 Tensor + keys=['merged', 'alpha', 'trimap', 'ori_merged', 'fg', 'bg']), # 要转换为 Tensor 的图像 +] +test_pipeline = [ + dict( + type='LoadImageFromFile', # 从文件加载 alpha 遮罩 + key='alpha', # 注释文件中 alpha 遮罩的键关键词。流程将从路径 “alpha_path” 中读取 alpha 遮罩 + flag='grayscale', + save_original_img=True), + dict( + type='LoadImageFromFile', # 从文件中加载图像 + key='trimap', # 要加载的图像的关键词。流程将从路径 “trimap_path” 读取三元图 + flag='grayscale', # 加载灰度图像,形状为(高度、宽度) + save_original_img=True), # 保存三元图用于计算指标。 它将与 “ori_trimap” 一起保存 + dict( + type='LoadImageFromFile', # 从文件中加载图像 + key='merged'), # 要加载的图像的关键词。流程将从路径 “merged_path” 读取并合并 + dict( + type='Pad', # 填充图像以与模型的下采样因子对齐 + keys=['trimap', 'merged'], # 要填充的图像 + mode='reflect'), # 填充模式 + dict( + type='RescaleToZeroOne', # 与 train_pipeline 相同 + keys=['merged', 'ori_alpha']), # 要缩放的图像 + dict( + type='Normalize', # 与 train_pipeline 相同 + keys=['merged'], + **img_norm_cfg), + dict( + type='Collect', # 与 train_pipeline 相同 + keys=['merged', 'trimap'], + meta_keys=[ + 'merged_path', 'pad', 'merged_ori_shape', 'ori_alpha', + 'ori_trimap' + ]), + dict( + type='ToTensor', # 与 train_pipeline 相同 + keys=['merged', 'trimap']), +] +data = dict( + samples_per_gpu=1, #单个 GPU 的批量大小 + workers_per_gpu=4, # 为每个 GPU 预取数据的 Worker 数 + drop_last=True, # 是否丢弃训练中的最后一批数据 + train=dict( # 训练数据集配置 + type=dataset_type, # 数据集的类型 + ann_file=f'{data_root}/training_list.json', # 注解文件路径 + data_prefix=data_root, # 图像路径的前缀 + pipeline=train_pipeline), # 见上文 train_pipeline + val=dict( # 验证数据集配置 + type=dataset_type, + ann_file=f'{data_root}/test_list.json', + data_prefix=data_root, + pipeline=test_pipeline), # 见上文 test_pipeline + test=dict( # 测试数据集配置 + type=dataset_type, + ann_file=f'{data_root}/test_list.json', + data_prefix=data_root, + pipeline=test_pipeline)) # 见上文 test_pipeline + +# 优化器 +optimizers = dict(type='Adam', lr=0.00001) # 用于构建优化器的配置,支持 PyTorch 中所有优化器,且参数与 PyTorch 中对应优化器相同 +# 学习策略 +lr_config = dict( # 用于注册 LrUpdater 钩子的学习率调度程序配置 + policy='Fixed') # 调度器的策略,支持 CosineAnnealing、Cyclic 等。支持的 LrUpdater 详情请参考 https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/lr_updater.py#L9。 + +# 检查点保存 +checkpoint_config = dict( # 配置检查点钩子,实现参考 https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/checkpoint.py + interval=40000, # 保存间隔为 40000 次迭代 + by_epoch=False) # 按迭代计数 +evaluation = dict( # # 构建验证钩子的配置 + interval=40000) # 验证区间 +log_config = dict( # 配置注册记录器钩子 + interval=10, # 打印日志的时间间隔 + hooks=[ + dict(type='TextLoggerHook', by_epoch=False), # 用于记录训练过程的记录器 + # dict(type='TensorboardLoggerHook') # 支持 Tensorboard 记录器 + ]) + +# runtime settings +total_iters = 1000000 # 训练模型的总迭代次数 +dist_params = dict(backend='nccl') # 设置分布式训练的参数,端口也可以设置 +log_level = 'INFO' # 日志级别 +work_dir = './work_dirs/dim_stage1' # 保存当前实验的模型检查点和日志的目录 +load_from = None # 从给定路径加载模型作为预训练模型。 这不会恢复训练 +resume_from = None # 从给定路径恢复检查点,当检查点被保存时,训练将从该 epoch 恢复 +workflow = [('train', 1)] # runner 的工作流程。 [('train', 1)] 表示只有一个工作流程,名为 'train' 的工作流程执行一次。 训练当前抠图模型时保持不变 +``` + +## 配置文件 - 复原 + +## 示例-EDSR + +为了帮助用户理解 mmediting 的配置文件结构,这里以 EDSR 为例,给出其配置文件的注释。对于每个模块的详细用法以及对应参数的选择,请参照 API 文档。 + +```python +exp_name = 'edsr_x2c64b16_1x16_300k_div2k' # 实验名称 + +scale = 2 # 上采样放大因子 + +# 模型设置 +model = dict( + type='BasicRestorer', # 图像恢复模型类型 + generator=dict( # 生成器配置 + type='EDSR', # 生成器类型 + in_channels=3, # 输入通道数 + out_channels=3, # 输出通道数 + mid_channels=64, # 中间特征通道数 + num_blocks=16, # 残差块数目 + upscale_factor=scale, # 上采样因子 + res_scale=1, # 残差缩放因子 + rgb_mean=(0.4488, 0.4371, 0.4040), # 输入图像 RGB 通道的平均值 + rgb_std=(1.0, 1.0, 1.0)), # 输入图像 RGB 通道的方差 + pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean')) # 像素损失函数的配置 + +# 模型训练和测试设置 +train_cfg = None # 训练的配置 +test_cfg = dict( # 测试的配置 + metrics=['PSNR'], # 测试时使用的评价指标 + crop_border=scale) # 测试时裁剪的边界尺寸 + +# 数据集设置 +train_dataset_type = 'SRAnnotationDataset' # 用于训练的数据集类型 +val_dataset_type = 'SRFolderDataset' # 用于验证的数据集类型 +train_pipeline = [ # 训练数据前处理流水线步骤组成的列表 + dict(type='LoadImageFromFile', # 从文件加载图像 + io_backend='disk', # 读取图像时使用的 io 类型 + key='lq', # 设置LR图像的键来找到相应的路径 + flag='unchanged'), # 读取图像的标识 + dict(type='LoadImageFromFile', # 从文件加载图像 + io_backend='disk', # 读取图像时使用的io类型 + key='gt', # 设置HR图像的键来找到相应的路径 + flag='unchanged'), # 读取图像的标识 + dict(type='RescaleToZeroOne', keys=['lq', 'gt']), # 将图像从[0,255]重缩放到[0,1] + dict(type='Normalize', # 正则化图像 + keys=['lq', 'gt'], # 执行正则化图像的键 + mean=[0, 0, 0], # 平均值 + std=[1, 1, 1], # 标准差 + to_rgb=True), # 更改为 RGB 通道 + dict(type='PairedRandomCrop', gt_patch_size=96), # LR 和 HR 成对随机裁剪 + dict(type='Flip', # 图像翻转 + keys=['lq', 'gt'], # 执行翻转图像的键 + flip_ratio=0.5, # 执行翻转的几率 + direction='horizontal'), # 翻转方向 + dict(type='Flip', # 图像翻转 + keys=['lq', 'gt'], # 执行翻转图像的键 + flip_ratio=0.5, # 执行翻转几率 + direction='vertical'), # 翻转方向 + dict(type='RandomTransposeHW', # 图像的随机的转置 + keys=['lq', 'gt'], # 执行转置图像的键 + transpose_ratio=0.5 # 执行转置的几率 + ), + dict(type='Collect', # Collect 类决定哪些键会被传递到生成器中 + keys=['lq', 'gt'], # 传入模型的键 + meta_keys=['lq_path', 'gt_path']), # 元信息键。在训练中,不需要元信息 + dict(type='ToTensor', # 将图像转换为张量 + keys=['lq', 'gt']) # 执行图像转换为张量的键 +] +test_pipeline = [ # 测试数据前处理流水线步骤组成的列表 + dict( + type='LoadImageFromFile', # 从文件加载图像 + io_backend='disk', # 读取图像时使用的io类型 + key='lq', # 设置LR图像的键来找到相应的路径 + flag='unchanged'), # 读取图像的标识 + dict( + type='LoadImageFromFile', # 从文件加载图像 + io_backend='disk', # 读取图像时使用的io类型 + key='gt', # 设置HR图像的键来找到相应的路径 + flag='unchanged'), # 读取图像的标识 + dict(type='RescaleToZeroOne', keys=['lq', 'gt']), # 将图像从[0,255]重缩放到[0,1] + dict( + type='Normalize', # 正则化图像 + keys=['lq', 'gt'], # 执行正则化图像的键 + mean=[0, 0, 0], # 平均值 + std=[1, 1, 1], # 标准差 + to_rgb=True), # 更改为RGB通道 + dict(type='Collect', # Collect类决定哪些键会被传递到生成器中 + keys=['lq', 'gt'], # 传入模型的键 + meta_keys=['lq_path', 'gt_path']), # 元信息键 + dict(type='ToTensor', # 将图像转换为张量 + keys=['lq', 'gt']) # 执行图像转换为张量的键 +] + +data = dict( + # 训练 + samples_per_gpu=16, # 单个 GPU 的批大小 + workers_per_gpu=6, # 单个 GPU 的 dataloader 的进程 + drop_last=True, # 在训练过程中丢弃最后一个批次 + train=dict( # 训练数据集的设置 + type='RepeatDataset', # 基于迭代的重复数据集 + times=1000, # 重复数据集的重复次数 + dataset=dict( + type=train_dataset_type, # 数据集类型 + lq_folder='data/DIV2K/DIV2K_train_LR_bicubic/X2_sub', # lq文件夹的路径 + gt_folder='data/DIV2K/DIV2K_train_HR_sub', # gt文件夹的路径 + ann_file='data/DIV2K/meta_info_DIV2K800sub_GT.txt', # 批注文件的路径 + pipeline=train_pipeline, # 训练流水线,如上所示 + scale=scale)), # 上采样放大因子 + + # 验证 + val_samples_per_gpu=1, # 验证时单个 GPU 的批大小 + val_workers_per_gpu=1, # 验证时单个 GPU 的 dataloader 的进程 + val=dict( + type=val_dataset_type, # 数据集类型 + lq_folder='data/val_set5/Set5_bicLRx2', # lq 文件夹的路径 + gt_folder='data/val_set5/Set5_mod12', # gt 文件夹的路径 + pipeline=test_pipeline, # 测试流水线,如上所示 + scale=scale, # 上采样放大因子 + filename_tmpl='{}'), # 文件名模板 + + # 测试 + test=dict( + type=val_dataset_type, # 数据集类型 + lq_folder='data/val_set5/Set5_bicLRx2', # lq 文件夹的路径 + gt_folder='data/val_set5/Set5_mod12', # gt 文件夹的路径 + pipeline=test_pipeline, # 测试流水线,如上所示 + scale=scale, # 上采样放大因子 + filename_tmpl='{}')) # 文件名模板 + +# 优化器设置 +optimizers = dict(generator=dict(type='Adam', lr=1e-4, betas=(0.9, 0.999))) # 用于构建优化器的设置,支持PyTorch中所有参数与PyTorch中参数相同的优化器 + +# 学习策略 +total_iters = 300000 # 训练模型的总迭代数 +lr_config = dict( # 用于注册LrUpdater钩子的学习率调度程序配置 + policy='Step', by_epoch=False, step=[200000], gamma=0.5) # 调度器的策略,还支持余弦、循环等 + +checkpoint_config = dict( # 模型权重钩子设置,更多细节可参考 https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/checkpoint.py + interval=5000, # 模型权重文件保存间隔为5000次迭代 + save_optimizer=True, # 保存优化器 + by_epoch=False) # 按迭代次数计数 +evaluation = dict( # 构建验证钩子的配置 + interval=5000, # 执行验证的间隔为5000次迭代 + save_image=True, # 验证期间保存图像 + gpu_collect=True) # 使用gpu收集 +log_config = dict( # 注册日志钩子的设置 + interval=100, # 打印日志间隔 + hooks=[ + dict(type='TextLoggerHook', by_epoch=False), # 记录训练过程信息的日志 + dict(type='TensorboardLoggerHook'), # 同时支持 Tensorboard 日志 + ]) +visual_config = None # 可视化的设置 + +# 运行设置 +dist_params = dict(backend='nccl') # 建立分布式训练的设置,其中端口号也可以设置 +log_level = 'INFO' # 日志等级 +work_dir = f'./work_dirs/{exp_name}' # 记录当前实验日志和模型权重文件的文件夹 +load_from = None # 从给定路径加载模型作为预训练模型. 这个选项不会用于断点恢复训练 +resume_from = None # 加载给定路径的模型权重文件作为断点续连的模型, 训练将从该时间点保存的周期点继续进行 +workflow = [('train', 1)] # runner 的执行流. [('train', 1)] 代表只有一个执行流,并且这个名为 train 的执行流只执行一次 +``` diff --git a/docs/zh_cn/user_guides/configs/config_generation.md b/docs/zh_cn/user_guides/configs/config_generation.md deleted file mode 100644 index 75088f5ef4..0000000000 --- a/docs/zh_cn/user_guides/configs/config_generation.md +++ /dev/null @@ -1,164 +0,0 @@ -# 配置文件 - 生成 - -与 [MMDetection](https://github.com/open-mmlab/mmdetection) 一样,我们将模块化和继承设计融入我们的配置系统,以方便进行各种实验。 - -## 示例 - pix2pix - -为了帮助用户对完整的配置和生成系统中的模块有一个基本的了解,我们对 pix2pix 的配置做如下简要说明。 -更详细的用法和各个模块对应的替代方案,请参考 API 文档。 - -```python -# 模型设置 -model = dict( - type='Pix2Pix', # 合成器名称 - generator=dict( - type='UnetGenerator', # 生成器名称 - in_channels=3, # 生成器的输入通道数 - out_channels=3, # 生成器的输出通道数 - num_down=8, # # 生成器中下采样的次数 - base_channels=64, # 生成器最后卷积层的通道数 - norm_cfg=dict(type='BN'), # 归一化层的配置 - use_dropout=True, # 是否在生成器中使用 dropout - init_cfg=dict(type='normal', gain=0.02)), # 初始化配置 - discriminator=dict( - type='PatchDiscriminator', # 判别器的名称 - in_channels=6, # 判别器的输入通道数 - base_channels=64, # 判别器第一卷积层的通道数 - num_conv=3, # 判别器中堆叠的中间卷积层(不包括输入和输出卷积层)的数量 - norm_cfg=dict(type='BN'), # 归一化层的配置 - init_cfg=dict(type='normal', gain=0.02)), # 初始化配置 - gan_loss=dict( - type='GANLoss', # GAN 损失的名称 - gan_type='vanilla', # GAN 损失的类型 - real_label_val=1.0, # GAN 损失函数中真实标签的值 - fake_label_val=0.0, # GAN 损失函数中伪造标签的值 - loss_weight=1.0), # GAN 损失函数的权重 - pixel_loss=dict(type='L1Loss', loss_weight=100.0, reduction='mean')) -# 模型训练和测试设置 -train_cfg = dict( - direction='b2a') # pix2pix 的图像到图像的转换方向 (模型训练的方向,和测试方向一致)。模型默认: a2b -test_cfg = dict( - direction='b2a', # pix2pix 的图像到图像的转换方向 (模型测试的方向,和训练方向一致)。模型默认: a2b - show_input=True) # 保存 pix2pix 的测试图像时是否显示输入的真实图像 - -# 数据设置 -train_dataset_type = 'GenerationPairedDataset' # 训练数据集的类型 -val_dataset_type = 'GenerationPairedDataset' # 验证/测试数据集类型 -img_norm_cfg = dict(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) # 输入图像归一化配置 -train_pipeline = [ - dict( - type='LoadPairedImageFromFile', # 从文件路径加载图像对 - io_backend='disk', # 存储图像的 IO 后端 - key='pair', # 查找对应路径的关键词 - flag='color'), # 加载图像标志 - dict( - type='Resize', # 图像大小调整 - keys=['img_a', 'img_b'], # 要调整大小的图像的关键词 - scale=(286, 286), # 调整图像大小的比例 - interpolation='bicubic'), # 调整图像大小时用于插值的算法 - dict( - type='FixedCrop', # 固定裁剪,在特定位置将配对图像裁剪为特定大小以训练 pix2pix - keys=['img_a', 'img_b'], # 要裁剪的图像的关键词 - crop_size=(256, 256)), # 裁剪图像的大小 - dict( - type='Flip', # 翻转图像 - keys=['img_a', 'img_b'], # 要翻转的图像的关键词 - direction='horizontal'), # 水平或垂直翻转图像 - dict( - type='RescaleToZeroOne', # 将图像从 [0, 255] 缩放到 [0, 1] - keys=['img_a', 'img_b']), # 要重新缩放的图像的关键词 - dict( - type='Normalize', # 图像归一化 - keys=['img_a', 'img_b'], # 要归一化的图像的关键词 - to_rgb=True, # 是否将图像通道从 BGR 转换为 RGB - **img_norm_cfg), # 图像归一化配置(`img_norm_cfg` 的定义见上文) - dict( - type='ToTensor', # 将图像转化为 Tensor - keys=['img_a', 'img_b']), # 要从图像转换为 Tensor 的图像的关键词 - dict( - type='Collect', # 决定数据中哪些键应该传递给合成器 - keys=['img_a', 'img_b'], # 图像的关键词 - meta_keys=['img_a_path', 'img_b_path']) # 图片的元关键词 -] -test_pipeline = [ - dict( - type='LoadPairedImageFromFile', # 从文件路径加载图像对 - io_backend='disk', # 存储图像的 IO 后端 - key='pair', # 查找对应路径的关键词 - flag='color'), # 加载图像标志 - dict( - type='Resize', # 图像大小调整 - keys=['img_a', 'img_b'], # 要调整大小的图像的关键词 - scale=(256, 256), # 调整图像大小的比例 - interpolation='bicubic'), # 调整图像大小时用于插值的算法 - dict( - type='RescaleToZeroOne', # 将图像从 [0, 255] 缩放到 [0, 1] - keys=['img_a', 'img_b']), # 要重新缩放的图像的关键词 - dict( - type='Normalize', # 图像归一化 - keys=['img_a', 'img_b'], # 要归一化的图像的关键词 - to_rgb=True, # 是否将图像通道从 BGR 转换为 RGB - **img_norm_cfg), # 图像归一化配置(`img_norm_cfg` 的定义见上文) - dict( - type='ToTensor', # 将图像转化为 Tensor - keys=['img_a', 'img_b']), # 要从图像转换为 Tensor 的图像的关键词 - dict( - type='Collect', # 决定数据中哪些键应该传递给合成器 - keys=['img_a', 'img_b'], # 图像的关键词 - meta_keys=['img_a_path', 'img_b_path']) # 图片的元关键词 -] -data_root = 'data/pix2pix/facades' # 数据的根路径 -data = dict( - samples_per_gpu=1, # 单个 GPU 的批量大小 - workers_per_gpu=4, # 为每个 GPU 预取数据的 Worker 数 - drop_last=True, # 是否丢弃训练中的最后一批数据 - val_samples_per_gpu=1, # 验证中单个 GPU 的批量大小 - val_workers_per_gpu=0, # 在验证中为每个 GPU 预取数据的 Worker 数 - train=dict( # 训练数据集配置 - type=train_dataset_type, - dataroot=data_root, - pipeline=train_pipeline, - test_mode=False), - val=dict( # 验证数据集配置 - type=val_dataset_type, - dataroot=data_root, - pipeline=test_pipeline, - test_mode=True), - test=dict( # 测试数据集配置 - type=val_dataset_type, - dataroot=data_root, - pipeline=test_pipeline, - test_mode=True)) - -# 优化器 -optimizers = dict( # 用于构建优化器的配置,支持 PyTorch 中所有优化器,且参数与 PyTorch 中对应优化器相同 - generator=dict(type='Adam', lr=2e-4, betas=(0.5, 0.999)), - discriminator=dict(type='Adam', lr=2e-4, betas=(0.5, 0.999))) - -# 学习策略 -lr_config = dict(policy='Fixed', by_epoch=False) # 用于注册 LrUpdater 钩子的学习率调度程序配置 - -# 检查点保存 -checkpoint_config = dict(interval=4000, save_optimizer=True, by_epoch=False) # 配置检查点钩子,实现参考 https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/checkpoint.py -evaluation = dict( # 构建验证钩子的配置 - interval=4000, # 验证区间 - save_image=True) # 是否保存图片 -log_config = dict( # 配置注册记录器钩子 - interval=100, # 打印日志的时间间隔 - hooks=[ - dict(type='TextLoggerHook', by_epoch=False), # 用于记录训练过程的记录器 - # dict(type='TensorboardLoggerHook') # 还支持 Tensorboard 记录器 - ]) -visual_config = None # 构建可视化钩子的配置 - -# 运行设置 -total_iters = 80000 # 训练模型的总迭代次数 -cudnn_benchmark = True # 设置 cudnn_benchmark -dist_params = dict(backend='nccl') # 设置分布式训练的参数,端口也可以设置 -log_level = 'INFO' # 日志级别 -load_from = None # 从给定路径加载模型作为预训练模型。 这不会恢复训练 -resume_from = None # 从给定路径恢复检查点,当检查点被保存时,训练将从该 epoch 恢复 -workflow = [('train', 1)] # runner 的工作流程。 [('train', 1)] 表示只有一个工作流程,名为 'train' 的工作流程执行一次。 训练当前生成模型时保持不变 -exp_name = 'pix2pix_facades' # 实验名称 -work_dir = f'./work_dirs/{exp_name}' # 保存当前实验的模型检查点和日志的目录 -``` diff --git a/docs/zh_cn/user_guides/configs/config_inpainting.md b/docs/zh_cn/user_guides/configs/config_inpainting.md deleted file mode 100644 index 12836fd3a3..0000000000 --- a/docs/zh_cn/user_guides/configs/config_inpainting.md +++ /dev/null @@ -1,155 +0,0 @@ -# 配置文件 - 补全 - -## 配置名称样式 - -与 [MMDetection](https://github.com/open-mmlab/mmdetection) 一样,我们将模块化和继承设计融入我们的配置系统,以方便进行各种实验。 - -## 配置字段说明 - -为了帮助用户对完整的配置和修复系统中的模块有一个基本的了解,我们对 Global&Local 的配置作如下简要说明。更详细的用法和各个模块对应的替代方案,请参考 API 文档。 - -```python -model = dict( - type='GLInpaintor', # 补全器的名称 - encdec=dict( - type='GLEncoderDecoder', # 编码器-解码器的名称 - encoder=dict(type='GLEncoder', norm_cfg=dict(type='SyncBN')), # 编码器的配置 - decoder=dict(type='GLDecoder', norm_cfg=dict(type='SyncBN')), # 解码器的配置 - dilation_neck=dict( - type='GLDilationNeck', norm_cfg=dict(type='SyncBN'))), # 扩颈的配置 - disc=dict( - type='GLDiscs', # 判别器的名称 - global_disc_cfg=dict( - in_channels=3, # 判别器的输入通道数 - max_channels=512, # 判别器中的最大通道数 - fc_in_channels=512 * 4 * 4, # 最后一个全连接层的输入通道 - fc_out_channels=1024, # 最后一个全连接层的输出通道 - num_convs=6, # 判别器中使用的卷积数量 - norm_cfg=dict(type='SyncBN') # 归一化层的配置 - ), - local_disc_cfg=dict( - in_channels=3, # 判别器的输入通道数 - max_channels=512, # 判别器中的最大通道数 - fc_in_channels=512 * 4 * 4, # 最后一个全连接层的输入通道 - fc_out_channels=1024, # 最后一个全连接层的输出通道 - num_convs=5, # 判别器中使用的卷积数量 - norm_cfg=dict(type='SyncBN') # 归一化层的配置 - ), - ), - loss_gan=dict( - type='GANLoss', # GAN 损失的名称 - gan_type='vanilla', # GAN 损失的类型 - loss_weight=0.001 # GAN 损失函数的权重 - ), - loss_l1_hole=dict( - type='L1Loss', # L1 损失的类型 - loss_weight=1.0 # L1 损失函数的权重 - ), - pretrained=None) # 预训练权重的路径 - -train_cfg = dict( - disc_step=1, # 训练生成器之前训练判别器的迭代次数 - iter_tc=90000, # 预热生成器的迭代次数 - iter_td=100000, # 预热判别器的迭代次数 - start_iter=0, # 开始的迭代 - local_size=(128, 128)) # 图像块的大小 -test_cfg = dict(metrics=['l1']) # 测试的配置 - -dataset_type = 'ImgInpaintingDataset' # 数据集类型 -input_shape = (256, 256) # 输入图像的形状 - -train_pipeline = [ - dict(type='LoadImageFromFile', key='gt_img'), # 加载图片的配置 - dict( - type='LoadMask', # 加载掩码 - mask_mode='bbox', # 掩码的类型 - mask_config=dict( - max_bbox_shape=(128, 128), # 检测框的形状 - max_bbox_delta=40, # 检测框高宽的变化 - min_margin=20, # 检测框到图片边界的最小距离 - img_shape=input_shape)), # 输入图像的形状 - dict( - type='Crop', # 裁剪 - keys=['gt_img'], # 要裁剪的图像的关键词 - crop_size=(384, 384), # 裁剪图像块的大小 - random_crop=True, # 是否使用随机裁剪 - ), - dict( - type='Resize', # 图像大小调整 - keys=['gt_img'], # 要调整大小的图像的关键词 - scale=input_shape, # 调整图像大小的比例 - keep_ratio=False, # 调整大小时是否保持比例 - ), - dict( - type='Normalize', # 图像归一化 - keys=['gt_img'], # 要归一化的图像的关键词 - mean=[127.5] * 3, # 归一化中使用的均值 - std=[127.5] * 3, # 归一化中使用的标准差 - to_rgb=False), # 是否将图像通道从 BGR 转换为 RGB - dict(type='GetMaskedImage'), # 获取被掩盖的图像 - dict( - type='Collect', # 决定数据中哪些键应该传递给合成器 - keys=['gt_img', 'masked_img', 'mask', 'mask_bbox'], # 要收集的数据的关键词 - meta_keys=['gt_img_path']), # 要收集的数据的元关键词 - dict(type='ToTensor', keys=['gt_img', 'masked_img', 'mask']), # 将图像转化为 Tensor - dict(type='ToTensor', keys=['mask_bbox']) # 转化为 Tensor -] - -test_pipeline = train_pipeline # 构建测试/验证流程 - -data_root = 'data/places365' # 数据根目录 - -data = dict( - samples_per_gpu=12, # 单个 GPU 的批量大小 - workers_per_gpu=8, # 为每个 GPU 预取数据的 Worker 数 - val_samples_per_gpu=1, # 验证中单个 GPU 的批量大小 - val_workers_per_gpu=8, # 在验证中为每个 GPU 预取数据的 Worker 数 - drop_last=True, # 是否丢弃训练中的最后一批数据 - train=dict( # 训练数据集配置 - type=dataset_type, - ann_file=f'{data_root}/train_places_img_list_total.txt', - data_prefix=data_root, - pipeline=train_pipeline, - test_mode=False), - val=dict( # 验证数据集配置 - type=dataset_type, - ann_file=f'{data_root}/val_places_img_list.txt', - data_prefix=data_root, - pipeline=test_pipeline, - test_mode=True)) - -optimizers = dict( # 用于构建优化器的配置,支持 PyTorch 中所有优化器,且参数与 PyTorch 中对应优化器相同 - generator=dict(type='Adam', lr=0.0004), disc=dict(type='Adam', lr=0.0004)) - -lr_config = dict(policy='Fixed', by_epoch=False) # 用于注册 LrUpdater 钩子的学习率调度程序配置 - -checkpoint_config = dict(by_epoch=False, interval=50000) # 配置检查点钩子,实现参考 https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/checkpoint.py -log_config = dict( # 配置注册记录器钩子 - interval=100, # 打印日志的时间间隔 - hooks=[ - dict(type='TextLoggerHook', by_epoch=False), - # dict(type='TensorboardLoggerHook'), # 支持 Tensorboard 记录器 - # dict(type='PaviLoggerHook', init_kwargs=dict(project='mmedit')) - ]) # 用于记录训练过程的记录器 - -visual_config = dict( # 构建可视化钩子的配置 - type='VisualizationHook', - output_dir='visual', - interval=1000, - res_name_list=[ - 'gt_img', 'masked_img', 'fake_res', 'fake_img', 'fake_gt_local' - ], -) # 用于可视化训练过程的记录器。 - -evaluation = dict(interval=50000) # 构建验证钩子的配置 - -total_iters = 500002 -dist_params = dict(backend='nccl') # 设置分布式训练的参数,端口也可以设置 -log_level = 'INFO' # 日志级别 -work_dir = None # 保存当前实验的模型检查点和日志的目录 -load_from = None # 从给定路径加载模型作为预训练模型。 这不会恢复训练 -resume_from = None # 从给定路径恢复检查点,当检查点被保存时,训练将从该 epoch 恢复 -workflow = [('train', 10000)] # runner 的工作流程。 [('train', 1)] 表示只有一个工作流程,名为 'train' 的工作流程执行一次。 训练当前生成模型时保持不变 -exp_name = 'gl_places' # 实验名称 -find_unused_parameters = False # 是否在分布式训练中查找未使用的参数 -``` diff --git a/docs/zh_cn/user_guides/configs/config_matting.md b/docs/zh_cn/user_guides/configs/config_matting.md deleted file mode 100644 index 41058bff29..0000000000 --- a/docs/zh_cn/user_guides/configs/config_matting.md +++ /dev/null @@ -1,167 +0,0 @@ -# 配置文件 - 抠图 - -与 [MMDetection](https://github.com/open-mmlab/mmdetection) 一样,我们将模块化和继承设计融入我们的配置系统,以方便进行各种实验。 - -## 例子 - Deep Image Matting Model - -为了帮助用户对一个完整的配置有一个基本的了解,我们对我们实现的原始 DIM 模型的配置做一个简短的评论,如下所示。 更详细的用法和各个模块对应的替代方案,请参考 API 文档。 - -```python -# 模型配置 -model = dict( - type='DIM', # 模型的名称(我们称之为抠图器) - backbone=dict( # 主干网络的配置 - type='SimpleEncoderDecoder', # 主干网络的类型 - encoder=dict( # 编码器的配置 - type='VGG16'), # 编码器的类型 - decoder=dict( # 解码器的配置 - type='PlainDecoder')), # 解码器的类型 - pretrained='./weights/vgg_state_dict.pth', # 编码器的预训练权重 - loss_alpha=dict( # alpha 损失的配置 - type='CharbonnierLoss', # 预测的 alpha 遮罩的损失类型 - loss_weight=0.5), # alpha 损失的权重 - loss_comp=dict( # 组合损失的配置 - type='CharbonnierCompLoss', # 组合损失的类型 - loss_weight=0.5)) # 组合损失的权重 -train_cfg = dict( # 训练 DIM 模型的配置 - train_backbone=True, # 在 DIM stage 1 中,会对主干网络进行训练 - train_refiner=False) # 在 DIM stage 1 中,不会对精炼器进行训练 -test_cfg = dict( # 测试 DIM 模型的配置 - refine=False, # 是否使用精炼器输出作为输出,在 stage 1 中,我们不使用它 - metrics=['SAD', 'MSE', 'GRAD', 'CONN']) # 测试时使用的指标 - -# 数据配置 -dataset_type = 'AdobeComp1kDataset' # 数据集类型,这将用于定义数据集 -data_root = 'data/adobe_composition-1k' # 数据的根目录 -img_norm_cfg = dict( # 归一化输入图像的配置 - mean=[0.485, 0.456, 0.406], # 归一化中使用的均值 - std=[0.229, 0.224, 0.225], # 归一化中使用的标准差 - to_rgb=True) # 是否将图像通道从 BGR 转换为 RGB -train_pipeline = [ # 训练数据处理流程 - dict( - type='LoadImageFromFile', # 从文件加载 alpha 遮罩 - key='alpha', # 注释文件中 alpha 遮罩的键关键词。流程将从路径 “alpha_path” 中读取 alpha 遮罩 - flag='grayscale'), # 加载灰度图像,形状为(高度、宽度) - dict( - type='LoadImageFromFile', # 从文件中加载图像 - key='fg'), # 要加载的图像的关键词。流程将从路径 “fg_path” 读取 fg - dict( - type='LoadImageFromFile', # 从文件中加载图像 - key='bg'), # 要加载的图像的关键词。流程将从路径 “bg_path” 读取 bg - dict( - type='LoadImageFromFile', # 从文件中加载图像 - key='merged'), # 要加载的图像的关键词。流程将从路径 “merged_path” 读取并合并 - dict( - type='CropAroundUnknown', # 在未知区域(半透明区域)周围裁剪图像 - keys=['alpha', 'merged', 'ori_merged', 'fg', 'bg'], # 要裁剪的图像 - crop_sizes=[320, 480, 640]), # 裁剪大小 - dict( - type='Flip', # 翻转图像 - keys=['alpha', 'merged', 'ori_merged', 'fg', 'bg']), # 要翻转的图像 - dict( - type='Resize', # 图像大小调整 - keys=['alpha', 'merged', 'ori_merged', 'fg', 'bg'], # 图像调整大小的图像 - scale=(320, 320), # 目标大小 - keep_ratio=False), # 是否保持高宽比例 - dict( - type='GenerateTrimap', # 从 alpha 遮罩生成三元图。 - kernel_size=(1, 30)), # 腐蚀/扩张内核大小的范围 - dict( - type='RescaleToZeroOne', # 将图像从 [0, 255] 缩放到 [0, 1] - keys=['merged', 'alpha', 'ori_merged', 'fg', 'bg']), # 要重新缩放的图像 - dict( - type='Normalize', # 图像归一化 - keys=['merged'], # 要归一化的图像 - **img_norm_cfg), # 图像归一化配置(`img_norm_cfg` 的定义见上文) - dict( - type='Collect', # 决定数据中哪些键应该传递给合成器 - keys=['merged', 'alpha', 'trimap', 'ori_merged', 'fg', 'bg'], # 图像的关键词 - meta_keys=[]), # 图片的元关键词,这里不需要元信息。 - dict( - type='ToTensor', # 将图像转化为 Tensor - keys=['merged', 'alpha', 'trimap', 'ori_merged', 'fg', 'bg']), # 要转换为 Tensor 的图像 -] -test_pipeline = [ - dict( - type='LoadImageFromFile', # 从文件加载 alpha 遮罩 - key='alpha', # 注释文件中 alpha 遮罩的键关键词。流程将从路径 “alpha_path” 中读取 alpha 遮罩 - flag='grayscale', - save_original_img=True), - dict( - type='LoadImageFromFile', # 从文件中加载图像 - key='trimap', # 要加载的图像的关键词。流程将从路径 “trimap_path” 读取三元图 - flag='grayscale', # 加载灰度图像,形状为(高度、宽度) - save_original_img=True), # 保存三元图用于计算指标。 它将与 “ori_trimap” 一起保存 - dict( - type='LoadImageFromFile', # 从文件中加载图像 - key='merged'), # 要加载的图像的关键词。流程将从路径 “merged_path” 读取并合并 - dict( - type='Pad', # 填充图像以与模型的下采样因子对齐 - keys=['trimap', 'merged'], # 要填充的图像 - mode='reflect'), # 填充模式 - dict( - type='RescaleToZeroOne', # 与 train_pipeline 相同 - keys=['merged', 'ori_alpha']), # 要缩放的图像 - dict( - type='Normalize', # 与 train_pipeline 相同 - keys=['merged'], - **img_norm_cfg), - dict( - type='Collect', # 与 train_pipeline 相同 - keys=['merged', 'trimap'], - meta_keys=[ - 'merged_path', 'pad', 'merged_ori_shape', 'ori_alpha', - 'ori_trimap' - ]), - dict( - type='ToTensor', # 与 train_pipeline 相同 - keys=['merged', 'trimap']), -] -data = dict( - samples_per_gpu=1, #单个 GPU 的批量大小 - workers_per_gpu=4, # 为每个 GPU 预取数据的 Worker 数 - drop_last=True, # 是否丢弃训练中的最后一批数据 - train=dict( # 训练数据集配置 - type=dataset_type, # 数据集的类型 - ann_file=f'{data_root}/training_list.json', # 注解文件路径 - data_prefix=data_root, # 图像路径的前缀 - pipeline=train_pipeline), # 见上文 train_pipeline - val=dict( # 验证数据集配置 - type=dataset_type, - ann_file=f'{data_root}/test_list.json', - data_prefix=data_root, - pipeline=test_pipeline), # 见上文 test_pipeline - test=dict( # 测试数据集配置 - type=dataset_type, - ann_file=f'{data_root}/test_list.json', - data_prefix=data_root, - pipeline=test_pipeline)) # 见上文 test_pipeline - -# 优化器 -optimizers = dict(type='Adam', lr=0.00001) # 用于构建优化器的配置,支持 PyTorch 中所有优化器,且参数与 PyTorch 中对应优化器相同 -# 学习策略 -lr_config = dict( # 用于注册 LrUpdater 钩子的学习率调度程序配置 - policy='Fixed') # 调度器的策略,支持 CosineAnnealing、Cyclic 等。支持的 LrUpdater 详情请参考 https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/lr_updater.py#L9。 - -# 检查点保存 -checkpoint_config = dict( # 配置检查点钩子,实现参考 https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/checkpoint.py - interval=40000, # 保存间隔为 40000 次迭代 - by_epoch=False) # 按迭代计数 -evaluation = dict( # # 构建验证钩子的配置 - interval=40000) # 验证区间 -log_config = dict( # 配置注册记录器钩子 - interval=10, # 打印日志的时间间隔 - hooks=[ - dict(type='TextLoggerHook', by_epoch=False), # 用于记录训练过程的记录器 - # dict(type='TensorboardLoggerHook') # 支持 Tensorboard 记录器 - ]) - -# runtime settings -total_iters = 1000000 # 训练模型的总迭代次数 -dist_params = dict(backend='nccl') # 设置分布式训练的参数,端口也可以设置 -log_level = 'INFO' # 日志级别 -work_dir = './work_dirs/dim_stage1' # 保存当前实验的模型检查点和日志的目录 -load_from = None # 从给定路径加载模型作为预训练模型。 这不会恢复训练 -resume_from = None # 从给定路径恢复检查点,当检查点被保存时,训练将从该 epoch 恢复 -workflow = [('train', 1)] # runner 的工作流程。 [('train', 1)] 表示只有一个工作流程,名为 'train' 的工作流程执行一次。 训练当前抠图模型时保持不变 -``` diff --git a/docs/zh_cn/user_guides/configs/config_restoration.md b/docs/zh_cn/user_guides/configs/config_restoration.md deleted file mode 100644 index 68d6589ef4..0000000000 --- a/docs/zh_cn/user_guides/configs/config_restoration.md +++ /dev/null @@ -1,162 +0,0 @@ -# 配置文件 - 复原 - -## 示例-EDSR - -为了帮助用户理解 mmediting 的配置文件结构,这里以 EDSR 为例,给出其配置文件的注释。对于每个模块的详细用法以及对应参数的选择,请参照 API 文档。 - -```python -exp_name = 'edsr_x2c64b16_1x16_300k_div2k' # 实验名称 - -scale = 2 # 上采样放大因子 - -# 模型设置 -model = dict( - type='BasicRestorer', # 图像恢复模型类型 - generator=dict( # 生成器配置 - type='EDSR', # 生成器类型 - in_channels=3, # 输入通道数 - out_channels=3, # 输出通道数 - mid_channels=64, # 中间特征通道数 - num_blocks=16, # 残差块数目 - upscale_factor=scale, # 上采样因子 - res_scale=1, # 残差缩放因子 - rgb_mean=(0.4488, 0.4371, 0.4040), # 输入图像 RGB 通道的平均值 - rgb_std=(1.0, 1.0, 1.0)), # 输入图像 RGB 通道的方差 - pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean')) # 像素损失函数的配置 - -# 模型训练和测试设置 -train_cfg = None # 训练的配置 -test_cfg = dict( # 测试的配置 - metrics=['PSNR'], # 测试时使用的评价指标 - crop_border=scale) # 测试时裁剪的边界尺寸 - -# 数据集设置 -train_dataset_type = 'SRAnnotationDataset' # 用于训练的数据集类型 -val_dataset_type = 'SRFolderDataset' # 用于验证的数据集类型 -train_pipeline = [ # 训练数据前处理流水线步骤组成的列表 - dict(type='LoadImageFromFile', # 从文件加载图像 - io_backend='disk', # 读取图像时使用的 io 类型 - key='lq', # 设置LR图像的键来找到相应的路径 - flag='unchanged'), # 读取图像的标识 - dict(type='LoadImageFromFile', # 从文件加载图像 - io_backend='disk', # 读取图像时使用的io类型 - key='gt', # 设置HR图像的键来找到相应的路径 - flag='unchanged'), # 读取图像的标识 - dict(type='RescaleToZeroOne', keys=['lq', 'gt']), # 将图像从[0,255]重缩放到[0,1] - dict(type='Normalize', # 正则化图像 - keys=['lq', 'gt'], # 执行正则化图像的键 - mean=[0, 0, 0], # 平均值 - std=[1, 1, 1], # 标准差 - to_rgb=True), # 更改为 RGB 通道 - dict(type='PairedRandomCrop', gt_patch_size=96), # LR 和 HR 成对随机裁剪 - dict(type='Flip', # 图像翻转 - keys=['lq', 'gt'], # 执行翻转图像的键 - flip_ratio=0.5, # 执行翻转的几率 - direction='horizontal'), # 翻转方向 - dict(type='Flip', # 图像翻转 - keys=['lq', 'gt'], # 执行翻转图像的键 - flip_ratio=0.5, # 执行翻转几率 - direction='vertical'), # 翻转方向 - dict(type='RandomTransposeHW', # 图像的随机的转置 - keys=['lq', 'gt'], # 执行转置图像的键 - transpose_ratio=0.5 # 执行转置的几率 - ), - dict(type='Collect', # Collect 类决定哪些键会被传递到生成器中 - keys=['lq', 'gt'], # 传入模型的键 - meta_keys=['lq_path', 'gt_path']), # 元信息键。在训练中,不需要元信息 - dict(type='ToTensor', # 将图像转换为张量 - keys=['lq', 'gt']) # 执行图像转换为张量的键 -] -test_pipeline = [ # 测试数据前处理流水线步骤组成的列表 - dict( - type='LoadImageFromFile', # 从文件加载图像 - io_backend='disk', # 读取图像时使用的io类型 - key='lq', # 设置LR图像的键来找到相应的路径 - flag='unchanged'), # 读取图像的标识 - dict( - type='LoadImageFromFile', # 从文件加载图像 - io_backend='disk', # 读取图像时使用的io类型 - key='gt', # 设置HR图像的键来找到相应的路径 - flag='unchanged'), # 读取图像的标识 - dict(type='RescaleToZeroOne', keys=['lq', 'gt']), # 将图像从[0,255]重缩放到[0,1] - dict( - type='Normalize', # 正则化图像 - keys=['lq', 'gt'], # 执行正则化图像的键 - mean=[0, 0, 0], # 平均值 - std=[1, 1, 1], # 标准差 - to_rgb=True), # 更改为RGB通道 - dict(type='Collect', # Collect类决定哪些键会被传递到生成器中 - keys=['lq', 'gt'], # 传入模型的键 - meta_keys=['lq_path', 'gt_path']), # 元信息键 - dict(type='ToTensor', # 将图像转换为张量 - keys=['lq', 'gt']) # 执行图像转换为张量的键 -] - -data = dict( - # 训练 - samples_per_gpu=16, # 单个 GPU 的批大小 - workers_per_gpu=6, # 单个 GPU 的 dataloader 的进程 - drop_last=True, # 在训练过程中丢弃最后一个批次 - train=dict( # 训练数据集的设置 - type='RepeatDataset', # 基于迭代的重复数据集 - times=1000, # 重复数据集的重复次数 - dataset=dict( - type=train_dataset_type, # 数据集类型 - lq_folder='data/DIV2K/DIV2K_train_LR_bicubic/X2_sub', # lq文件夹的路径 - gt_folder='data/DIV2K/DIV2K_train_HR_sub', # gt文件夹的路径 - ann_file='data/DIV2K/meta_info_DIV2K800sub_GT.txt', # 批注文件的路径 - pipeline=train_pipeline, # 训练流水线,如上所示 - scale=scale)), # 上采样放大因子 - - # 验证 - val_samples_per_gpu=1, # 验证时单个 GPU 的批大小 - val_workers_per_gpu=1, # 验证时单个 GPU 的 dataloader 的进程 - val=dict( - type=val_dataset_type, # 数据集类型 - lq_folder='data/val_set5/Set5_bicLRx2', # lq 文件夹的路径 - gt_folder='data/val_set5/Set5_mod12', # gt 文件夹的路径 - pipeline=test_pipeline, # 测试流水线,如上所示 - scale=scale, # 上采样放大因子 - filename_tmpl='{}'), # 文件名模板 - - # 测试 - test=dict( - type=val_dataset_type, # 数据集类型 - lq_folder='data/val_set5/Set5_bicLRx2', # lq 文件夹的路径 - gt_folder='data/val_set5/Set5_mod12', # gt 文件夹的路径 - pipeline=test_pipeline, # 测试流水线,如上所示 - scale=scale, # 上采样放大因子 - filename_tmpl='{}')) # 文件名模板 - -# 优化器设置 -optimizers = dict(generator=dict(type='Adam', lr=1e-4, betas=(0.9, 0.999))) # 用于构建优化器的设置,支持PyTorch中所有参数与PyTorch中参数相同的优化器 - -# 学习策略 -total_iters = 300000 # 训练模型的总迭代数 -lr_config = dict( # 用于注册LrUpdater钩子的学习率调度程序配置 - policy='Step', by_epoch=False, step=[200000], gamma=0.5) # 调度器的策略,还支持余弦、循环等 - -checkpoint_config = dict( # 模型权重钩子设置,更多细节可参考 https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/checkpoint.py - interval=5000, # 模型权重文件保存间隔为5000次迭代 - save_optimizer=True, # 保存优化器 - by_epoch=False) # 按迭代次数计数 -evaluation = dict( # 构建验证钩子的配置 - interval=5000, # 执行验证的间隔为5000次迭代 - save_image=True, # 验证期间保存图像 - gpu_collect=True) # 使用gpu收集 -log_config = dict( # 注册日志钩子的设置 - interval=100, # 打印日志间隔 - hooks=[ - dict(type='TextLoggerHook', by_epoch=False), # 记录训练过程信息的日志 - dict(type='TensorboardLoggerHook'), # 同时支持 Tensorboard 日志 - ]) -visual_config = None # 可视化的设置 - -# 运行设置 -dist_params = dict(backend='nccl') # 建立分布式训练的设置,其中端口号也可以设置 -log_level = 'INFO' # 日志等级 -work_dir = f'./work_dirs/{exp_name}' # 记录当前实验日志和模型权重文件的文件夹 -load_from = None # 从给定路径加载模型作为预训练模型. 这个选项不会用于断点恢复训练 -resume_from = None # 加载给定路径的模型权重文件作为断点续连的模型, 训练将从该时间点保存的周期点继续进行 -workflow = [('train', 1)] # runner 的执行流. [('train', 1)] 代表只有一个执行流,并且这个名为 train 的执行流只执行一次 -``` diff --git a/docs/zh_cn/user_guides/dataset_prepare.md b/docs/zh_cn/user_guides/dataset_prepare.md new file mode 100644 index 0000000000..6d16267fb5 --- /dev/null +++ b/docs/zh_cn/user_guides/dataset_prepare.md @@ -0,0 +1 @@ +# 教程 2:准备数据集(待更新) diff --git a/docs/zh_cn/user_guides/datasets/dataset_prepare.md b/docs/zh_cn/user_guides/datasets/dataset_prepare.md deleted file mode 100644 index 16cc9bfc17..0000000000 --- a/docs/zh_cn/user_guides/datasets/dataset_prepare.md +++ /dev/null @@ -1 +0,0 @@ -# 数据集(待更新) diff --git a/docs/zh_cn/user_guides/deploy.md b/docs/zh_cn/user_guides/deploy.md new file mode 100644 index 0000000000..7be7e15f42 --- /dev/null +++ b/docs/zh_cn/user_guides/deploy.md @@ -0,0 +1 @@ +# 教程 8:部署指南(待更新) diff --git a/docs/zh_cn/user_guides/inference.md b/docs/zh_cn/user_guides/inference.md index ae954498e1..7d56f7b4ae 100644 --- a/docs/zh_cn/user_guides/inference.md +++ b/docs/zh_cn/user_guides/inference.md @@ -1 +1,237 @@ -# 推理(待更新) +# 教程 3:预训练权重推理(待更新) + +我们针对特定任务提供了一些脚本,可以对单张图像进行推理。 + +#### 图像补全 + +您可以使用以下命令,输入一张测试图像以及缺损部位的遮罩图像,实现对测试图像的补全。 + +```shell +python demo/inpainting_demo.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + ${MASKED_IMAGE_FILE} \ + ${MASK_FILE} \ + ${SAVE_FILE} \ + [--imshow] \ + [--device ${GPU_ID}] +``` + +如果指定了 --imshow ,演示程序将使用 opencv 显示图像。例子: + +```shell +python demo/inpainting_demo.py \ + configs/global_local/gl_8xb12_celeba-256x256.py \ + https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_celeba_20200619-5af0493f.pth \ + tests/data/inpainting/celeba_test.png \ + tests/data/inpainting/bbox_mask.png \ + tests/data/inpainting/inpainting_celeba.png +``` + +补全结果将保存在 `tests/data/inpainting/inpainting_celeba.png` 中。 + +#### 抠图 + +您可以使用以下命令,输入一张测试图像以及对应的三元图(trimap),实现对测试图像的抠图。 + +```shell +python demo/matting_demo.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + ${IMAGE_FILE} \ + ${TRIMAP_FILE} \ + ${SAVE_FILE} \ + [--imshow] \ + [--device ${GPU_ID}] +``` + +如果指定了 --imshow ,演示程序将使用 opencv 显示图像。例子: + +```shell +python demo/matting_demo.py \ + configs/dim/dim_stage3-v16-pln_1000k-1xb1_comp1k.py \ + https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_SAD-50.6_20200609_111851-647f24b6.pth \ + tests/data/matting_dataset/merged/GT05.jpg \ + tests/data/matting_dataset/trimap/GT05.png \ + tests/data/matting_dataset/pred/GT05.png +``` + +预测的 alpha 遮罩将保存在 `tests/data/matting_dataset/pred/GT05.png` 中。 + +#### 图像超分辨率 + +您可以使用以下命令来测试要恢复的图像。 + +```shell +python demo/restoration_demo.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + ${IMAGE_FILE} \ + ${SAVE_FILE} \ + [--imshow] \ + [--device ${GPU_ID}] \ + [--ref-path ${REF_PATH}] +``` + +如果指定了 `--imshow` ,演示程序将使用 opencv 显示图像。例子: + +```shell +python demo/restoration_demo.py \ + configs/esrgan/esrgan_x4c64b23g32_400k-1xb16_div2k.py \ + https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth \ + tests/data/image/lq/baboon_x4.png \ + demo/demo_out_baboon.png +``` + +您可以通过提供 `--ref-path` 参数来测试基于参考的超分辨率算法。例子: + +```shell +python demo/restoration_demo.py \ + configs/ttsr/ttsr-gan_x4c64b16_500k-1xb9_CUFED.py \ + https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-gan_x4_c64b16_g1_500k_CUFED_20210626-2ab28ca0.pth \ + tests/data/frames/sequence/gt/sequence_1/00000000.png \ + demo/demo_out.png \ + --ref-path tests/data/frames/sequence/gt/sequence_1/00000001.png +``` + +#### 人脸图像超分辨率 + +您可以使用以下命令来测试要恢复的人脸图像。 + +```shell +python demo/restoration_face_demo.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + ${IMAGE_FILE} \ + ${SAVE_FILE} \ + [--upscale-factor] \ + [--face-size] \ + [--imshow] \ + [--device ${GPU_ID}] +``` + +如果指定了 --imshow ,演示程序将使用 opencv 显示图像。例子: + +```shell +python demo/restoration_face_demo.py \ + configs/glean/glean_in128out1024_300k-4xb2_ffhq-celeba-hq.py \ + https://download.openmmlab.com/mmediting/restorers/glean/glean_in128out1024_4x2_300k_ffhq_celebahq_20210812-acbcb04f.pth \ + tests/data/image/face/000001.png \ + tests/data/image/face/pred.png \ + --upscale-factor 4 +``` + +#### 视频超分辨率 + +您可以使用以下命令来测试视频以进行恢复。 + +```shell +python demo/restoration_video_demo.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + ${INPUT_DIR} \ + ${OUTPUT_DIR} \ + [--window-size=${WINDOW_SIZE}] \ + [--device ${GPU_ID}] +``` + +它同时支持滑动窗口框架和循环框架。 例子: + +EDVR: + +```shell +python demo/restoration_video_demo.py \ + configs/edvr/edvrm_wotsa_reds_600k-8xb8.py \ + https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth \ + data/Vid4/BIx4/calendar/ \ + demo/output \ + --window-size=5 +``` + +BasicVSR: + +```shell +python demo/restoration_video_demo.py \ + configs/basicvsr/basicvsr_2xb4_reds4.py \ + https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth \ + data/Vid4/BIx4/calendar/ \ + demo/output +``` + +复原的视频将保存在 ` demo/output/` 中。 + +#### 视频插帧 + +您可以使用以下命令来测试视频插帧。 + +```shell +python demo/video_interpolation_demo.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + ${INPUT_DIR} \ + ${OUTPUT_DIR} \ + [--fps-multiplier ${FPS_MULTIPLIER}] \ + [--fps ${FPS}] +``` + +`${INPUT_DIR}` 和 `${OUTPUT_DIR}` 可以是视频文件路径或存放一系列有序图像的文件夹。 +若 `${OUTPUT_DIR}` 是视频文件地址,其帧率可由输入视频帧率和 `fps_multiplier` 共同决定,也可由 `fps` 直接给定(其中前者优先级更高)。例子: + +由输入视频帧率和 `fps_multiplier` 共同决定输出视频的帧率: + +```shell +python demo/video_interpolation_demo.py \ + configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py \ + https://download.openmmlab.com/mmediting/video_interpolators/cain/cain_b5_320k_vimeo-triple_20220117-647f3de2.pth \ + tests/data/frames/test_inference.mp4 \ + tests/data/frames/test_inference_vfi_out.mp4 \ + --fps-multiplier 2.0 +``` + +由 `fps` 直接给定输出视频的帧率: + +```shell +python demo/video_interpolation_demo.py \ + configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py \ + https://download.openmmlab.com/mmediting/video_interpolators/cain/cain_b5_320k_vimeo-triple_20220117-647f3de2.pth \ + tests/data/frames/test_inference.mp4 \ + tests/data/frames/test_inference_vfi_out.mp4 \ + --fps 60.0 +``` + +#### 图像生成 + +```shell +python demo/generation_demo.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + ${IMAGE_FILE} \ + ${SAVE_FILE} \ + [--unpaired-path ${UNPAIRED_IMAGE_FILE}] \ + [--imshow] \ + [--device ${GPU_ID}] +``` + +如果指定了 `--unpaired-path` (用于 CycleGAN),模型将执行未配对的图像到图像的转换。 如果指定了 `--imshow` ,演示也将使用opencv显示图像。 例子: + +针对配对数据: + +```shell +python demo/generation_demo.py \ + configs/example_config.py \ + work_dirs/example_exp/example_model_20200202.pth \ + demo/demo.jpg \ + demo/demo_out.jpg +``` + +针对未配对数据(用 opencv 显示图像): + +```shell +python demo/generation_demo.py 、 + configs/example_config.py \ + work_dirs/example_exp/example_model_20200202.pth \ + demo/demo.jpg \ + demo/demo_out.jpg \ + --unpaired-path demo/demo_unpaired.jpg \ + --imshow +``` diff --git a/docs/zh_cn/user_guides/metrics.md b/docs/zh_cn/user_guides/metrics.md new file mode 100644 index 0000000000..6df8c50bea --- /dev/null +++ b/docs/zh_cn/user_guides/metrics.md @@ -0,0 +1 @@ +# 教程 5:使用评价指标 diff --git a/docs/zh_cn/user_guides/train_test.md b/docs/zh_cn/user_guides/train_test.md index 35571fc9e9..7ee71b6bb6 100644 --- a/docs/zh_cn/user_guides/train_test.md +++ b/docs/zh_cn/user_guides/train_test.md @@ -1 +1 @@ -# 训练 & 测试(待更新) +# 教程 4:训练与测试(待更新) diff --git a/docs/zh_cn/user_guides/useful_tools.md b/docs/zh_cn/user_guides/useful_tools.md index eea60c83a6..429e2a6f77 100644 --- a/docs/zh_cn/user_guides/useful_tools.md +++ b/docs/zh_cn/user_guides/useful_tools.md @@ -1 +1,351 @@ -# 实用工具(待更新) +# 教程 7:实用工具(待更新) + +我们在 `tools/` 目录下提供了很多有用的工具。 + +### 获取 FLOP 和参数量(实验性) + +我们提供了一个改编自 [flops-counter.pytorch](https://github.com/sovrasov/flops-counter.pytorch) 的脚本来计算模型的 FLOP 和参数量。 + +```shell +python tools/get_flops.py ${CONFIG_FILE} [--shape ${INPUT_SHAPE}] +``` + +例如, + +```shell +python tools/get_flops.py configs/resotorer/srresnet.py --shape 40 40 +``` + +你会得到以下的结果。 + +``` +============================== +Input shape: (3, 40, 40) +Flops: 4.07 GMac +Params: 1.52 M +============================== +``` + +**注**:此工具仍处于实验阶段,我们不保证数字正确。 您可以将结果用于简单的比较,但在技术报告或论文中采用它之前,请仔细检查它。 + +(1) FLOPs 与输入形状有关,而参数量与输入形状无关。默认输入形状为 (1, 3, 250, 250)。 +(2) 一些运算符不计入 FLOP,如 GN 和自定义运算符。 +你可以通过修改 [`mmcv/cnn/utils/flops_counter.py`](https://github.com/open-mmlab/mmcv/blob/master/mmcv/cnn/utils/flops_counter.py) 来添加对新运算符的支持。 + +### 发布模型 + +在将模型上传到 AWS 之前,您可能需要 +(1) 将模型权重转换为 CPU tensors, (2) 删除优化器状态,和 +(3) 计算模型权重文件的哈希并将哈希 ID 附加到文件名。 + +```shell +python tools/publish_model.py ${INPUT_FILENAME} ${OUTPUT_FILENAME} +``` + +例如, + +```shell +python tools/publish_model.py work_dirs/example_exp/latest.pth example_model_20200202.pth +``` + +最终输出文件名将是 `example_model_20200202-{hash id}.pth`. + +### 转换为 ONNX(实验性) + +我们提供了一个脚本将模型转换为 [ONNX](https://github.com/onnx/onnx) 格式。 转换后的模型可以通过 [Netron](https://github.com/lutzroeder/netron) 等工具进行可视化。此外,我们还支持比较 Pytorch 和 ONNX 模型之间的输出结果。 + +```bash +python tools/pytorch2onnx.py + ${CFG_PATH} \ + ${CHECKPOINT_PATH} \ + ${MODEL_TYPE} \ + ${IMAGE_PATH} \ + --trimap-path ${TRIMAP_PATH} \ + --output-file ${OUTPUT_ONNX} \ + --show \ + --verify \ + --dynamic-export +``` + +参数说明: + +- `config` : 模型配置文件的路径。 +- `checkpoint` : 模型模型权重文件的路径。 +- `model_type` : 配置文件的模型类型,选项: `inpainting`, `mattor`, `restorer`, `synthesizer`。 +- `image_path` : 输入图像文件的路径。 +- `--trimap-path` : 输入三元图文件的路径,用于 mattor 模型。 +- `--output-file`: 输出 ONNX 模型的路径。默认为 `tmp.onnx`。 +- `--opset-version` : ONNX opset 版本。默认为 11。 +- `--show`: 确定是否打印导出模型的架构。默认为 `False`。 +- `--verify`: 确定是否验证导出模型的正确性。默认为 `False`。 +- `--dynamic-export`: 确定是否导出具有动态输入和输出形状的 ONNX 模型。默认为 `False`。 + +**注**:此工具仍处于试验阶段。目前不支持某些自定义运算符。我们现在只支持 `mattor` 和 `restorer`。 + +#### 支持导出到 ONNX 的模型列表 + +下表列出了保证可导出到 ONNX 并可在 ONNX Runtime 中运行的模型。 + +| 模型 | 配置 | 动态形状 | 批量推理 | 备注 | +| :------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------: | :------: | :--: | +| ESRGAN | [esrgan_x4c64b23g32_g1_400k_div2k.py](https://github.com/open-mmlab/mmediting/blob/master/configs/restorers/esrgan/esrgan_x4c64b23g32_g1_400k_div2k.py) | Y | Y | | +| ESRGAN | [esrgan_psnr_x4c64b23g32_g1_1000k_div2k.py](https://github.com/open-mmlab/mmediting/blob/master/configs/restorers/esrgan/esrgan_psnr_x4c64b23g32_g1_1000k_div2k.py) | Y | Y | | +| SRCNN | [srcnn_x4k915_g1_1000k_div2k.py](https://github.com/open-mmlab/mmediting/blob/master/configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py) | Y | Y | | +| DIM | [dim_stage3_v16_pln_1x1_1000k_comp1k.py](https://github.com/open-mmlab/mmediting/blob/master/configs/dim/dim_stage3_v16_pln_1x1_1000k_comp1k.py) | Y | Y | | +| GCA | [gca_r34_4x10_200k_comp1k.py](https://github.com/open-mmlab/mmediting/blob/master/configs/gca/gca_r34_4x10_200k_comp1k.py) | N | Y | | +| IndexNet | [indexnet_mobv2_1x16_78k_comp1k.py](https://github.com/open-mmlab/mmediting/blob/master/configs/indexnet/indexnet_mobv2_1x16_78k_comp1k.py) | Y | Y | | + +**注**: + +- *以上所有模型均使用 Pytorch==1.6.0 和 onnxruntime==1.5.1* +- 如果您遇到上面列出的模型的任何问题,请创建一个 issue,我们会尽快处理。对于列表中未包含的型号,请尝试自行解决。 +- 由于此功能是实验性的并且可能会快速更改,请始终尝试使用最新的 `mmcv` 和 `mmedit`。 + +### 将 ONNX 转换为 TensorRT(实验性) + +我们还提供了将 [ONNX](https://github.com/onnx/onnx) 模型转换为 [TensorRT](https://github.com/NVIDIA/TensorRT) 格式的脚本。 此外,我们支持比较 ONNX 和 TensorRT 模型之间的输出结果。 + +```bash +python tools/onnx2tensorrt.py + ${CFG_PATH} \ + ${MODEL_TYPE} \ + ${IMAGE_PATH} \ + ${INPUT_ONNX} \ + --trt-file ${OUT_TENSORRT} \ + --max-shape INT INT INT INT \ + --min-shape INT INT INT INT \ + --workspace-size INT \ + --fp16 \ + --show \ + --verify \ + --verbose +``` + +参数说明: + +- `config` : 模型配置文件的路径。 +- `model_type` :配置文件的模型类型,选项: `inpainting`, `mattor`, `restorer`, `synthesizer`。 +- `img_path` : 输入图像文件的路径。 +- `onnx_file` : 输入 ONNX 文件的路径。 +- `--trt-file` : 输出 TensorRT 模型的路径。默认为 `tmp.trt`。 +- `--max-shape` : 模型输入的最大形状。 +- `--min-shape` : 模型输入的最小形状。 +- `--workspace-size`: 以 GiB 为单位的最大工作空间大小。默认为 1 GiB。 +- `--fp16`: 确定是否以 fp16 模式导出 TensorRT。默认为 `False`。 +- `--show`: 确定是否显示 ONNX 和 TensorRT 的输出。默认为 `False`。 +- `--verify`: 确定是否验证导出模型的正确性。默认为 `False`。 +- `--verbose`: 确定在创建 TensorRT 引擎时是否详细记录日志消息。默认为 `False`。 + +**注**:此工具仍处于试验阶段。 目前不支持某些自定义运算符。 我们现在只支持 `restorer`。 在生成 SRCNN 的 ONNX 文件时,将 SCRNN 模型中的 'bicubic' 替换为 'bilinear' \[此处\](https://github.com/open-mmlab/mmediting/blob/764e6065e315b7d0033762038fcbf0bb1c570d4d/mmedit.bones/modelsrnn py#L40)。 因为 TensorRT 目前不支持 bicubic 插值,最终性能将下降约 4%。 + +#### 支持导出到 TensorRT 的模型列表 + +下表列出了保证可导出到 TensorRT 引擎并可在 TensorRT 中运行的模型。 + +| 模型 | 配置 | 动态形状 | 批量推理 | 备注 | +| :----: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :------: | :------: | :-----------------------------------: | +| ESRGAN | [esrgan_x4c64b23g32_g1_400k_div2k.py](https://github.com/open-mmlab/mmediting/blob/master/configs/restorers/esrgan/esrgan_x4c64b23g32_g1_400k_div2k.py) | Y | Y | | +| ESRGAN | [esrgan_psnr_x4c64b23g32_g1_1000k_div2k.py](https://github.com/open-mmlab/mmediting/blob/master/configs/restorers/esrgan/esrgan_psnr_x4c64b23g32_g1_1000k_div2k.py) | Y | Y | | +| SRCNN | [srcnn_x4k915_g1_1000k_div2k.py](https://github.com/open-mmlab/mmediting/blob/master/configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py) | Y | Y | 'bicubic' 上采样必须替换为 'bilinear' | + +**注**: + +- *以上所有模型均使用 Pytorch==1.8.1、onnxruntime==1.7.0 和 tensorrt==7.2.3.4 进行测试* +- 如果您遇到上面列出的模型的任何问题,请创建一个问题,我们会尽快处理。 对于列表中未包含的型号,请尝试自行解决。 +- 由于此功能是实验性的并且可能会快速更改,因此请始终尝试使用最新的 `mmcv` 和 `mmedit`。 + +### 评估 ONNX 和 TensorRT 模型(实验性) + +我们在 `tools/deploy_test.py` 中提供了评估 TensorRT 和 ONNX 模型的方法。 + +#### 先决条件 + +要评估 ONNX 和 TensorRT 模型,应先安装 onnx、onnxruntime 和 TensorRT。遵循 [mmcv 中的 ONNXRuntime](https://mmcv.readthedocs.io/en/latest/onnxruntime_op.html) 和 \[mmcv 中的 TensorRT 插件\](https://github.com/open-mmlab/mmcv/blob/master/docs/tensorrt_plugin.md%EF%BC%89%E4%BD%BF%E7%94%A8 ONNXRuntime 自定义操作和 TensorRT 插件安装 `mmcv-full`。 + +#### 用法 + +```bash +python tools/deploy_test.py \ + ${CONFIG_FILE} \ + ${MODEL_PATH} \ + ${BACKEND} \ + --out ${OUTPUT_FILE} \ + --save-path ${SAVE_PATH} \ + ----cfg-options ${CFG_OPTIONS} \ +``` + +#### 参数说明: + +- `config`: 模型配置文件的路径。 +- `model`: TensorRT 或 ONNX 模型文件的路径。 +- `backend`: 用于测试的后端,选择 tensorrt 或 onnxruntime。 +- `--out`: pickle 格式的输出结果文件的路径。 +- `--save-path`: 存储图像的路径,如果没有给出,则不会保存图像。 +- `--cfg-options`: 覆盖使用的配置文件中的一些设置,`xxx=yyy` 格式的键值对将被合并到配置文件中。 + +#### 结果和模型 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ModelConfigDatasetMetricPyTorchONNX RuntimeTensorRT FP32TensorRT FP16
ESRGAN + esrgan_x4c64b23g32_g1_400k_div2k.py + Set5PSNR28.270028.261928.261928.2616
SSIM0.77780.77840.77840.7783
Set14PSNR24.632824.629024.629024.6274
SSIM0.64910.64940.64940.6494
DIV2KPSNR26.653126.653226.653226.6532
SSIM0.73400.73400.73400.7340
ESRGAN + esrgan_psnr_x4c64b23g32_g1_1000k_div2k.py + Set5PSNR30.642830.630730.630730.6305
SSIM0.85590.85650.85650.8566
Set14PSNR27.054327.042227.042227.0411
SSIM0.74470.74500.74500.7449
DIV2KPSNR29.335429.335429.335429.3339
SSIM0.82630.82630.82630.8263
SRCNN + srcnn_x4k915_g1_1000k_div2k.py + Set5PSNR28.431628.412027.214427.2127
SSIM0.80990.81060.77820.7781
Set14PSNR25.648625.636724.861324.8599
SSIM0.70140.70150.66740.6673
DIV2KPSNR27.746027.746026.989126.9862
SSIM0.78540.785430.76050.7604
+ +**注**: + +- 所有 ONNX 和 TensorRT 模型都使用数据集上的动态形状进行评估,图像根据原始配置文件进行预处理。 +- 此工具仍处于试验阶段,我们目前仅支持 `restorer`。 diff --git a/docs/zh_cn/user_guides/visualization.md b/docs/zh_cn/user_guides/visualization.md index 04aa43c3ed..b42ece1d09 100644 --- a/docs/zh_cn/user_guides/visualization.md +++ b/docs/zh_cn/user_guides/visualization.md @@ -1 +1 @@ -# 可视化(待更新) +# 教程 6:可视化(待更新) From 8137c28a9e3baac93cb35d336abcd6794d083ce6 Mon Sep 17 00:00:00 2001 From: xiaomile <15622388695@163.com> Date: Wed, 14 Dec 2022 20:46:57 +0800 Subject: [PATCH 17/44] [CodeCamp #99] type hints Part B (#1481) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 第一次提交 * 第一次提交 * 第二次提交 * 第三次提交 * 第四次提交,修改 isort * 第5次提交,isort调整 * 第五次提交,调整isort * 第6次提交,调整yapf * 第7次提交,针对部分类型修改 * 第7次提交,针对部分类型修改 * 第7次提交,针对部分类型修改 * 第7次提交,针对部分类型修改 * 第八次提交,根据要求修改部分参数类型和函数返回类型 spearable_conv_module.py参数kernel_size,stride,padding,dilation根据ConvModule的同名参数进行修改类型。resnet.py类ResNet中forward函数返回的类型是list;其他部分根据要求修改 * 第八次提交,yapf调整 * 第九次提交,img_normalize.py部分类型修改 根据tests/test_models/test_base_archs/test_img_normalize.py创建这个class时给的参数rgb_mean和rgb_std的类型,以及mmedit/models/editors/ttsr/lte.py创建这个class的参数vgg_mean和vgg_std的参数类型,修改img_mean 和 img_std的类型 * 第十次提交,修改base_edit_model.py和base_mattor.py部分参数类型 base_edit_model.py函数convert_to_datasample的返回类型修改为List[EditDataSample],因为其返回的变量inputs也是函数的参数,因此将参数inputs的类型也修改为List[EditDataSample]; base_mattor.py的函数convert_to_datasample的返回类型修改为List[EditDataSample] --- mmedit/models/base_archs/aspp.py | 28 +++-- mmedit/models/base_archs/downsample.py | 5 +- mmedit/models/base_archs/ensemble.py | 11 +- mmedit/models/base_archs/gated_conv_module.py | 13 ++- mmedit/models/base_archs/img_normalize.py | 8 +- mmedit/models/base_archs/linear_module.py | 21 ++-- mmedit/models/base_archs/multi_layer_disc.py | 33 +++--- mmedit/models/base_archs/patch_disc.py | 17 +-- mmedit/models/base_archs/resnet.py | 108 ++++++++++-------- .../base_archs/separable_conv_module.py | 29 ++--- .../base_archs/simple_encoder_decoder.py | 3 +- mmedit/models/base_archs/smpatch_disc.py | 19 +-- mmedit/models/base_archs/sr_backbone.py | 7 +- mmedit/models/base_archs/upsample.py | 9 +- mmedit/models/base_archs/vgg.py | 18 +-- mmedit/models/base_models/base_edit_model.py | 35 ++++-- mmedit/models/base_models/base_mattor.py | 18 ++- .../models/base_models/basic_interpolator.py | 23 ++-- mmedit/models/base_models/one_stage.py | 59 ++++++---- mmedit/models/base_models/two_stage.py | 66 ++++++----- 20 files changed, 310 insertions(+), 220 deletions(-) diff --git a/mmedit/models/base_archs/aspp.py b/mmedit/models/base_archs/aspp.py index 9b3bbc4665..43f9341984 100644 --- a/mmedit/models/base_archs/aspp.py +++ b/mmedit/models/base_archs/aspp.py @@ -1,7 +1,9 @@ # Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional, Sequence + import torch from mmcv.cnn import ConvModule -from torch import nn +from torch import Tensor, nn from torch.nn import functional as F from .separable_conv_module import DepthwiseSeparableConvModule @@ -23,7 +25,9 @@ class ASPPPooling(nn.Sequential): act_cfg (dict): Config dict for activation layer. """ - def __init__(self, in_channels, out_channels, conv_cfg, norm_cfg, act_cfg): + def __init__(self, in_channels: int, out_channels: int, + conv_cfg: Optional[dict], norm_cfg: Optional[dict], + act_cfg: Optional[dict]): super().__init__( nn.AdaptiveAvgPool2d(1), ConvModule( @@ -34,7 +38,7 @@ def __init__(self, in_channels, out_channels, conv_cfg, norm_cfg, act_cfg): norm_cfg=norm_cfg, act_cfg=act_cfg)) - def forward(self, x): + def forward(self, x: Tensor) -> Tensor: """Forward function for ASPP Pooling module. Args: @@ -79,14 +83,14 @@ class ASPP(nn.Module): """ def __init__(self, - in_channels, - out_channels=256, - mid_channels=256, - dilations=(12, 24, 36), - conv_cfg=None, - norm_cfg=dict(type='BN'), - act_cfg=dict(type='ReLU'), - separable_conv=False): + in_channels: int, + out_channels: int = 256, + mid_channels: int = 256, + dilations: Sequence[int] = (12, 24, 36), + conv_cfg: Optional[dict] = None, + norm_cfg: Optional[dict] = dict(type='BN'), + act_cfg: Optional[dict] = dict(type='ReLU'), + separable_conv: bool = False): super().__init__() if separable_conv: @@ -131,7 +135,7 @@ def __init__(self, norm_cfg=norm_cfg, act_cfg=act_cfg), nn.Dropout(0.5)) - def forward(self, x): + def forward(self, x: Tensor) -> Tensor: """Forward function for ASPP module. Args: diff --git a/mmedit/models/base_archs/downsample.py b/mmedit/models/base_archs/downsample.py index 7d51a5b554..d6ad980a3e 100644 --- a/mmedit/models/base_archs/downsample.py +++ b/mmedit/models/base_archs/downsample.py @@ -1,5 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. -def pixel_unshuffle(x, scale): +from torch import Tensor + + +def pixel_unshuffle(x: Tensor, scale: int) -> Tensor: """Down-sample by pixel unshuffle. Args: diff --git a/mmedit/models/base_archs/ensemble.py b/mmedit/models/base_archs/ensemble.py index 54ec380616..e34f2536cd 100644 --- a/mmedit/models/base_archs/ensemble.py +++ b/mmedit/models/base_archs/ensemble.py @@ -1,4 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional + import torch import torch.nn as nn @@ -13,13 +15,13 @@ class SpatialTemporalEnsemble(nn.Module): Default: False. """ - def __init__(self, is_temporal_ensemble=False): + def __init__(self, is_temporal_ensemble: Optional[bool] = False): super().__init__() self.is_temporal_ensemble = is_temporal_ensemble - def _transform(self, imgs, mode): + def _transform(self, imgs: torch.Tensor, mode: str) -> torch.Tensor: """Apply spatial transform (flip, rotate) to the images. Args: @@ -52,7 +54,8 @@ def _transform(self, imgs, mode): return imgs - def spatial_ensemble(self, imgs, model): + def spatial_ensemble(self, imgs: torch.Tensor, + model: nn.Module) -> torch.Tensor: """Apply spatial ensemble. Args: @@ -82,7 +85,7 @@ def spatial_ensemble(self, imgs, model): return outputs.to(imgs.device) - def forward(self, imgs, model): + def forward(self, imgs: torch.Tensor, model: nn.Module) -> torch.Tensor: """Apply spatial and temporal ensemble. Args: diff --git a/mmedit/models/base_archs/gated_conv_module.py b/mmedit/models/base_archs/gated_conv_module.py index 7cfa29fea3..a5a0e006b7 100644 --- a/mmedit/models/base_archs/gated_conv_module.py +++ b/mmedit/models/base_archs/gated_conv_module.py @@ -1,5 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. import copy +from typing import Optional, Tuple, Union import torch import torch.nn as nn @@ -32,11 +33,11 @@ class SimpleGatedConvModule(nn.Module): """ def __init__(self, - in_channels, - out_channels, - kernel_size, - feat_act_cfg=dict(type='ELU'), - gate_act_cfg=dict(type='Sigmoid'), + in_channels: int, + out_channels: int, + kernel_size: Union[int, Tuple[int, int]], + feat_act_cfg: Optional[dict] = dict(type='ELU'), + gate_act_cfg: Optional[dict] = dict(type='Sigmoid'), **kwargs): super().__init__() # the activation function should specified outside conv module @@ -54,7 +55,7 @@ def __init__(self, if self.with_gate_act: self.gate_act = build_activation_layer(gate_act_cfg) - def forward(self, x): + def forward(self, x: torch.Tensor) -> torch.Tensor: """Forward Function. Args: diff --git a/mmedit/models/base_archs/img_normalize.py b/mmedit/models/base_archs/img_normalize.py index 1bd8f76aa6..a845479e28 100644 --- a/mmedit/models/base_archs/img_normalize.py +++ b/mmedit/models/base_archs/img_normalize.py @@ -1,4 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. +from typing import Tuple + import torch import torch.nn as nn @@ -15,7 +17,11 @@ class ImgNormalize(nn.Conv2d): sign (int): Sign of bias. Default -1. """ - def __init__(self, pixel_range, img_mean, img_std, sign=-1): + def __init__(self, + pixel_range: float, + img_mean: Tuple[float, float, float], + img_std: Tuple[float, float, float], + sign: int = -1): assert len(img_mean) == len(img_std) num_channels = len(img_mean) diff --git a/mmedit/models/base_archs/linear_module.py b/mmedit/models/base_archs/linear_module.py index 6d5e1152b6..0c3a268d40 100644 --- a/mmedit/models/base_archs/linear_module.py +++ b/mmedit/models/base_archs/linear_module.py @@ -1,7 +1,10 @@ # Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional, Tuple + import torch.nn as nn from mmcv.cnn import build_activation_layer from mmengine.model.weight_init import kaiming_init +from torch import Tensor class LinearModule(nn.Module): @@ -24,13 +27,13 @@ class LinearModule(nn.Module): """ def __init__(self, - in_features, - out_features, - bias=True, - act_cfg=dict(type='ReLU'), - inplace=True, - with_spectral_norm=False, - order=('linear', 'act')): + in_features: int, + out_features: int, + bias: bool = True, + act_cfg: Optional[dict] = dict(type='ReLU'), + inplace: bool = True, + with_spectral_norm: bool = False, + order: Tuple[str, str] = ('linear', 'act')): super().__init__() assert act_cfg is None or isinstance(act_cfg, dict) self.act_cfg = act_cfg @@ -62,7 +65,7 @@ def __init__(self, # Use msra init by default self.init_weights() - def init_weights(self): + def init_weights(self) -> None: """Init weights for the model.""" if self.with_activation and self.act_cfg['type'] == 'LeakyReLU': nonlinearity = 'leaky_relu' @@ -73,7 +76,7 @@ def init_weights(self): kaiming_init(self.linear, a=a, nonlinearity=nonlinearity) - def forward(self, x, activate=True): + def forward(self, x: Tensor, activate: Optional[bool] = True) -> Tensor: """Forward Function. Args: diff --git a/mmedit/models/base_archs/multi_layer_disc.py b/mmedit/models/base_archs/multi_layer_disc.py index 20f3c55660..3d225f727c 100644 --- a/mmedit/models/base_archs/multi_layer_disc.py +++ b/mmedit/models/base_archs/multi_layer_disc.py @@ -1,8 +1,11 @@ # Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional + import torch.nn as nn from mmcv.cnn import ConvModule from mmengine import MMLogger from mmengine.runner import load_checkpoint +from torch import Tensor from mmedit.models.base_archs import LinearModule from mmedit.registry import COMPONENTS @@ -44,19 +47,19 @@ class MultiLayerDiscriminator(nn.Module): """ def __init__(self, - in_channels, - max_channels, - num_convs=5, - fc_in_channels=None, - fc_out_channels=1024, - kernel_size=5, - conv_cfg=None, - norm_cfg=None, - act_cfg=dict(type='ReLU'), - out_act_cfg=dict(type='ReLU'), - with_input_norm=True, - with_out_convs=False, - with_spectral_norm=False, + in_channels: int, + max_channels: int, + num_convs: int = 5, + fc_in_channels: Optional[int] = None, + fc_out_channels: int = 1024, + kernel_size: int = 5, + conv_cfg: Optional[dict] = None, + norm_cfg: Optional[dict] = None, + act_cfg: Optional[dict] = dict(type='ReLU'), + out_act_cfg: Optional[dict] = dict(type='ReLU'), + with_input_norm: bool = True, + with_out_convs: bool = False, + with_spectral_norm: bool = False, **kwargs): super().__init__() if fc_in_channels is not None: @@ -128,7 +131,7 @@ def __init__(self, act_cfg=out_act_cfg, with_spectral_norm=with_spectral_norm) - def forward(self, x): + def forward(self, x: Tensor) -> Tensor: """Forward Function. Args: @@ -149,7 +152,7 @@ def forward(self, x): return x - def init_weights(self, pretrained=None): + def init_weights(self, pretrained: Optional[str] = None) -> None: """Init weights for models. Args: diff --git a/mmedit/models/base_archs/patch_disc.py b/mmedit/models/base_archs/patch_disc.py index e1bcaad08a..b25eef77c1 100644 --- a/mmedit/models/base_archs/patch_disc.py +++ b/mmedit/models/base_archs/patch_disc.py @@ -1,8 +1,11 @@ # Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional + import torch.nn as nn from mmcv.cnn import ConvModule, build_conv_layer from mmengine import MMLogger from mmengine.runner import load_checkpoint +from torch import Tensor from mmedit.models.utils import generation_init_weights from mmedit.registry import MODULES @@ -27,11 +30,11 @@ class PatchDiscriminator(nn.Module): """ def __init__(self, - in_channels, - base_channels=64, - num_conv=3, - norm_cfg=dict(type='BN'), - init_cfg=dict(type='normal', gain=0.02)): + in_channels: int, + base_channels: int = 64, + num_conv: int = 3, + norm_cfg: dict = dict(type='BN'), + init_cfg: Optional[dict] = dict(type='normal', gain=0.02)): super().__init__() assert isinstance(norm_cfg, dict), ("'norm_cfg' should be dict, but" f'got {type(norm_cfg)}') @@ -105,7 +108,7 @@ def __init__(self, self.init_gain = 0.02 if init_cfg is None else init_cfg.get( 'gain', 0.02) - def forward(self, x): + def forward(self, x: Tensor) -> Tensor: """Forward function. Args: @@ -116,7 +119,7 @@ def forward(self, x): """ return self.model(x) - def init_weights(self, pretrained=None): + def init_weights(self, pretrained: Optional[str] = None) -> None: """Initialize weights for the model. Args: diff --git a/mmedit/models/base_archs/resnet.py b/mmedit/models/base_archs/resnet.py index 1a0caf80da..90eedf08ae 100644 --- a/mmedit/models/base_archs/resnet.py +++ b/mmedit/models/base_archs/resnet.py @@ -1,4 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. +from typing import List, Optional, Sequence + import torch.nn as nn import torch.utils.checkpoint as cp from mmcv.cnn import build_activation_layer, build_conv_layer, build_norm_layer @@ -6,6 +8,7 @@ from mmengine.model.weight_init import constant_init, kaiming_init from mmengine.runner import load_checkpoint from mmengine.utils.dl_utils.parrots_wrapper import _BatchNorm +from torch import Tensor class BasicBlock(nn.Module): @@ -30,15 +33,15 @@ class BasicBlock(nn.Module): expansion = 1 def __init__(self, - inplanes, - planes, - stride=1, - dilation=1, - downsample=None, - act_cfg=dict(type='ReLU'), - conv_cfg=None, - norm_cfg=dict(type='BN'), - with_cp=False): + inplanes: int, + planes: int, + stride: int = 1, + dilation: int = 1, + downsample: Optional[nn.Module] = None, + act_cfg: dict = dict(type='ReLU'), + conv_cfg: Optional[dict] = None, + norm_cfg: dict = dict(type='BN'), + with_cp: bool = False): super(BasicBlock, self).__init__() self.norm1_name, norm1 = build_norm_layer(norm_cfg, planes, postfix=1) @@ -65,19 +68,19 @@ def __init__(self, self.with_cp = with_cp @property - def norm1(self): + def norm1(self) -> nn.Module: """nn.Module: normalization layer after the first convolution layer""" return getattr(self, self.norm1_name) @property - def norm2(self): + def norm2(self) -> nn.Module: """nn.Module: normalization layer after the second convolution layer""" return getattr(self, self.norm2_name) - def forward(self, x): + def forward(self, x: Tensor) -> Tensor: """Forward function.""" - def _inner_forward(x): + def _inner_forward(x: Tensor) -> Tensor: identity = x out = self.conv1(x) @@ -126,15 +129,15 @@ class Bottleneck(nn.Module): expansion = 4 def __init__(self, - inplanes, - planes, - stride=1, - dilation=1, - downsample=None, - act_cfg=dict(type='ReLU'), - conv_cfg=None, - norm_cfg=dict(type='BN'), - with_cp=False): + inplanes: int, + planes: int, + stride: int = 1, + dilation: int = 1, + downsample: Optional[nn.Module] = None, + act_cfg: dict = dict(type='ReLU'), + conv_cfg: Optional[dict] = None, + norm_cfg: dict = dict(type='BN'), + with_cp: bool = False): super(Bottleneck, self).__init__() self.inplanes = inplanes @@ -185,21 +188,21 @@ def __init__(self, self.downsample = downsample @property - def norm1(self): + def norm1(self) -> nn.Module: """nn.Module: normalization layer after the first convolution layer""" return getattr(self, self.norm1_name) @property - def norm2(self): + def norm2(self) -> nn.Module: """nn.Module: normalization layer after the second convolution layer""" return getattr(self, self.norm2_name) @property - def norm3(self): + def norm3(self) -> nn.Module: """nn.Module: normalization layer after the second convolution layer""" return getattr(self, self.norm3_name) - def forward(self, x): + def forward(self, x: Tensor) -> Tensor: identity = x out = self.conv1(x) @@ -269,23 +272,23 @@ class ResNet(nn.Module): } def __init__(self, - depth, - in_channels, - stem_channels, - base_channels, - num_stages=4, - strides=(1, 2, 2, 2), - dilations=(1, 1, 2, 4), - deep_stem=False, - avg_down=False, - frozen_stages=-1, - act_cfg=dict(type='ReLU'), - conv_cfg=None, - norm_cfg=dict(type='BN'), - with_cp=False, - multi_grid=None, - contract_dilation=False, - zero_init_residual=True): + depth: int, + in_channels: int = 3, + stem_channels: int = 64, + base_channels: int = 64, + num_stages: int = 4, + strides: Sequence[int] = (1, 2, 2, 2), + dilations: Sequence[int] = (1, 1, 2, 4), + deep_stem: bool = False, + avg_down: bool = False, + frozen_stages: int = -1, + act_cfg: dict = dict(type='ReLU'), + conv_cfg: Optional[dict] = None, + norm_cfg: dict = dict(type='BN'), + with_cp: bool = False, + multi_grid: Optional[Sequence[int]] = None, + contract_dilation: bool = False, + zero_init_residual: bool = True): super(ResNet, self).__init__() from functools import partial @@ -334,7 +337,7 @@ def __init__(self, self._freeze_stages() - def _make_stem_layer(self, in_channels, stem_channels): + def _make_stem_layer(self, in_channels: int, stem_channels: int) -> None: """Make stem layer for ResNet.""" if self.deep_stem: self.stem = nn.Sequential( @@ -384,11 +387,16 @@ def _make_stem_layer(self, in_channels, stem_channels): self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) @property - def norm1(self): + def norm1(self) -> nn.Module: """nn.Module: normalization layer after the second convolution layer""" return getattr(self, self.norm1_name) - def _make_layer(self, block, planes, blocks, stride=1, dilation=1): + def _make_layer(self, + block: BasicBlock, + planes: int, + blocks: int, + stride: int = 1, + dilation: int = 1) -> nn.Module: downsample = None if stride != 1 or self.inplanes != planes * block.expansion: downsample = nn.Sequential( @@ -424,7 +432,7 @@ def _make_layer(self, block, planes, blocks, stride=1, dilation=1): return nn.Sequential(*layers) - def _nostride_dilate(self, m, dilate): + def _nostride_dilate(self, m: nn.Module, dilate: int) -> None: classname = m.__class__.__name__ if classname.find('Conv') != -1 and dilate > 1: # the convolution with stride @@ -440,7 +448,7 @@ def _nostride_dilate(self, m, dilate): m.dilation = (dilate, dilate) m.padding = (dilate, dilate) - def init_weights(self, pretrained=None): + def init_weights(self, pretrained: Optional[str] = None) -> None: """Init weights for the model. Args: @@ -466,7 +474,7 @@ def init_weights(self, pretrained=None): else: raise TypeError('pretrained must be a str or None') - def _freeze_stages(self): + def _freeze_stages(self) -> None: """Freeze stages param and norm stats.""" if self.frozen_stages >= 0: if self.deep_stem: @@ -485,7 +493,7 @@ def _freeze_stages(self): for param in m.parameters(): param.requires_grad = False - def forward(self, x): + def forward(self, x: Tensor) -> List[Tensor]: """Forward function. Args: diff --git a/mmedit/models/base_archs/separable_conv_module.py b/mmedit/models/base_archs/separable_conv_module.py index 139a54e58c..0d807ccbf5 100644 --- a/mmedit/models/base_archs/separable_conv_module.py +++ b/mmedit/models/base_archs/separable_conv_module.py @@ -1,6 +1,9 @@ # Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional, Tuple, Union + import torch.nn as nn from mmcv.cnn import ConvModule +from torch import Tensor class DepthwiseSeparableConvModule(nn.Module): @@ -39,18 +42,18 @@ class DepthwiseSeparableConvModule(nn.Module): """ def __init__(self, - in_channels, - out_channels, - kernel_size, - stride=1, - padding=0, - dilation=1, - norm_cfg=None, - act_cfg=dict(type='ReLU'), - dw_norm_cfg='default', - dw_act_cfg='default', - pw_norm_cfg='default', - pw_act_cfg='default', + in_channels: int, + out_channels: int, + kernel_size: Union[int, Tuple[int, int]], + stride: Union[int, Tuple[int, int]] = 1, + padding: Union[int, Tuple[int, int]] = 0, + dilation: Union[int, Tuple[int, int]] = 1, + norm_cfg: Optional[dict] = None, + act_cfg: Optional[dict] = dict(type='ReLU'), + dw_norm_cfg: Union[dict, str] = 'default', + dw_act_cfg: Union[dict, str] = 'default', + pw_norm_cfg: Union[dict, str] = 'default', + pw_act_cfg: Union[dict, str] = 'default', **kwargs): super().__init__() assert 'groups' not in kwargs, 'groups should not be specified' @@ -83,7 +86,7 @@ def __init__(self, act_cfg=pw_act_cfg, **kwargs) - def forward(self, x): + def forward(self, x: Tensor) -> Tensor: """Forward function. Args: diff --git a/mmedit/models/base_archs/simple_encoder_decoder.py b/mmedit/models/base_archs/simple_encoder_decoder.py index 964fdf6626..76f542377c 100644 --- a/mmedit/models/base_archs/simple_encoder_decoder.py +++ b/mmedit/models/base_archs/simple_encoder_decoder.py @@ -2,6 +2,7 @@ from typing import Optional from mmengine.model import BaseModule +from torch import Tensor from mmedit.registry import MODELS @@ -27,7 +28,7 @@ def __init__(self, decoder['in_channels'] = self.encoder.out_channels self.decoder = MODELS.build(decoder) - def forward(self, *args, **kwargs): + def forward(self, *args, **kwargs) -> Tensor: """Forward function. Returns: diff --git a/mmedit/models/base_archs/smpatch_disc.py b/mmedit/models/base_archs/smpatch_disc.py index b121a1a641..96446cac27 100644 --- a/mmedit/models/base_archs/smpatch_disc.py +++ b/mmedit/models/base_archs/smpatch_disc.py @@ -1,8 +1,11 @@ # Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional + import torch.nn as nn from mmcv.cnn import ConvModule from mmengine import MMLogger from mmengine.runner import load_checkpoint +from torch import Tensor from mmedit.models.utils import generation_init_weights from mmedit.registry import COMPONENTS @@ -29,12 +32,12 @@ class SoftMaskPatchDiscriminator(nn.Module): """ def __init__(self, - in_channels, - base_channels=64, - num_conv=3, - norm_cfg=None, - init_cfg=dict(type='normal', gain=0.02), - with_spectral_norm=False): + in_channels: int, + base_channels: Optional[int] = 64, + num_conv: Optional[int] = 3, + norm_cfg: Optional[dict] = None, + init_cfg: Optional[dict] = dict(type='normal', gain=0.02), + with_spectral_norm: Optional[bool] = False): super().__init__() kernel_size = 4 @@ -104,7 +107,7 @@ def __init__(self, self.init_gain = 0.02 if init_cfg is None else init_cfg.get( 'gain', 0.02) - def forward(self, x): + def forward(self, x: Tensor) -> Tensor: """Forward function. Args: @@ -115,7 +118,7 @@ def forward(self, x): """ return self.model(x) - def init_weights(self, pretrained=None): + def init_weights(self, pretrained: Optional[str] = None) -> None: """Initialize weights for the model. Args: diff --git a/mmedit/models/base_archs/sr_backbone.py b/mmedit/models/base_archs/sr_backbone.py index eef6d3c983..cab5c22b44 100644 --- a/mmedit/models/base_archs/sr_backbone.py +++ b/mmedit/models/base_archs/sr_backbone.py @@ -1,5 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch.nn as nn +from torch import Tensor from ..utils import default_init_weights @@ -54,7 +55,7 @@ class ResidualBlockNoBN(nn.Module): Default: 1.0. """ - def __init__(self, mid_channels=64, res_scale=1.0): + def __init__(self, mid_channels: int = 64, res_scale: float = 1.0): super().__init__() self.res_scale = res_scale self.conv1 = nn.Conv2d(mid_channels, mid_channels, 3, 1, 1, bias=True) @@ -67,7 +68,7 @@ def __init__(self, mid_channels=64, res_scale=1.0): if res_scale == 1.0: self.init_weights() - def init_weights(self): + def init_weights(self) -> None: """Initialize weights for ResidualBlockNoBN. Initialization methods like `kaiming_init` are for VGG-style modules. @@ -79,7 +80,7 @@ def init_weights(self): for m in [self.conv1, self.conv2]: default_init_weights(m, 0.1) - def forward(self, x): + def forward(self, x: Tensor) -> Tensor: """Forward function. Args: diff --git a/mmedit/models/base_archs/upsample.py b/mmedit/models/base_archs/upsample.py index 67b6befc3b..17516df5e2 100644 --- a/mmedit/models/base_archs/upsample.py +++ b/mmedit/models/base_archs/upsample.py @@ -1,6 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import torch.nn as nn import torch.nn.functional as F +from torch import Tensor from .sr_backbone import default_init_weights @@ -18,8 +19,8 @@ class PixelShufflePack(nn.Module): Upsampled feature map. """ - def __init__(self, in_channels, out_channels, scale_factor, - upsample_kernel): + def __init__(self, in_channels: int, out_channels: int, scale_factor: int, + upsample_kernel: int): super().__init__() self.in_channels = in_channels self.out_channels = out_channels @@ -32,11 +33,11 @@ def __init__(self, in_channels, out_channels, scale_factor, padding=(self.upsample_kernel - 1) // 2) self.init_weights() - def init_weights(self): + def init_weights(self) -> None: """Initialize weights for PixelShufflePack.""" default_init_weights(self, 1) - def forward(self, x): + def forward(self, x: Tensor) -> Tensor: """Forward function for PixelShufflePack. Args: diff --git a/mmedit/models/base_archs/vgg.py b/mmedit/models/base_archs/vgg.py index 53af8e96c6..3dd0161d11 100644 --- a/mmedit/models/base_archs/vgg.py +++ b/mmedit/models/base_archs/vgg.py @@ -1,9 +1,10 @@ # Copyright (c) OpenMMLab. All rights reserved. -from typing import Optional +from typing import Dict, List, Optional import torch.nn as nn from mmengine.model import BaseModule from mmengine.model.weight_init import constant_init, xavier_init +from torch import Tensor from mmedit.registry import MODELS from ..base_archs.aspp import ASPP @@ -28,10 +29,10 @@ class VGG16(BaseModule): """ def __init__(self, - in_channels, - batch_norm=False, - aspp=False, - dilations=None, + in_channels: int, + batch_norm: Optional[bool] = False, + aspp: Optional[bool] = False, + dilations: Optional[List[int]] = None, init_cfg: Optional[dict] = None): super().__init__(init_cfg=init_cfg) self.batch_norm = batch_norm @@ -55,7 +56,8 @@ def __init__(self, else: self.out_channels = 512 - def _make_layer(self, inplanes, planes, convs_layers): + def _make_layer(self, inplanes: int, planes: int, + convs_layers: int) -> nn.Module: layers = [] for _ in range(convs_layers): conv2d = nn.Conv2d(inplanes, planes, kernel_size=3, padding=1) @@ -68,7 +70,7 @@ def _make_layer(self, inplanes, planes, convs_layers): layers += [nn.MaxPool2d(kernel_size=2, stride=2, return_indices=True)] return nn.Sequential(*layers) - def init_weights(self): + def init_weights(self) -> None: """Init weights for the model.""" if self.init_cfg is not None: super().init_weights() @@ -80,7 +82,7 @@ def init_weights(self): elif isinstance(m, nn.BatchNorm2d): constant_init(m, 1) - def forward(self, x): + def forward(self, x: Tensor) -> Dict[str, Tensor]: """Forward function for ASPP module. Args: diff --git a/mmedit/models/base_models/base_edit_model.py b/mmedit/models/base_models/base_edit_model.py index 08234d4ed1..4d0c0afbc4 100644 --- a/mmedit/models/base_models/base_edit_model.py +++ b/mmedit/models/base_models/base_edit_model.py @@ -1,5 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. -from typing import List, Optional +from typing import Dict, List, Optional, Union import torch from mmengine.model import BaseModel @@ -33,12 +33,12 @@ class BaseEditModel(BaseModel): """ def __init__(self, - generator, - pixel_loss, - train_cfg=None, - test_cfg=None, - init_cfg=None, - data_preprocessor=None): + generator: dict, + pixel_loss: dict, + train_cfg: Optional[dict] = None, + test_cfg: Optional[dict] = None, + init_cfg: Optional[dict] = None, + data_preprocessor: Optional[dict] = None): super().__init__( init_cfg=init_cfg, data_preprocessor=data_preprocessor) @@ -55,7 +55,7 @@ def forward(self, inputs: torch.Tensor, data_samples: Optional[List[EditDataSample]] = None, mode: str = 'tensor', - **kwargs): + **kwargs) -> Union[torch.Tensor, List[EditDataSample], dict]: """Returns losses or predictions of training, validation, testing, and simple inference process. @@ -116,12 +116,17 @@ def forward(self, elif mode == 'loss': return self.forward_train(inputs, data_samples, **kwargs) - def convert_to_datasample(self, inputs, data_samples): + def convert_to_datasample(self, inputs: List[EditDataSample], + data_samples: List[EditDataSample] + ) -> List[EditDataSample]: for data_sample, output in zip(inputs, data_samples): data_sample.output = output return inputs - def forward_tensor(self, inputs, data_samples=None, **kwargs): + def forward_tensor(self, + inputs: torch.Tensor, + data_samples: Optional[List[EditDataSample]] = None, + **kwargs) -> torch.Tensor: """Forward tensor. Returns result of simple forward. Args: @@ -138,7 +143,10 @@ def forward_tensor(self, inputs, data_samples=None, **kwargs): return feats - def forward_inference(self, inputs, data_samples=None, **kwargs): + def forward_inference(self, + inputs: torch.Tensor, + data_samples: Optional[List[EditDataSample]] = None, + **kwargs) -> List[EditDataSample]: """Forward inference. Returns predictions of validation, testing, and simple inference. @@ -163,7 +171,10 @@ def forward_inference(self, inputs, data_samples=None, **kwargs): return predictions - def forward_train(self, inputs, data_samples=None, **kwargs): + def forward_train(self, + inputs: torch.Tensor, + data_samples: Optional[List[EditDataSample]] = None, + **kwargs) -> Dict[str, torch.Tensor]: """Forward training. Returns dict of losses of training. Args: diff --git a/mmedit/models/base_models/base_mattor.py b/mmedit/models/base_models/base_mattor.py index ee48535c21..65b331cc4a 100644 --- a/mmedit/models/base_models/base_mattor.py +++ b/mmedit/models/base_models/base_mattor.py @@ -15,7 +15,9 @@ Tuple[torch.Tensor], torch.Tensor] -def _pad(batch_image, ds_factor, mode='reflect'): +def _pad(batch_image: torch.Tensor, + ds_factor: int, + mode: str = 'reflect') -> Tuple[torch.Tensor, Tuple[int, int]]: """Pad image to a multiple of give down-sampling factor.""" h, w = batch_image.shape[-2:] # NCHW @@ -33,7 +35,10 @@ def _pad(batch_image, ds_factor, mode='reflect'): return batch_image, pad -def _interpolate(batch_image, ds_factor, mode='bicubic'): +def _interpolate(batch_image: torch.Tensor, + ds_factor: int, + mode: str = 'bicubic' + ) -> Tuple[torch.Tensor, Tuple[int, int]]: """Resize image to multiple of give down-sampling factor.""" h, w = batch_image.shape[-2:] # NCHW @@ -97,7 +102,7 @@ def __init__(self, self.backbone = MODELS.build(backbone) - def resize_inputs(self, batch_inputs): + def resize_inputs(self, batch_inputs: torch.Tensor) -> torch.Tensor: """Pad or interpolate images and trimaps to multiple of given factor.""" @@ -121,7 +126,8 @@ def resize_inputs(self, batch_inputs): return torch.cat((batch_images, batch_trimaps), dim=1) - def restore_size(self, pred_alpha, data_sample): + def restore_size(self, pred_alpha: torch.Tensor, + data_sample: EditDataSample) -> torch.Tensor: """Restore the predicted alpha to the original shape. The shape of the predicted alpha may not be the same as the shape of @@ -243,7 +249,9 @@ def forward(self, else: raise ValueError('Invalid forward mode.') - def convert_to_datasample(self, inputs, data_samples): + def convert_to_datasample(self, inputs: DataSamples, + data_samples: List[EditDataSample] + ) -> List[EditDataSample]: for data_sample, output in zip(inputs, data_samples): data_sample.output = output return inputs diff --git a/mmedit/models/base_models/basic_interpolator.py b/mmedit/models/base_models/basic_interpolator.py index 1de2d36207..7a88fc34eb 100644 --- a/mmedit/models/base_models/basic_interpolator.py +++ b/mmedit/models/base_models/basic_interpolator.py @@ -1,4 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional + import torch from mmedit.registry import MODELS @@ -35,14 +37,14 @@ class BasicInterpolator(BaseEditModel): """ def __init__(self, - generator, - pixel_loss, - train_cfg=None, - test_cfg=None, - required_frames=2, - step_frames=1, - init_cfg=None, - data_preprocessor=None): + generator: dict, + pixel_loss: dict, + train_cfg: Optional[dict] = None, + test_cfg: Optional[dict] = None, + required_frames: int = 2, + step_frames: int = 1, + init_cfg: Optional[dict] = None, + data_preprocessor: Optional[dict] = None): super().__init__( generator=generator, @@ -57,7 +59,7 @@ def __init__(self, # Step size of video frame interpolation self.step_frames = step_frames - def split_frames(self, input_tensors): + def split_frames(self, input_tensors: torch.Tensor) -> torch.Tensor: """split input tensors for inference. Args: @@ -80,7 +82,8 @@ def split_frames(self, input_tensors): return result @staticmethod - def merge_frames(input_tensors, output_tensors): + def merge_frames(input_tensors: torch.Tensor, + output_tensors: torch.Tensor) -> list: """merge input frames and output frames. Interpolate a frame between the given two frames. diff --git a/mmedit/models/base_models/one_stage.py b/mmedit/models/base_models/one_stage.py index 8de25730cd..265e4b0cbe 100644 --- a/mmedit/models/base_models/one_stage.py +++ b/mmedit/models/base_models/one_stage.py @@ -1,14 +1,19 @@ # Copyright (c) OpenMMLab. All rights reserved. -from typing import List, Optional, Union +from typing import List, Optional, Tuple, Union import torch from mmengine.config import Config from mmengine.model import BaseModel +from mmengine.optim import OptimWrapperDict from mmedit.registry import MODELS from mmedit.structures import EditDataSample, PixelData +from mmedit.utils import SampleList from ..utils import set_requires_grad +FORWARD_RETURN_TYPE = Union[dict, torch.Tensor, + Tuple[torch.Tensor, torch.Tensor], SampleList] + @MODELS.register_module() class OneStageInpaintor(BaseModel): @@ -45,18 +50,18 @@ class OneStageInpaintor(BaseModel): def __init__(self, data_preprocessor: Union[dict, Config], - encdec, - disc=None, - loss_gan=None, - loss_gp=None, - loss_disc_shift=None, - loss_composed_percep=None, - loss_out_percep=False, - loss_l1_hole=None, - loss_l1_valid=None, - loss_tv=None, - train_cfg=None, - test_cfg=None, + encdec: dict, + disc: Optional[dict] = None, + loss_gan: Optional[dict] = None, + loss_gp: Optional[dict] = None, + loss_disc_shift: Optional[dict] = None, + loss_composed_percep: Optional[dict] = None, + loss_out_percep: bool = False, + loss_l1_hole: Optional[dict] = None, + loss_l1_valid: Optional[dict] = None, + loss_tv: Optional[dict] = None, + train_cfg: Optional[dict] = None, + test_cfg: Optional[dict] = None, init_cfg: Optional[dict] = None): super().__init__( data_preprocessor=data_preprocessor, init_cfg=init_cfg) @@ -99,7 +104,10 @@ def __init__(self, self.disc_step_count = 0 - def forward(self, inputs, data_samples, mode='tensor'): + def forward(self, + inputs: torch.Tensor, + data_samples: Optional[SampleList], + mode: str = 'tensor') -> FORWARD_RETURN_TYPE: """Forward function. Args: @@ -144,7 +152,8 @@ def forward(self, inputs, data_samples, mode='tensor'): else: raise ValueError('Invalid forward mode.') - def train_step(self, data: List[dict], optim_wrapper): + def train_step(self, data: List[dict], + optim_wrapper: OptimWrapperDict) -> dict: """Train step function. In this function, the inpaintor will finish the train step following @@ -244,7 +253,7 @@ def train_step(self, data: List[dict], optim_wrapper): return log_vars - def forward_train(self, *args, **kwargs): + def forward_train(self, *args, **kwargs) -> None: """Forward function for training. In this version, we do not use this interface. @@ -253,7 +262,8 @@ def forward_train(self, *args, **kwargs): 'current training schedule. Please use ' '`train_step` for training.') - def forward_train_d(self, data_batch, is_real, is_disc): + def forward_train_d(self, data_batch: torch.Tensor, is_real: bool, + is_disc: bool) -> dict: """Forward function in discriminator training step. In this function, we compute the prediction for each data batch (real @@ -285,7 +295,9 @@ def forward_train_d(self, data_batch, is_real, is_disc): return loss - def generator_loss(self, fake_res, fake_img, gt, mask, masked_img): + def generator_loss(self, fake_res: torch.Tensor, fake_img: torch.Tensor, + gt: torch.Tensor, mask: torch.Tensor, + masked_img: torch.Tensor) -> Tuple[dict, dict]: """Forward function in generator training step. In this function, we mainly compute the loss items for generator with @@ -349,7 +361,8 @@ def generator_loss(self, fake_res, fake_img, gt, mask, masked_img): return res, loss - def forward_tensor(self, inputs, data_samples): + def forward_tensor(self, inputs: torch.Tensor, data_samples: SampleList + ) -> Tuple[torch.Tensor, torch.Tensor]: """Forward function in tensor mode. Args: @@ -370,7 +383,8 @@ def forward_tensor(self, inputs, data_samples): fake_imgs = fake_reses * masks + masked_imgs * (1. - masks) return fake_reses, fake_imgs - def forward_test(self, inputs, data_samples): + def forward_test(self, inputs: torch.Tensor, + data_samples: SampleList) -> SampleList: """Forward function for testing. Args: @@ -392,12 +406,13 @@ def forward_test(self, inputs, data_samples): predictions.append(pred) return predictions - def convert_to_datasample(self, inputs, data_samples): + def convert_to_datasample(self, inputs: SampleList, + data_samples: SampleList) -> SampleList: for data_sample, output in zip(inputs, data_samples): data_sample.output = output return inputs - def forward_dummy(self, x): + def forward_dummy(self, x: torch.Tensor) -> torch.Tensor: """Forward dummy function for getting flops. Args: diff --git a/mmedit/models/base_models/two_stage.py b/mmedit/models/base_models/two_stage.py index aabf0d8bba..fffae0ba7c 100644 --- a/mmedit/models/base_models/two_stage.py +++ b/mmedit/models/base_models/two_stage.py @@ -1,10 +1,12 @@ # Copyright (c) OpenMMLab. All rights reserved. -from typing import List, Optional, Union +from typing import List, Optional, Sequence, Tuple, Union import torch from mmengine.config import Config +from mmengine.optim import OptimWrapperDict from mmedit.registry import MODELS +from mmedit.utils import SampleList from ..utils import set_requires_grad from .one_stage import OneStageInpaintor @@ -50,25 +52,27 @@ class TwoStageInpaintor(OneStageInpaintor): discriminator. Default: False. """ - def __init__(self, - data_preprocessor: Union[dict, Config], - encdec: dict, - disc=None, - loss_gan=None, - loss_gp=None, - loss_disc_shift=None, - loss_composed_percep=None, - loss_out_percep=False, - loss_l1_hole=None, - loss_l1_valid=None, - loss_tv=None, - train_cfg=None, - test_cfg=None, - init_cfg: Optional[dict] = None, - stage1_loss_type=('loss_l1_hole', ), - stage2_loss_type=('loss_l1_hole', 'loss_gan'), - input_with_ones=True, - disc_input_with_mask=False): + def __init__( + self, + data_preprocessor: Union[dict, Config], + encdec: dict, + disc: Optional[dict] = None, + loss_gan: Optional[dict] = None, + loss_gp: Optional[dict] = None, + loss_disc_shift: Optional[dict] = None, + loss_composed_percep: Optional[dict] = None, + loss_out_percep: bool = False, + loss_l1_hole: Optional[dict] = None, + loss_l1_valid: Optional[dict] = None, + loss_tv: Optional[dict] = None, + train_cfg: Optional[dict] = None, + test_cfg: Optional[dict] = None, + init_cfg: Optional[dict] = None, + stage1_loss_type: Optional[Sequence[str]] = ('loss_l1_hole', ), + stage2_loss_type: Optional[Sequence[str]] = ('loss_l1_hole', + 'loss_gan'), + input_with_ones: bool = True, + disc_input_with_mask: bool = False): super().__init__( data_preprocessor=data_preprocessor, encdec=encdec, @@ -93,7 +97,8 @@ def __init__(self, if self.train_cfg is not None: self.cur_iter = self.train_cfg.start_iter - def forward_tensor(self, inputs, data_samples): + def forward_tensor(self, inputs: torch.Tensor, data_samples: SampleList + ) -> Tuple[torch.Tensor, torch.Tensor]: """Forward function in tensor mode. Args: @@ -116,7 +121,9 @@ def forward_tensor(self, inputs, data_samples): fake_imgs = stage2_fake_res * masks + masked_imgs * (1. - masks) return stage2_fake_res, fake_imgs - def two_stage_loss(self, stage1_data, stage2_data, gt, mask, masked_img): + def two_stage_loss(self, stage1_data: dict, stage2_data: dict, + gt: torch.Tensor, mask: torch.Tensor, + masked_img: torch.Tensor) -> Tuple[dict, dict]: """Calculate two-stage loss. Args: @@ -164,12 +171,12 @@ def two_stage_loss(self, stage1_data, stage2_data, gt, mask, masked_img): return results, loss def calculate_loss_with_type(self, - loss_type, - fake_res, - fake_img, - gt, - mask, - prefix='stage1_'): + loss_type: str, + fake_res: torch.Tensor, + fake_img: torch.Tensor, + gt: torch.Tensor, + mask: torch.Tensor, + prefix: Optional[str] = 'stage1_') -> dict: """Calculate multiple types of losses. Args: @@ -213,7 +220,8 @@ def calculate_loss_with_type(self, return loss_dict - def train_step(self, data: List[dict], optim_wrapper): + def train_step(self, data: List[dict], + optim_wrapper: OptimWrapperDict) -> dict: """Train step function. In this function, the inpaintor will finish the train step following From 1aa9aeb3c1f60d3403926ff98664433f3dc64c26 Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Thu, 15 Dec 2022 16:53:57 +0800 Subject: [PATCH 18/44] [Enhancement] Add reproducibility warning for BigGAN 128x128 (#1538) add reproducibility warning for BigGAN 128x128 --- configs/biggan/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/configs/biggan/README.md b/configs/biggan/README.md index 9babef2be5..b98288eddd 100644 --- a/configs/biggan/README.md +++ b/configs/biggan/README.md @@ -45,6 +45,10 @@ Evaluation of our trained BigGAN. | BigGAN 128x128 Best IS | ImageNet1k | 13.51(1328000) | **129.07**(1328000) | [config](/configs/biggan/biggan_ajbrock-sn_8xb32-1500kiters_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmgen/biggan/biggan_imagenet1k_128x128_b32x8_best_is_iter_1328000_20211111_122911-28c688bc.pth)\|[log](https://download.openmmlab.com/mmgen/biggan/biggan_imagenet1k_128x128_b32x8_1500k_20211111_122548-5315b13d.log.json) | | Note: `BigGAN-Deep` trained on `ImageNet1k` will come later. | | | | | | +### Note on reproducibility + +`BigGAN 128x128` model is trained with V100 GPUs and CUDA 10.1 and can hardly reproduce the result with A100 and CUDA 11.3. If you have any idea about the reproducibility, please feel free to contact with us. + ## Converted weights Since we haven't finished training our models, we provide you with several pre-trained weights which have been evaluated. Here, we refer to [BigGAN-PyTorch](https://github.com/ajbrock/BigGAN-PyTorch) and [pytorch-pretrained-BigGAN](https://github.com/huggingface/pytorch-pretrained-BigGAN). From 1af537fe61beb9163090dfb2b1b542280caffb12 Mon Sep 17 00:00:00 2001 From: VongolaWu Date: Mon, 19 Dec 2022 11:30:08 +0800 Subject: [PATCH 19/44] Add NAFNet to README_zh-CN.md --- README_zh-CN.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README_zh-CN.md b/README_zh-CN.md index b1836aa84a..03e7bca01d 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -280,6 +280,14 @@ pip3 install -e .
+
+ +Image Restoration + +- ✅ [NAFNet](configs/nafnet/README.md) + +
+ 请参考[模型库](https://mmediting.readthedocs.io/zh_CN/1.x/3_model_zoo.html)了解详情。 ## 参与贡献 From d049f223c0928f53fff3a74e05294337920a7020 Mon Sep 17 00:00:00 2001 From: VongolaWu Date: Mon, 19 Dec 2022 11:30:47 +0800 Subject: [PATCH 20/44] Update Readme.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index b16ead5cfb..816acc4b20 100644 --- a/README.md +++ b/README.md @@ -282,6 +282,8 @@ Supported algorithms: +
+ Image Restoration - ✅ [NAFNet](configs/nafnet/README.md) From f008699cfc069d24beefd5441a42ede51df322a0 Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Mon, 19 Dec 2022 11:31:17 +0800 Subject: [PATCH 21/44] revise config of biggan-cvt (#1529) --- ...iggan-deep_cvt-hugging-face_rgb_imagenet1k-256x256.py | 9 ++++----- ...iggan-deep_cvt-hugging-face_rgb_imagenet1k-512x512.py | 7 +++---- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/configs/biggan/biggan-deep_cvt-hugging-face_rgb_imagenet1k-256x256.py b/configs/biggan/biggan-deep_cvt-hugging-face_rgb_imagenet1k-256x256.py index d81c1a09ea..6e48b0cd9e 100644 --- a/configs/biggan/biggan-deep_cvt-hugging-face_rgb_imagenet1k-256x256.py +++ b/configs/biggan/biggan-deep_cvt-hugging-face_rgb_imagenet1k-256x256.py @@ -3,11 +3,10 @@ '../_base_/gen_default_runtime.py', ] -# setting image size to 512x512 -train_resize = _base_.train_dataloader.dataset.pipeline[3] -test_resize = _base_.test_dataloader.dataset.pipeline[3] -val_resize = _base_.val_dataloader.dataset.pipeline[3] -train_resize.scale = test_resize.scale = val_resize.scale = (256, 256) +# setting image size to 256x256 +_base_.train_dataloader.dataset.pipeline[2].scale = (256, 256) +_base_.test_dataloader.dataset.pipeline[2].scale = (256, 256) +_base_.val_dataloader.dataset.pipeline[2].scale = (256, 256) ema_config = dict( type='ExponentialMovingAverage', diff --git a/configs/biggan/biggan-deep_cvt-hugging-face_rgb_imagenet1k-512x512.py b/configs/biggan/biggan-deep_cvt-hugging-face_rgb_imagenet1k-512x512.py index 11b2a46275..72d7bef5d4 100644 --- a/configs/biggan/biggan-deep_cvt-hugging-face_rgb_imagenet1k-512x512.py +++ b/configs/biggan/biggan-deep_cvt-hugging-face_rgb_imagenet1k-512x512.py @@ -4,10 +4,9 @@ ] # setting image size to 512x512 -train_resize = _base_.train_dataloader.dataset.pipeline[3] -test_resize = _base_.test_dataloader.dataset.pipeline[3] -val_resize = _base_.val_dataloader.dataset.pipeline[3] -train_resize.scale = test_resize.scale = val_resize.scale = (512, 512) +_base_.train_dataloader.dataset.pipeline[2].scale = (512, 512) +_base_.test_dataloader.dataset.pipeline[2].scale = (512, 512) +_base_.val_dataloader.dataset.pipeline[2].scale = (512, 512) ema_config = dict( type='ExponentialMovingAverage', From b0f55928c57dccf0297985dda265c0a1c5919de4 Mon Sep 17 00:00:00 2001 From: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Date: Mon, 19 Dec 2022 15:14:21 +0800 Subject: [PATCH 22/44] [Fix] fix ssim only calculate on the first channel bug (#1515) --- mmedit/evaluation/metrics/metrics_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mmedit/evaluation/metrics/metrics_utils.py b/mmedit/evaluation/metrics/metrics_utils.py index 4ed5602a64..64630454f4 100644 --- a/mmedit/evaluation/metrics/metrics_utils.py +++ b/mmedit/evaluation/metrics/metrics_utils.py @@ -121,7 +121,7 @@ def img_transform(img, '"Y" and None.') if crop_border != 0: - img = img[crop_border:-crop_border, crop_border:-crop_border, None] + img = img[crop_border:-crop_border, crop_border:-crop_border, ...] return img From 10278bafa777d2cd29f54aee8c20c6f89f4f806c Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Wed, 21 Dec 2022 10:06:29 +0800 Subject: [PATCH 23/44] [Enhancement] Revise `_base_` in tdan's config (#1544) * revise _base_ in tdan's config * update readme and metafile for tdan --- configs/tdan/README.md | 16 +++++----- configs/tdan/README_zh-CN.md | 8 ++--- configs/tdan/metafile.yml | 32 +++++++++---------- .../tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py | 2 +- ...tdan_x4ft_8xb16-lr5e-5-400k_vimeo90k-bi.py | 2 +- ...tdan_x4ft_8xb16-lr5e-5-800k_vimeo90k-bd.py | 2 +- 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/configs/tdan/README.md b/configs/tdan/README.md index 58d56e83f4..9849acacee 100644 --- a/configs/tdan/README.md +++ b/configs/tdan/README.md @@ -25,17 +25,17 @@ The metrics are `PSNR / SSIM` . | Method | Vid4 (BIx4) PSNR (Y) | SPMCS-30 (BIx4) PSNR (Y) | Vid4 (BDx4) PSNR (Y) | SPMCS-30 (BDx4) PSNR (Y) | GPU Info | Download | | :-----------------------------------------: | :------------------: | :----------------------: | :------------------: | :----------------------: | :----------------------: | :-------------------------------------------: | -| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi](/configs/tdan/tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | -| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd](/configs/tdan/tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | -| [tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi](/configs/tdan/tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi.py) | **26.49** | **30.42** | 25.93 | 29.69 | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528-739979d9.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528_135616.log.json) | -| [tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd](/configs/tdan/tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd.py) | 25.80 | 29.56 | **26.87** | **30.77** | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528-c53ab844.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528_122401.log.json) | +| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi](/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | +| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd](/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | +| [tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi](/configs/tdan/tdan_x4ft_8xb16-lr5e-5-400k_vimeo90k-bi.py) | **26.49** | **30.42** | 25.93 | 29.69 | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528-739979d9.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528_135616.log.json) | +| [tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd](/configs/tdan/tdan_x4ft_8xb16-lr5e-5-800k_vimeo90k-bd.py) | 25.80 | 29.56 | **26.87** | **30.77** | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528-c53ab844.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528_122401.log.json) | | Method | Vid4 (BIx4) SSIM (Y) | SPMCS-30 (BIx4) SSIM (Y) | Vid4 (BDx4) SSIM (Y) | SPMCS-30 (BDx4) SSIM (Y) | GPU Info | Download | | :-----------------------------------------: | :------------------: | :----------------------: | :------------------: | :----------------------: | :----------------------: | :-------------------------------------------: | -| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi](/configs/tdan/tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | -| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd](/configs/tdan/tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | -| [tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi](/configs/tdan/tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi.py) | **0.792** | **0.856** | 0.772 | 0.842 | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528-739979d9.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528_135616.log.json) | -| [tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd](/configs/tdan/tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd.py) | 0.784 | 0.851 | **0.815** | **0.868** | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528-c53ab844.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528_122401.log.json) | +| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi](/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | +| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd](/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | +| [tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi](/configs/tdan/tdan_x4ft_8xb16-lr5e-5-400k_vimeo90k-bi.py) | **0.792** | **0.856** | 0.772 | 0.842 | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528-739979d9.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528_135616.log.json) | +| [tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd](/configs/tdan/tdan_x4ft_8xb16-lr5e-5-800k_vimeo90k-bd.py) | 0.784 | 0.851 | **0.815** | **0.868** | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528-c53ab844.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528_122401.log.json) | ## Quick Start diff --git a/configs/tdan/README_zh-CN.md b/configs/tdan/README_zh-CN.md index bbee9ff5ec..8b144620fa 100644 --- a/configs/tdan/README_zh-CN.md +++ b/configs/tdan/README_zh-CN.md @@ -25,10 +25,10 @@ | 算法 | Vid4 (BIx4) | SPMCS-30 (BIx4) | Vid4 (BDx4) | SPMCS-30 (BDx4) | GPU 信息 | 下载 | | :--------------------------------------------------------: | :-------------: | :-------------: | :-------------: | :-------------: | :----------------------: | :--------------------------------------------------------: | -| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi](/configs/tdan/tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | -| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd](/configs/tdan/tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | -| [tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi](/configs/tdan/tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi.py) | **26.49/0.792** | **30.42/0.856** | 25.93/0.772 | 29.69/0.842 | 8 (Tesla V100-SXM2-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528-739979d9.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528_135616.log.json) | -| [tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd](/configs/tdan/tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd.py) | 25.80/0.784 | 29.56/0.851 | **26.87/0.815** | **30.77/0.868** | 8 (Tesla V100-SXM2-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528-c53ab844.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528_122401.log.json) | +| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi](/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | +| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd](/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | +| [tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi](/configs/tdan/tdan_x4ft_8xb16-lr5e-5-400k_vimeo90k-bi.py) | **26.49/0.792** | **30.42/0.856** | 25.93/0.772 | 29.69/0.842 | 8 (Tesla V100-SXM2-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528-739979d9.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528_135616.log.json) | +| [tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd](/configs/tdan/tdan_x4ft_8xb16-lr5e-5-800k_vimeo90k-bd.py) | 25.80/0.784 | 29.56/0.851 | **26.87/0.815** | **30.77/0.868** | 8 (Tesla V100-SXM2-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528-c53ab844.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528_122401.log.json) | ## 快速开始 diff --git a/configs/tdan/metafile.yml b/configs/tdan/metafile.yml index b47fd6ccd8..c0f780b475 100644 --- a/configs/tdan/metafile.yml +++ b/configs/tdan/metafile.yml @@ -7,34 +7,34 @@ Collections: - https://arxiv.org/abs/1812.02898 README: configs/tdan/README.md Models: -- Config: configs/tdan/tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi.py +- Config: configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py In Collection: TDAN Metadata: GPUs: 8 (Tesla V100-SXM2-32GB) Training Data: VIMEO90K - Name: tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi + Name: tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi Results: - Dataset: VIMEO90K Metrics: {} Task: Video Super-Resolution Weights: '' -- Config: configs/tdan/tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd.py +- Config: configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py In Collection: TDAN Metadata: GPUs: 8 (Tesla V100-SXM2-32GB) Training Data: VIMEO90K - Name: tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd + Name: tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd Results: - Dataset: VIMEO90K Metrics: {} Task: Video Super-Resolution Weights: '' -- Config: configs/tdan/tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi.py +- Config: configs/tdan/tdan_x4ft_8xb16-lr5e-5-400k_vimeo90k-bi.py In Collection: TDAN Metadata: GPUs: 8 (Tesla V100-SXM2-32GB) Training Data: VIMEO90K - Name: tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi + Name: tdan_x4ft_8xb16-lr5e-5-400k_vimeo90k-bi Results: - Dataset: VIMEO90K Metrics: @@ -44,12 +44,12 @@ Models: Vid4 (BIx4) PSNR (Y): 26.49 Task: Video Super-Resolution Weights: https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528-739979d9.pth -- Config: configs/tdan/tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd.py +- Config: configs/tdan/tdan_x4ft_8xb16-lr5e-5-800k_vimeo90k-bd.py In Collection: TDAN Metadata: GPUs: 8 (Tesla V100-SXM2-32GB) Training Data: VIMEO90K - Name: tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd + Name: tdan_x4ft_8xb16-lr5e-5-800k_vimeo90k-bd Results: - Dataset: VIMEO90K Metrics: @@ -59,34 +59,34 @@ Models: Vid4 (BIx4) PSNR (Y): 25.8 Task: Video Super-Resolution Weights: https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528-c53ab844.pth -- Config: configs/tdan/tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi.py +- Config: configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py In Collection: TDAN Metadata: GPUs: 8 (Tesla V100-SXM2-32GB) Training Data: VIMEO90K - Name: tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi + Name: tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi Results: - Dataset: VIMEO90K Metrics: {} Task: Video Super-Resolution Weights: '' -- Config: configs/tdan/tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd.py +- Config: configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py In Collection: TDAN Metadata: GPUs: 8 (Tesla V100-SXM2-32GB) Training Data: VIMEO90K - Name: tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd + Name: tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd Results: - Dataset: VIMEO90K Metrics: {} Task: Video Super-Resolution Weights: '' -- Config: configs/tdan/tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi.py +- Config: configs/tdan/tdan_x4ft_8xb16-lr5e-5-400k_vimeo90k-bi.py In Collection: TDAN Metadata: GPUs: 8 (Tesla V100-SXM2-32GB) Training Data: VIMEO90K - Name: tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi + Name: tdan_x4ft_8xb16-lr5e-5-400k_vimeo90k-bi Results: - Dataset: VIMEO90K Metrics: @@ -96,12 +96,12 @@ Models: Vid4 (BIx4) SSIM (Y): 0.792 Task: Video Super-Resolution Weights: https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528-739979d9.pth -- Config: configs/tdan/tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd.py +- Config: configs/tdan/tdan_x4ft_8xb16-lr5e-5-800k_vimeo90k-bd.py In Collection: TDAN Metadata: GPUs: 8 (Tesla V100-SXM2-32GB) Training Data: VIMEO90K - Name: tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd + Name: tdan_x4ft_8xb16-lr5e-5-800k_vimeo90k-bd Results: - Dataset: VIMEO90K Metrics: diff --git a/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py b/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py index e6af5d8922..8e7dbc0e5a 100644 --- a/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py +++ b/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py @@ -1,4 +1,4 @@ -_base_ = './tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd.py' +_base_ = './tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py' experiment_name = 'tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi' work_dir = f'./work_dirs/{experiment_name}' diff --git a/configs/tdan/tdan_x4ft_8xb16-lr5e-5-400k_vimeo90k-bi.py b/configs/tdan/tdan_x4ft_8xb16-lr5e-5-400k_vimeo90k-bi.py index 4da1fd0974..4a510b8e59 100644 --- a/configs/tdan/tdan_x4ft_8xb16-lr5e-5-400k_vimeo90k-bi.py +++ b/configs/tdan/tdan_x4ft_8xb16-lr5e-5-400k_vimeo90k-bi.py @@ -1,4 +1,4 @@ -_base_ = './tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi.py' +_base_ = './tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py' experiment_name = 'tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi' work_dir = f'./work_dirs/{experiment_name}' diff --git a/configs/tdan/tdan_x4ft_8xb16-lr5e-5-800k_vimeo90k-bd.py b/configs/tdan/tdan_x4ft_8xb16-lr5e-5-800k_vimeo90k-bd.py index 6f80adf061..ab96135d87 100644 --- a/configs/tdan/tdan_x4ft_8xb16-lr5e-5-800k_vimeo90k-bd.py +++ b/configs/tdan/tdan_x4ft_8xb16-lr5e-5-800k_vimeo90k-bd.py @@ -1,4 +1,4 @@ -_base_ = './tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd.py' +_base_ = './tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py' experiment_name = 'tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd' work_dir = f'./work_dirs/{experiment_name}' From 61ca30e2bf9795b1a7a2b96b84ddb9312f30baeb Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Wed, 21 Dec 2022 13:01:33 +0800 Subject: [PATCH 24/44] [Enhancement] Use coverage < 7.0.0 in unit tests (#1549) * fix coverage version to 6.5.0 * change coverage version restriction to '<7.0.0' to adopt circle CI env --- requirements/tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/tests.txt b/requirements/tests.txt index 075956b746..2a4ffe162d 100644 --- a/requirements/tests.txt +++ b/requirements/tests.txt @@ -6,7 +6,7 @@ clip @ git+https://github.com/openai/CLIP.git@d50d76daa670286dd6cacf3bcd80b5e482 # pytest # pytest-runner # yapf -coverage +coverage < 7.0.0 imageio-ffmpeg==0.4.4 interrogate mmdet >= 3.0.0rc2 From b13cd065a8a0528f9171e1915d9a3ec2365dbf25 Mon Sep 17 00:00:00 2001 From: AlexZou <62631470+AlexZou14@users.noreply.github.com> Date: Wed, 21 Dec 2022 13:48:14 +0800 Subject: [PATCH 25/44] [CodeCamp #83] Support Restormer model (#1503) * Merge branch 'cndocs' of https://github.com/AlexZou14/mmediting into cndocs * Add Restormer * Add einops * Create test_restormer_net.py * Refactor deraining config * Update restormer_net.py * Refactor config * Update restormer_official_rain13k.py * Update deraining_test_config.py * Fix Restormer Readme * Fix runtime.txt * refactor configs * rename deblurring config * rename deblurring config * Fix config and Fix docstring * Update runtime.txt * fix typo * remove edit_dual_data_preprocessor * Fix test_restormer_net.py typo * Add denoising_real and fix config typo * Fix Some typo * Fix Typo * fix configs * fix dpdd dataset * fix readme * Fix Readme * Fix README_zh-CN * Fix Typo * support dual deblur and fix pad * fix ut * update metrics * Fix test_dual_restormer * fix ut * fix typo Co-authored-by: Z-Fran <1396925302@qq.com> Co-authored-by: Z-Fran <49083766+Z-Fran@users.noreply.github.com> --- .../deblurring-defocus_test_config.py | 98 +++ .../datasets/deblurring-motion_test_config.py | 98 +++ .../denoising-gaussian_color_test_config.py | 104 ++++ .../denoising-gaussian_gray_test_config.py | 88 +++ .../datasets/denoising-real_test_config.py | 60 ++ .../_base_/datasets/deraining_test_config.py | 117 ++++ configs/restormer/README.md | 261 ++++++++ configs/restormer/README_zh-CN.md | 239 ++++++++ configs/restormer/metafile.yml | 382 ++++++++++++ .../restormer_official_dfwb-color-sigma15.py | 37 ++ .../restormer_official_dfwb-color-sigma25.py | 37 ++ .../restormer_official_dfwb-color-sigma50.py | 37 ++ .../restormer_official_dfwb-gray-sigma15.py | 37 ++ .../restormer_official_dfwb-gray-sigma25.py | 37 ++ .../restormer_official_dfwb-gray-sigma50.py | 37 ++ .../restormer/restormer_official_dpdd-dual.py | 18 + .../restormer_official_dpdd-single.py | 30 + configs/restormer/restormer_official_gopro.py | 30 + .../restormer/restormer_official_rain13k.py | 30 + configs/restormer/restormer_official_sidd.py | 30 + .../data_preprocessors/gen_preprocessor.py | 17 + mmedit/models/editors/__init__.py | 3 +- mmedit/models/editors/restormer/__init__.py | 4 + .../models/editors/restormer/restormer_net.py | 564 ++++++++++++++++++ model-index.yml | 1 + requirements/runtime.txt | 1 + .../test_restormer/test_restormer_net.py | 101 ++++ 27 files changed, 2497 insertions(+), 1 deletion(-) create mode 100644 configs/_base_/datasets/deblurring-defocus_test_config.py create mode 100644 configs/_base_/datasets/deblurring-motion_test_config.py create mode 100644 configs/_base_/datasets/denoising-gaussian_color_test_config.py create mode 100644 configs/_base_/datasets/denoising-gaussian_gray_test_config.py create mode 100644 configs/_base_/datasets/denoising-real_test_config.py create mode 100644 configs/_base_/datasets/deraining_test_config.py create mode 100644 configs/restormer/README.md create mode 100644 configs/restormer/README_zh-CN.md create mode 100644 configs/restormer/metafile.yml create mode 100644 configs/restormer/restormer_official_dfwb-color-sigma15.py create mode 100644 configs/restormer/restormer_official_dfwb-color-sigma25.py create mode 100644 configs/restormer/restormer_official_dfwb-color-sigma50.py create mode 100644 configs/restormer/restormer_official_dfwb-gray-sigma15.py create mode 100644 configs/restormer/restormer_official_dfwb-gray-sigma25.py create mode 100644 configs/restormer/restormer_official_dfwb-gray-sigma50.py create mode 100644 configs/restormer/restormer_official_dpdd-dual.py create mode 100644 configs/restormer/restormer_official_dpdd-single.py create mode 100644 configs/restormer/restormer_official_gopro.py create mode 100644 configs/restormer/restormer_official_rain13k.py create mode 100644 configs/restormer/restormer_official_sidd.py create mode 100644 mmedit/models/editors/restormer/__init__.py create mode 100644 mmedit/models/editors/restormer/restormer_net.py create mode 100644 tests/test_models/test_editors/test_restormer/test_restormer_net.py diff --git a/configs/_base_/datasets/deblurring-defocus_test_config.py b/configs/_base_/datasets/deblurring-defocus_test_config.py new file mode 100644 index 0000000000..360f10b8fa --- /dev/null +++ b/configs/_base_/datasets/deblurring-defocus_test_config.py @@ -0,0 +1,98 @@ +test_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='imgL', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='imgR', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict(type='PackEditInputs') +] + +dpdd_data_root = 'data/DPDD' + +dpdd_indoor_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='DPDD-Indoor', task_name='deblurring'), + data_root=dpdd_data_root, + data_prefix=dict( + img='inputC', imgL='inputL', imgR='inputR', gt='target'), + ann_file='indoor_labels.txt', + pipeline=test_pipeline)) +dpdd_indoor_evaluator = [ + dict(type='MAE', prefix='DPDD-Indoor'), + dict(type='PSNR', prefix='DPDD-Indoor'), + dict(type='SSIM', prefix='DPDD-Indoor'), +] + +dpdd_outdoor_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='DPDD-Outdoor', task_name='deblurring'), + data_root=dpdd_data_root, + data_prefix=dict( + img='inputC', imgL='inputL', imgR='inputR', gt='target'), + ann_file='outdoor_labels.txt', + pipeline=test_pipeline)) +dpdd_outdoor_evaluator = [ + dict(type='MAE', prefix='DPDD-Outdoor'), + dict(type='PSNR', prefix='DPDD-Outdoor'), + dict(type='SSIM', prefix='DPDD-Outdoor'), +] + +dpdd_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='DPDD-Combined', task_name='deblurring'), + data_root=dpdd_data_root, + data_prefix=dict( + img='inputC', imgL='inputL', imgR='inputR', gt='target'), + pipeline=test_pipeline)) +dpdd_evaluator = [ + dict(type='MAE', prefix='DPDD-Combined'), + dict(type='PSNR', prefix='DPDD-Combined'), + dict(type='SSIM', prefix='DPDD-Combined'), +] + +# test config +test_cfg = dict(type='MultiTestLoop') +test_dataloader = [ + dpdd_indoor_dataloader, + dpdd_outdoor_dataloader, + dpdd_dataloader, +] +test_evaluator = [ + dpdd_indoor_evaluator, + dpdd_outdoor_evaluator, + dpdd_evaluator, +] diff --git a/configs/_base_/datasets/deblurring-motion_test_config.py b/configs/_base_/datasets/deblurring-motion_test_config.py new file mode 100644 index 0000000000..a863d70df4 --- /dev/null +++ b/configs/_base_/datasets/deblurring-motion_test_config.py @@ -0,0 +1,98 @@ +test_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict(type='PackEditInputs') +] + +gopro_data_root = 'data/GoPro' +gopro_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='GoPro', task_name='deblurring'), + data_root=gopro_data_root, + data_prefix=dict(img='input', gt='target'), + pipeline=test_pipeline)) +gopro_evaluator = [ + dict(type='PSNR', prefix='GoPro'), + dict(type='SSIM', prefix='GoPro'), +] + +hide_data_root = 'data/HIDE' +hide_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='HIDE', task_name='deblurring'), + data_root=hide_data_root, + data_prefix=dict(img='input', gt='target'), + pipeline=test_pipeline)) +hide_evaluator = [ + dict(type='PSNR', prefix='HIDE'), + dict(type='SSIM', prefix='HIDE'), +] + +realblurj_data_root = 'data/RealBlur_J' +realblurj_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='RealBlur_J', task_name='deblurring'), + data_root=realblurj_data_root, + data_prefix=dict(img='input', gt='target'), + pipeline=test_pipeline)) +realblurj_evaluator = [ + dict(type='PSNR', convert_to='Y', prefix='RealBlurJ'), + dict(type='SSIM', convert_to='Y', prefix='RealBlurJ'), +] + +realblurr_data_root = 'data/RealBlur_R' +realblurr_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='RealBlur_R', task_name='deblurring'), + data_root=realblurr_data_root, + data_prefix=dict(img='input', gt='target'), + pipeline=test_pipeline)) +realblurr_evaluator = [ + dict(type='PSNR', convert_to='Y', prefix='RealBlurR'), + dict(type='SSIM', convert_to='Y', prefix='RealBlurR'), +] + +# test config +test_cfg = dict(type='MultiTestLoop') +test_dataloader = [ + gopro_dataloader, + hide_dataloader, + realblurj_dataloader, + realblurr_dataloader, +] +test_evaluator = [ + gopro_evaluator, + hide_evaluator, + realblurj_evaluator, + realblurr_evaluator, +] diff --git a/configs/_base_/datasets/denoising-gaussian_color_test_config.py b/configs/_base_/datasets/denoising-gaussian_color_test_config.py new file mode 100644 index 0000000000..c06f0a4c3d --- /dev/null +++ b/configs/_base_/datasets/denoising-gaussian_color_test_config.py @@ -0,0 +1,104 @@ +sigma = 15 +test_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='RandomNoise', + params=dict( + noise_type=['gaussian'], + noise_prob=[1], + gaussian_sigma=[sigma * 255, sigma * 255], + gaussian_gray_noise_prob=0), + keys=['img']), + dict(type='PackEditInputs') +] + +data_root = 'data/denoising_gaussian_test' +cbsd68_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='CBSD68', task_name='denoising'), + data_root=data_root, + data_prefix=dict(img='CBSD68', gt='CBSD68'), + pipeline=test_pipeline)) +cbsd68_evaluator = [ + dict(type='PSNR', prefix='CBSD68'), + dict(type='SSIM', prefix='CBSD68'), +] + +kodak24_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='Kodak24', task_name='denoising'), + data_root=data_root, + data_prefix=dict(img='Kodak24', gt='Kodak24'), + pipeline=test_pipeline)) +kodak24_evaluator = [ + dict(type='PSNR', prefix='Kodak24'), + dict(type='SSIM', prefix='Kodak24'), +] + +mcmaster_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='McMaster', task_name='denoising'), + data_root=data_root, + data_prefix=dict(img='McMaster', gt='McMaster'), + pipeline=test_pipeline)) +mcmaster_evaluator = [ + dict(type='PSNR', prefix='McMaster'), + dict(type='SSIM', prefix='McMaster'), +] + +urban100_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='Urban100', task_name='denoising'), + data_root=data_root, + data_prefix=dict(img='Urban100', gt='Urban100'), + pipeline=test_pipeline)) +urban100_evaluator = [ + dict(type='PSNR', prefix='Urban100'), + dict(type='SSIM', prefix='Urban100'), +] + +# test config +test_cfg = dict(type='MultiTestLoop') +test_dataloader = [ + cbsd68_dataloader, + kodak24_dataloader, + mcmaster_dataloader, + urban100_dataloader, +] +test_evaluator = [ + cbsd68_evaluator, + kodak24_evaluator, + mcmaster_evaluator, + urban100_evaluator, +] diff --git a/configs/_base_/datasets/denoising-gaussian_gray_test_config.py b/configs/_base_/datasets/denoising-gaussian_gray_test_config.py new file mode 100644 index 0000000000..326aed8a3b --- /dev/null +++ b/configs/_base_/datasets/denoising-gaussian_gray_test_config.py @@ -0,0 +1,88 @@ +sigma = 15 +test_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='color', + channel_order='rgb', + to_y_channel=True, + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='color', + channel_order='rgb', + to_y_channel=True, + imdecode_backend='cv2'), + dict( + type='RandomNoise', + params=dict( + noise_type=['gaussian'], + noise_prob=[1], + gaussian_sigma=[sigma * 255, sigma * 255], + gaussian_gray_noise_prob=1), + keys=['img']), + dict(type='PackEditInputs') +] + +data_root = 'data/denoising_gaussian_test' +set12_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='Set12', task_name='denoising'), + data_root=data_root, + data_prefix=dict(img='Set12', gt='Set12'), + pipeline=test_pipeline)) +set12_evaluator = [ + dict(type='PSNR', prefix='Set12'), + dict(type='SSIM', prefix='Set12'), +] + +bsd68_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='BSD68', task_name='denoising'), + data_root=data_root, + data_prefix=dict(img='BSD68', gt='BSD68'), + pipeline=test_pipeline)) +bsd68_evaluator = [ + dict(type='PSNR', prefix='BSD68'), + dict(type='SSIM', prefix='BSD68'), +] + +urban100_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='Urban100', task_name='denoising'), + data_root=data_root, + data_prefix=dict(img='Urban100', gt='Urban100'), + pipeline=test_pipeline)) +urban100_evaluator = [ + dict(type='PSNR', prefix='Urban100'), + dict(type='SSIM', prefix='Urban100'), +] + +# test config +test_cfg = dict(type='MultiTestLoop') +test_dataloader = [ + set12_dataloader, + bsd68_dataloader, + urban100_dataloader, +] +test_evaluator = [ + set12_evaluator, + bsd68_evaluator, + urban100_evaluator, +] diff --git a/configs/_base_/datasets/denoising-real_test_config.py b/configs/_base_/datasets/denoising-real_test_config.py new file mode 100644 index 0000000000..88a069f850 --- /dev/null +++ b/configs/_base_/datasets/denoising-real_test_config.py @@ -0,0 +1,60 @@ +test_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict(type='PackEditInputs') +] + +sidd_data_root = 'data/SIDD' +sidd_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='SIDD', task_name='denoising'), + data_root=sidd_data_root, + data_prefix=dict(img='input', gt='groundtruth'), + pipeline=test_pipeline)) +sidd_evaluator = [ + dict(type='PSNR', prefix='SIDD'), + dict(type='SSIM', prefix='SIDD'), +] + +dnd_data_root = 'data/DND' +dnd_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='DND', task_name='denoising'), + data_root=dnd_data_root, + data_prefix=dict(img='input', gt='groundtruth'), + pipeline=test_pipeline)) +dnd_evaluator = [ + dict(type='PSNR', prefix='DND'), + dict(type='SSIM', prefix='DND'), +] + +# test config +test_cfg = dict(type='MultiTestLoop') +test_dataloader = [ + sidd_dataloader, + # dnd_dataloader, +] +test_evaluator = [ + sidd_evaluator, + # dnd_dataloader, +] diff --git a/configs/_base_/datasets/deraining_test_config.py b/configs/_base_/datasets/deraining_test_config.py new file mode 100644 index 0000000000..2e633f08b9 --- /dev/null +++ b/configs/_base_/datasets/deraining_test_config.py @@ -0,0 +1,117 @@ +test_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict(type='PackEditInputs') +] + +rain100h_data_root = 'data/Rain100H' +rain100h_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='Rain100H', task_name='deraining'), + data_root=rain100h_data_root, + data_prefix=dict(img='input', gt='target'), + pipeline=test_pipeline)) +rain100h_evaluator = [ + dict(type='PSNR', convert_to='Y', prefix='Rain100H'), + dict(type='SSIM', convert_to='Y', prefix='Rain100H'), +] + +rain100l_data_root = 'data/Rain100L' +rain100l_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='Rain100L', task_name='deraining'), + data_root=rain100l_data_root, + data_prefix=dict(img='input', gt='target'), + pipeline=test_pipeline)) +rain100l_evaluator = [ + dict(type='PSNR', convert_to='Y', prefix='Rain100L'), + dict(type='SSIM', convert_to='Y', prefix='Rain100L'), +] + +test100_data_root = 'data/Test100' +test100_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='Test100', task_name='deraining'), + data_root=test100_data_root, + data_prefix=dict(img='input', gt='target'), + pipeline=test_pipeline)) +test100_evaluator = [ + dict(type='PSNR', convert_to='Y', prefix='Test100'), + dict(type='SSIM', convert_to='Y', prefix='Test100'), +] + +test1200_data_root = 'data/Test1200' +test1200_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='Test1200', task_name='deraining'), + data_root=test1200_data_root, + data_prefix=dict(img='input', gt='target'), + pipeline=test_pipeline)) +test1200_evaluator = [ + dict(type='PSNR', convert_to='Y', prefix='Test1200'), + dict(type='SSIM', convert_to='Y', prefix='Test1200'), +] + +test2800_data_root = 'data/Test2800' +test2800_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='Test2800', task_name='deraining'), + data_root=test2800_data_root, + data_prefix=dict(img='input', gt='target'), + pipeline=test_pipeline)) +test2800_evaluator = [ + dict(type='PSNR', convert_to='Y', prefix='Test2800'), + dict(type='SSIM', convert_to='Y', prefix='Test2800'), +] + +# test config +test_cfg = dict(type='MultiTestLoop') +test_dataloader = [ + rain100h_dataloader, + rain100l_dataloader, + test100_dataloader, + test1200_dataloader, + test2800_dataloader, +] +test_evaluator = [ + rain100h_evaluator, + rain100l_evaluator, + test100_evaluator, + test1200_evaluator, + test2800_evaluator, +] diff --git a/configs/restormer/README.md b/configs/restormer/README.md new file mode 100644 index 0000000000..2bc7c1f5c8 --- /dev/null +++ b/configs/restormer/README.md @@ -0,0 +1,261 @@ +# Restormer (CVPR'2022) + +> [Restormer: Efficient Transformer for High-Resolution Image Restoration](https://arxiv.org/abs/2111.09881) + +> **Task**: Denoising, Deblurring, Deraining + + + +## Abstract + + + +Since convolutional neural networks (CNNs) perform well at learning generalizable image priors from large-scale data, these models have been extensively applied to image restoration and related tasks. Recently, another class of neural architectures, Transformers, have shown significant performance gains on natural language and high-level vision tasks. While the Transformer model mitigates the shortcomings of CNNs (i.e., limited receptive field and inadaptability to input content), its computational complexity grows quadratically with the spatial resolution, therefore making it infeasible to apply to most image restoration tasks involving high-resolution images. In this work, we propose an efficient Transformer model by making several key designs in the building blocks (multi-head attention and feed-forward network) such that it can capture long-range pixel interactions, while still remaining applicable to large images. Our model, named Restoration Transformer (Restormer), achieves state-of-the-art results on several image restoration tasks, including image deraining, single-image motion deblurring, defocus deblurring (single-image and dual-pixel data), and image denoising (Gaussian grayscale/color denoising, and real image denoising). + + + +
+ +
+ +## Results and models + +### **Deraining** + +Evaluated on Y channels. The metrics are `PSNR` / `SSIM` . + +| Method | Rain100H
PSNR/SSIM (Y) | Rain100L
PSNR/SSIM (Y) | Test100
PSNR/SSIM (Y) | Test1200
PSNR/SSIM (Y) | Test2800
PSNR/SSIM (Y) | GPU Info | Download | +| :-------------------------------: | :-----------------------: | :-----------------------: | :----------------------: | :-----------------------: | :-----------------------: | :------: | :---------------------------------: | +| [restormer_official_rain13k](/configs/restormer/restormer_official_rain13k.py) | 31.4804/0.9056 | 39.1023/0.9787 | 32.0287/0.9239 | 33.2251/0.9272 | 34.2170/0.9451 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_rain13k-2be7b550.pth) \| log | + +### **Motion Deblurring** + +Evaluated on RGB channels for GoPro and HIDE, and Y channel for ReakBlur-J and ReakBlur-R. The metrics are `PSNR` / `SSIM` . + +| Method | GoPro
PSNR/SSIM (RGB) | HIDE
PSNR/SSIM (RGB) | RealBlur-J
PSNR/SSIM (Y) | RealBlur-R
PSNR/SSIM (Y) | GPU Info | Download | +| :------------------------------------------: | :----------------------: | :---------------------: | :-------------------------: | :-------------------------: | :------: | :---------------------------------------------: | +| [restormer_official_gopro](/configs/restormer/restormer_official_gopro.py) | 32.9295/0.9496 | 31.2289/0.9345 | 28.4356/0.8681 | 35.9141/0.9707 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_gopro-db7363a0.pth) \| log | + +### **Defocus Deblurring** + +Evaluated on RGB channels. The metrics are `PSNR` / `SSIM` / `MAE` / `LPIPS`. + +| Method | Indoor Scenes PSNR | Indoor Scenes SSIM | Indoor Scenes MAE | Indoor Scenes LPIPS | Outdoor Scenes PSNR | Outdoor Scenes SSIM | Outdoor Scenes MAE | Outdoor Scenes LPIPS | Combined PSNR | Combined SSIM | Combined MAE | Combined LPIPS | GPU Info | Download | +| :------------------------------------------------------------------------------------: | :----------------: | :----------------: | :---------------: | :-----------------: | :-----------------: | :-----------------: | :----------------: | :------------------: | :-----------: | :-----------: | :----------: | :------------: | :------: | :------------------------------------------------------------------------------------------------------------: | +| [restormer_official_dpdd-single](/configs/restormer/restormer_official_dpdd-single.py) | 28.8681 | 0.8859 | 0.0251 | - | 23.2410 | 0.7509 | 0.0499 | - | 25.9805 | 0.8166 | 0.0378 | - | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth) \| log | +| [restormer_official_dpdd-dual](/configs/restormer/restormer_official_dpdd-dual.py) | 26.6160 | 0.8346 | 0.0354 | - | 26.6160 | 0.8346 | 0.0354 | - | 26.6160 | 0.8346 | 0.0354 | - | 1 | [model](https://download.openmmlab.com/mmediting/restormer_official_dpdd-dual-52c94c00.pth) \| log | + +### **Gaussian Denoising** + +**Test Grayscale Gaussian Noise** + +Evaluated on grayscale images. The metrics are `PSNR` / `SSIM` . + +| Method | $\\sigma$ | Set12
PSNR/SSIM | BSD68
PSNR/SSIM | Urban100
PSNR/SSIM | GPU Info | Download | +| :------------------------------------------------------------: | :-------: | :----------------: | :----------------: | :-------------------: | :------: | :--------------------------------------------------------------: | +| [restormer_official_dfwb-gray-sigma15](/configs/restormer/restormer_official_dfwb-gray-sigma15.py) | 15 | 34.0182/0.9160 | 32.4987/0.8940 | 34.4336/0.9419 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma15-da74417f.pth) \| log | +| [restormer_official_dfwb-gray-sigma25](/configs/restormer/restormer_official_dfwb-gray-sigma25.py) | 25 | 31.7289/0.8811 | 30.1613/0.8370 | 32.1162/0.9140 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma25-08010841.pth) \| log | +| [restormer_official_dfwb-gray-sigma50](/configs/restormer/restormer_official_dfwb-gray-sigma50.py) | 50 | 28.6269/0.8188 | 27.3266/0.7434 | 28.9636/0.8571 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma50-ee852dfe.pth) \| log | +| | | | | | | | +| [restormer_official_dfwb-gray-sigma15](/configs/restormer/restormer_official_dfwb-gray-sigma15.py) | 15 | 33.9642/0.9153 | 32.4994/0.8928 | 34.3152/0.9409 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth) \| log | +| [restormer_official_dfwb-gray-sigma25](/configs/restormer/restormer_official_dfwb-gray-sigma25.py) | 25 | 31.7106/0.8810 | 30.1486/0.8360 | 32.0457/0.9131 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth) \| log | +| [restormer_official_dfwb-gray-sigma50](/configs/restormer/restormer_official_dfwb-gray-sigma50.py) | 50 | 28.6614/0.8197 | 27.3537/0.7422 | 28.9848/0.8571 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth) \| log | + +> Top super-row: training a separate model for each noise level. Bottom super-row: learning a single model to handle various noise levels. + +**Test Color Gaussian Noise** + +Evaluated on RGB channels. The metrics are `PSNR` / `SSIM` . + +| Method | $\\sigma$ | CBSD68
PSNR/SSIM (RGB) | Kodak24
PSNR/SSIM (RGB) | McMaster
PSNR/SSIM (RGB) | Urban100
PSNR/SSIM (RGB) | GPU Info | Download | +| :------------------------------------: | :-------: | :-----------------------: | :------------------------: | :-------------------------: | :-------------------------: | :------: | :--------------------------------------: | +| [restormer_official_dfwb-color-sigma15](/configs/restormer/restormer_official_dfwb-color-sigma15.py) | 15 | 34.3506/0.9352 | 35.4900/0.9312 | 35.6072/0.9352 | 35.1522/0.9530 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma15-012ceb71.pth) \| log | +| [restormer_official_dfwb-color-sigma25](/configs/restormer/restormer_official_dfwb-color-sigma25.py) | 25 | 31.7457/0.8942 | 33.0489/0.8943 | 33.3260/0.9066 | 32.9670/0.9317 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma25-e307f222.pth) \| log | +| [restormer_official_dfwb-color-sigma50](/configs/restormer/restormer_official_dfwb-color-sigma50.py) | 50 | 28.5569/0.8127 | 30.0122/0.8238 | 30.2608/0.8515 | 30.0230/0.8902 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma50-a991983d.pth) \| log | +| | | | | | | | | +| [restormer_official_dfwb-color-sigma15](/configs/restormer/restormer_official_dfwb-color-sigma15.py) | 15 | 34.3422/0.9356 | 35.4544/0.9308 | 35.5473/0.9344 | 35.0754/0.9524 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth) \| log | +| [restormer_official_dfwb-color-sigma25](/configs/restormer/restormer_official_dfwb-color-sigma25.py) | 25 | 31.7391/0.8945 | 33.0380/0.8941 | 33.3040/0.9063 | 32.9165/0.9312 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth) \| log | +| [restormer_official_dfwb-color-sigma50](/configs/restormer/restormer_official_dfwb-color-sigma50.py) | 50 | 28.5582/0.8126 | 30.0074/0.8233 | 30.2671/0.8520 | 30.0172/0.8898 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth) \| log | + +> Top super-row: training a separate model for each noise level. Bottom super-row: learning a single model to handle various noise levels. + +### **Real Image Denoising** + +Evaluated on RGB channels. The metrics are `PSNR` / `SSIM` . + +| Method | SIDD
PSNR/SSIM | GPU Info | Download | +| :----------------------------------------------------------------------: | :---------------: | :------: | :-----------------------------------------------------------------------------------------------------: | +| [restormer_official_sidd](/configs/restormer/restormer_official_sidd.py) | 40.0156/0.9225 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_sidd-9e7025db.pth) \| log | + +## Quick Start + +**Train** + +You can refer to **Train a model** part in [train_test.md](/docs/en/user_guides/train_test.md#Train-a-model-in-MMEditing). + +
+ +**Test** + +
+Test Instructions + +You can use the following commands to test a model with cpu or single/multiple GPUs. + +```shell +# cpu test +# Deraining +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_rain13k.py https://download.openmmlab.com/mmediting/restormer/restormer_official_rain13k-2be7b550.pth + +# Motion Deblurring +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_gopro.py https://download.openmmlab.com/mmediting/restormer/restormer_official_gopro-db7363a0.pth + +# Defocus Deblurring +# Single +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dpdd-dual.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth +# Dual +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dpdd-single.py https://download.openmmlab.com/mmediting/restormer_official_dpdd-dual-52c94c00.pth + +# Gaussian Denoising +# Test Grayscale Gaussian Noise +# sigma15 +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma15-da74417f.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth + +# sigma25 +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma25-08010841.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth + +# sigma50 +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma50-ee852dfe.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth + +# Test Color Gaussian Noise +# sigma15 +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma15-012ceb71.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth + +# sigma25 +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma25-e307f222.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth + +# sigma50 +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma50-a991983d.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth + +# single-gpu test +# Deraining +python tools/test.py configs/restormer/restormer_official_rain13k.py https://download.openmmlab.com/mmediting/restormer/restormer_official_rain13k-2be7b550.pth + +# Motion Deblurring +python tools/test.py configs/restormer/restormer_official_gopro.py https://download.openmmlab.com/mmediting/restormer/restormer_official_gopro-db7363a0.pth + +# Defocus Deblurring +# Single +python tools/test.py configs/restormer/restormer_official_dpdd-dual.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth +# Dual +python tools/test.py configs/restormer/restormer_official_dpdd-single.py https://download.openmmlab.com/mmediting/restormer_official_dpdd-dual-52c94c00.pth + +# Gaussian Denoising +# Test Grayscale Gaussian Noise +# sigma15 +python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma15-da74417f.pth + +python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth + +# sigma25 +python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma25-08010841.pth + +python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth + +# sigma50 +python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma50-ee852dfe.pth + +python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth + +# Test Color Gaussian Noise +# sigma15 +python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma15-012ceb71.pth + +python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth + +# sigma25 +python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma25-e307f222.pth + +python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth + +# sigma50 +python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma50-a991983d.pth + +python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth + + +# multi-gpu test +# Deraining +./tools/dist_test.sh configs/restormer/restormer_official_rain13k.py https://download.openmmlab.com/mmediting/restormer/restormer_official_rain13k-2be7b550.pth + +# Motion Deblurring +./tools/dist_test.sh configs/restormer/restormer_official_gopro.py https://download.openmmlab.com/mmediting/restormer/restormer_official_gopro-db7363a0.pth + +# Defocus Deblurring +# Single +./tools/dist_test.sh configs/restormer/restormer_official_dpdd-dual.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth +# Dual +./tools/dist_test.sh configs/restormer/restormer_official_dpdd-single.py https://download.openmmlab.com/mmediting/restormer_official_dpdd-dual-52c94c00.pth + +# Gaussian Denoising +# Test Grayscale Gaussian Noise +# sigma15 +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-gray-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma15-da74417f.pth + +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-gray-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth + +# sigma25 +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-gray-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma25-08010841.pth + +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-gray-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth + +# sigma50 +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-gray-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma50-ee852dfe.pth + +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-gray-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth + +# Test Color Gaussian Noise +# sigma15 +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-color-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma15-012ceb71.pth + +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-color-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth + +# sigma25 +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-color-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma25-e307f222.pth + +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-color-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth + +# sigma50 +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-color-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma50-a991983d.pth + +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-color-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth + +``` + +For more details, you can refer to **Test a pre-trained model** part in [train_test.md](/docs/en/user_guides/train_test.md#Test-a-pre-trained-model-in-MMEditing). + +
+ +## Citation + +```bibtex +@inproceedings{Zamir2021Restormer, + title={Restormer: Efficient Transformer for High-Resolution Image Restoration}, + author={Syed Waqas Zamir and Aditya Arora and Salman Khan and Munawar Hayat + and Fahad Shahbaz Khan and Ming-Hsuan Yang}, + booktitle={CVPR}, + year={2022} +} +``` diff --git a/configs/restormer/README_zh-CN.md b/configs/restormer/README_zh-CN.md new file mode 100644 index 0000000000..400f597d62 --- /dev/null +++ b/configs/restormer/README_zh-CN.md @@ -0,0 +1,239 @@ +# Restormer (CVPR'2022) + +> [Restormer: Efficient Transformer for High-Resolution Image Restoration](https://arxiv.org/abs/2111.09881) + +> **任务**: 图像去噪,图像去模糊,图像去雨 + + + +
+ +
+ +## **各个任务下模型的测试结果** + +### **图像去雨** + +所有数据集均在Y通道上进行测试,测试指标为PSNR和SSIM。 + +| 方法 | Rain100H
PSNR/SSIM (Y) | Rain100L
PSNR/SSIM (Y) | Test100
PSNR/SSIM (Y) | Test1200
PSNR/SSIM (Y) | Test2800
PSNR/SSIM (Y) | GPU信息 | 下载 | +| :--------------------------------: | :-----------------------: | :-----------------------: | :----------------------: | :-----------------------: | :-----------------------: | :-----: | :---------------------------------: | +| [restormer_official_rain13k](/configs/restormer/restormer_official_rain13k.py) | 31.4804/0.9056 | 39.1023/0.9787 | 32.0287/0.9239 | 33.2251/0.9272 | 34.2170/0.9451 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_rain13k-2be7b550.pth) \| log | + +### **图像去模糊** + +Gopro和HIDE数据集上使用RGB通道测试,ReakBlur-J 和 ReakBlur-R数据集使用Y通道测试。测试指标为PSNR和SSIM。 + +| 方法 | GoPro
PSNR/SSIM (RGB) | HIDE
PSNR/SSIM (RGB) | RealBlur-J
PSNR/SSIM (Y) | RealBlur-R
PSNR/SSIM (Y) | GPU信息 | 下载 | +| :--------------------------------------------: | :----------------------: | :---------------------: | :-------------------------: | :-------------------------: | :-----: | :--------------------------------------------: | +| [restormer_official_gopro](/configs/restormer/restormer_official_gopro.py) | 32.9295/0.9496 | 31.2289/0.9345 | 28.4356/0.8681 | 35.9141/0.9707 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_gopro-db7363a0.pth) \| log | + +### **图像去失焦模糊** + +所有指标均在RGB通道上进行测试。测试指标为PSNR、SSIM、MAE和LPIPS. + +| 方法 | 室内场景图像的PSNR | 室内场景图像的SSIM | 室内场景图像的MAE | 室内场景图像的LPIPS | 室外场景图像的PSNR | 室外场景图像的SSIM | 室外场景图像的MAE | 室外场景图像的LPIPS | 所有图像平均PSNR | 所有图像平均SSIM | 所有图像平均MAE | 所有图像平均LPIPS | GPU 信息 | 下载 | +| :----: | :-------------: | :-------------: | :------------: | :--------------: | :-------------: | :-------------: | :------------: | :--------------: | :------------: | :-------------: | :------------: | :--------------: | :------: | :-----: | +| [restormer_official_dpdd-single](/configs/restormer/restormer_official_dpdd-single.py) | 28.8681 | 0.8859 | 0.0251 | - | 23.2410 | 0.7509 | 0.0499 | - | 25.9805 | 0.8166 | 0.0378 | - | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth) \| log | +| [restormer_official_dpdd-dual](/configs/restormer/restormer_official_dpdd-dual.py) | 26.6160 | 0.8346 | 0.0354 | - | 26.6160 | 0.8346 | 0.0354 | - | 26.6160 | 0.8346 | 0.0354 | - | 1 | [model](https://download.openmmlab.com/mmediting/restormer_official_dpdd-dual-52c94c00.pth) \| log | + +### **图像高斯噪声去除** + +**灰度图的高斯噪声** + +使用PSNR和SSIM指标对数据集上的灰度图进行测试。 + +| 方法 | $\\sigma$ | Set12
PSNR/SSIM | BSD68
PSNR/SSIM | Urban100
PSNR/SSIM | GPU信息 | 下载 | +| :-------------------------------------------------------------: | :-------: | :----------------: | :----------------: | :-------------------: | :-----: | :--------------------------------------------------------------: | +| [restormer_official_dfwb-gray-sigma15](/configs/restormer/restormer_official_dfwb-gray-sigma15.py) | 15 | 34.0182/0.9160 | 32.4987/0.8940 | 34.4336/0.9419 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma15-da74417f.pth) \| log | +| [restormer_official_dfwb-gray-sigma25](/configs/restormer/restormer_official_dfwb-gray-sigma25.py) | 25 | 31.7289/0.8811 | 30.1613/0.8370 | 32.1162/0.9140 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma25-08010841.pth) \| log | +| [restormer_official_dfwb-gray-sigma50](/configs/restormer/restormer_official_dfwb-gray-sigma50.py) | 50 | 28.6269/0.8188 | 27.3266/0.7434 | 28.9636/0.8571 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma50-ee852dfe.pth) \| log | +| | | | | | | | +| [restormer_official_dfwb-gray-sigma15](/configs/restormer/restormer_official_dfwb-gray-sigma15.py) | 15 | 33.9642/0.9153 | 32.4994/0.8928 | 34.3152/0.9409 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth) \| log | +| [restormer_official_dfwb-gray-sigma25](/configs/restormer/restormer_official_dfwb-gray-sigma25.py) | 25 | 31.7106/0.8810 | 30.1486/0.8360 | 32.0457/0.9131 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth) \| log | +| [restormer_official_dfwb-gray-sigma50](/configs/restormer/restormer_official_dfwb-gray-sigma50.py) | 50 | 28.6614/0.8197 | 27.3537/0.7422 | 28.9848/0.8571 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth) \| log | + +> 上面三行代表每个噪声等级训练一个单独的模型,下面三行代表学习一个单一的模型来处理各种噪音水平。 + +**彩色图像的高斯噪声** + +所有指标均在RGB通道上进行测试,测试指标为PSNR和SSIM。 + +| 方法 | $\\sigma$ | CBSD68
PSNR/SSIM (RGB) | Kodak24
PSNR/SSIM (RGB) | McMaster
PSNR/SSIM (RGB) | Urban100
PSNR/SSIM (RGB) | GPU信息 | 下载 | +| :-------------------------------------: | :-------: | :-----------------------: | :------------------------: | :-------------------------: | :-------------------------: | :-----: | :--------------------------------------: | +| [restormer_official_dfwb-color-sigma15](/configs/restormer/restormer_official_dfwb-color-sigma15.py) | 15 | 34.3506/0.9352 | 35.4900/0.9312 | 35.6072/0.9352 | 35.1522/0.9530 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma15-012ceb71.pth) \| log | +| [restormer_official_dfwb-color-sigma25](/configs/restormer/restormer_official_dfwb-color-sigma25.py) | 25 | 31.7457/0.8942 | 33.0489/0.8943 | 33.3260/0.9066 | 32.9670/0.9317 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma25-e307f222.pth) \| log | +| [restormer_official_dfwb-color-sigma50](/configs/restormer/restormer_official_dfwb-color-sigma50.py) | 50 | 28.5569/0.8127 | 30.0122/0.8238 | 30.2608/0.8515 | 30.0230/0.8902 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma50-a991983d.pth) \| log | +| | | | | | | | | +| [restormer_official_dfwb-color-sigma15](/configs/restormer/restormer_official_dfwb-color-sigma15.py) | 15 | 34.3422/0.9356 | 35.4544/0.9308 | 35.5473/0.9344 | 35.0754/0.9524 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth) \| log | +| [restormer_official_dfwb-color-sigma25](/configs/restormer/restormer_official_dfwb-color-sigma25.py) | 25 | 31.7391/0.8945 | 33.0380/0.8941 | 33.3040/0.9063 | 32.9165/0.9312 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth) \| log | +| [restormer_official_dfwb-color-sigma50](/configs/restormer/restormer_official_dfwb-color-sigma50.py) | 50 | 28.5582/0.8126 | 30.0074/0.8233 | 30.2671/0.8520 | 30.0172/0.8898 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth) \| log | + +> 上面三行代表每个噪声等级训练一个单独的模型,下面三行代表学习一个单一的模型来处理各种噪音水平。 + +### **真实场景图像去噪** + +所有指标均在RGB通道上进行测试,测试指标为PSNR和SSIM。 + +| 方法 | SIDD
PSNR/SSIM | GPU信息 | 下载 | +| :----------------------------------------------------------------------: | :---------------: | :-----: | :-----------------------------------------------------------------------------------------------------: | +| [restormer_official_sidd](/configs/restormer/restormer_official_sidd.py) | 40.0156/0.9225 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_sidd-9e7025db.pth) \| log | + +## 使用方法 + +**训练** + +可以参考 [train_test.md](/docs/zh_cn/user_guides/train_test.md) 中的 **Train a model** 部分。 + +**测试** + +
+测试说明 + +您可以使用以下命令来测试模型。 + +```shell +# cpu test +# Deraining +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_rain13k.py https://download.openmmlab.com/mmediting/restormer/restormer_official_rain13k-2be7b550.pth + +# Motion Deblurring +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_gopro.py https://download.openmmlab.com/mmediting/restormer/restormer_official_gopro-db7363a0.pth + +# Defocus Deblurring +# Single +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dpdd-dual.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth +# Dual +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dpdd-single.py https://download.openmmlab.com/mmediting/restormer_official_dpdd-dual-52c94c00.pth + +# Gaussian Denoising +# Test Grayscale Gaussian Noise +# sigma15 +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma15-da74417f.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth + +# sigma25 +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma25-08010841.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth + +# sigma50 +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma50-ee852dfe.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth + +# Test Color Gaussian Noise +# sigma15 +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma15-012ceb71.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth + +# sigma25 +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma25-e307f222.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth + +# sigma50 +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma50-a991983d.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth + +# single-gpu test +# Deraining +python tools/test.py configs/restormer/restormer_official_rain13k.py https://download.openmmlab.com/mmediting/restormer/restormer_official_rain13k-2be7b550.pth + +# Motion Deblurring +python tools/test.py configs/restormer/restormer_official_gopro.py https://download.openmmlab.com/mmediting/restormer/restormer_official_gopro-db7363a0.pth + +# Defocus Deblurring +# Single +python tools/test.py configs/restormer/restormer_official_dpdd-dual.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth +# Dual +python tools/test.py configs/restormer/restormer_official_dpdd-single.py https://download.openmmlab.com/mmediting/restormer_official_dpdd-dual-52c94c00.pth + +# Gaussian Denoising +# Test Grayscale Gaussian Noise +# sigma15 +python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma15-da74417f.pth + +python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth + +# sigma25 +python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma25-08010841.pth + +python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth + +# sigma50 +python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma50-ee852dfe.pth + +python tools/test.py configs/restormer/restormer_official_dfwb-gray-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth + +# Test Color Gaussian Noise +# sigma15 +python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma15-012ceb71.pth + +python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth + +# sigma25 +python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma25-e307f222.pth + +python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth + +# sigma50 +python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma50-a991983d.pth + +python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth + + +# multi-gpu test +# Deraining +./tools/dist_test.sh configs/restormer/restormer_official_rain13k.py https://download.openmmlab.com/mmediting/restormer/restormer_official_rain13k-2be7b550.pth + +# Motion Deblurring +./tools/dist_test.sh configs/restormer/restormer_official_gopro.py https://download.openmmlab.com/mmediting/restormer/restormer_official_gopro-db7363a0.pth + +# Defocus Deblurring +# Single +./tools/dist_test.sh configs/restormer/restormer_official_dpdd-dual.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth +# Dual +./tools/dist_test.sh configs/restormer/restormer_official_dpdd-single.py https://download.openmmlab.com/mmediting/restormer_official_dpdd-dual-52c94c00.pth + +# Gaussian Denoising +# Test Grayscale Gaussian Noise +# sigma15 +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-gray-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma15-da74417f.pth + +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-gray-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth + +# sigma25 +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-gray-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma25-08010841.pth + +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-gray-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth + +# sigma50 +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-gray-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma50-ee852dfe.pth + +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-gray-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth + +# Test Color Gaussian Noise +# sigma15 +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-color-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma15-012ceb71.pth + +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-color-sigma15.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth + +# sigma25 +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-color-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma25-e307f222.pth + +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-color-sigma25.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth + +# sigma50 +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-color-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma50-a991983d.pth + +./tools/dist_test.sh configs/restormer/restormer_official_dfwb-color-sigma50.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth + +``` + +更多细节可以参考 [train_test.md](/docs/zh_cn/user_guides/train_test.md) 中的 **Test a pre-trained model** 部分。 + +
diff --git a/configs/restormer/metafile.yml b/configs/restormer/metafile.yml new file mode 100644 index 0000000000..90e8f0b8a1 --- /dev/null +++ b/configs/restormer/metafile.yml @@ -0,0 +1,382 @@ +Collections: +- Metadata: + Architecture: + - Restormer + Name: Restormer + Paper: + - https://arxiv.org/abs/2111.09881 + README: configs/restormer/README.md +Models: +- Config: configs/restormer/restormer_official_rain13k.py + In Collection: Restormer + Metadata: + GPUs: '1' + Training Data: Others + Name: restormer_official_rain13k + Results: + - Dataset: Others + Metrics: + Rain100H
PSNR/SSIM (Y): + PSNR: 31.4804 + SSIM: 0.9056 + Rain100L
PSNR/SSIM (Y): + PSNR: 39.1023 + SSIM: 0.9787 + Test100
PSNR/SSIM (Y): + PSNR: 32.0287 + SSIM: 0.9239 + Test1200
PSNR/SSIM (Y): + PSNR: 33.2251 + SSIM: 0.9272 + Test2800
PSNR/SSIM (Y): + PSNR: 34.217 + SSIM: 0.9451 + Task: Denoising, Deblurring, Deraining + Weights: https://download.openmmlab.com/mmediting/restormer/restormer_official_rain13k-2be7b550.pth +- Config: configs/restormer/restormer_official_gopro.py + In Collection: Restormer + Metadata: + GPUs: '1' + Training Data: Others + Name: restormer_official_gopro + Results: + - Dataset: Others + Metrics: + GoPro
PSNR/SSIM (RGB): + PSNR: 32.9295 + SSIM: 0.9496 + HIDE
PSNR/SSIM (RGB): + PSNR: 31.2289 + SSIM: 0.9345 + RealBlur-J
PSNR/SSIM (Y): + PSNR: 28.4356 + SSIM: 0.8681 + RealBlur-R
PSNR/SSIM (Y): + PSNR: 35.9141 + SSIM: 0.9707 + Task: Denoising, Deblurring, Deraining + Weights: https://download.openmmlab.com/mmediting/restormer/restormer_official_gopro-db7363a0.pth +- Config: configs/restormer/restormer_official_dpdd-single.py + In Collection: Restormer + Metadata: + GPUs: '1' + Training Data: Others + Name: restormer_official_dpdd-single + Results: + - Dataset: Others + Metrics: + Combined MAE: 0.0378 + Combined PSNR: 25.9805 + Combined SSIM: 0.8166 + Indoor Scenes MAE: 0.0251 + Indoor Scenes PSNR: 28.8681 + Indoor Scenes SSIM: 0.8859 + Outdoor Scenes MAE: 0.0499 + Outdoor Scenes PSNR: 23.241 + Outdoor Scenes SSIM: 0.7509 + Task: Denoising, Deblurring, Deraining + Weights: https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth +- Config: configs/restormer/restormer_official_dpdd-dual.py + In Collection: Restormer + Metadata: + GPUs: '1' + Training Data: Others + Name: restormer_official_dpdd-dual + Results: + - Dataset: Others + Metrics: + Combined MAE: 0.0354 + Combined PSNR: 26.616 + Combined SSIM: 0.8346 + Indoor Scenes MAE: 0.0354 + Indoor Scenes PSNR: 26.616 + Indoor Scenes SSIM: 0.8346 + Outdoor Scenes MAE: 0.0354 + Outdoor Scenes PSNR: 26.616 + Outdoor Scenes SSIM: 0.8346 + Task: Denoising, Deblurring, Deraining + Weights: https://download.openmmlab.com/mmediting/restormer_official_dpdd-dual-52c94c00.pth +- Config: configs/restormer/restormer_official_dfwb-gray-sigma15.py + In Collection: Restormer + Metadata: + GPUs: '1' + Training Data: Others + Name: restormer_official_dfwb-gray-sigma15 + Results: + - Dataset: Others + Metrics: + $\\sigma$: 15.0 + BSD68
PSNR/SSIM: + PSNR: 32.4987 + SSIM: 0.894 + Set12
PSNR/SSIM: + PSNR: 34.0182 + SSIM: 0.916 + Urban100
PSNR/SSIM: + PSNR: 34.4336 + SSIM: 0.9419 + Task: Denoising, Deblurring, Deraining + Weights: https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma15-da74417f.pth +- Config: configs/restormer/restormer_official_dfwb-gray-sigma25.py + In Collection: Restormer + Metadata: + GPUs: '1' + Training Data: Others + Name: restormer_official_dfwb-gray-sigma25 + Results: + - Dataset: Others + Metrics: + $\\sigma$: 25.0 + BSD68
PSNR/SSIM: + PSNR: 30.1613 + SSIM: 0.837 + Set12
PSNR/SSIM: + PSNR: 31.7289 + SSIM: 0.8811 + Urban100
PSNR/SSIM: + PSNR: 32.1162 + SSIM: 0.914 + Task: Denoising, Deblurring, Deraining + Weights: https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma25-08010841.pth +- Config: configs/restormer/restormer_official_dfwb-gray-sigma50.py + In Collection: Restormer + Metadata: + GPUs: '1' + Training Data: Others + Name: restormer_official_dfwb-gray-sigma50 + Results: + - Dataset: Others + Metrics: + $\\sigma$: 50.0 + BSD68
PSNR/SSIM: + PSNR: 27.3266 + SSIM: 0.7434 + Set12
PSNR/SSIM: + PSNR: 28.6269 + SSIM: 0.8188 + Urban100
PSNR/SSIM: + PSNR: 28.9636 + SSIM: 0.8571 + Task: Denoising, Deblurring, Deraining + Weights: https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma50-ee852dfe.pth +- Config: configs/restormer/restormer_official_dfwb-gray-sigma15.py + In Collection: Restormer + Metadata: + GPUs: '1' + Training Data: Others + Name: restormer_official_dfwb-gray-sigma15 + Results: + - Dataset: Others + Metrics: + $\\sigma$: 15.0 + BSD68
PSNR/SSIM: + PSNR: 32.4994 + SSIM: 0.8928 + Set12
PSNR/SSIM: + PSNR: 33.9642 + SSIM: 0.9153 + Urban100
PSNR/SSIM: + PSNR: 34.3152 + SSIM: 0.9409 + Task: Denoising, Deblurring, Deraining + Weights: https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth +- Config: configs/restormer/restormer_official_dfwb-gray-sigma25.py + In Collection: Restormer + Metadata: + GPUs: '1' + Training Data: Others + Name: restormer_official_dfwb-gray-sigma25 + Results: + - Dataset: Others + Metrics: + $\\sigma$: 25.0 + BSD68
PSNR/SSIM: + PSNR: 30.1486 + SSIM: 0.836 + Set12
PSNR/SSIM: + PSNR: 31.7106 + SSIM: 0.881 + Urban100
PSNR/SSIM: + PSNR: 32.0457 + SSIM: 0.9131 + Task: Denoising, Deblurring, Deraining + Weights: https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth +- Config: configs/restormer/restormer_official_dfwb-gray-sigma50.py + In Collection: Restormer + Metadata: + GPUs: '1' + Training Data: Others + Name: restormer_official_dfwb-gray-sigma50 + Results: + - Dataset: Others + Metrics: + $\\sigma$: 50.0 + BSD68
PSNR/SSIM: + PSNR: 27.3537 + SSIM: 0.7422 + Set12
PSNR/SSIM: + PSNR: 28.6614 + SSIM: 0.8197 + Urban100
PSNR/SSIM: + PSNR: 28.9848 + SSIM: 0.8571 + Task: Denoising, Deblurring, Deraining + Weights: https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth +- Config: configs/restormer/restormer_official_dfwb-color-sigma15.py + In Collection: Restormer + Metadata: + GPUs: '1' + Training Data: Others + Name: restormer_official_dfwb-color-sigma15 + Results: + - Dataset: Others + Metrics: + $\\sigma$: 15.0 + CBSD68
PSNR/SSIM (RGB): + PSNR: 34.3506 + SSIM: 0.9352 + Kodak24
PSNR/SSIM (RGB): + PSNR: 35.49 + SSIM: 0.9312 + McMaster
PSNR/SSIM (RGB): + PSNR: 35.6072 + SSIM: 0.9352 + Urban100
PSNR/SSIM (RGB): + PSNR: 35.1522 + SSIM: 0.953 + Task: Denoising, Deblurring, Deraining + Weights: https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma15-012ceb71.pth +- Config: configs/restormer/restormer_official_dfwb-color-sigma25.py + In Collection: Restormer + Metadata: + GPUs: '1' + Training Data: Others + Name: restormer_official_dfwb-color-sigma25 + Results: + - Dataset: Others + Metrics: + $\\sigma$: 25.0 + CBSD68
PSNR/SSIM (RGB): + PSNR: 31.7457 + SSIM: 0.8942 + Kodak24
PSNR/SSIM (RGB): + PSNR: 33.0489 + SSIM: 0.8943 + McMaster
PSNR/SSIM (RGB): + PSNR: 33.326 + SSIM: 0.9066 + Urban100
PSNR/SSIM (RGB): + PSNR: 32.967 + SSIM: 0.9317 + Task: Denoising, Deblurring, Deraining + Weights: https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma25-e307f222.pth +- Config: configs/restormer/restormer_official_dfwb-color-sigma50.py + In Collection: Restormer + Metadata: + GPUs: '1' + Training Data: Others + Name: restormer_official_dfwb-color-sigma50 + Results: + - Dataset: Others + Metrics: + $\\sigma$: 50.0 + CBSD68
PSNR/SSIM (RGB): + PSNR: 28.5569 + SSIM: 0.8127 + Kodak24
PSNR/SSIM (RGB): + PSNR: 30.0122 + SSIM: 0.8238 + McMaster
PSNR/SSIM (RGB): + PSNR: 30.2608 + SSIM: 0.8515 + Urban100
PSNR/SSIM (RGB): + PSNR: 30.023 + SSIM: 0.8902 + Task: Denoising, Deblurring, Deraining + Weights: https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma50-a991983d.pth +- Config: configs/restormer/restormer_official_dfwb-color-sigma15.py + In Collection: Restormer + Metadata: + GPUs: '1' + Training Data: Others + Name: restormer_official_dfwb-color-sigma15 + Results: + - Dataset: Others + Metrics: + $\\sigma$: 15.0 + CBSD68
PSNR/SSIM (RGB): + PSNR: 34.3422 + SSIM: 0.9356 + Kodak24
PSNR/SSIM (RGB): + PSNR: 35.4544 + SSIM: 0.9308 + McMaster
PSNR/SSIM (RGB): + PSNR: 35.5473 + SSIM: 0.9344 + Urban100
PSNR/SSIM (RGB): + PSNR: 35.0754 + SSIM: 0.9524 + Task: Denoising, Deblurring, Deraining + Weights: https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth +- Config: configs/restormer/restormer_official_dfwb-color-sigma25.py + In Collection: Restormer + Metadata: + GPUs: '1' + Training Data: Others + Name: restormer_official_dfwb-color-sigma25 + Results: + - Dataset: Others + Metrics: + $\\sigma$: 25.0 + CBSD68
PSNR/SSIM (RGB): + PSNR: 31.7391 + SSIM: 0.8945 + Kodak24
PSNR/SSIM (RGB): + PSNR: 33.038 + SSIM: 0.8941 + McMaster
PSNR/SSIM (RGB): + PSNR: 33.304 + SSIM: 0.9063 + Urban100
PSNR/SSIM (RGB): + PSNR: 32.9165 + SSIM: 0.9312 + Task: Denoising, Deblurring, Deraining + Weights: https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth +- Config: configs/restormer/restormer_official_dfwb-color-sigma50.py + In Collection: Restormer + Metadata: + GPUs: '1' + Training Data: Others + Name: restormer_official_dfwb-color-sigma50 + Results: + - Dataset: Others + Metrics: + $\\sigma$: 50.0 + CBSD68
PSNR/SSIM (RGB): + PSNR: 28.5582 + SSIM: 0.8126 + Kodak24
PSNR/SSIM (RGB): + PSNR: 30.0074 + SSIM: 0.8233 + McMaster
PSNR/SSIM (RGB): + PSNR: 30.2671 + SSIM: 0.852 + Urban100
PSNR/SSIM (RGB): + PSNR: 30.0172 + SSIM: 0.8898 + Task: Denoising, Deblurring, Deraining + Weights: https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth +- Config: configs/restormer/restormer_official_sidd.py + In Collection: Restormer + Metadata: + GPUs: '1' + Training Data: Others + Name: restormer_official_sidd + Results: + - Dataset: Others + Metrics: + SIDD
PSNR/SSIM: + PSNR: 40.0156 + SSIM: 0.9225 + Task: Denoising, Deblurring, Deraining + Weights: https://download.openmmlab.com/mmediting/restormer/restormer_official_sidd-9e7025db.pth diff --git a/configs/restormer/restormer_official_dfwb-color-sigma15.py b/configs/restormer/restormer_official_dfwb-color-sigma15.py new file mode 100644 index 0000000000..3985289ef6 --- /dev/null +++ b/configs/restormer/restormer_official_dfwb-color-sigma15.py @@ -0,0 +1,37 @@ +_base_ = [ + '../_base_/default_runtime.py', + '../_base_/datasets/denoising-gaussian_color_test_config.py' +] + +experiment_name = 'restormer_official_dfwb_color_sigma15' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify sigma of RandomNoise +sigma = 15 +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[2]['params']['gaussian_sigma'] = [sigma * 255, sigma * 255] + +# model settings +model = dict( + type='BaseEditModel', + generator=dict( + type='Restormer', + inp_channels=3, + out_channels=3, + dim=48, + num_blocks=[4, 6, 6, 8], + num_refinement_blocks=4, + heads=[1, 2, 4, 8], + ffn_expansion_factor=2.66, + bias=False, + LayerNorm_type='BiasFree', + dual_pixel_task=False), + pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), + data_preprocessor=dict( + type='EditDataPreprocessor', + mean=[0., 0., 0.], + std=[255., 255., 255.], + )) diff --git a/configs/restormer/restormer_official_dfwb-color-sigma25.py b/configs/restormer/restormer_official_dfwb-color-sigma25.py new file mode 100644 index 0000000000..e1ecdb5cfd --- /dev/null +++ b/configs/restormer/restormer_official_dfwb-color-sigma25.py @@ -0,0 +1,37 @@ +_base_ = [ + '../_base_/default_runtime.py', + '../_base_/datasets/denoising-gaussian_color_test_config.py' +] + +experiment_name = 'restormer_official_dfwb_color_sigma25' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify sigma of RandomNoise +sigma = 25 +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[2]['params']['gaussian_sigma'] = [sigma * 255, sigma * 255] + +# model settings +model = dict( + type='BaseEditModel', + generator=dict( + type='Restormer', + inp_channels=3, + out_channels=3, + dim=48, + num_blocks=[4, 6, 6, 8], + num_refinement_blocks=4, + heads=[1, 2, 4, 8], + ffn_expansion_factor=2.66, + bias=False, + LayerNorm_type='BiasFree', + dual_pixel_task=False), + pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), + data_preprocessor=dict( + type='EditDataPreprocessor', + mean=[0., 0., 0.], + std=[255., 255., 255.], + )) diff --git a/configs/restormer/restormer_official_dfwb-color-sigma50.py b/configs/restormer/restormer_official_dfwb-color-sigma50.py new file mode 100644 index 0000000000..37a355083f --- /dev/null +++ b/configs/restormer/restormer_official_dfwb-color-sigma50.py @@ -0,0 +1,37 @@ +_base_ = [ + '../_base_/default_runtime.py', + '../_base_/datasets/denoising-gaussian_color_test_config.py' +] + +experiment_name = 'restormer_official_dfwb_color_sigma50' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify sigma of RandomNoise +sigma = 50 +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[2]['params']['gaussian_sigma'] = [sigma * 255, sigma * 255] + +# model settings +model = dict( + type='BaseEditModel', + generator=dict( + type='Restormer', + inp_channels=3, + out_channels=3, + dim=48, + num_blocks=[4, 6, 6, 8], + num_refinement_blocks=4, + heads=[1, 2, 4, 8], + ffn_expansion_factor=2.66, + bias=False, + LayerNorm_type='BiasFree', + dual_pixel_task=False), + pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), + data_preprocessor=dict( + type='EditDataPreprocessor', + mean=[0., 0., 0.], + std=[255., 255., 255.], + )) diff --git a/configs/restormer/restormer_official_dfwb-gray-sigma15.py b/configs/restormer/restormer_official_dfwb-gray-sigma15.py new file mode 100644 index 0000000000..a7db922251 --- /dev/null +++ b/configs/restormer/restormer_official_dfwb-gray-sigma15.py @@ -0,0 +1,37 @@ +_base_ = [ + '../_base_/default_runtime.py', + '../_base_/datasets/denoising-gaussian_gray_test_config.py' +] + +experiment_name = 'restormer_official_dfwb_gray_sigma15' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify sigma of RandomNoise +sigma = 15 +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[2]['params']['gaussian_sigma'] = [sigma * 255, sigma * 255] + +# model settings +model = dict( + type='BaseEditModel', + generator=dict( + type='Restormer', + inp_channels=1, + out_channels=1, + dim=48, + num_blocks=[4, 6, 6, 8], + num_refinement_blocks=4, + heads=[1, 2, 4, 8], + ffn_expansion_factor=2.66, + bias=False, + LayerNorm_type='BiasFree', + dual_pixel_task=False), + pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), + data_preprocessor=dict( + type='EditDataPreprocessor', + mean=[0.], + std=[255.], + )) diff --git a/configs/restormer/restormer_official_dfwb-gray-sigma25.py b/configs/restormer/restormer_official_dfwb-gray-sigma25.py new file mode 100644 index 0000000000..3ce1537c69 --- /dev/null +++ b/configs/restormer/restormer_official_dfwb-gray-sigma25.py @@ -0,0 +1,37 @@ +_base_ = [ + '../_base_/default_runtime.py', + '../_base_/datasets/denoising-gaussian_gray_test_config.py' +] + +experiment_name = 'restormer_official_dfwb_gray_sigma25' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify sigma of RandomNoise +sigma = 25 +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[2]['params']['gaussian_sigma'] = [sigma * 255, sigma * 255] + +# model settings +model = dict( + type='BaseEditModel', + generator=dict( + type='Restormer', + inp_channels=1, + out_channels=1, + dim=48, + num_blocks=[4, 6, 6, 8], + num_refinement_blocks=4, + heads=[1, 2, 4, 8], + ffn_expansion_factor=2.66, + bias=False, + LayerNorm_type='BiasFree', + dual_pixel_task=False), + pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), + data_preprocessor=dict( + type='EditDataPreprocessor', + mean=[0.], + std=[255.], + )) diff --git a/configs/restormer/restormer_official_dfwb-gray-sigma50.py b/configs/restormer/restormer_official_dfwb-gray-sigma50.py new file mode 100644 index 0000000000..e97ecfd2b0 --- /dev/null +++ b/configs/restormer/restormer_official_dfwb-gray-sigma50.py @@ -0,0 +1,37 @@ +_base_ = [ + '../_base_/default_runtime.py', + '../_base_/datasets/denoising-gaussian_gray_test_config.py' +] + +experiment_name = 'restormer_official_dfwb_gray_sigma50' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify sigma of RandomNoise +sigma = 50 +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[2]['params']['gaussian_sigma'] = [sigma * 255, sigma * 255] + +# model settings +model = dict( + type='BaseEditModel', + generator=dict( + type='Restormer', + inp_channels=1, + out_channels=1, + dim=48, + num_blocks=[4, 6, 6, 8], + num_refinement_blocks=4, + heads=[1, 2, 4, 8], + ffn_expansion_factor=2.66, + bias=False, + LayerNorm_type='BiasFree', + dual_pixel_task=False), + pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), + data_preprocessor=dict( + type='EditDataPreprocessor', + mean=[0.], + std=[255.], + )) diff --git a/configs/restormer/restormer_official_dpdd-dual.py b/configs/restormer/restormer_official_dpdd-dual.py new file mode 100644 index 0000000000..ed9526de08 --- /dev/null +++ b/configs/restormer/restormer_official_dpdd-dual.py @@ -0,0 +1,18 @@ +_base_ = [ + 'restormer_official_dpdd-single.py', +] + +experiment_name = 'restormer_official_dpdd-dual' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify PackEditInputs +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[4] = dict(type='PackEditInputs', keys=['imgL', 'imgR']) + +# model settings +model = dict( + generator=dict(inp_channels=6, dual_pixel_task=True), + data_preprocessor=dict(type='GenDataPreprocessor')) diff --git a/configs/restormer/restormer_official_dpdd-single.py b/configs/restormer/restormer_official_dpdd-single.py new file mode 100644 index 0000000000..136520da00 --- /dev/null +++ b/configs/restormer/restormer_official_dpdd-single.py @@ -0,0 +1,30 @@ +_base_ = [ + '../_base_/default_runtime.py', + '../_base_/datasets/deblurring-defocus_test_config.py' +] + +experiment_name = 'restormer_official_dpdd-single' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# model settings +model = dict( + type='BaseEditModel', + generator=dict( + type='Restormer', + inp_channels=3, + out_channels=3, + dim=48, + num_blocks=[4, 6, 6, 8], + num_refinement_blocks=4, + heads=[1, 2, 4, 8], + ffn_expansion_factor=2.66, + bias=False, + LayerNorm_type='WithBias', + dual_pixel_task=False), + pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), + data_preprocessor=dict( + type='EditDataPreprocessor', + mean=[0., 0., 0.], + std=[255., 255., 255.], + )) diff --git a/configs/restormer/restormer_official_gopro.py b/configs/restormer/restormer_official_gopro.py new file mode 100644 index 0000000000..a07a489725 --- /dev/null +++ b/configs/restormer/restormer_official_gopro.py @@ -0,0 +1,30 @@ +_base_ = [ + '../_base_/default_runtime.py', + '../_base_/datasets/deblurring-motion_test_config.py' +] + +experiment_name = 'restormer_official_gopro' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# model settings +model = dict( + type='BaseEditModel', + generator=dict( + type='Restormer', + inp_channels=3, + out_channels=3, + dim=48, + num_blocks=[4, 6, 6, 8], + num_refinement_blocks=4, + heads=[1, 2, 4, 8], + ffn_expansion_factor=2.66, + bias=False, + LayerNorm_type='WithBias', + dual_pixel_task=False), + pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), + data_preprocessor=dict( + type='EditDataPreprocessor', + mean=[0., 0., 0.], + std=[255., 255., 255.], + )) diff --git a/configs/restormer/restormer_official_rain13k.py b/configs/restormer/restormer_official_rain13k.py new file mode 100644 index 0000000000..c352582737 --- /dev/null +++ b/configs/restormer/restormer_official_rain13k.py @@ -0,0 +1,30 @@ +_base_ = [ + '../_base_/default_runtime.py', + '../_base_/datasets/deraining_test_config.py' +] + +experiment_name = 'restormer_official_rain13k' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# model settings +model = dict( + type='BaseEditModel', + generator=dict( + type='Restormer', + inp_channels=3, + out_channels=3, + dim=48, + num_blocks=[4, 6, 6, 8], + num_refinement_blocks=4, + heads=[1, 2, 4, 8], + ffn_expansion_factor=2.66, + bias=False, + LayerNorm_type='WithBias', + dual_pixel_task=False), + pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), + data_preprocessor=dict( + type='EditDataPreprocessor', + mean=[0., 0., 0.], + std=[255., 255., 255.], + )) diff --git a/configs/restormer/restormer_official_sidd.py b/configs/restormer/restormer_official_sidd.py new file mode 100644 index 0000000000..926796fcde --- /dev/null +++ b/configs/restormer/restormer_official_sidd.py @@ -0,0 +1,30 @@ +_base_ = [ + '../_base_/default_runtime.py', + '../_base_/datasets/denoising-real_test_config.py' +] + +experiment_name = 'restormer_official_sidd' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# model settings +model = dict( + type='BaseEditModel', + generator=dict( + type='Restormer', + inp_channels=3, + out_channels=3, + dim=48, + num_blocks=[4, 6, 6, 8], + num_refinement_blocks=4, + heads=[1, 2, 4, 8], + ffn_expansion_factor=2.66, + bias=False, + LayerNorm_type='BiasFree', + dual_pixel_task=False), + pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), + data_preprocessor=dict( + type='EditDataPreprocessor', + mean=[0., 0., 0.], + std=[255., 255., 255.], + )) diff --git a/mmedit/models/data_preprocessors/gen_preprocessor.py b/mmedit/models/data_preprocessors/gen_preprocessor.py index ff8206a70d..8229589fa5 100644 --- a/mmedit/models/data_preprocessors/gen_preprocessor.py +++ b/mmedit/models/data_preprocessors/gen_preprocessor.py @@ -188,3 +188,20 @@ def forward(self, data: dict, training: bool = False) -> dict: data['inputs'] = _batch_inputs data.setdefault('data_samples', None) return data + + def destructor(self, batch_tensor: torch.Tensor): + """Destructor of data processor. Destruct padding, normalization and + dissolve batch. + + Args: + batch_tensor (Tensor): Batched output. + + Returns: + Tensor: Destructed output. + """ + + # De-normalization + batch_tensor = batch_tensor * self.std + self.mean + batch_tensor = batch_tensor.clamp_(0, 255) + + return batch_tensor diff --git a/mmedit/models/editors/__init__.py b/mmedit/models/editors/__init__.py index 36feaad845..486a087653 100644 --- a/mmedit/models/editors/__init__.py +++ b/mmedit/models/editors/__init__.py @@ -46,6 +46,7 @@ from .rdn import RDNNet from .real_basicvsr import RealBasicVSR, RealBasicVSRNet from .real_esrgan import RealESRGAN, UNetDiscriminatorWithSpectralNorm +from .restormer import Restormer from .sagan import SAGAN from .singan import SinGAN from .srcnn import SRCNNNet @@ -83,5 +84,5 @@ 'DiscoDiffusion', 'IDLossModel', 'PESinGAN', 'MSPIEStyleGAN2', 'StyleGAN3Generator', 'InstColorization', 'NAFBaseline', 'NAFBaselineLocal', 'NAFNet', 'NAFNetLocal', 'DDIMScheduler', - 'DDPMScheduler', 'DenoisingUnet', 'ClipWrapper', 'EG3D' + 'DDPMScheduler', 'DenoisingUnet', 'ClipWrapper', 'EG3D', 'Restormer' ] diff --git a/mmedit/models/editors/restormer/__init__.py b/mmedit/models/editors/restormer/__init__.py new file mode 100644 index 0000000000..e1a3c0d914 --- /dev/null +++ b/mmedit/models/editors/restormer/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .restormer_net import Restormer + +__all__ = ['Restormer'] diff --git a/mmedit/models/editors/restormer/restormer_net.py b/mmedit/models/editors/restormer/restormer_net.py new file mode 100644 index 0000000000..bc3c68bf09 --- /dev/null +++ b/mmedit/models/editors/restormer/restormer_net.py @@ -0,0 +1,564 @@ +# Copyright (c) OpenMMLab. All rights reserved. + +import numbers + +import torch +import torch.nn as nn +import torch.nn.functional as F +from einops import rearrange +from mmengine.model import BaseModule + +from mmedit.registry import MODELS + + +def to_3d(x): + """Reshape input tensor.""" + return rearrange(x, 'b c h w -> b (h w) c') + + +def to_4d(x, h, w): + """Reshape input tensor.""" + return rearrange(x, 'b (h w) c -> b c h w', h=h, w=w) + + +class BiasFree_LayerNorm(BaseModule): + """Layer normalization without bias. + + Args: + normalized_shape (tuple): The shape of inputs. + """ + + def __init__(self, normalized_shape): + super(BiasFree_LayerNorm, self).__init__() + if isinstance(normalized_shape, numbers.Integral): + normalized_shape = (normalized_shape, ) + normalized_shape = torch.Size(normalized_shape) + + assert len(normalized_shape) == 1 + + self.weight = nn.Parameter(torch.ones(normalized_shape)) + self.normalized_shape = normalized_shape + + def forward(self, x): + """Forward function. + + Args: + x (Tensor): Input tensor with shape (B, C, H, W). + + Returns: + Tensor: Forward results. + """ + sigma = x.var(-1, keepdim=True, unbiased=False) + return x / torch.sqrt(sigma + 1e-5) * self.weight + + +class WithBias_LayerNorm(BaseModule): + """Layer normalization with bias. The bias can be learned. + + Args: + normalized_shape (tuple): The shape of inputs. + """ + + def __init__(self, normalized_shape): + super(WithBias_LayerNorm, self).__init__() + if isinstance(normalized_shape, numbers.Integral): + normalized_shape = (normalized_shape, ) + normalized_shape = torch.Size(normalized_shape) + + assert len(normalized_shape) == 1 + + self.weight = nn.Parameter(torch.ones(normalized_shape)) + self.bias = nn.Parameter(torch.zeros(normalized_shape)) + self.normalized_shape = normalized_shape + + def forward(self, x): + """Forward function. + + Args: + x (Tensor): Input tensor with shape (B, C, H, W). + + Returns: + Tensor: Forward results. + """ + mu = x.mean(-1, keepdim=True) + sigma = x.var(-1, keepdim=True, unbiased=False) + return (x - mu) / torch.sqrt(sigma + 1e-5) * self.weight + self.bias + + +class LayerNorm(BaseModule): + """Layer normalization module. + + Note: This is different from the layernorm2d in pytorch. + The layer norm here can select Layer Normalization type. + Args: + dim (int): Channel number of inputs. + LayerNorm_type (str): Layer Normalization type. + """ + + def __init__(self, dim, LayerNorm_type): + super(LayerNorm, self).__init__() + if LayerNorm_type == 'BiasFree': + self.body = BiasFree_LayerNorm(dim) + else: + self.body = WithBias_LayerNorm(dim) + + def forward(self, x): + """Forward function. + + Args: + x (Tensor): Input tensor with shape (B, C, H, W). + + Returns: + Tensor: Forward results. + """ + h, w = x.shape[-2:] + return to_4d(self.body(to_3d(x)), h, w) + + +class FeedForward(BaseModule): + """Gated-Dconv Feed-Forward Network (GDFN) + + The original version of GDFN in + "Restormer: Efficient Transformer for High-Resolution Image Restoration". + + Args: + dim (int): Channel number of inputs. + ffn_expansion_factor (float): channel expansion factor. Default: 2.66 + bias (bool): The bias of convolution. + """ + + def __init__(self, dim, ffn_expansion_factor, bias): + super(FeedForward, self).__init__() + + hidden_features = int(dim * ffn_expansion_factor) + + self.project_in = nn.Conv2d( + dim, hidden_features * 2, kernel_size=1, bias=bias) + + self.dwconv = nn.Conv2d( + hidden_features * 2, + hidden_features * 2, + kernel_size=3, + stride=1, + padding=1, + groups=hidden_features * 2, + bias=bias) + + self.project_out = nn.Conv2d( + hidden_features, dim, kernel_size=1, bias=bias) + + def forward(self, x): + """Forward function. + + Args: + x (Tensor): Input tensor with shape (B, C, H, W). + + Returns: + Tensor: Forward results. + """ + x = self.project_in(x) + x1, x2 = self.dwconv(x).chunk(2, dim=1) + x = F.gelu(x1) * x2 + x = self.project_out(x) + return x + + +class Attention(BaseModule): + """Multi-DConv Head Transposed Self-Attention (MDTA) + + The original version of MDTA in + "Restormer: Efficient Transformer for High-Resolution Image Restoration". + + Args: + dim (int): Channel number of inputs. + num_heads (int): Number of attention heads. + bias (bool): The bias of convolution. + """ + + def __init__(self, dim, num_heads, bias): + super(Attention, self).__init__() + self.num_heads = num_heads + self.temperature = nn.Parameter(torch.ones(num_heads, 1, 1)) + + self.qkv = nn.Conv2d(dim, dim * 3, kernel_size=1, bias=bias) + self.qkv_dwconv = nn.Conv2d( + dim * 3, + dim * 3, + kernel_size=3, + stride=1, + padding=1, + groups=dim * 3, + bias=bias) + self.project_out = nn.Conv2d(dim, dim, kernel_size=1, bias=bias) + + def forward(self, x): + """Forward function. + + Args: + x (Tensor): Input tensor with shape (B, C, H, W). + + Returns: + Tensor: Forward results. + """ + b, c, h, w = x.shape + + qkv = self.qkv_dwconv(self.qkv(x)) + q, k, v = qkv.chunk(3, dim=1) + + q = rearrange( + q, 'b (head c) h w -> b head c (h w)', head=self.num_heads) + k = rearrange( + k, 'b (head c) h w -> b head c (h w)', head=self.num_heads) + v = rearrange( + v, 'b (head c) h w -> b head c (h w)', head=self.num_heads) + + q = torch.nn.functional.normalize(q, dim=-1) + k = torch.nn.functional.normalize(k, dim=-1) + + attn = (q @ k.transpose(-2, -1)) * self.temperature + attn = attn.softmax(dim=-1) + + out = (attn @ v) + + out = rearrange( + out, + 'b head c (h w) -> b (head c) h w', + head=self.num_heads, + h=h, + w=w) + + out = self.project_out(out) + return out + + +class TransformerBlock(BaseModule): + """Transformer Block. + + The original version of Transformer Block in "Restormer: Efficient\ + Transformer for High-Resolution Image Restoration". + + Args: + dim (int): Channel number of inputs. + num_heads (int): Number of attention heads. + ffn_expansion_factor (float): channel expansion factor. Default: 2.66 + bias (bool): The bias of convolution. + LayerNorm_type (str): Layer Normalization type. + """ + + def __init__(self, dim, num_heads, ffn_expansion_factor, bias, + LayerNorm_type): + super(TransformerBlock, self).__init__() + + self.norm1 = LayerNorm(dim, LayerNorm_type) + self.attn = Attention(dim, num_heads, bias) + self.norm2 = LayerNorm(dim, LayerNorm_type) + self.ffn = FeedForward(dim, ffn_expansion_factor, bias) + + def forward(self, x): + """Forward function. + + Args: + x (Tensor): Input tensor with shape (B, C, H, W). + + Returns: + Tesnor: Forward results. + """ + x = x + self.attn(self.norm1(x)) + x = x + self.ffn(self.norm2(x)) + + return x + + +class OverlapPatchEmbed(BaseModule): + """Overlapped image patch embedding with 3x3 Conv. + + Args: + in_c (int, optional): Channel number of inputs. Default: 3 + embed_dim (int, optional): embedding dimension. Default: 48 + bias (bool, optional): The bias of convolution. Default: False + """ + + def __init__(self, in_c=3, embed_dim=48, bias=False): + super(OverlapPatchEmbed, self).__init__() + + self.proj = nn.Conv2d( + in_c, embed_dim, kernel_size=3, stride=1, padding=1, bias=bias) + + def forward(self, x): + """Forward function. + + Args: + x (Tensor): Input tensor with shape (B, C, H, W). + + Returns: + Tesnor: Forward results. + """ + x = self.proj(x) + + return x + + +class Downsample(BaseModule): + """Downsample modules. + + Args: + n_feat(int): Channel number of features. + """ + + def __init__(self, n_feat): + super(Downsample, self).__init__() + + self.body = nn.Sequential( + nn.Conv2d( + n_feat, + n_feat // 2, + kernel_size=3, + stride=1, + padding=1, + bias=False), nn.PixelUnshuffle(2)) + + def forward(self, x): + """Forward function. + + Args: + x (Tensor): Input tensor with shape (B, C, H, W). + + Returns: + Tesnor: Forward results. + """ + return self.body(x) + + +class Upsample(BaseModule): + """Upsample modules. + + Args: + n_feat(int): Channel number of features. + """ + + def __init__(self, n_feat): + super(Upsample, self).__init__() + + self.body = nn.Sequential( + nn.Conv2d( + n_feat, + n_feat * 2, + kernel_size=3, + stride=1, + padding=1, + bias=False), nn.PixelShuffle(2)) + + def forward(self, x): + """Forward function. + + Args: + x (Tensor): Input tensor with shape (B, C, H, W). + + Returns: + Tesnor: Forward results. + """ + return self.body(x) + + +@MODELS.register_module() +class Restormer(BaseModule): + """Restormer A PyTorch impl of: `Restormer: Efficient Transformer for High- + Resolution Image Restoration`. Ref repo: + https://github.com/swz30/Restormer. + + Args: + inp_channels (int): Number of input image channels. Default: 3. + out_channels (int): Number of output image channels: 3. + dim (int): Number of feature dimension. Default: 48. + num_blocks (List(int)): Depth of each Transformer layer. + Default: [4, 6, 6, 8]. + num_refinement_blocks (int): Number of refinement blocks. + Default: 4. + heads (List(int)): Number of attention heads in different layers. + Default: 7. + ffn_expansion_factor (float): Ratio of feed forward network expansion. + Default: 2.66. + bias (bool): The bias of convolution. Default: False + LayerNorm_type (str|optional): Select layer Normalization type. + Optional: 'WithBias','BiasFree' + Default: 'WithBias'. + dual_pixel_task (bool): True for dual-pixel defocus deblurring only. + Also set inp_channels=6. Default: False. + dual_keys (List): Keys of dual images in inputs. + Default: ['imgL', 'imgR']. + """ + + def __init__(self, + inp_channels=3, + out_channels=3, + dim=48, + num_blocks=[4, 6, 6, 8], + num_refinement_blocks=4, + heads=[1, 2, 4, 8], + ffn_expansion_factor=2.66, + bias=False, + LayerNorm_type='WithBias', + dual_pixel_task=False, + dual_keys=['imgL', 'imgR']): + + super(Restormer, self).__init__() + + self.patch_embed = OverlapPatchEmbed(inp_channels, dim) + + self.encoder_level1 = nn.Sequential(*[ + TransformerBlock( + dim=dim, + num_heads=heads[0], + ffn_expansion_factor=ffn_expansion_factor, + bias=bias, + LayerNorm_type=LayerNorm_type) for i in range(num_blocks[0]) + ]) + + self.down1_2 = Downsample(dim) + self.encoder_level2 = nn.Sequential(*[ + TransformerBlock( + dim=int(dim * 2**1), + num_heads=heads[1], + ffn_expansion_factor=ffn_expansion_factor, + bias=bias, + LayerNorm_type=LayerNorm_type) for i in range(num_blocks[1]) + ]) + + self.down2_3 = Downsample(int(dim * 2**1)) + self.encoder_level3 = nn.Sequential(*[ + TransformerBlock( + dim=int(dim * 2**2), + num_heads=heads[2], + ffn_expansion_factor=ffn_expansion_factor, + bias=bias, + LayerNorm_type=LayerNorm_type) for i in range(num_blocks[2]) + ]) + + self.down3_4 = Downsample(int(dim * 2**2)) + self.latent = nn.Sequential(*[ + TransformerBlock( + dim=int(dim * 2**3), + num_heads=heads[3], + ffn_expansion_factor=ffn_expansion_factor, + bias=bias, + LayerNorm_type=LayerNorm_type) for i in range(num_blocks[3]) + ]) + + self.up4_3 = Upsample(int(dim * 2**3)) + self.reduce_chan_level3 = nn.Conv2d( + int(dim * 2**3), int(dim * 2**2), kernel_size=1, bias=bias) + self.decoder_level3 = nn.Sequential(*[ + TransformerBlock( + dim=int(dim * 2**2), + num_heads=heads[2], + ffn_expansion_factor=ffn_expansion_factor, + bias=bias, + LayerNorm_type=LayerNorm_type) for i in range(num_blocks[2]) + ]) + + self.up3_2 = Upsample(int(dim * 2**2)) + self.reduce_chan_level2 = nn.Conv2d( + int(dim * 2**2), int(dim * 2**1), kernel_size=1, bias=bias) + self.decoder_level2 = nn.Sequential(*[ + TransformerBlock( + dim=int(dim * 2**1), + num_heads=heads[1], + ffn_expansion_factor=ffn_expansion_factor, + bias=bias, + LayerNorm_type=LayerNorm_type) for i in range(num_blocks[1]) + ]) + + self.up2_1 = Upsample(int(dim * 2**1)) + + self.decoder_level1 = nn.Sequential(*[ + TransformerBlock( + dim=int(dim * 2**1), + num_heads=heads[0], + ffn_expansion_factor=ffn_expansion_factor, + bias=bias, + LayerNorm_type=LayerNorm_type) for i in range(num_blocks[0]) + ]) + + self.refinement = nn.Sequential(*[ + TransformerBlock( + dim=int(dim * 2**1), + num_heads=heads[0], + ffn_expansion_factor=ffn_expansion_factor, + bias=bias, + LayerNorm_type=LayerNorm_type) + for i in range(num_refinement_blocks) + ]) + + self.dual_pixel_task = dual_pixel_task + self.dual_keys = dual_keys + if self.dual_pixel_task: + self.skip_conv = nn.Conv2d( + dim, int(dim * 2**1), kernel_size=1, bias=bias) + + self.output = nn.Conv2d( + int(dim * 2**1), + out_channels, + kernel_size=3, + stride=1, + padding=1, + bias=bias) + + def forward(self, inp_img): + """Forward function. + + Args: + inp_img (Tensor): Input tensor with shape (B, C, H, W). + Returns: + Tensor: Forward results. + """ + + if self.dual_pixel_task: + dual_images = [inp_img[key] for key in self.dual_keys] + inp_img = torch.cat(dual_images, dim=1) + + _, _, h, w = inp_img.shape + if h % 8 == 0: + padding_h = 0 + else: + padding_h = 8 - h % 8 + if w % 8 == 0: + padding_w = 0 + else: + padding_w = 8 - w % 8 + + inp_img = F.pad(inp_img, (0, padding_w, 0, padding_h), 'reflect') + inp_enc_level1 = self.patch_embed(inp_img) + out_enc_level1 = self.encoder_level1(inp_enc_level1) + + inp_enc_level2 = self.down1_2(out_enc_level1) + out_enc_level2 = self.encoder_level2(inp_enc_level2) + + inp_enc_level3 = self.down2_3(out_enc_level2) + out_enc_level3 = self.encoder_level3(inp_enc_level3) + + inp_enc_level4 = self.down3_4(out_enc_level3) + latent = self.latent(inp_enc_level4) + + inp_dec_level3 = self.up4_3(latent) + inp_dec_level3 = torch.cat([inp_dec_level3, out_enc_level3], 1) + inp_dec_level3 = self.reduce_chan_level3(inp_dec_level3) + out_dec_level3 = self.decoder_level3(inp_dec_level3) + + inp_dec_level2 = self.up3_2(out_dec_level3) + inp_dec_level2 = torch.cat([inp_dec_level2, out_enc_level2], 1) + inp_dec_level2 = self.reduce_chan_level2(inp_dec_level2) + out_dec_level2 = self.decoder_level2(inp_dec_level2) + + inp_dec_level1 = self.up2_1(out_dec_level2) + inp_dec_level1 = torch.cat([inp_dec_level1, out_enc_level1], 1) + out_dec_level1 = self.decoder_level1(inp_dec_level1) + + out_dec_level1 = self.refinement(out_dec_level1) + + if self.dual_pixel_task: + out_dec_level1 = out_dec_level1 + self.skip_conv(inp_enc_level1) + out_dec_level1 = self.output(out_dec_level1) + else: + out_dec_level1 = self.output(out_dec_level1) + inp_img + + return out_dec_level1[:, :, :h, :w] diff --git a/model-index.yml b/model-index.yml index 61919afa89..a78dcb34b0 100644 --- a/model-index.yml +++ b/model-index.yml @@ -34,6 +34,7 @@ Import: - configs/rdn/metafile.yml - configs/real_basicvsr/metafile.yml - configs/real_esrgan/metafile.yml +- configs/restormer/metafile.yml - configs/sagan/metafile.yml - configs/singan/metafile.yml - configs/sngan_proj/metafile.yml diff --git a/requirements/runtime.txt b/requirements/runtime.txt index fc13ae548f..d98b318732 100644 --- a/requirements/runtime.txt +++ b/requirements/runtime.txt @@ -1,5 +1,6 @@ av av==8.0.3; python_version < '3.7' +einops face-alignment facexlib lmdb diff --git a/tests/test_models/test_editors/test_restormer/test_restormer_net.py b/tests/test_models/test_editors/test_restormer/test_restormer_net.py new file mode 100644 index 0000000000..d094052466 --- /dev/null +++ b/tests/test_models/test_editors/test_restormer/test_restormer_net.py @@ -0,0 +1,101 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmedit.models.editors import Restormer + + +def test_restormer_cpu(): + """Test Restormer.""" + + # Motion Deblurring or Image Deraining + net = Restormer( + inp_channels=3, + out_channels=3, + dim=24, + num_blocks=[2, 2, 2, 4], + num_refinement_blocks=1, + heads=[1, 2, 4, 8], + ffn_expansion_factor=2.66, + bias=False, + LayerNorm_type='WithBias', + dual_pixel_task=False) + img = torch.rand(1, 3, 16, 16) + output = net(img) + assert isinstance(output, torch.Tensor) + assert output.shape == (1, 3, 16, 16) + + # Image Denoising Gray + net = Restormer( + inp_channels=1, + out_channels=1, + dim=24, + num_blocks=[2, 2, 2, 4], + num_refinement_blocks=1, + heads=[1, 2, 4, 8], + ffn_expansion_factor=2.66, + bias=False, + LayerNorm_type='BiasFree', + dual_pixel_task=False) + img = torch.rand(1, 1, 16, 16) + output = net(img) + assert isinstance(output, torch.Tensor) + assert output.shape == (1, 1, 16, 16) + + # Image Denoising Color + net = Restormer( + inp_channels=3, + out_channels=3, + dim=24, + num_blocks=[2, 2, 2, 4], + num_refinement_blocks=1, + heads=[1, 2, 4, 8], + ffn_expansion_factor=2.66, + bias=False, + LayerNorm_type='BiasFree', + dual_pixel_task=False) + img = torch.rand(1, 3, 16, 16) + output = net(img) + assert isinstance(output, torch.Tensor) + assert output.shape == (1, 3, 16, 16) + + # Image Dual Defocus Deblurring + net = Restormer( + inp_channels=6, + out_channels=3, + dim=24, + num_blocks=[2, 2, 2, 4], + num_refinement_blocks=1, + heads=[1, 2, 4, 8], + ffn_expansion_factor=2.66, + bias=False, + LayerNorm_type='WithBias', + dual_pixel_task=True, + dual_keys=['imgL', 'imgR']) + img = dict() + img['imgL'] = torch.rand(1, 3, 16, 16) + img['imgR'] = torch.rand(1, 3, 16, 16) + output = net(img) + assert isinstance(output, torch.Tensor) + assert output.shape == (1, 3, 16, 16) + + +def test_restormer_cuda(): + net = Restormer( + inp_channels=3, + out_channels=3, + dim=24, + num_blocks=[2, 2, 2, 4], + num_refinement_blocks=1, + heads=[1, 2, 4, 8], + ffn_expansion_factor=2.66, + bias=False, + LayerNorm_type='WithBias', + dual_pixel_task=False) + img = torch.rand(1, 3, 16, 16) + + # Image Deblurring or Image Deraining (gpu) + if torch.cuda.is_available(): + net = net.cuda() + output = net(img.cuda()) + assert isinstance(output, torch.Tensor) + assert output.shape == (1, 3, 16, 16) From 11f5c2e6573ddf2cc311dd3e5c7cc6d37ad26893 Mon Sep 17 00:00:00 2001 From: Z-Fran <49083766+Z-Fran@users.noreply.github.com> Date: Thu, 22 Dec 2022 19:32:29 +0800 Subject: [PATCH 26/44] [Fix] fix restormer ut (#1550) --- .../test_editors/test_restormer/test_restormer_net.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/test_models/test_editors/test_restormer/test_restormer_net.py b/tests/test_models/test_editors/test_restormer/test_restormer_net.py index d094052466..64624d825f 100644 --- a/tests/test_models/test_editors/test_restormer/test_restormer_net.py +++ b/tests/test_models/test_editors/test_restormer/test_restormer_net.py @@ -1,9 +1,13 @@ # Copyright (c) OpenMMLab. All rights reserved. +import pytest import torch from mmedit.models.editors import Restormer +@pytest.mark.skipif( + torch.__version__ < '1.8.0', + reason='skip on torch<1.8 due to unsupported PixelUnShuffle') def test_restormer_cpu(): """Test Restormer.""" @@ -79,6 +83,9 @@ def test_restormer_cpu(): assert output.shape == (1, 3, 16, 16) +@pytest.mark.skipif( + torch.__version__ < '1.8.0', + reason='skip on torch<1.8 due to unsupported PixelUnShuffle') def test_restormer_cuda(): net = Restormer( inp_channels=3, From 618211686cca91b2efc7650c73c4316f7119638b Mon Sep 17 00:00:00 2001 From: Dingrui Lei <56751303+ldr426@users.noreply.github.com> Date: Thu, 22 Dec 2022 06:36:32 -0600 Subject: [PATCH 27/44] [Bug] fix extract_gt_data of realesrgan (#1542) * [Bug] fix extract_gt_data of realesrgan [Bug] fix extract_gt_data of realesrgan * Update real_esrgan.py Co-authored-by: Z-Fran <49083766+Z-Fran@users.noreply.github.com> --- mmedit/models/editors/real_esrgan/real_esrgan.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mmedit/models/editors/real_esrgan/real_esrgan.py b/mmedit/models/editors/real_esrgan/real_esrgan.py index b16b31477a..685297876f 100644 --- a/mmedit/models/editors/real_esrgan/real_esrgan.py +++ b/mmedit/models/editors/real_esrgan/real_esrgan.py @@ -191,7 +191,9 @@ def extract_gt_data(self, data_samples): gt_imgs = [data_sample.gt_img.data for data_sample in data_samples] gt = torch.stack(gt_imgs) - gt_unsharp = [data_sample.gt_img.data for data_sample in data_samples] + gt_unsharp = [ + data_sample.gt_unsharp.data for data_sample in data_samples + ] gt_unsharp = torch.stack(gt_unsharp) gt_pixel, gt_percep, gt_gan = gt.clone(), gt.clone(), gt.clone() From 0b343173bd1fa43be61a7ef9ab6a64a574b45b8f Mon Sep 17 00:00:00 2001 From: Yanhong Zeng Date: Fri, 23 Dec 2022 18:00:16 +0800 Subject: [PATCH 28/44] update readme of projects (#1552) * update example projects * fix lint --- docs/en/community/contributing.md | 2 +- docs/en/community/projects.md | 72 +++++++++++++++++++------------ projects/README.md | 63 ++++++++++++++++++++++----- 3 files changed, 99 insertions(+), 38 deletions(-) diff --git a/docs/en/community/contributing.md b/docs/en/community/contributing.md index bce2e9a914..7a6f5b72b8 100644 --- a/docs/en/community/contributing.md +++ b/docs/en/community/contributing.md @@ -1,4 +1,4 @@ -# Contributing to MMEditing +# Contributing guidance Welcome to the MMEditing community, we are committed to building a toolbox for cutting-edge image, video and 3D content generation, editing and processing techniques. diff --git a/docs/en/community/projects.md b/docs/en/community/projects.md index fe234251c6..50e25c903f 100644 --- a/docs/en/community/projects.md +++ b/docs/en/community/projects.md @@ -1,49 +1,67 @@ -# Projects based on MMEditing +# MMEditing projects -There are many awesome projects built upon MMEditing. -We list some of them as examples of how to extend MMEditing for your own projects. -As the page might not be completed, please feel free to create a PR to update this page. +Welcome to the MMEditing community! +The MMEditing ecosystem consists of tutorials, libraries, and projects from a broad set of researchers in academia and industry, ML and application engineers. +The goal of this ecosystem is to support, accelerate, and aid in your exploration with MMEditing for image, video, 3D content generation, editing and processing. -We also welcome any pull request to contribute your projects in the [projects of MMEditing](https://github.com/open-mmlab/mmediting/tree/dev-1.x/projects). +Here are a few projects that are built upon MMEditing. They are examples of how to use MMEditing as a library, to make your projects more maintainable. +Please find more projects in [MMEditing Ecosystem](https://openmmlab.com/ecosystem). -## Projects as an extension +## Show your projects on OpenMMLab Ecosystem -Some projects extend the boundary of MMEditing for deployment or other research fields. -They reveal the potential of what MMEditing can do. We list several of them as below. +You can submit your project so that it can be shown on the homepage of [OpenMMLab](https://openmmlab.com/ecosystem). + +## Add example projects to MMEditing + +Here is an [example project](../../../projects/example_project) about how to add your projects to MMEditing. +You can copy and create your own project from the [example project](../../../projects/example_project). + +We also provide some documentation listed below for your reference: + +- [Contribution Guide](https://mmediting.readthedocs.io/en/dev-1.x/community/contributing.html) + + The guides for new contributors about how to add your projects to MMEditing. + +- [New Model Guide](https://mmediting.readthedocs.io/en/dev-1.x/howto/models.html) + + The documentation of adding new models. + +- [Discussions](https://github.com/open-mmlab/mmediting/discussions) + + Welcome to start a discussion! + +## Projects of libraries and toolboxes - [PowerVQE](https://github.com/ryanxingql/powervqe): Open framework for quality enhancement of compressed videos based on PyTorch and MMEditing. + - [VR-Baseline](https://github.com/linjing7/VR-Baseline): Video Restoration Toolbox. -- [Manga-Colorization-with-CycleGAN](https://github.com/chandlerbing65nm/Manga-Colorization-with-CycleGAN): Colorizing Black&White Japanese Manga using Generative Adversarial Network. -## Projects of papers +- [Derain-Toolbox](https://github.com/biubiubiiu/derain-toolbox): Single Image Deraining Toolbox and Benchmark -There are also projects released with papers. -Some of the papers are published in top-tier conferences (CVPR, ICCV, and ECCV), the others are also highly influential. -To make this list also a reference for the community to develop and compare new object detection algorithms, we list them following the time order of top-tier conferences. -Methods already supported and maintained by MMDetection are not listed. +## Projects of research papers -- Towards Interpretable Video Super-Resolution via Alternating Optimization, ECCV 2022 [\[paper\]](https://arxiv.org/abs/2207.10765)[\[github\]](https://github.com/caojiezhang/DAVSR) +- [Towards Interpretable Video Super-Resolution via Alternating Optimization, ECCV 2022](https://arxiv.org/abs/2207.10765)[\[github\]](https://github.com/caojiezhang/DAVSR) -- SepLUT:Separable Image-adaptive Lookup Tables for Real-time Image Enhancement, ECCV 2022 [\[paper\]](https://arxiv.org/abs/2207.08351)[\[github\]](https://github.com/ImCharlesY/SepLUT) +- [SepLUT:Separable Image-adaptive Lookup Tables for Real-time Image Enhancement, ECCV 2022](https://arxiv.org/abs/2207.08351)[\[github\]](https://github.com/ImCharlesY/SepLUT) -- Investigating Tradeoffs in Real-World Video Super-Resolution(RealBasicVSR), CVPR 2022 [\[paper\]](https://arxiv.org/abs/2111.12704)[\[github\]](https://github.com/ckkelvinchan/RealBasicVSR) +- [TTVSR: Learning Trajectory-Aware Transformer for Video Super-Resolution, CVPR 2022](https://arxiv.org/abs/2204.04216)[\[github\]](https://github.com/researchmm/TTVSR) -- BasicVSR++: Improving Video Super-Resolution with Enhanced Propagation and Alignment, CVPR 2022 [\[paper\]](https://arxiv.org/abs/2104.13371)[\[github\]](https://github.com/ckkelvinchan/BasicVSR_PlusPlus) +- [Arbitrary-Scale Image Synthesis, CVPR 2022](https://arxiv.org/pdf/2204.02273.pdf)[\[github\]](https://github.com/vglsd/ScaleParty) -- Multi-Scale Memory-Based Video Deblurring, CVPR 2022 [\[paper\]](https://arxiv.org/abs/2204.02977)[\[github\]](https://github.com/jibo27/MemDeblur) +- [Investigating Tradeoffs in Real-World Video Super-Resolution(RealBasicVSR), CVPR 2022](https://arxiv.org/abs/2111.12704)[\[github\]](https://github.com/ckkelvinchan/RealBasicVSR) -- AdaInt:Learning Adaptive Intervals for 3D Lookup Tables on Real-time Image Enhancement, CVPR 2022 [\[paper\]](https://arxiv.org/abs/2204.13983)[\[github\]](https://github.com/ImCharlesY/AdaInt) +- [BasicVSR++: Improving Video Super-Resolution with Enhanced Propagation and Alignment, CVPR 2022](https://arxiv.org/abs/2104.13371)[\[github\]](https://github.com/ckkelvinchan/BasicVSR_PlusPlus) -- A New Dataset and Transformer for Stereoscopic Video Super-Resolution, CVPRW 2022 [\[paper\]](https://openaccess.thecvf.com/content/CVPR2022W/NTIRE/papers/Imani_A_New_Dataset_and_Transformer_for_Stereoscopic_Video_Super-Resolution_CVPRW_2022_paper.pdf)[\[github\]](https://github.com/H-deep/Trans-SVSR) +- [Multi-Scale Memory-Based Video Deblurring, CVPR 2022](https://arxiv.org/abs/2204.02977)[\[github\]](https://github.com/jibo27/MemDeblur) -- BasicVSR:The Search for Essential Components in Video Super-Resolution and Beyond, CVPR 2021 [\[paper\]](https://arxiv.org/abs/2012.02181)[\[github\]](https://github.com/ckkelvinchan/BasicVSR-IconVSR) +- [AdaInt:Learning Adaptive Intervals for 3D Lookup Tables on Real-time Image Enhancement, CVPR 2022](https://arxiv.org/abs/2204.13983)[\[github\]](https://github.com/ImCharlesY/AdaInt) -- GLEAN:Generative Latent Bank for Large-Factor Image Super-Resolution, CVPR 2021 [\[paper\]](https://arxiv.org/abs/2012.00739)[\[github\]](https://github.com/ckkelvinchan/GLEAN) +- [A New Dataset and Transformer for Stereoscopic Video Super-Resolution, CVPRW 2022](https://openaccess.thecvf.com/content/CVPR2022W/NTIRE/papers/Imani_A_New_Dataset_and_Transformer_for_Stereoscopic_Video_Super-Resolution_CVPRW_2022_paper.pdf)[\[github\]](https://github.com/H-deep/Trans-SVSR) -- DAN:Unfolding the Alternating Optimization for Blind Super Resolution, NeurIPS 2020 [\[paper\]](https://arxiv.org/abs/2010.02631v4)[\[github\]](https://github.com/AlexZou14/DAN-Basd-on-Openmmlab) +- [Liquid warping GAN with attention: A unified framework for human image synthesis, TPAMI 2021](https://arxiv.org/pdf/2011.09055.pdf)[\[github\]](https://github.com/iPERDance/iPERCore) -- Positional Encoding as Spatial Inductive Bias in GANs, CVPR 2021[\[paper\]](https://openaccess.thecvf.com/content/CVPR2021/papers/Xu_Positional_Encoding_As_Spatial_Inductive_Bias_in_GANs_CVPR_2021_paper.pdf)[\[github\]](https://github.com/open-mmlab/mmgeneration/tree/master/configs/positional_encoding_in_gans) +- [BasicVSR:The Search for Essential Components in Video Super-Resolution and Beyond, CVPR 2021](https://arxiv.org/abs/2012.02181)[\[github\]](https://github.com/ckkelvinchan/BasicVSR-IconVSR) -- A Multi-Modality Ovarian Tumor Ultrasound Image Dataset for Unsupervised Cross-Domain Semantic Segmentation, arXiv 2022 [\[paper\]](https://arxiv.org/pdf/2207.06799.pdf)[\[github\]](https://github.com/cv516buaa/mmotu_ds2net) +- [GLEAN:Generative Latent Bank for Large-Factor Image Super-Resolution, CVPR 2021](https://arxiv.org/abs/2012.00739)[\[github\]](https://github.com/ckkelvinchan/GLEAN) -- Arbitrary-Scale Image Synthesis, CVPR 2022 [\[paper\]](https://arxiv.org/pdf/2204.02273.pdf)[\[github\]](https://github.com/vglsd/ScaleParty) +- [DAN:Unfolding the Alternating Optimization for Blind Super Resolution, NeurIPS 2020](https://arxiv.org/abs/2010.02631v4)[\[github\]](https://github.com/AlexZou14/DAN-Basd-on-Openmmlab) diff --git a/projects/README.md b/projects/README.md index 2a4e69da7b..f6e6c0ca9e 100644 --- a/projects/README.md +++ b/projects/README.md @@ -1,24 +1,67 @@ # Welcome to Projects of MMEditing -In this folder, we welcome all contribution of image, video, 3D content generation, editing and processing. +Welcome to the MMEditing community! +The MMEditing ecosystem consists of tutorials, libraries, and projects from a broad set of researchers in academia and industry, ML and application engineers. +The goal of this ecosystem is to support, accelerate, and aid in your exploration with MMEditing for image, video, 3D content generation, editing and processing. -Here, these requirements, e.g. code standards, are not that strict as in core package. -Thus, developers from the community can implement their algorithms much more easily and efficiently in MMEditing. -We appreciate all contributions from community to make MMEditing greater. +Here are a few projects that are built upon MMEditing. They are examples of how to use MMEditing as a library, to make your projects more maintainable. +Please find more projects in [MMEditing Ecosystem](https://openmmlab.com/ecosystem). -Here is an [example project](./example_project) about how to add your algorithms easily. -You can copy and create your own project from the [example project](./example_project). +## Show your projects on OpenMMLab Ecosystem -We also provide some documentation listed below: +You can submit your project so that it can be shown on the homepage of [OpenMMLab](https://openmmlab.com/ecosystem). -- [New Model Guide](https://mmediting.readthedocs.io/en/dev-1.x/howto/models.html) +## Add example projects to MMEditing - The documentation of adding new models. +Here is an [example project](./example_project) about how to add your projects to MMEditing. +You can copy and create your own project from the [example project](./example_project). + +We also provide some documentation listed below for your reference: - [Contribution Guide](https://mmediting.readthedocs.io/en/dev-1.x/community/contributing.html) The guides for new contributors about how to add your projects to MMEditing. +- [New Model Guide](https://mmediting.readthedocs.io/en/dev-1.x/howto/models.html) + + The documentation of adding new models. + - [Discussions](https://github.com/open-mmlab/mmediting/discussions) - Welcome to start discussion! + Welcome to start a discussion! + +## Projects of libraries and toolboxes + +- [PowerVQE](https://github.com/ryanxingql/powervqe): Open framework for quality enhancement of compressed videos based on PyTorch and MMEditing. + +- [VR-Baseline](https://github.com/linjing7/VR-Baseline): Video Restoration Toolbox. + +- [Derain-Toolbox](https://github.com/biubiubiiu/derain-toolbox): Single Image Deraining Toolbox and Benchmark + +## Projects of research papers + +- [Towards Interpretable Video Super-Resolution via Alternating Optimization, ECCV 2022](https://arxiv.org/abs/2207.10765)[\[github\]](https://github.com/caojiezhang/DAVSR) + +- [SepLUT:Separable Image-adaptive Lookup Tables for Real-time Image Enhancement, ECCV 2022](https://arxiv.org/abs/2207.08351)[\[github\]](https://github.com/ImCharlesY/SepLUT) + +- [TTVSR: Learning Trajectory-Aware Transformer for Video Super-Resolution, CVPR 2022](https://arxiv.org/abs/2204.04216)[\[github\]](https://github.com/researchmm/TTVSR) + +- [Arbitrary-Scale Image Synthesis, CVPR 2022](https://arxiv.org/pdf/2204.02273.pdf)[\[github\]](https://github.com/vglsd/ScaleParty) + +- [Investigating Tradeoffs in Real-World Video Super-Resolution(RealBasicVSR), CVPR 2022](https://arxiv.org/abs/2111.12704)[\[github\]](https://github.com/ckkelvinchan/RealBasicVSR) + +- [BasicVSR++: Improving Video Super-Resolution with Enhanced Propagation and Alignment, CVPR 2022](https://arxiv.org/abs/2104.13371)[\[github\]](https://github.com/ckkelvinchan/BasicVSR_PlusPlus) + +- [Multi-Scale Memory-Based Video Deblurring, CVPR 2022](https://arxiv.org/abs/2204.02977)[\[github\]](https://github.com/jibo27/MemDeblur) + +- [AdaInt:Learning Adaptive Intervals for 3D Lookup Tables on Real-time Image Enhancement, CVPR 2022](https://arxiv.org/abs/2204.13983)[\[github\]](https://github.com/ImCharlesY/AdaInt) + +- [A New Dataset and Transformer for Stereoscopic Video Super-Resolution, CVPRW 2022](https://openaccess.thecvf.com/content/CVPR2022W/NTIRE/papers/Imani_A_New_Dataset_and_Transformer_for_Stereoscopic_Video_Super-Resolution_CVPRW_2022_paper.pdf)[\[github\]](https://github.com/H-deep/Trans-SVSR) + +- [Liquid warping GAN with attention: A unified framework for human image synthesis, TPAMI 2021](https://arxiv.org/pdf/2011.09055.pdf)[\[github\]](https://github.com/iPERDance/iPERCore) + +- [BasicVSR:The Search for Essential Components in Video Super-Resolution and Beyond, CVPR 2021](https://arxiv.org/abs/2012.02181)[\[github\]](https://github.com/ckkelvinchan/BasicVSR-IconVSR) + +- [GLEAN:Generative Latent Bank for Large-Factor Image Super-Resolution, CVPR 2021](https://arxiv.org/abs/2012.00739)[\[github\]](https://github.com/ckkelvinchan/GLEAN) + +- [DAN:Unfolding the Alternating Optimization for Blind Super Resolution, NeurIPS 2020](https://arxiv.org/abs/2010.02631v4)[\[github\]](https://github.com/AlexZou14/DAN-Basd-on-Openmmlab) From 592ad09084dd180b1dc13915478307dc9d3b2d33 Mon Sep 17 00:00:00 2001 From: austin273 <71265435+austin273@users.noreply.github.com> Date: Sat, 24 Dec 2022 15:03:27 +0800 Subject: [PATCH 29/44] fix config path in disco-diffusion (#1553) * fix config path in disco-diffusion * fix metafile and model_index --- .dev_scripts/update_model_index.py | 5 ++++- configs/disco_diffusion/README.md | 26 +++++++++++++------------- configs/disco_diffusion/metafile.yml | 6 +++--- configs/ggan/metafile.yml | 6 +++--- configs/pggan/metafile.yml | 6 +++--- configs/pix2pix/metafile.yml | 8 ++++---- configs/sagan/metafile.yml | 20 ++++++++++---------- configs/singan/metafile.yml | 6 +++--- configs/sngan_proj/metafile.yml | 20 ++++++++++---------- configs/styleganv1/metafile.yml | 4 ++-- configs/styleganv3/metafile.yml | 18 +++++++++--------- configs/wgan-gp/metafile.yml | 4 ++-- 12 files changed, 66 insertions(+), 63 deletions(-) diff --git a/.dev_scripts/update_model_index.py b/.dev_scripts/update_model_index.py index 1703d55f2f..271d58e474 100755 --- a/.dev_scripts/update_model_index.py +++ b/.dev_scripts/update_model_index.py @@ -177,7 +177,8 @@ def parse_md(md_file): # import ipdb # ipdb.set_trace() if 'Config' not in cols and 'Download' not in cols: - warnings.warn(f"Lack 'Config' or 'Download' in line {i+1}") + warnings.warn("Lack 'Config' or 'Download' in" + f'line {i+1} in {md_file}') i += 1 continue if 'Method' in cols: @@ -210,6 +211,8 @@ def parse_md(md_file): left = line[config_idx].index('](') + 2 right = line[config_idx].index(')', left) config = line[config_idx][left:right].strip('./') + config = osp.join( + osp.dirname(md_file), osp.basename(config)) elif line[config_idx].find('△') == -1: j += 1 continue diff --git a/configs/disco_diffusion/README.md b/configs/disco_diffusion/README.md index b55f037505..949ac0f086 100644 --- a/configs/disco_diffusion/README.md +++ b/configs/disco_diffusion/README.md @@ -24,18 +24,18 @@ Created by Somnai, augmented by Gandamu, and building on the work of RiversHaveW We have converted several `unet` weights and offer related configs. See more details of different `unet` in [Tutorial](#tutorials). -| Diffusion Model | Config | Download | -| :--------------------------------------: | :-------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------: | -| 512x512_diffusion_uncond_finetune_008100 | [config](configs/disco/disco-diffusion_adm-u-finetuned_imagenet-512x512.py) | [model](https://download.openmmlab.com/mmediting/synthesizers/disco/adm-u_finetuned_imagenet-512x512-ab471d70.pth) | -| 256x256_diffusion_uncond | [config](configs/disco/disco-diffusion_adm-u-finetuned_imagenet-256x256.py) | [model](<>) | -| portrait_generator_v001 | [config](configs/disco/disco-diffusion_portrait-generator-v001.py) | [model](https://download.openmmlab.com/mmediting/synthesizers/disco/adm-u-cvt-rgb_portrait-v001-f4a3f3bc.pth) | -| pixelartdiffusion_expanded | Coming soon! | | -| pixel_art_diffusion_hard_256 | Coming soon! | | -| pixel_art_diffusion_soft_256 | Coming soon! | | -| pixelartdiffusion4k | Coming soon! | | -| watercolordiffusion_2 | Coming soon! | | -| watercolordiffusion | Coming soon! | | -| PulpSciFiDiffusion | Coming soon! | | +| Diffusion Model | Config | Download | +| :--------------------------------------: | :-------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------: | +| 512x512_diffusion_uncond_finetune_008100 | [config](./disco-diffusion_adm-u-finetuned_imagenet-512x512.py) | [model](https://download.openmmlab.com/mmediting/synthesizers/disco/adm-u_finetuned_imagenet-512x512-ab471d70.pth) | +| 256x256_diffusion_uncond | [config](./disco-diffusion_adm-u-finetuned_imagenet-256x256.py) | [model](<>) | +| portrait_generator_v001 | [config](./disco-diffusion_portrait-generator-v001.py) | [model](https://download.openmmlab.com/mmediting/synthesizers/disco/adm-u-cvt-rgb_portrait-v001-f4a3f3bc.pth) | +| pixelartdiffusion_expanded | Coming soon! | | +| pixel_art_diffusion_hard_256 | Coming soon! | | +| pixel_art_diffusion_soft_256 | Coming soon! | | +| pixelartdiffusion4k | Coming soon! | | +| watercolordiffusion_2 | Coming soon! | | +| watercolordiffusion | Coming soon! | | +| PulpSciFiDiffusion | Coming soon! | | ## To-do List @@ -81,7 +81,7 @@ save_image(image, "image.png") ## Tutorials -Considering that `disco-diffusion` contains many adjustable parameters, we provide users with a [jupyter-notebook](configs/disco_diffusion/tutorials.ipynb) / [colab](https://githubtocolab.com/open-mmlab/mmediting/blob/dev-1.x/configs/disco_diffusion/tutorials.ipynb) tutorial that exhibits the meaning of different parameters, and gives results corresponding to adjustment. +Considering that `disco-diffusion` contains many adjustable parameters, we provide users with a [jupyter-notebook](./tutorials.ipynb) / [colab](https://githubtocolab.com/open-mmlab/mmediting/blob/dev-1.x/configs/disco_diffusion/tutorials.ipynb) tutorial that exhibits the meaning of different parameters, and gives results corresponding to adjustment. Refer to [Disco Sheet](https://docs.google.com/document/d/1l8s7uS2dGqjztYSjPpzlmXLjl5PM3IGkRWI3IiCuK7g/edit). ## Credits diff --git a/configs/disco_diffusion/metafile.yml b/configs/disco_diffusion/metafile.yml index f3a26fd520..a53a0fb304 100644 --- a/configs/disco_diffusion/metafile.yml +++ b/configs/disco_diffusion/metafile.yml @@ -7,7 +7,7 @@ Collections: - https://github.com/alembics/disco-diffusion README: configs/disco_diffusion/README.md Models: -- Config: configs/disco/disco-diffusion_adm-u-finetuned_imagenet-512x512.py +- Config: configs/disco_diffusion/disco-diffusion_adm-u-finetuned_imagenet-512x512.py In Collection: Disco Diffusion Metadata: Training Data: Others @@ -17,7 +17,7 @@ Models: Metrics: {} Task: Text2Image, Image2Image, diffusion Weights: https://download.openmmlab.com/mmediting/synthesizers/disco/adm-u_finetuned_imagenet-512x512-ab471d70.pth -- Config: configs/disco/disco-diffusion_adm-u-finetuned_imagenet-256x256.py +- Config: configs/disco_diffusion/disco-diffusion_adm-u-finetuned_imagenet-256x256.py In Collection: Disco Diffusion Metadata: Training Data: Others @@ -27,7 +27,7 @@ Models: Metrics: {} Task: Text2Image, Image2Image, diffusion Weights: <> -- Config: configs/disco/disco-diffusion_portrait-generator-v001.py +- Config: configs/disco_diffusion/disco-diffusion_portrait-generator-v001.py In Collection: Disco Diffusion Metadata: Training Data: Others diff --git a/configs/ggan/metafile.yml b/configs/ggan/metafile.yml index ecb3a36221..ace7d6e4eb 100644 --- a/configs/ggan/metafile.yml +++ b/configs/ggan/metafile.yml @@ -7,7 +7,7 @@ Collections: - https://arxiv.org/abs/1705.02894 README: configs/ggan/README.md Models: -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/ggan/ggan_dcgan-archi_lr1e-3-1xb128-12Mimgs_celeba-cropped-64x64.py +- Config: configs/ggan/ggan_dcgan-archi_lr1e-3-1xb128-12Mimgs_celeba-cropped-64x64.py In Collection: GGAN Metadata: Training Data: CELEBA @@ -19,7 +19,7 @@ Models: MS-SSIM: 0.3318 Task: Unconditional GANs Weights: https://download.openmmlab.com/mmgen/ggan/ggan_celeba-cropped_dcgan-archi_lr-1e-3_64_b128x1_12m.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/ggan/ggan_dcgan-archi_lr1e-4-1xb64-10Mimgs_celeba-cropped-128x128.py +- Config: configs/ggan/ggan_dcgan-archi_lr1e-4-1xb64-10Mimgs_celeba-cropped-128x128.py In Collection: GGAN Metadata: Training Data: CELEBA @@ -31,7 +31,7 @@ Models: MS-SSIM: 0.3149 Task: Unconditional GANs Weights: https://download.openmmlab.com/mmgen/ggan/ggan_celeba-cropped_dcgan-archi_lr-1e-4_128_b64x1_10m_20210430_143027-516423dc.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/ggan/ggan_lsgan-archi_lr1e-4-1xb128-20Mimgs_lsun-bedroom-64x64.py +- Config: configs/ggan/ggan_lsgan-archi_lr1e-4-1xb128-20Mimgs_lsun-bedroom-64x64.py In Collection: GGAN Metadata: Training Data: Others diff --git a/configs/pggan/metafile.yml b/configs/pggan/metafile.yml index 025278cbd7..dfc524f6c4 100644 --- a/configs/pggan/metafile.yml +++ b/configs/pggan/metafile.yml @@ -7,7 +7,7 @@ Collections: - https://arxiv.org/abs/1710.10196 README: configs/pggan/README.md Models: -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/pggan/pggan_8xb4-12Mimgs_celeba-cropped-128x128.py +- Config: configs/pggan/pggan_8xb4-12Mimgs_celeba-cropped-128x128.py In Collection: PGGAN Metadata: Training Data: CELEBA @@ -18,7 +18,7 @@ Models: MS-SSIM: 0.3023 Task: Unconditional GANs Weights: https://download.openmmlab.com/mmgen/pggan/pggan_celeba-cropped_128_g8_20210408_181931-85a2e72c.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/pggan/pggan_8xb4-12Mimgs_lsun-bedroom-128x128.py +- Config: configs/pggan/pggan_8xb4-12Mimgs_lsun-bedroom-128x128.py In Collection: PGGAN Metadata: Training Data: Others @@ -29,7 +29,7 @@ Models: MS-SSIM: 0.0602 Task: Unconditional GANs Weights: https://download.openmmlab.com/mmgen/pggan/pggan_lsun-bedroom_128x128_g8_20210408_182033-5e59f45d.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/pggan/pggan_8xb4-12Mimg_celeba-hq-1024x1024.py +- Config: configs/pggan/pggan_8xb4-12Mimg_celeba-hq-1024x1024.py In Collection: PGGAN Metadata: Training Data: CELEBA diff --git a/configs/pix2pix/metafile.yml b/configs/pix2pix/metafile.yml index 79b582ec55..aa96448b7c 100644 --- a/configs/pix2pix/metafile.yml +++ b/configs/pix2pix/metafile.yml @@ -7,7 +7,7 @@ Collections: - https://openaccess.thecvf.com/content_cvpr_2017/html/Isola_Image-To-Image_Translation_With_CVPR_2017_paper.html README: configs/pix2pix/README.md Models: -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-80kiters_facades.py +- Config: configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-80kiters_facades.py In Collection: Pix2Pix Metadata: Training Data: FACADES @@ -19,7 +19,7 @@ Models: IS: 1.62 Task: Image2Image Weights: https://download.openmmlab.com/mmgen/pix2pix/refactor/pix2pix_vanilla_unet_bn_1x1_80k_facades_20210902_170442-c0958d50.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_aerial2maps.py +- Config: configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_aerial2maps.py In Collection: Pix2Pix Metadata: Training Data: MAPS @@ -31,7 +31,7 @@ Models: IS: 3.137 Task: Image2Image Weights: https://download.openmmlab.com/mmgen/pix2pix/refactor/pix2pix_vanilla_unet_bn_a2b_1x1_219200_maps_convert-bgr_20210902_170729-59a31517.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_maps2aerial.py +- Config: configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_maps2aerial.py In Collection: Pix2Pix Metadata: Training Data: MAPS @@ -43,7 +43,7 @@ Models: IS: 3.31 Task: Image2Image Weights: https://download.openmmlab.com/mmgen/pix2pix/refactor/pix2pix_vanilla_unet_bn_b2a_1x1_219200_maps_convert-bgr_20210902_170814-6d2eac4a.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/pix2pix/pix2pix_vanilla-unet-bn_wo-jitter-flip-1xb4-190kiters_edges2shoes.py +- Config: configs/pix2pix/pix2pix_vanilla-unet-bn_wo-jitter-flip-1xb4-190kiters_edges2shoes.py In Collection: Pix2Pix Metadata: Training Data: EDGES2SHOES diff --git a/configs/sagan/metafile.yml b/configs/sagan/metafile.yml index 1eb6cbe472..ee04fa7f3a 100644 --- a/configs/sagan/metafile.yml +++ b/configs/sagan/metafile.yml @@ -7,7 +7,7 @@ Collections: - https://proceedings.mlr.press/v97/zhang19d.html README: configs/sagan/README.md Models: -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py +- Config: configs/sagan/sagan_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py In Collection: SAGAN Metadata: Training Data: Others @@ -22,7 +22,7 @@ Models: dist_step: 5.0 Task: Conditional GANs Weights: https://download.openmmlab.com/mmgen/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_woReUinplace_is-iter400000_20210730_125743-4008a9ca.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py +- Config: configs/sagan/sagan_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py In Collection: SAGAN Metadata: Training Data: Others @@ -37,7 +37,7 @@ Models: dist_step: 5.0 Task: Conditional GANs Weights: https://download.openmmlab.com/mmgen/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_woReUinplace_fid-iter480000_20210730_125449-d50568a4.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py +- Config: configs/sagan/sagan_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py In Collection: SAGAN Metadata: Training Data: Others @@ -52,7 +52,7 @@ Models: dist_step: 5.0 Task: Conditional GANs Weights: https://download.openmmlab.com/mmgen/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_wReLUinplace_is-iter380000_20210730_124937-c77b4d25.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py +- Config: configs/sagan/sagan_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py In Collection: SAGAN Metadata: Training Data: Others @@ -67,7 +67,7 @@ Models: dist_step: 5.0 Task: Conditional GANs Weights: https://download.openmmlab.com/mmgen/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_wReLUinplace_fid-iter460000_20210730_125155-cbefb354.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_woReLUinplace_Glr1e-4_Dlr4e-4_ndisc1-4xb64_imagenet1k-128x128.py +- Config: configs/sagan/sagan_woReLUinplace_Glr1e-4_Dlr4e-4_ndisc1-4xb64_imagenet1k-128x128.py In Collection: SAGAN Metadata: Training Data: Others @@ -82,7 +82,7 @@ Models: dist_step: 1.0 Task: Conditional GANs Weights: https://download.openmmlab.com/mmgen/sagan/sagan_imagenet1k_128_Glr1e-4_Dlr4e-4_ndisc1_b32x4_woReLUinplace_is-iter980000_20210730_163140-cfbebfc6.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_woReLUinplace_Glr1e-4_Dlr4e-4_ndisc1-4xb64_imagenet1k-128x128.py +- Config: configs/sagan/sagan_woReLUinplace_Glr1e-4_Dlr4e-4_ndisc1-4xb64_imagenet1k-128x128.py In Collection: SAGAN Metadata: Training Data: Others @@ -97,7 +97,7 @@ Models: dist_step: 1.0 Task: Conditional GANs Weights: https://download.openmmlab.com/mmgen/sagan/sagan_imagenet1k_128_Glr1e-4_Dlr4e-4_ndisc1_b32x4_woReLUinplace_fid-iter950000_20210730_163431-d7916963.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_woReLUinplace-Glr1e-4_Dlr4e-4_noaug-ndisc1-8xb32-bigGAN-sch_imagenet1k-128x128.py +- Config: configs/sagan/sagan_woReLUinplace-Glr1e-4_Dlr4e-4_noaug-ndisc1-8xb32-bigGAN-sch_imagenet1k-128x128.py In Collection: SAGAN Metadata: Training Data: Others @@ -112,7 +112,7 @@ Models: dist_step: 1.0 Task: Conditional GANs Weights: https://download.openmmlab.com/mmgen/sagan/sagan_128_woReLUinplace_noaug_bigGAN_imagenet1k_b32x8_Glr1e-4_Dlr-4e-4_ndisc1_20210818_210232-3f5686af.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_woReLUinplace-Glr1e-4_Dlr4e-4_noaug-ndisc1-8xb32-bigGAN-sch_imagenet1k-128x128.py +- Config: configs/sagan/sagan_woReLUinplace-Glr1e-4_Dlr4e-4_noaug-ndisc1-8xb32-bigGAN-sch_imagenet1k-128x128.py In Collection: SAGAN Metadata: Training Data: Others @@ -127,7 +127,7 @@ Models: dist_step: 1.0 Task: Conditional GANs Weights: https://download.openmmlab.com/mmgen/sagan/sagan_128_woReLUinplace_noaug_bigGAN_imagenet1k_b32x8_Glr1e-4_Dlr-4e-4_ndisc1_20210818_210232-3f5686af.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_cvt-studioGAN_cifar10-32x32.py +- Config: configs/sagan/sagan_cvt-studioGAN_cifar10-32x32.py In Collection: SAGAN Metadata: Training Data: Others @@ -143,7 +143,7 @@ Models: n_disc: 5.0 Task: Conditional GANs Weights: https://download.openmmlab.com/mmgen/sagan/sagan_32_cifar10_convert-studio-rgb_20210730_153321-080da7e2.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_128_cvt_studioGAN.py +- Config: configs/sagan/sagan_128_cvt_studioGAN.py In Collection: SAGAN Metadata: Training Data: Others diff --git a/configs/singan/metafile.yml b/configs/singan/metafile.yml index 1f83fe0814..20b67a3893 100644 --- a/configs/singan/metafile.yml +++ b/configs/singan/metafile.yml @@ -7,7 +7,7 @@ Collections: - https://openaccess.thecvf.com/content_ICCV_2019/html/Shaham_SinGAN_Learning_a_Generative_Model_From_a_Single_Natural_Image_ICCV_2019_paper.html README: configs/singan/README.md Models: -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/singan/singan_balloons.py +- Config: configs/singan/singan_balloons.py In Collection: SinGAN Metadata: Training Data: Others @@ -18,7 +18,7 @@ Models: Num Scales: 8.0 Task: Internal Learning Weights: https://download.openmmlab.com/mmgen/singan/singan_balloons_20210406_191047-8fcd94cf.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/singan/singan_fish.py +- Config: configs/singan/singan_fish.py In Collection: SinGAN Metadata: Training Data: Others @@ -29,7 +29,7 @@ Models: Num Scales: 10.0 Task: Internal Learning Weights: https://download.openmmlab.com/mmgen/singan/singan_fis_20210406_201006-860d91b6.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/singan/singan_bohemian.py +- Config: configs/singan/singan_bohemian.py In Collection: SinGAN Metadata: Training Data: Others diff --git a/configs/sngan_proj/metafile.yml b/configs/sngan_proj/metafile.yml index d772bd7807..b47f0bf097 100644 --- a/configs/sngan_proj/metafile.yml +++ b/configs/sngan_proj/metafile.yml @@ -7,7 +7,7 @@ Collections: - https://openreview.net/forum?id=B1QRgziT- README: configs/sngan_proj/README.md Models: -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py +- Config: configs/sngan_proj/sngan-proj_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py In Collection: SNGAN Metadata: Training Data: Others @@ -22,7 +22,7 @@ Models: disc_step: 5.0 Task: Conditional GANs Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_woReLUinplace_is-iter400000_20210709_163823-902ce1ae.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py +- Config: configs/sngan_proj/sngan-proj_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py In Collection: SNGAN Metadata: Training Data: Others @@ -37,7 +37,7 @@ Models: disc_step: 5.0 Task: Conditional GANs Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_woReLUinplace_fid-iter490000_20210709_163329-ba0862a0.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py +- Config: configs/sngan_proj/sngan-proj_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py In Collection: SNGAN Metadata: Training Data: Others @@ -52,7 +52,7 @@ Models: disc_step: 5.0 Task: Conditional GANs Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_wReLUinplace_is-iter490000_20210709_202230-cd863c74.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py +- Config: configs/sngan_proj/sngan-proj_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py In Collection: SNGAN Metadata: Training Data: Others @@ -67,7 +67,7 @@ Models: disc_step: 5.0 Task: Conditional GANs Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_cifar10_32_lr-2e-4-b64x1_wReLUinplace_fid-iter490000_20210709_203038-191b2648.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj_woReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py +- Config: configs/sngan_proj/sngan-proj_woReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py In Collection: SNGAN Metadata: Training Data: Others @@ -82,7 +82,7 @@ Models: disc_step: 5.0 Task: Conditional GANs Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_woReLUinplace_is-iter952000_20210730_132027-9c884a21.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj_woReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py +- Config: configs/sngan_proj/sngan-proj_woReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py In Collection: SNGAN Metadata: Training Data: Others @@ -97,7 +97,7 @@ Models: disc_step: 5.0 Task: Conditional GANs Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_woReLUinplace_fid-iter988000_20210730_131424-061bf803.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj_wReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py +- Config: configs/sngan_proj/sngan-proj_wReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py In Collection: SNGAN Metadata: Training Data: Others @@ -112,7 +112,7 @@ Models: disc_step: 5.0 Task: Conditional GANs Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_wReLUinplace_is-iter944000_20210730_132714-ca0ccd07.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj_wReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py +- Config: configs/sngan_proj/sngan-proj_wReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py In Collection: SNGAN Metadata: Training Data: Others @@ -127,7 +127,7 @@ Models: disc_step: 5.0 Task: Conditional GANs Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_wReLUinplace_fid-iter988000_20210730_132401-9a682411.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj-cvt-studioGAN_cifar10-32x32.py +- Config: configs/sngan_proj/sngan-proj-cvt-studioGAN_cifar10-32x32.py In Collection: SNGAN Metadata: Training Data: Others @@ -143,7 +143,7 @@ Models: disc_step: 5.0 Task: Conditional GANs Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_cifar10_convert-studio-rgb_20210709_111346-2979202d.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj-cvt-studioGAN_imagenet1k-128x128.py +- Config: configs/sngan_proj/sngan-proj-cvt-studioGAN_imagenet1k-128x128.py In Collection: SNGAN Metadata: Training Data: Others diff --git a/configs/styleganv1/metafile.yml b/configs/styleganv1/metafile.yml index d1a62f0f92..ed2d62c759 100644 --- a/configs/styleganv1/metafile.yml +++ b/configs/styleganv1/metafile.yml @@ -7,7 +7,7 @@ Collections: - https://openaccess.thecvf.com/content_CVPR_2019/html/Karras_A_Style-Based_Generator_Architecture_for_Generative_Adversarial_Networks_CVPR_2019_paper.html README: configs/styleganv1/README.md Models: -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv1/styleganv1_ffhq-256x256_8xb4-25Mimgs.py +- Config: configs/styleganv1/styleganv1_ffhq-256x256_8xb4-25Mimgs.py In Collection: StyleGANv1 Metadata: Training Data: FFHQ @@ -21,7 +21,7 @@ Models: SSIM: 27.05 Task: Unconditional GANs Weights: https://download.openmmlab.com/mmgen/styleganv1/styleganv1_ffhq_256_g8_25Mimg_20210407_161748-0094da86.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv1/styleganv1_ffhq-1024x1024_8xb4-25Mimgs.py +- Config: configs/styleganv1/styleganv1_ffhq-1024x1024_8xb4-25Mimgs.py In Collection: StyleGANv1 Metadata: Training Data: FFHQ diff --git a/configs/styleganv3/metafile.yml b/configs/styleganv3/metafile.yml index 9389454d6a..e2a27ca177 100644 --- a/configs/styleganv3/metafile.yml +++ b/configs/styleganv3/metafile.yml @@ -7,7 +7,7 @@ Collections: - https://nvlabs-fi-cdn.nvidia.com/stylegan3/stylegan3-paper.pdf README: configs/styleganv3/README.md Models: -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv3/stylegan3-t_gamma32.8_8xb4-fp16-noaug_ffhq-1024x1024.py +- Config: configs/styleganv3/stylegan3-t_gamma32.8_8xb4-fp16-noaug_ffhq-1024x1024.py In Collection: StyleGANv3 Metadata: Training Data: FFHQ @@ -18,7 +18,7 @@ Models: Iter: 490000.0 Task: Unconditional GANs Weights: https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_noaug_fp16_gamma32.8_ffhq_1024_b4x8_best_fid_iter_490000_20220401_120733-4ff83434.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv3/stylegan3-t_ada-gamma6.6_8xb4-fp16_metfaces-1024x1024.py +- Config: configs/styleganv3/stylegan3-t_ada-gamma6.6_8xb4-fp16_metfaces-1024x1024.py In Collection: StyleGANv3 Metadata: Training Data: Others @@ -30,7 +30,7 @@ Models: Iter: 130000.0 Task: Unconditional GANs Weights: https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_ada_fp16_gamma6.6_metfaces_1024_b4x8_best_fid_iter_130000_20220401_115101-f2ef498e.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv3/stylegan3-t_gamma2.0_8xb4-fp16-noaug_ffhq-256x256.py +- Config: configs/styleganv3/stylegan3-t_gamma2.0_8xb4-fp16-noaug_ffhq-256x256.py In Collection: StyleGANv3 Metadata: Training Data: FFHQ @@ -52,7 +52,7 @@ Models: Metrics: {} Task: Unconditional GANs Weights: '' -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv3/stylegan3-t_cvt-official-rgb_8xb4_ffhqu-256x256.py +- Config: configs/styleganv3/stylegan3-t_cvt-official-rgb_8xb4_ffhqu-256x256.py In Collection: StyleGANv3 Metadata: Training Data: FFHQ @@ -65,7 +65,7 @@ Models: FID50k: 4.62 Task: Unconditional GANs Weights: https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_ffhqu_256_b4x8_cvt_official_rgb_20220329_235046-153df4c8.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv3/stylegan3-t_cvt-official-rgb_8xb4_afhqv2-512x512.py +- Config: configs/styleganv3/stylegan3-t_cvt-official-rgb_8xb4_afhqv2-512x512.py In Collection: StyleGANv3 Metadata: Training Data: Others @@ -78,7 +78,7 @@ Models: FID50k: 4.04 Task: Unconditional GANs Weights: https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_afhqv2_512_b4x8_cvt_official_rgb_20220329_235017-ee6b037a.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv3/stylegan3-t_cvt-official-rgb_8xb4_ffhq-1024x1024.py +- Config: configs/styleganv3/stylegan3-t_cvt-official-rgb_8xb4_ffhq-1024x1024.py In Collection: StyleGANv3 Metadata: Training Data: FFHQ @@ -91,7 +91,7 @@ Models: FID50k: 2.79 Task: Unconditional GANs Weights: https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_ffhq_1024_b4x8_cvt_official_rgb_20220329_235113-db6c6580.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv3/stylegan3-r_cvt-official-rgb_8xb4_ffhqu-256x256.py +- Config: configs/styleganv3/stylegan3-r_cvt-official-rgb_8xb4_ffhqu-256x256.py In Collection: StyleGANv3 Metadata: Training Data: FFHQ @@ -104,7 +104,7 @@ Models: FID50k: 4.5 Task: Unconditional GANs Weights: https://download.openmmlab.com/mmgen/stylegan3/stylegan3_r_ffhqu_256_b4x8_cvt_official_rgb_20220329_234909-4521d963.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv3/stylegan3-r_cvt-official-rgb_8xb4x8_afhqv2-512x512.py +- Config: configs/styleganv3/stylegan3-r_cvt-official-rgb_8xb4x8_afhqv2-512x512.py In Collection: StyleGANv3 Metadata: Training Data: Others @@ -117,7 +117,7 @@ Models: FID50k: 4.4 Task: Unconditional GANs Weights: https://download.openmmlab.com/mmgen/stylegan3/stylegan3_r_afhqv2_512_b4x8_cvt_official_rgb_20220329_234829-f2eaca72.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv3/stylegan3-r_cvt-official-rgb_8xb4_ffhq-1024x1024.py +- Config: configs/styleganv3/stylegan3-r_cvt-official-rgb_8xb4_ffhq-1024x1024.py In Collection: StyleGANv3 Metadata: Training Data: FFHQ diff --git a/configs/wgan-gp/metafile.yml b/configs/wgan-gp/metafile.yml index 0b088dc713..06bdc773f0 100644 --- a/configs/wgan-gp/metafile.yml +++ b/configs/wgan-gp/metafile.yml @@ -7,7 +7,7 @@ Collections: - https://arxiv.org/abs/1704.00028 README: configs/wgan-gp/README.md Models: -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/wgan-gp/wgangp_GN_1xb64-160kiters_celeba-cropped-128x128.py +- Config: configs/wgan-gp/wgangp_GN_1xb64-160kiters_celeba-cropped-128x128.py In Collection: WGAN-GP Metadata: Training Data: CELEBA @@ -18,7 +18,7 @@ Models: MS-SSIM: 0.2601 Task: Unconditional GANs Weights: https://download.openmmlab.com/mmgen/wgangp/wgangp_GN_celeba-cropped_128_b64x1_160k_20210408_170611-f8a99336.pth -- Config: https://github.com/open-mmlab/mmediting/tree/master/configs/wgan-gp/wgangp_GN-GP-50_1xb64-160kiters_lsun-bedroom-128x128.py +- Config: configs/wgan-gp/wgangp_GN-GP-50_1xb64-160kiters_lsun-bedroom-128x128.py In Collection: WGAN-GP Metadata: Training Data: Others From b116c4688a9ee5a33d245703893c8aabab75696f Mon Sep 17 00:00:00 2001 From: whu-lee <69310975+whu-lee@users.noreply.github.com> Date: Sat, 24 Dec 2022 16:46:25 +0800 Subject: [PATCH 30/44] [Doc] translate documentation, overview (#1539) * translate overview * Update docs/zh_cn/get_started/overview.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/get_started/overview.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/get_started/overview.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/get_started/overview.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/get_started/overview.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/get_started/overview.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/get_started/overview.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/get_started/overview.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/get_started/overview.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/get_started/overview.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/get_started/overview.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/get_started/overview.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/get_started/overview.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/get_started/overview.md Co-authored-by: Yanhong Zeng * fix lint Co-authored-by: Yanhong Zeng --- docs/zh_cn/get_started/overview.md | 102 +++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/docs/zh_cn/get_started/overview.md b/docs/zh_cn/get_started/overview.md index e525587c02..25ae662d32 100644 --- a/docs/zh_cn/get_started/overview.md +++ b/docs/zh_cn/get_started/overview.md @@ -1 +1,103 @@ # 概述(待更新) + +# 概述 + +欢迎来到 MMEditing! 在本节中,您将了解 + +- [MMEditing是什么?](#mmediting-是什么) +- [为什么要使用 MMEditing?](#为什么要使用-mmediting) +- [新手入门](#新手入门) +- [基础教程](#基础教程) +- [进阶教程](#进阶教程) + +## MMEditing 是什么? + +MMEditing 是一个供专业人工智能研究人员和机器学习工程师去处理、编辑和合成图像与视频的开源工具箱。 + +MMEditing 允许研究人员和工程师使用最先进的预训练模型,并且可以轻松训练和开发新的定制模型。 + +MMEditing 支持各种基础生成模型,包括: + +- 无条件生成对抗网络 (GANs) +- 条件生成对抗网络 (GANs) +- 内部学习 +- 扩散模型 +- 还有许多其他生成模型即将推出! + +MMEditing 支持各种应用程序,包括: + +- 图像超分辨率 +- 视频超分辨率 +- 视频帧插值 +- 图像修复 +- 图像抠图 +- 图像到图像的翻译 +- 还有许多其他应用程序即将推出! + +
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+ StyleGAN3 Images +
+ +
+ +
+ BigGAN Images +
+ +
+ +## 为什么要使用 MMEditing? + +- **最先进的性能** + + MMEditing 提供最先进的生成模型来处理、编辑和合成图像和视频。 + +- **强大而流行的应用** + + MMEditing 支持流行的*修复*、*抠图*、*超分辨率* 和*生成* 等应用。 具体来说,MMEditing 支持 GAN 插值、GAN 投影、GAN 编辑和许多其他流行的 GAN 的应用。 是时候玩转你的 GAN 了! + +- **全新模块化设计,灵活组合:** + + 我们将 MMEditing 分解为不同的模块,通过组合不同的模块可以轻松构建定制的模型。 具体来说,提出了一种新的复杂损失模块设计,用于自定义模块之间的链接,可以实现不同模块之间的灵活组合。([损失函数](../howto/losses.md)) + +- **高效的分布式训练:** + + 在[MMSeparateDistributedDataParallel](https://github.com/open-mmlab/mmengine/blob/main/mmengine/model/wrappers/seperate_distributed.py)的支持下,可以轻松实现动态架构的分布式训练。 + +## 新手入门 + +安装说明见[安装](install.md)。 + +## 基础教程 + +对于初学者,我们建议从 [基础教程](../user_guides/config.md) 学习 MMEditing 的基本用法。 + +## 进阶教程 + +对于熟悉 MMEditing 的用户,可能想了解 MMEditing 的进阶实用,以及如何扩展算法库,如何使用多个算法库框架等高级用法,请参考[进阶教程](../advanced_guides/evaluator.md)。 + +## 开发指南 + +想要使用 MMEditing 进行深度开发的用户,可以参考[开发指南](../howto/models.md)。 From 1ec7db3a7b4c45891f6f73ac801cce5c722e0c63 Mon Sep 17 00:00:00 2001 From: willaty Date: Sat, 24 Dec 2022 16:58:51 +0800 Subject: [PATCH 31/44] [Docs] translate documentation for loss function (#1541) * translate documentation for loss function * Update docs/zh_cn/howto/losses.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/howto/losses.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/howto/losses.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/howto/losses.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/howto/losses.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/howto/losses.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/howto/losses.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/howto/losses.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/howto/losses.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/howto/losses.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/howto/losses.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/howto/losses.md Co-authored-by: Yanhong Zeng * Update docs/zh_cn/howto/losses.md Co-authored-by: Yanhong Zeng * fix lint Co-authored-by: Yanhong Zeng --- docs/zh_cn/howto/losses.md | 526 ++++++++++++++++++++++++++++++++++++- 1 file changed, 525 insertions(+), 1 deletion(-) diff --git a/docs/zh_cn/howto/losses.md b/docs/zh_cn/howto/losses.md index 260855c734..bf04fde426 100644 --- a/docs/zh_cn/howto/losses.md +++ b/docs/zh_cn/howto/losses.md @@ -1 +1,525 @@ -# 自定义损失函数(待更新) +# 如何设计自己的损失函数 + +`losses` 在 `MMEditing` 中注册为 `LOSSES`。 +在 MMEditing 中设计自己的损失函数,步骤和在 MMEditing 中自定义任何其他模型类似。 +本节主要具体介绍了如何在 MMEditing 中实现自定义的损失函数。 +本教程建议您在实现自定义的损失函数时,应该遵循本教程相同的设计,这样在我们的框架中使用您新定义的损失函数,就不需要额外的工作。 + +本指南包括: + +- [设计你自己的损失函数](#如何设计自己的损失函数) + - [支持损失函数介绍](#支持的损失函数介绍) + - [设计一个新的损失函数](#设计一个新的损失函数) + - [MSELoss 的一个例子](#MSELoss-的一个例子) + - [DiscShiftLoss 的一个例子](#DiscShiftLoss-的一个例子) + - [GANWithCustomizedLoss 的一个例子](#GANWithCustomizedLoss-的一个例子) + - [可用损失函数](#可用损失函数) + - [常规损失函数](#常规损失函数) + - [损失函数组件](#损失函数组件) + +## 支持的损失函数介绍 + +为了方便使用,您可以直接使用我们为具体算法设置的默认损失计算过程,如lsgan、biggan、styleganv2等。 +以`stylegan2`为例,我们使用R1梯度惩罚和生成器路径长度正则化作为可配置损失,用户可以调整相关参数,如 `r1_loss_weight` 和 `g_reg_weight`。 + +```python +# stylegan2_base.py +loss_config =dict( + r1_loss_weight=10。 / 2. * d_reg_interval, + r1_interval=d_reg_interval, + norm_mode='HWC', + g_reg_interval=g_reg_interval, + g_reg_weight=2。 * g_reg_interval, + pl_batch_shrink=2) + +model=dict( + type='StyleGAN2', + xxx, + loss_config=loss_config) +``` + +## 设计一个新的损失函数 + +### MSELoss 的一个例子 + +一般来说,要实现一个损失模块,我们会编写一个函数实现,然后用类实现包装它。 以MSELoss为例: + +```python +@masked_loss +def mse_loss(pred,target): + return F.mse_loss(pred,target,reduction='none') + +@LOSSES.register_module() +Class MSELoss(nn.Module): + + def __init__(self, loss_weight=1.0, reduction='mean', sample_wise=False): + # 代码可以在``mmedit/models/losses/pixelwise_loss.py``中找到 + + def forward(self, pred, target, weight=None, **kwargs): + # 代码可以在``mmedit/models/losses/pixelwise_loss.py``中找到 +``` + +根据这个损失函数的定义,我们现在可以简单地通过在配置文件中定义它来使用: + +```python +pixel_loss=dict(type='MSELoss', loss_weight=1.0, reduction='mean') +``` + +请注意,上面的`pixel_loss`必须在模型中定义。 详情请参考[自定义模型](./models.md)。 与自定义模型类似,为了使用您自己实现的损失函数,您需要在编写后在`mmedit/models/losses/__init__.py`中导入该损失函数。 + +### DiscShiftLoss 的一个例子 + +一般来说,要实现一个损失模块,我们会编写一个函数实现,然后用类实现包装它。 +但是,在 MMEditing 中,我们提供了另一个统一的接口 data_info 供用户定义输入参数和数据项之间的映射。 + +```python +@weighted_loss +def disc_shift_loss(pred): + return pred**2 + +@MODULES.register_module() +Class DiscShiftLoss(nn.Module): + + def __init__(self, loss_weight=1.0, data_info=None): + super(DiscShiftLoss,self).__init__() + # 代码可以在``mmgen/models/losses/disc_auxiliary_loss.py``中找到 + + def forward(self, *args, **kwargs): + # 代码可以在``mmgen/models/losses/disc_auxiliary_loss.py``中找到 +``` + +这种损失模块设计的目标是允许在生成模型(`MODELS`)中自动使用它,而无需其他复杂代码来定义数据和关键字参数之间的映射。 因此,与 OpenMMLab 中的其他框架不同,我们的损失模块包含一个特殊的关键字 data_info,它是一个定义输入参数与生成模型数据之间映射的字典。 以`DiscShiftLoss`为例,用户在编写配置文件时,可能会用到这个loss,如下: + +```python +dict(type='DiscShiftLoss', + loss_weight=0.001 * 0.5, + data_info=dict(pred='disc_pred_real')) +``` + +`data_info` 中的信息告诉模块使用 `disc_pred_real` 数据作为 `pred` 参数的输入张量。 一旦 `data_info` 不为 `None`,我们的损失模块将自动构建计算图。 + +```python +@MODULES.register_module() +class DiscShiftLoss(nn.Module): + + def __init__(self, loss_weight=1.0, data_info=None): + super(DiscShiftLoss, self).__init__() + self.loss_weight = loss_weight + self.data_info = data_info + + def forward(self, *args, **kwargs): + # use data_info to build computational path + if self.data_info is not None: + # parse the args and kwargs + if len(args) == 1: + assert isinstance(args[0], dict), ( + 'You should offer a dictionary containing network outputs ' + 'for building up computational graph of this loss module.') + outputs_dict = args[0] + elif 'outputs_dict' in kwargs: + assert len(args) == 0, ( + 'If the outputs dict is given in keyworded arguments, no' + ' further non-keyworded arguments should be offered.') + outputs_dict = kwargs.pop('outputs_dict') + else: + raise NotImplementedError( + 'Cannot parsing your arguments passed to this loss module.' + ' Please check the usage of this module') + # link the outputs with loss input args according to self.data_info + loss_input_dict = { + k: outputs_dict[v] + for k, v in self.data_info.items() + } + kwargs.update(loss_input_dict) + kwargs.update(dict(weight=self.loss_weight)) + return disc_shift_loss(**kwargs) + else: + # if you have not define how to build computational graph, this + # module will just directly return the loss as usual. + return disc_shift_loss(*args, weight=self.loss_weight, **kwargs) + + @staticmethod + def loss_name(): + return 'loss_disc_shift' + +``` + +如这部分代码所示,一旦用户设置了“data_info”,损失模块将收到一个包含所有必要数据和模块的字典,该字典由训练过程中的“MODELS”提供。 如果此字典作为非关键字参数给出,则应将其作为第一个参数提供。 如果您使用关键字参数,请将其命名为 `outputs_dict`。 + +### GANWithCustomizedLoss 的一个例子 + +为了构建计算图,生成模型必须提供包含各种数据的字典。 仔细观察任何生成模型,你会发现我们将各种特征和模块收集到字典中。 我们在这里提供了一个自定义的`GANWithCustomizedLoss`来展示这个过程。 + +```python +class GANWithCustomizedLoss(BaseModel): + + def __init__(self, gan_loss, disc_auxiliary_loss, gen_auxiliary_loss, + *args, **kwargs): + # ... + if gan_loss is not None: + self.gan_loss = MODULES.build(gan_loss) + else: + self.gan_loss = None + + if disc_auxiliary_loss: + self.disc_auxiliary_losses = MODULES.build(disc_auxiliary_loss) + if not isinstance(self.disc_auxiliary_losses, nn.ModuleList): + self.disc_auxiliary_losses = nn.ModuleList( + [self.disc_auxiliary_losses]) + else: + self.disc_auxiliary_loss = None + + if gen_auxiliary_loss: + self.gen_auxiliary_losses = MODULES.build(gen_auxiliary_loss) + if not isinstance(self.gen_auxiliary_losses, nn.ModuleList): + self.gen_auxiliary_losses = nn.ModuleList( + [self.gen_auxiliary_losses]) + else: + self.gen_auxiliary_losses = None + + def train_step(self, data: dict, + optim_wrapper: OptimWrapperDict) -> Dict[str, Tensor]: + # ... + + # get data dict to compute losses for disc + data_dict_ = dict( + iteration=curr_iter, + gen=self.generator, + disc=self.discriminator, + disc_pred_fake=disc_pred_fake, + disc_pred_real=disc_pred_real, + fake_imgs=fake_imgs, + real_imgs=real_imgs) + + loss_disc, log_vars_disc = self._get_disc_loss(data_dict_) + + # ... + + def _get_disc_loss(self, outputs_dict): + # Construct losses dict. If you hope some items to be included in the + # computational graph, you have to add 'loss' in its name. Otherwise, + # items without 'loss' in their name will just be used to print + # information. + losses_dict = {} + # gan loss + losses_dict['loss_disc_fake'] = self.gan_loss( + outputs_dict['disc_pred_fake'], target_is_real=False, is_disc=True) + losses_dict['loss_disc_real'] = self.gan_loss( + outputs_dict['disc_pred_real'], target_is_real=True, is_disc=True) + + # disc auxiliary loss + if self.with_disc_auxiliary_loss: + for loss_module in self.disc_auxiliary_losses: + loss_ = loss_module(outputs_dict) + if loss_ is None: + continue + + # the `loss_name()` function return name as 'loss_xxx' + if loss_module.loss_name() in losses_dict: + losses_dict[loss_module.loss_name( + )] = losses_dict[loss_module.loss_name()] + loss_ + else: + losses_dict[loss_module.loss_name()] = loss_ + loss, log_var = self.parse_losses(losses_dict) + + return loss, log_var + +``` + +在这里,`_get_disc_loss` 将帮助自动组合各种损失函数。 + +因此,只要用户设计相同规则的损失模块,就可以在生成模型的训练中插入任何一种损失,无需对模型代码进行其他修改。 您只需要在配置文件中定义 `data_info` 即可。 + +## 可用损失函数 + +我们在配置中列出了可用的损失示例,如下所示。 + +### 常规损失函数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodclassExample
vanilla gan lossmmedit.models.GANLoss + +```python +# dic gan +loss_gan=dict( + type='GANLoss', + gan_type='vanilla', + loss_weight=0.001, +) + +``` + +
lsgan lossmmedit.models.GANLoss +
wgan lossmmedit.models.GANLoss + +```python +# deepfillv1 +loss_gan=dict( + type='GANLoss', + gan_type='wgan', + loss_weight=0.0001, +) +``` + +
hinge lossmmedit.models.GANLoss + +```python +# deepfillv2 +loss_gan=dict( + type='GANLoss', + gan_type='hinge', + loss_weight=0.1, +) +``` + +
smgan lossmmedit.models.GANLoss + +```python +# aot-gan +loss_gan=dict( + type='GANLoss', + gan_type='smgan', + loss_weight=0.01, +) +``` + +
gradient penaltymmedit.models.GradientPenaltyLoss + +```python +# deepfillv1 +loss_gp=dict(type='GradientPenaltyLoss', loss_weight=10.) +``` + +
discriminator shift lossmmedit.models.DiscShiftLoss + +```python +# deepfillv1 +loss_disc_shift=dict(type='DiscShiftLoss', loss_weight=0.001) + +``` + +
clip lossmmedit.models.CLIPLoss
L1 composition lossmmedit.models.L1CompositionLoss
MSE composition lossmmedit.models.MSECompositionLoss
charbonnier composition lossmmedit.models.CharbonnierCompLoss + +```python +# dim +loss_comp=dict(type='CharbonnierCompLoss', loss_weight=0.5) +``` + +
face id Lossmmedit.models.FaceIdLoss
light cnn feature lossmmedit.models.LightCNNFeatureLoss + +```python +# dic gan +feature_loss=dict( + type='LightCNNFeatureLoss', + pretrained=pretrained_light_cnn, + loss_weight=0.1, + criterion='l1') +``` + +
gradient lossmmedit.models.GradientLoss
l1 Lossmmedit.models.L1Loss + +```python +# dic gan +pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean') +``` + +
mse lossmmedit.models.MSELoss + +```python +# dic gan +align_loss=dict(type='MSELoss', loss_weight=0.1, reduction='mean') +``` + +
charbonnier lossmmedit.models.CharbonnierLoss + +```python +# dim +loss_alpha=dict(type='CharbonnierLoss', loss_weight=0.5) +``` + +
masked total variation lossmmedit.models.MaskedTVLoss + +```python +# partial conv +loss_tv=dict( + type='MaskedTVLoss', + loss_weight=0.1 +) + +``` + +
perceptual lossmmedit.models.PerceptualLoss + +```python +# real_basicvsr +perceptual_loss=dict( + type='PerceptualLoss', + layer_weights={ + '2': 0.1, + '7': 0.1, + '16': 1.0, + '25': 1.0, + '34': 1.0, + }, + vgg_type='vgg19', + perceptual_weight=1.0, + style_weight=0, + norm_img=False) + +``` + +
transferal perceptual lossmmedit.models.TransferalPerceptualLoss + +```python +# ttsr +transferal_perceptual_loss=dict( + type='TransferalPerceptualLoss', + loss_weight=1e-2, + use_attention=False, + criterion='mse') + +``` + +
+ +### 损失函数组件 + +对于“GANWithCustomizedLoss”,我们提供了几个组件来构建自定义损失。 + +| Method | class | +| ------------------------------------ | ------------------------------------------- | +| clip loss component | mmedit.models.CLIPLossComps | +| discriminator shift loss component | mmedit.models. DiscShiftLossComps | +| gradient penalty loss component | mmedit.models. GradientPenaltyLossComps | +| r1 gradient penalty component | mmedit.models. R1GradientPenaltyComps | +| face Id loss component | mmedit.models. FaceIdLossComps | +| gan loss component | mmedit.models. GANLossComps | +| generator path regularizer component | mmedit.models.GeneratorPathRegularizerComps | From e296dd06d8e0c85e8e216c640ddd6fd1cddeea20 Mon Sep 17 00:00:00 2001 From: Sunny <34833233+curiosity654@users.noreply.github.com> Date: Mon, 26 Dec 2022 09:08:51 +0800 Subject: [PATCH 32/44] [Docs] Add docstring and type hint for initialization function of DDPM Scheduler (#1556) update ddpm scheduler comments --- mmedit/models/editors/ddpm/ddpm_scheduler.py | 38 +++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/mmedit/models/editors/ddpm/ddpm_scheduler.py b/mmedit/models/editors/ddpm/ddpm_scheduler.py index d06f2e85bb..4f7a376994 100644 --- a/mmedit/models/editors/ddpm/ddpm_scheduler.py +++ b/mmedit/models/editors/ddpm/ddpm_scheduler.py @@ -1,5 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. -from typing import Union +from typing import Optional, Union import numpy as np import torch @@ -12,11 +12,11 @@ class DDPMScheduler: def __init__(self, - num_train_timesteps=1000, - beta_start=0.0001, - beta_end=0.02, - beta_schedule='linear', - trained_betas=None, + num_train_timesteps: int = 1000, + beta_start: float = 0.0001, + beta_end: float = 0.02, + beta_schedule: str = 'linear', + trained_betas: Optional[Union[np.array, list]] = None, variance_type='fixed_small', clip_sample=True): """```DDPMScheduler``` support the diffusion and reverse process @@ -25,13 +25,25 @@ def __init__(self, The code is heavily influenced by https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddpm.py. # noqa Args: - num_train_timesteps (int, optional): _description_. Defaults to 1000. - beta_start (float, optional): _description_. Defaults to 0.0001. - beta_end (float, optional): _description_. Defaults to 0.02. - beta_schedule (str, optional): _description_. Defaults to 'linear'. - trained_betas (_type_, optional): _description_. Defaults to None. - variance_type (str, optional): _description_. Defaults to 'fixed_small'. - clip_sample (bool, optional): _description_. Defaults to True. + num_train_timesteps (int, optional): The timesteps for training + process. Defaults to 1000. + beta_start (float, optional): The beta value at start. The beta + values will be interpolated from beta_start to beta_end. + Defaults to 0.0001. + beta_end (float, optional): The beta value at the end. The beta + values will be interpolated from beta_start to beta_end. + Defaults to 0.02. + beta_schedule (str, optional): The interpolation schedule for beta + values. Supported choices are 'linear', 'scaled_linear', and + 'squaredcos_cap_v2'. Defaults to 'linear'. + trained_betas (list, np.array, optional): betas directly to the + constructor to bypass `beta_start`, `beta_end` etc. Defaults to None. + variance_type (str, optional): How denoising unet output variance + value. Supported choices are 'fixed_small', 'fixed_small_log', + 'fixed_large', 'fixed_large_log', 'learned', and 'leanred_range'. + Defaults to 'fixed_small'. + clip_sample (bool, optional): Whether clip the value of predicted + original image (x0) to [-1, 1]. Defaults to True. """ self.num_train_timesteps = num_train_timesteps if trained_betas is not None: From c1faa1ee5218708886649631d5d9f874930db39b Mon Sep 17 00:00:00 2001 From: Yanhong Zeng Date: Mon, 26 Dec 2022 09:15:53 +0800 Subject: [PATCH 33/44] [Improvement] Update download link (#1554) * fix ckpt path * fix ckpt_path * rebase dev-1.x * relative path for configs * update link * fix link * - * update model index * fix bug in doc_link_checker * fix bug in doc_link_checker * fix link * fix link * fix link * fix link Co-authored-by: willaty --- .dev_scripts/README.md | 9 +++ .dev_scripts/doc_link_checker.py | 46 +++++++++--- .dev_scripts/download_models.py | 8 +-- .dev_scripts/test_benchmark.py | 8 +-- configs/aot_gan/README.md | 12 ++-- configs/aot_gan/README_zh-CN.md | 12 ++-- configs/aot_gan/metafile.yml | 2 +- configs/basicvsr/README.md | 10 +-- configs/basicvsr/README_zh-CN.md | 6 +- configs/basicvsr_pp/README.md | 20 +++--- configs/basicvsr_pp/README_zh-CN.md | 6 +- configs/biggan/README.md | 14 ++-- configs/biggan/metafile.yml | 14 ++-- configs/cain/README.md | 6 +- configs/cain/README_zh-CN.md | 6 +- configs/cyclegan/README.md | 30 ++++---- configs/cyclegan/metafile.yml | 20 +++--- configs/dcgan/README.md | 10 +-- configs/dcgan/metafile.yml | 6 +- configs/deepfillv1/README.md | 12 ++-- configs/deepfillv1/README_zh-CN.md | 12 ++-- configs/deepfillv2/README.md | 12 ++-- configs/deepfillv2/README_zh-CN.md | 12 ++-- configs/dic/README.md | 8 +-- configs/dic/README_zh-CN.md | 8 +-- configs/dim/README.md | 14 ++-- configs/dim/README_zh-CN.md | 14 ++-- configs/edsr/README.md | 6 +- configs/edsr/README_zh-CN.md | 10 +-- configs/edvr/README.md | 16 ++--- configs/edvr/README_zh-CN.md | 8 +-- configs/eg3d/README.md | 12 ++-- configs/esrgan/README.md | 4 +- configs/esrgan/README_zh-CN.md | 4 +- configs/flavr/README.md | 2 +- configs/flavr/README_zh-CN.md | 2 +- configs/gca/README.md | 20 +++--- configs/gca/README_zh-CN.md | 20 +++--- configs/ggan/README.md | 6 +- configs/ggan/metafile.yml | 6 +- configs/glean/README.md | 14 ++-- configs/glean/README_zh-CN.md | 14 ++-- ...n_in128out1024_4xb2-300k_ffhq-celeba-hq.py | 4 +- configs/glean/glean_x16_2xb8_cat.py | 4 +- configs/glean/glean_x16_2xb8_ffhq.py | 4 +- configs/glean/glean_x8_2xb8_cat.py | 4 +- configs/global_local/README.md | 12 ++-- configs/global_local/README_zh-CN.md | 12 ++-- configs/guided_diffusion/README.md | 8 +-- configs/iconvsr/README.md | 12 ++-- configs/iconvsr/README_zh-CN.md | 6 +- configs/indexnet/README.md | 14 ++-- configs/indexnet/README_zh-CN.md | 14 ++-- configs/inst_colorization/README.md | 8 +-- configs/inst_colorization/README_zh-CN.md | 8 +-- configs/inst_colorization/metafile.yml | 2 +- configs/liif/README.md | 4 +- configs/liif/README_zh-CN.md | 6 +- configs/lsgan/README.md | 8 +-- configs/lsgan/metafile.yml | 8 +-- configs/nafnet/README.md | 8 +-- configs/nafnet/README_zh-CN.md | 8 +-- configs/partial_conv/README.md | 16 ++--- configs/partial_conv/README_zh-CN.md | 16 ++--- configs/pggan/README.md | 10 +-- configs/pggan/metafile.yml | 6 +- configs/pix2pix/README.md | 12 ++-- configs/pix2pix/metafile.yml | 8 +-- configs/positional_encoding_in_gans/README.md | 70 +++++++++---------- .../positional_encoding_in_gans/metafile.yml | 68 +++++++++--------- configs/rdn/README.md | 6 +- configs/rdn/README_zh-CN.md | 10 +-- configs/real_basicvsr/README.md | 4 +- configs/real_basicvsr/README_zh-CN.md | 10 +-- configs/real_esrgan/README.md | 4 +- configs/real_esrgan/README_zh-CN.md | 4 +- configs/restormer/README.md | 48 ++++++------- configs/restormer/README_zh-CN.md | 44 ++++++------ configs/restormer/metafile.yml | 2 +- configs/sagan/README.md | 22 +++--- configs/sagan/metafile.yml | 20 +++--- configs/singan/README.md | 10 +-- configs/singan/metafile.yml | 6 +- configs/sngan_proj/README.md | 22 +++--- configs/sngan_proj/metafile.yml | 20 +++--- configs/srcnn/README.md | 2 +- configs/srcnn/README_zh-CN.md | 6 +- configs/srgan_resnet/README.md | 4 +- configs/srgan_resnet/README_zh-CN.md | 4 +- configs/styleganv1/README.md | 8 +-- configs/styleganv1/metafile.yml | 4 +- configs/styleganv2/README.md | 46 ++++++------ configs/styleganv2/metafile.yml | 32 ++++----- configs/styleganv3/README.md | 34 ++++----- configs/styleganv3/metafile.yml | 18 ++--- ...a-gamma3.3_8xb4-fp16_metfaces-1024x1024.py | 2 +- ...a-gamma6.6_8xb4-fp16_metfaces-1024x1024.py | 2 +- configs/tdan/README.md | 16 ++--- configs/tdan/README_zh-CN.md | 8 +-- configs/tof/README.md | 26 +++---- configs/tof/README_zh-CN.md | 10 +-- configs/ttsr/README.md | 8 +-- configs/ttsr/README_zh-CN.md | 8 +-- configs/wgan-gp/README.md | 4 +- configs/wgan-gp/metafile.yml | 4 +- demo/mmediting_inference_tutorial.ipynb | 14 ++-- docs/en/get_started/quick_run.md | 4 +- docs/en/howto/models.md | 2 +- docs/en/user_guides/dataset_prepare.md | 2 +- docs/en/user_guides/inference.md | 8 +-- docs/zh_cn/community/contributing.md | 8 +-- .../models/editors/glean/glean_styleganv2.py | 10 +-- .../stylegan2/stylegan2_discriminator.py | 10 +-- .../editors/stylegan2/stylegan2_generator.py | 10 +-- 114 files changed, 706 insertions(+), 681 deletions(-) diff --git a/.dev_scripts/README.md b/.dev_scripts/README.md index d599a1633a..44d1591e56 100644 --- a/.dev_scripts/README.md +++ b/.dev_scripts/README.md @@ -12,6 +12,7 @@ - [7. Train failed or canceled jobs](#7-train-failed-or-canceled-jobs) - [8. Deterministic training](#8-deterministic-training) - [9. Automatically check links](#9-automatically-check-links) +- [10. Calculate flops](#10-calculate-flops) ## 1. Check UT @@ -235,3 +236,11 @@ python .dev_scripts/doc_link_checker.py --target README.md You can specify the `--target` by a file or a directory. **Notes:** DO NOT use it in CI, because requiring too many http requirements by CI will cause 503 and CI will propabaly fail. + +10. Calculate flops + +To summarize the flops of different models, you can run the following commands: + +```bash +python .dev_scripts/benchmark_valid_flop.py --flops --flops-str +``` diff --git a/.dev_scripts/doc_link_checker.py b/.dev_scripts/doc_link_checker.py index f9fdd4e42e..51a452b4bb 100644 --- a/.dev_scripts/doc_link_checker.py +++ b/.dev_scripts/doc_link_checker.py @@ -1,20 +1,24 @@ # Copyright (c) MegFlow. All rights reserved. +# Copyright (c) OpenMMLab. All rights reserved. # /bin/python3 import argparse import os import re +import requests +from tqdm import tqdm + def make_parser(): parser = argparse.ArgumentParser('Doc link checker') - parser.add_argument( - '--http', default=False, type=bool, help='check http or not ') parser.add_argument( '--target', default='./docs', type=str, help='the directory or file to check') + parser.add_argument( + '--ignore', type=str, nargs='+', default=[], help='input image size') return parser @@ -22,7 +26,6 @@ def make_parser(): def analyze_doc(home, path): - print('analyze {}'.format(path)) problem_list = [] code_block = 0 with open(path) as f: @@ -51,11 +54,31 @@ def analyze_doc(home, path): end = item.find(')') ref = item[start + 1:end] - if ref.startswith('http') or ref.startswith('#'): + if ref.startswith('http'): + if ref.startswith( + 'https://download.openmmlab.com/' + ) or ref.startswith('http://download.openmmlab.com/'): + resp = requests.head(ref) + if resp.status_code == 200: + continue + else: + problem_list.append(ref) + else: + continue + + if ref.startswith('#'): continue + + if ref == '<>': + continue + if '.md#' in ref: - ref = ref[ref.find('#'):] - fullpath = os.path.join(home, ref) + ref = ref[:ref.find('#')] + if ref.startswith('/'): + fullpath = os.path.join( + os.path.dirname(__file__), '../', ref[1:]) + else: + fullpath = os.path.join(home, ref) if not os.path.exists(fullpath): problem_list.append(ref) else: @@ -68,11 +91,16 @@ def analyze_doc(home, path): raise Exception('found link error') -def traverse(target): +def traverse(args): + target = args.target if os.path.isfile(target): analyze_doc(os.path.dirname(target), target) return - for home, dirs, files in os.walk(target): + target_files = list(os.walk(target)) + target_files.sort() + for home, dirs, files in tqdm(target_files): + if home in args.ignore: + continue for filename in files: if filename.endswith('.md'): path = os.path.join(home, filename) @@ -82,4 +110,4 @@ def traverse(target): if __name__ == '__main__': args = make_parser().parse_args() - traverse(args.target) + traverse(args) diff --git a/.dev_scripts/download_models.py b/.dev_scripts/download_models.py index f3349aaf15..1fff57835e 100644 --- a/.dev_scripts/download_models.py +++ b/.dev_scripts/download_models.py @@ -74,9 +74,7 @@ def download(args): model_index.build_models_with_collections() models = OrderedDict({model.name: model for model in model_index.models}) - http_prefix_long = 'https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmediting/' # noqa http_prefix_short = 'https://download.openmmlab.com/mmediting/' - http_prefix_gen = 'https://download.openmmlab.com/mmgen/' # load model list if args.model_list: @@ -109,12 +107,8 @@ def download(args): model_weight_url = model_info.weights - if model_weight_url.startswith(http_prefix_long): - model_name = model_weight_url[len(http_prefix_long):] - elif model_weight_url.startswith(http_prefix_short): + if model_weight_url.startswith(http_prefix_short): model_name = model_weight_url[len(http_prefix_short):] - elif model_weight_url.startswith(http_prefix_gen): - model_name = model_weight_url[len(http_prefix_gen):] elif model_weight_url == '': print(f'{model_info.Name} weight is missing') return None diff --git a/.dev_scripts/test_benchmark.py b/.dev_scripts/test_benchmark.py index ae36afb13b..ed66aa7491 100644 --- a/.dev_scripts/test_benchmark.py +++ b/.dev_scripts/test_benchmark.py @@ -99,16 +99,10 @@ def create_test_job_batch(commands, model_info, args, port, script_name): assert config.exists(), f'{fname}: {config} not found.' http_prefix_short = 'https://download.openmmlab.com/mmediting/' - http_prefix_long = 'https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmediting/' # noqa - http_prefix_gen = 'https://download.openmmlab.com/mmgen/' model_weight_url = model_info.weights - if model_weight_url.startswith(http_prefix_long): - model_name = model_weight_url[len(http_prefix_long):] - elif model_weight_url.startswith(http_prefix_short): + if model_weight_url.startswith(http_prefix_short): model_name = model_weight_url[len(http_prefix_short):] - elif model_weight_url.startswith(http_prefix_gen): - model_name = model_weight_url[len(http_prefix_gen):] elif model_weight_url == '': print(f'{fname} weight is missing') return None diff --git a/configs/aot_gan/README.md b/configs/aot_gan/README.md index d5e7eb0ccb..8c376fc7f5 100644 --- a/configs/aot_gan/README.md +++ b/configs/aot_gan/README.md @@ -22,9 +22,9 @@ State-of-the-art image inpainting approaches can suffer from generating distorte **Places365-Challenge** -| Method | Mask Type | Resolution | Train Iters | Test Set | l1 error | PSNR | SSIM | GPU Info | Download | -| :--------------------------------------------------: | :----------------: | :--------: | :---------: | :-----------: | :------: | :---: | :---: | :---------------------: | :-----------------------------------------------------: | -| [AOT-GAN](/configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py) | free-form (50-60%) | 512x512 | 500k | Places365-val | 7.07 | 19.01 | 0.682 | 4 (GeForce GTX 1080 Ti) | [model](https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.pth) \| [log](https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.json) | +| Method | Mask Type | Resolution | Train Iters | Test Set | l1 error | PSNR | SSIM | GPU Info | Download | +| :------------------------------------------------: | :----------------: | :--------: | :---------: | :-----------: | :------: | :---: | :---: | :---------------------: | :-------------------------------------------------------: | +| [AOT-GAN](./aot-gan_smpgan_4xb4_places-512x512.py) | free-form (50-60%) | 512x512 | 500k | Places365-val | 7.07 | 19.01 | 0.682 | 4 (GeForce GTX 1080 Ti) | [model](https://download.openmmlab.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.pth) \| [log](https://download.openmmlab.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.json) | More results for different mask area: @@ -84,13 +84,13 @@ You can use the following commands to test a model with cpu or single/multiple G ```shell # cpu test -CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.pth +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py https://download.openmmlab.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.pth # single-gpu test -python tools/test.py configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.pth +python tools/test.py configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py https://download.openmmlab.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.pth # multi-gpu test -./tools/dist_test.sh configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.pth 8 +./tools/dist_test.sh configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py https://download.openmmlab.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.pth 8 ``` For more details, you can refer to **Test a pre-trained model** part in [train_test.md](/docs/en/user_guides/train_test.md#Test-a-pre-trained-model-in-MMEditing). diff --git a/configs/aot_gan/README_zh-CN.md b/configs/aot_gan/README_zh-CN.md index 508936cbf3..abcec11c8c 100644 --- a/configs/aot_gan/README_zh-CN.md +++ b/configs/aot_gan/README_zh-CN.md @@ -20,9 +20,9 @@ **Places365-Challenge** -| 算法 | 掩膜类型 | 分辨率 | 训练集容量 | 测试集 | l1 损失 | PSNR | SSIM | GPU 信息 | 下载 | -| :------------------------------------------------------: | :----------------: | :-----: | :--------: | :-----------: | :-----: | :---: | :---: | :---------------------: | :------------------------------------------------------: | -| [AOT-GAN](/configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py) | free-form (50-60%) | 512x512 | 500k | Places365-val | 7.07 | 19.01 | 0.682 | 4 (GeForce GTX 1080 Ti) | [模型](https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.pth) \| [日志](https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.json) | +| 算法 | 掩膜类型 | 分辨率 | 训练集容量 | 测试集 | l1 损失 | PSNR | SSIM | GPU 信息 | 下载 | +| :------------------------------------------------: | :----------------: | :-----: | :--------: | :-----------: | :-----: | :---: | :---: | :---------------------: | :------------------------------------------------------------: | +| [AOT-GAN](./aot-gan_smpgan_4xb4_places-512x512.py) | free-form (50-60%) | 512x512 | 500k | Places365-val | 7.07 | 19.01 | 0.682 | 4 (GeForce GTX 1080 Ti) | [模型](https://download.openmmlab.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.pth) \| [日志](https://download.openmmlab.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.json) | @@ -80,13 +80,13 @@ python tools/train.py configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py ```shell # CPU上测试 -CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.pth +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py https://download.openmmlab.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.pth # 单个GPU上测试 -python tools/test.py configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.pth +python tools/test.py configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py https://download.openmmlab.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.pth # 多个GPU上测试 -./tools/dist_test.sh configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.pth 8 +./tools/dist_test.sh configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py https://download.openmmlab.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.pth 8 ``` 更多细节可以参考 [train_test.md](/docs/zh_cn/user_guides/train_test.md) 中的 **Test a pre-trained model** 部分。 diff --git a/configs/aot_gan/metafile.yml b/configs/aot_gan/metafile.yml index e0cb08db51..f4810ed5df 100644 --- a/configs/aot_gan/metafile.yml +++ b/configs/aot_gan/metafile.yml @@ -20,4 +20,4 @@ Models: SSIM: 0.682 l1 error: 7.07 Task: Inpainting - Weights: https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.pth + Weights: https://download.openmmlab.com/mmediting/inpainting/aot_gan/AOT-GAN_512x512_4x12_places_20220509-6641441b.pth diff --git a/configs/basicvsr/README.md b/configs/basicvsr/README.md index 7eceedeeb1..2516443664 100644 --- a/configs/basicvsr/README.md +++ b/configs/basicvsr/README.md @@ -23,11 +23,11 @@ Video super-resolution (VSR) approaches tend to have more components than the im Evaluated on RGB channels for REDS4 and Y channel for others. The metrics are `PSNR` / `SSIM` . The pretrained weights of SPyNet can be found [here](https://download.openmmlab.com/mmediting/restorers/basicvsr/spynet_20210409-c6c1bd09.pth). -| Method | REDS4 (BIx4) PSNR (RGB) | Vimeo-90K-T (BIx4) PSNR (Y) | Vid4 (BIx4) PSNR (Y) | UDM10 (BDx4) PSNR (Y) | Vimeo-90K-T (BDx4) PSNR (Y) | Vid4 (BDx4) PSNR (Y) | REDS4 (BIx4) SSIM (RGB) | Vimeo-90K-T (BIx4) SSIM (Y) | Vid4 (BIx4) SSIM (Y) | UDM10 (BDx4) SSIM (Y) | Vimeo-90K-T (BDx4) SSIM (Y) | Vid4 (BDx4) SSIM (Y) | GPU Info | Download | -| :--------------------------------------------------------------------: | :---------------------: | :-------------------------: | :------------------: | :-------------------: | :-------------------------: | :------------------: | :---------------------: | :-------------------------: | :------------------: | :-------------------: | :-------------------------: | :------------------: | :----------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| [basicvsr_reds4](/configs/basicvsr/basicvsr_2xb4_reds4.py) | **31.4170** | 36.2848 | 27.2694 | 33.4478 | 34.4700 | 24.4541 | **0.8909** | 0.9395 | 0.8318 | 0.9306 | 0.9286 | 0.7455 | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20210409_092646.log.json) | -| [basicvsr_vimeo90k_bi](/configs/basicvsr/basicvsr_2xb4_vimeo90k-bi.py) | 30.3128 | **37.2026** | **27.2755** | 34.5554 | 34.8097 | 25.0517 | 0.8660 | **0.9451** | **0.8248** | 0.9434 | 0.9316 | 0.7636 | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_vimeo90k_bi_20210409-d2d8f760.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_vimeo90k_bi_20210409_132702.log.json) | -| [basicvsr_vimeo90k_bd](/configs/basicvsr/basicvsr_2xb4_vimeo90k-bd.py) | 29.0376 | 34.6427 | 26.2708 | **39.9953** | **37.5501** | **27.9791** | 0.8481 | 0.9335 | 0.8022 | **0.9695** | **0.9499** | **0.8556** | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_vimeo90k_bd_20210409-0154dd64.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_vimeo90k_bd_20210409_132740.log.json) | +| Method | REDS4 (BIx4) PSNR (RGB) | Vimeo-90K-T (BIx4) PSNR (Y) | Vid4 (BIx4) PSNR (Y) | UDM10 (BDx4) PSNR (Y) | Vimeo-90K-T (BDx4) PSNR (Y) | Vid4 (BDx4) PSNR (Y) | REDS4 (BIx4) SSIM (RGB) | Vimeo-90K-T (BIx4) SSIM (Y) | Vid4 (BIx4) SSIM (Y) | UDM10 (BDx4) SSIM (Y) | Vimeo-90K-T (BDx4) SSIM (Y) | Vid4 (BDx4) SSIM (Y) | GPU Info | Download | +| :----------------------------------------------------: | :---------------------: | :-------------------------: | :------------------: | :-------------------: | :-------------------------: | :------------------: | :---------------------: | :-------------------------: | :------------------: | :-------------------: | :-------------------------: | :------------------: | :----------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| [basicvsr_reds4](./basicvsr_2xb4_reds4.py) | **31.4170** | 36.2848 | 27.2694 | 33.4478 | 34.4700 | 24.4541 | **0.8909** | 0.9395 | 0.8318 | 0.9306 | 0.9286 | 0.7455 | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20210409_092646.log.json) | +| [basicvsr_vimeo90k_bi](./basicvsr_2xb4_vimeo90k-bi.py) | 30.3128 | **37.2026** | **27.2755** | 34.5554 | 34.8097 | 25.0517 | 0.8660 | **0.9451** | **0.8248** | 0.9434 | 0.9316 | 0.7636 | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_vimeo90k_bi_20210409-d2d8f760.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_vimeo90k_bi_20210409_132702.log.json) | +| [basicvsr_vimeo90k_bd](./basicvsr_2xb4_vimeo90k-bd.py) | 29.0376 | 34.6427 | 26.2708 | **39.9953** | **37.5501** | **27.9791** | 0.8481 | 0.9335 | 0.8022 | **0.9695** | **0.9499** | **0.8556** | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_vimeo90k_bd_20210409-0154dd64.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_vimeo90k_bd_20210409_132740.log.json) | ## Quick Start diff --git a/configs/basicvsr/README_zh-CN.md b/configs/basicvsr/README_zh-CN.md index 11c8a62f2c..69498cb82a 100644 --- a/configs/basicvsr/README_zh-CN.md +++ b/configs/basicvsr/README_zh-CN.md @@ -25,9 +25,9 @@ SPyNet 的 预训练权重在[这里](https://download.openmmlab.com/mmediting/r | 算法 | REDS4 (BIx4)
PSNR/SSIM (RGB) | Vimeo-90K-T (BIx4)
PSNR/SSIM (Y) | Vid4 (BIx4)
PSNR/SSIM (Y) | UDM10 (BDx4)
PSNR/SSIM (Y) | Vimeo-90K-T (BDx4)
PSNR/SSIM (Y) | Vid4 (BDx4)
PSNR/SSIM (Y) | GPU 信息 | 下载 | | :-: | :-----------------------------: | :---------------------------------: | :--------------------------: | :---------------------------: | :---------------------------------: | :--------------------------: | :-----: | :--: | -| [basicvsr_reds4](/configs/basicvsr/basicvsr_2xb4_reds4.py) | **31.4170/0.8909** | 36.2848/0.9395 | 27.2694/0.8318 | 33.4478/0.9306 | 34.4700/0.9286 | 24.4541/0.7455 | 2 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20210409_092646.log.json) | -| [basicvsr_vimeo90k_bi](/configs/basicvsr/basicvsr_2xb4_vimeo90k-bi.py) | 30.3128/0.8660 | **37.2026/0.9451** | **27.2755/0.8248** | 34.5554/0.9434 | 34.8097/0.9316 | 25.0517/0.7636 | 2 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_vimeo90k_bi_20210409-d2d8f760.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_vimeo90k_bi_20210409_132702.log.json) | -| [basicvsr_vimeo90k_bd](/configs/basicvsr/basicvsr_2xb4_vimeo90k-bd.py) | 29.0376/0.8481 | 34.6427/0.9335 | 26.2708/0.8022 | **39.9953/0.9695** | **37.5501/0.9499** | **27.9791/0.8556** | 2 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_vimeo90k_bd_20210409-0154dd64.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_vimeo90k_bd_20210409_132740.log.json) | +| [basicvsr_reds4](./basicvsr_2xb4_reds4.py) | **31.4170/0.8909** | 36.2848/0.9395 | 27.2694/0.8318 | 33.4478/0.9306 | 34.4700/0.9286 | 24.4541/0.7455 | 2 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20210409_092646.log.json) | +| [basicvsr_vimeo90k_bi](./basicvsr_2xb4_vimeo90k-bi.py) | 30.3128/0.8660 | **37.2026/0.9451** | **27.2755/0.8248** | 34.5554/0.9434 | 34.8097/0.9316 | 25.0517/0.7636 | 2 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_vimeo90k_bi_20210409-d2d8f760.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_vimeo90k_bi_20210409_132702.log.json) | +| [basicvsr_vimeo90k_bd](./basicvsr_2xb4_vimeo90k-bd.py) | 29.0376/0.8481 | 34.6427/0.9335 | 26.2708/0.8022 | **39.9953/0.9695** | **37.5501/0.9499** | **27.9791/0.8556** | 2 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_vimeo90k_bd_20210409-0154dd64.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_vimeo90k_bd_20210409_132740.log.json) | ## 快速开始 diff --git a/configs/basicvsr_pp/README.md b/configs/basicvsr_pp/README.md index 807f0a7aca..b81707f718 100644 --- a/configs/basicvsr_pp/README.md +++ b/configs/basicvsr_pp/README.md @@ -24,15 +24,15 @@ The pretrained weights of SPyNet can be found [here](https://download.openmmlab. | Method | REDS4 (BIx4) PSNR (RGB) | Vimeo-90K-T (BIx4) PSNR (Y) | Vid4 (BIx4) PSNR (Y) | UDM10 (BDx4) PSNR (Y) | Vimeo-90K-T (BDx4) PSNR (Y) | Vid4 (BDx4) PSNR (Y) | GPU Info | Download | | :-----------------: | :---------------------: | :-------------------------: | :------------------: | :-------------------: | :-------------------------: | :------------------: | :-------------------: | :--------------------: | -| [basicvsr_plusplus_c64n7_8x1_600k_reds4](/configs/basicvsr_pp/basicvsr-pp_c64n7_8xb1-600k_reds4.py) | **32.3855** | 36.4445 | 27.7674 | 34.6868 | 34.0372 | 24.6209 | 8 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_600k_reds4_20210217-db622b2f.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_600k_reds4_20210217_113115.log.json) | -| [basicvsr_plusplus_c64n7_4x2_300k_vimeo90k_bi](/configs/basicvsr_pp/basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bi.py) | 31.0126 | **37.7864** | **27.7882** | 33.1211 | 33.8972 | 23.6086 | 4 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bi_20210305-4ef437e2.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bi_20210305_141254.log.json) | -| [basicvsr_plusplus_c64n7_4x2_300k_vimeo90k_bd](/configs/basicvsr_pp/basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bd.py) | 29.2041 | 34.7248 | 26.4377 | **40.7216** | **38.2054** | **29.0400** | 4 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bd_20210305-ab315ab1.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bd_20210305_140921.log.json) | +| [basicvsr_plusplus_c64n7_8x1_600k_reds4](./basicvsr-pp_c64n7_8xb1-600k_reds4.py) | **32.3855** | 36.4445 | 27.7674 | 34.6868 | 34.0372 | 24.6209 | 8 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_600k_reds4_20210217-db622b2f.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_600k_reds4_20210217_113115.log.json) | +| [basicvsr_plusplus_c64n7_4x2_300k_vimeo90k_bi](./basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bi.py) | 31.0126 | **37.7864** | **27.7882** | 33.1211 | 33.8972 | 23.6086 | 4 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bi_20210305-4ef437e2.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bi_20210305_141254.log.json) | +| [basicvsr_plusplus_c64n7_4x2_300k_vimeo90k_bd](./basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bd.py) | 29.2041 | 34.7248 | 26.4377 | **40.7216** | **38.2054** | **29.0400** | 4 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bd_20210305-ab315ab1.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bd_20210305_140921.log.json) | | Method | REDS4 (BIx4) SSIM (RGB) | Vimeo-90K-T (BIx4) SSIM (Y) | Vid4 (BIx4) SSIM (Y) | UDM10 (BDx4) SSIM (Y) | Vimeo-90K-T (BDx4) SSIM (Y) | Vid4 (BDx4) SSIM (Y) | GPU Info | Download | | :-----------------: | :---------------------: | :-------------------------: | :------------------: | :-------------------: | :-------------------------: | :------------------: | :-------------------: | :--------------------: | -| [basicvsr_plusplus_c64n7_8x1_600k_reds4](/configs/basicvsr_pp/basicvsr-pp_c64n7_8xb1-600k_reds4.py) | **0.9069** | 0.9411 | 0.8444 | 0.9417 | 0.9244 | 0.7540 | 8 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_600k_reds4_20210217-db622b2f.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_600k_reds4_20210217_113115.log.json) | -| [basicvsr_plusplus_c64n7_4x2_300k_vimeo90k_bi](/configs/basicvsr_pp/basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bi.py) | 0.8804 | **0.9500** | **0.8401** | 0.9270 | 0.9195 | 0.7033 | 4 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bi_20210305-4ef437e2.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bi_20210305_141254.log.json) | -| [basicvsr_plusplus_c64n7_4x2_300k_vimeo90k_bd](/configs/basicvsr_pp/basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bd.py) | 0.8528 | 0.9351 | 0.8074 | **0.9722** | **0.9550** | **0.8753** | 4 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bd_20210305-ab315ab1.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bd_20210305_140921.log.json) | +| [basicvsr_plusplus_c64n7_8x1_600k_reds4](./basicvsr-pp_c64n7_8xb1-600k_reds4.py) | **0.9069** | 0.9411 | 0.8444 | 0.9417 | 0.9244 | 0.7540 | 8 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_600k_reds4_20210217-db622b2f.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_600k_reds4_20210217_113115.log.json) | +| [basicvsr_plusplus_c64n7_4x2_300k_vimeo90k_bi](./basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bi.py) | 0.8804 | **0.9500** | **0.8401** | 0.9270 | 0.9195 | 0.7033 | 4 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bi_20210305-4ef437e2.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bi_20210305_141254.log.json) | +| [basicvsr_plusplus_c64n7_4x2_300k_vimeo90k_bd](./basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bd.py) | 0.8528 | 0.9351 | 0.8074 | **0.9722** | **0.9550** | **0.8753** | 4 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bd_20210305-ab315ab1.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bd_20210305_140921.log.json) |
NTIRE 2021 checkpoints @@ -41,25 +41,25 @@ Note that the following models are finetuned from smaller models. The training s **NTIRE 2021 Video Super-Resolution** -[basicvsr-pp_c128n25_600k_ntire-vsr](/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-vsr.py) +[basicvsr-pp_c128n25_600k_ntire-vsr](./basicvsr-pp_c128n25_600k_ntire-vsr.py) [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_vsr_20210311-1ff35292.pth) **NTIRE 2021 Quality Enhancement of Compressed Video - Track 1** -[basicvsr-pp_c128n25_600k_ntire-decompress-track1](/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-decompress-track1.py) +[basicvsr-pp_c128n25_600k_ntire-decompress-track1](./basicvsr-pp_c128n25_600k_ntire-decompress-track1.py) [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_decompress_track1_20210223-7b2eba02.pth) **NTIRE 2021 Quality Enhancement of Compressed Video - Track 2** -[basicvsr-pp_c128n25_600k_ntire-decompress-track2](/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-decompress-track2.py) +[basicvsr-pp_c128n25_600k_ntire-decompress-track2](./basicvsr-pp_c128n25_600k_ntire-decompress-track2.py) [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_decompress_track2_20210314-eeae05e6.pth) **NTIRE 2021 Quality Enhancement of Compressed Video - Track 3** -[basicvsr-pp_c128n25_600k_ntire-decompress-track3](/configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-decompress-track3.py) +[basicvsr-pp_c128n25_600k_ntire-decompress-track3](./basicvsr-pp_c128n25_600k_ntire-decompress-track3.py) [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_decompress_track3_20210304-6daf4a40.pth) diff --git a/configs/basicvsr_pp/README_zh-CN.md b/configs/basicvsr_pp/README_zh-CN.md index 8ef47f6ee4..0c4810d3fd 100644 --- a/configs/basicvsr_pp/README_zh-CN.md +++ b/configs/basicvsr_pp/README_zh-CN.md @@ -22,9 +22,9 @@ SPyNet 的 预训练权重在[这里](https://download.openmmlab.com/mmediting/r | 算法 | REDS4 (BIx4) PSNR/SSIM (RGB) | Vimeo-90K-T (BIx4) PSNR/SSIM (Y) | Vid4 (BIx4) PSNR/SSIM (Y) | UDM10 (BDx4) PSNR/SSIM (Y) | Vimeo-90K-T (BDx4) PSNR/SSIM (Y) | Vid4 (BDx4) PSNR/SSIM (Y) | GPU 信息 | Download | | :-----: | :--------------------------: | :------------------------------: | :-----------------------: | :------------------------: | :------------------------------: | :-----------------------: | :---------: | :------------: | -| [basicvsr_plusplus_c64n7_8x1_600k_reds4](/configs/basicvsr_pp/basicvsr-pp_c64n7_8xb1-600k_reds4.py) | **32.3855/0.9069** | 36.4445/0.9411 | 27.7674/0.8444 | 34.6868/0.9417 | 34.0372/0.9244 | 24.6209/0.7540 | 8 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_600k_reds4_20210217-db622b2f.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_600k_reds4_20210217_113115.log.json) | -| [basicvsr_plusplus_c64n7_4x2_300k_vimeo90k_bi](/configs/basicvsr_pp/basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bi.py) | 31.0126/0.8804 | **37.7864/0.9500** | **27.7882/0.8401** | 33.1211/0.9270 | 33.8972/0.9195 | 23.6086/0.7033 | 4 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bi_20210305-4ef437e2.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bi_20210305_141254.log.json) | -| [basicvsr_plusplus_c64n7_4x2_300k_vimeo90k_bd](/configs/basicvsr_pp/basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bd.py) | 29.2041/0.8528 | 34.7248/0.9351 | 26.4377/0.8074 | **40.7216/0.9722** | **38.2054/0.9550** | **29.0400/0.8753** | 4 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bd_20210305-ab315ab1.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bd_20210305_140921.log.json) | +| [basicvsr_plusplus_c64n7_8x1_600k_reds4](./basicvsr-pp_c64n7_8xb1-600k_reds4.py) | **32.3855/0.9069** | 36.4445/0.9411 | 27.7674/0.8444 | 34.6868/0.9417 | 34.0372/0.9244 | 24.6209/0.7540 | 8 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_600k_reds4_20210217-db622b2f.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_600k_reds4_20210217_113115.log.json) | +| [basicvsr_plusplus_c64n7_4x2_300k_vimeo90k_bi](./basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bi.py) | 31.0126/0.8804 | **37.7864/0.9500** | **27.7882/0.8401** | 33.1211/0.9270 | 33.8972/0.9195 | 23.6086/0.7033 | 4 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bi_20210305-4ef437e2.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bi_20210305_141254.log.json) | +| [basicvsr_plusplus_c64n7_4x2_300k_vimeo90k_bd](./basicvsr-pp_c64n7_4xb2-300k_vimeo90k-bd.py) | 29.2041/0.8528 | 34.7248/0.9351 | 26.4377/0.8074 | **40.7216/0.9722** | **38.2054/0.9550** | **29.0400/0.8753** | 4 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bd_20210305-ab315ab1.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bd_20210305_140921.log.json) |
NTIRE 2021 模型权重文件 diff --git a/configs/biggan/README.md b/configs/biggan/README.md index b98288eddd..dde0566bef 100644 --- a/configs/biggan/README.md +++ b/configs/biggan/README.md @@ -40,9 +40,9 @@ Evaluation of our trained BigGAN. | Models | Dataset | FID (Iter) | IS (Iter) | Config | Download | | :------------------------------------------------: | :--------: | :---------------: | :-----------------: | :-------------------------------------------------: | :---------------------------------------------------: | -| BigGAN 32x32 | CIFAR10 | 9.78(390000) | 8.70(390000) | [config](/configs/biggan/biggan_2xb25-500kiters_cifar10-32x32.py) | [model](https://download.openmmlab.com/mmgen/biggan/biggan_cifar10_32x32_b25x2_500k_20210728_110906-08b61a44.pth)\|[log](https://download.openmmlab.com/mmgen/biggan/biggan_cifar10_32_b25x2_500k_20210706_171051.log.json) | -| BigGAN 128x128 Best FID | ImageNet1k | **8.69**(1232000) | 101.15(1232000) | [config](/configs/biggan/biggan_ajbrock-sn_8xb32-1500kiters_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmgen/biggan/biggan_imagenet1k_128x128_b32x8_best_fid_iter_1232000_20211111_122548-5315b13d.pth)\|[log](https://download.openmmlab.com/mmgen/biggan/biggan_imagenet1k_128x128_b32x8_1500k_20211111_122548-5315b13d.log.json) | -| BigGAN 128x128 Best IS | ImageNet1k | 13.51(1328000) | **129.07**(1328000) | [config](/configs/biggan/biggan_ajbrock-sn_8xb32-1500kiters_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmgen/biggan/biggan_imagenet1k_128x128_b32x8_best_is_iter_1328000_20211111_122911-28c688bc.pth)\|[log](https://download.openmmlab.com/mmgen/biggan/biggan_imagenet1k_128x128_b32x8_1500k_20211111_122548-5315b13d.log.json) | +| BigGAN 32x32 | CIFAR10 | 9.78(390000) | 8.70(390000) | [config](./biggan_2xb25-500kiters_cifar10-32x32.py) | [model](https://download.openmmlab.com/mmediting/biggan/biggan_cifar10_32x32_b25x2_500k_20210728_110906-08b61a44.pth)\|[log](https://download.openmmlab.com/mmediting/biggan/biggan_cifar10_32_b25x2_500k_20210706_171051.log.json) | +| BigGAN 128x128 Best FID | ImageNet1k | **8.69**(1232000) | 101.15(1232000) | [config](./biggan_ajbrock-sn_8xb32-1500kiters_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmediting/biggan/biggan_imagenet1k_128x128_b32x8_best_fid_iter_1232000_20211111_122548-5315b13d.pth)\|[log](https://download.openmmlab.com/mmediting/biggan/biggan_imagenet1k_128x128_b32x8_1500k_20211111_122548-5315b13d.log.json) | +| BigGAN 128x128 Best IS | ImageNet1k | 13.51(1328000) | **129.07**(1328000) | [config](./biggan_ajbrock-sn_8xb32-1500kiters_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmediting/biggan/biggan_imagenet1k_128x128_b32x8_best_is_iter_1328000_20211111_122911-28c688bc.pth)\|[log](https://download.openmmlab.com/mmediting/biggan/biggan_imagenet1k_128x128_b32x8_1500k_20211111_122548-5315b13d.log.json) | | Note: `BigGAN-Deep` trained on `ImageNet1k` will come later. | | | | | | ### Note on reproducibility @@ -57,10 +57,10 @@ Evaluation results and download links are provided below. | Models | Dataset | FID | IS | Config | Download | Original Download link | | :-----------------: | :--------: | :-----: | :-----: | :--------------------------------------------: | :----------------------------------------------: | :-------------------------------------------------------------: | -| BigGAN 128x128 | ImageNet1k | 10.1414 | 96.728 | [config](/configs/biggan/biggan_cvt-BigGAN-PyTorch-rgb_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmgen/biggan/biggan_imagenet1k_128x128_cvt_BigGAN-PyTorch_rgb_20210730_125223-3e353fef.pth) | [link](https://drive.google.com/open?id=1nAle7FCVFZdix2--ks0r5JBkFnKw8ctW) | -| BigGAN-Deep 128x128 | ImageNet1k | 5.9471 | 107.161 | [config](/configs/biggan/biggan-deep_cvt-hugging-face-rgb_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmgen/biggan/biggan-deep_imagenet1k_128x128_cvt_hugging-face_rgb_20210728_111659-099e96f9.pth) | [link](https://s3.amazonaws.com/models.huggingface.co/biggan/biggan-deep-128-pytorch_model.bin) | -| BigGAN-Deep 256x256 | ImageNet1k | 11.3151 | 135.107 | [config](/configs/biggan/biggan-deep_cvt-hugging-face_rgb_imagenet1k-256x256.py) | [model](https://download.openmmlab.com/mmgen/biggan/biggan-deep_imagenet1k_256x256_cvt_hugging-face_rgb_20210728_111735-28651569.pth) | [link](https://s3.amazonaws.com/models.huggingface.co/biggan/biggan-deep-256-pytorch_model.bin) | -| BigGAN-Deep 512x512 | ImageNet1k | 16.8728 | 124.368 | [config](/configs/biggan/biggan-deep_cvt-hugging-face_rgb_imagenet1k-512x512.py) | [model](https://download.openmmlab.com/mmgen/biggan/biggan-deep_imagenet1k_512x512_cvt_hugging-face_rgb_20210728_112346-a42585f2.pth) | [link](https://s3.amazonaws.com/models.huggingface.co/biggan/biggan-deep-512-pytorch_model.bin) | +| BigGAN 128x128 | ImageNet1k | 10.1414 | 96.728 | [config](./biggan_cvt-BigGAN-PyTorch-rgb_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmediting/biggan/biggan_imagenet1k_128x128_cvt_BigGAN-PyTorch_rgb_20210730_125223-3e353fef.pth) | [link](https://drive.google.com/open?id=1nAle7FCVFZdix2--ks0r5JBkFnKw8ctW) | +| BigGAN-Deep 128x128 | ImageNet1k | 5.9471 | 107.161 | [config](./biggan-deep_cvt-hugging-face-rgb_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmediting/biggan/biggan-deep_imagenet1k_128x128_cvt_hugging-face_rgb_20210728_111659-099e96f9.pth) | [link](https://s3.amazonaws.com/models.huggingface.co/biggan/biggan-deep-128-pytorch_model.bin) | +| BigGAN-Deep 256x256 | ImageNet1k | 11.3151 | 135.107 | [config](./biggan-deep_cvt-hugging-face_rgb_imagenet1k-256x256.py) | [model](https://download.openmmlab.com/mmediting/biggan/biggan-deep_imagenet1k_256x256_cvt_hugging-face_rgb_20210728_111735-28651569.pth) | [link](https://s3.amazonaws.com/models.huggingface.co/biggan/biggan-deep-256-pytorch_model.bin) | +| BigGAN-Deep 512x512 | ImageNet1k | 16.8728 | 124.368 | [config](./biggan-deep_cvt-hugging-face_rgb_imagenet1k-512x512.py) | [model](https://download.openmmlab.com/mmediting/biggan/biggan-deep_imagenet1k_512x512_cvt_hugging-face_rgb_20210728_112346-a42585f2.pth) | [link](https://s3.amazonaws.com/models.huggingface.co/biggan/biggan-deep-512-pytorch_model.bin) | Sampling results are shown below. diff --git a/configs/biggan/metafile.yml b/configs/biggan/metafile.yml index d70d3070c7..ba91aad6c5 100644 --- a/configs/biggan/metafile.yml +++ b/configs/biggan/metafile.yml @@ -16,7 +16,7 @@ Models: - Dataset: Others Metrics: {} Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/biggan/biggan_cifar10_32x32_b25x2_500k_20210728_110906-08b61a44.pth + Weights: https://download.openmmlab.com/mmediting/biggan/biggan_cifar10_32x32_b25x2_500k_20210728_110906-08b61a44.pth - Config: configs/biggan/biggan_ajbrock-sn_8xb32-1500kiters_imagenet1k-128x128.py In Collection: BigGAN Metadata: @@ -26,7 +26,7 @@ Models: - Dataset: Others Metrics: {} Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/biggan/biggan_imagenet1k_128x128_b32x8_best_fid_iter_1232000_20211111_122548-5315b13d.pth + Weights: https://download.openmmlab.com/mmediting/biggan/biggan_imagenet1k_128x128_b32x8_best_fid_iter_1232000_20211111_122548-5315b13d.pth - Config: configs/biggan/biggan_ajbrock-sn_8xb32-1500kiters_imagenet1k-128x128.py In Collection: BigGAN Metadata: @@ -36,7 +36,7 @@ Models: - Dataset: Others Metrics: {} Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/biggan/biggan_imagenet1k_128x128_b32x8_best_is_iter_1328000_20211111_122911-28c688bc.pth + Weights: https://download.openmmlab.com/mmediting/biggan/biggan_imagenet1k_128x128_b32x8_best_is_iter_1328000_20211111_122911-28c688bc.pth - Config: configs/biggan/biggan_cvt-BigGAN-PyTorch-rgb_imagenet1k-128x128.py In Collection: BigGAN Metadata: @@ -48,7 +48,7 @@ Models: FID: 10.1414 IS: 96.728 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/biggan/biggan_imagenet1k_128x128_cvt_BigGAN-PyTorch_rgb_20210730_125223-3e353fef.pth + Weights: https://download.openmmlab.com/mmediting/biggan/biggan_imagenet1k_128x128_cvt_BigGAN-PyTorch_rgb_20210730_125223-3e353fef.pth - Config: configs/biggan/biggan-deep_cvt-hugging-face-rgb_imagenet1k-128x128.py In Collection: BigGAN Metadata: @@ -60,7 +60,7 @@ Models: FID: 5.9471 IS: 107.161 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/biggan/biggan-deep_imagenet1k_128x128_cvt_hugging-face_rgb_20210728_111659-099e96f9.pth + Weights: https://download.openmmlab.com/mmediting/biggan/biggan-deep_imagenet1k_128x128_cvt_hugging-face_rgb_20210728_111659-099e96f9.pth - Config: configs/biggan/biggan-deep_cvt-hugging-face_rgb_imagenet1k-256x256.py In Collection: BigGAN Metadata: @@ -72,7 +72,7 @@ Models: FID: 11.3151 IS: 135.107 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/biggan/biggan-deep_imagenet1k_256x256_cvt_hugging-face_rgb_20210728_111735-28651569.pth + Weights: https://download.openmmlab.com/mmediting/biggan/biggan-deep_imagenet1k_256x256_cvt_hugging-face_rgb_20210728_111735-28651569.pth - Config: configs/biggan/biggan-deep_cvt-hugging-face_rgb_imagenet1k-512x512.py In Collection: BigGAN Metadata: @@ -84,4 +84,4 @@ Models: FID: 16.8728 IS: 124.368 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/biggan/biggan-deep_imagenet1k_512x512_cvt_hugging-face_rgb_20210728_112346-a42585f2.pth + Weights: https://download.openmmlab.com/mmediting/biggan/biggan-deep_imagenet1k_512x512_cvt_hugging-face_rgb_20210728_112346-a42585f2.pth diff --git a/configs/cain/README.md b/configs/cain/README.md index 4cfd230bfa..9f2bfdba9b 100644 --- a/configs/cain/README.md +++ b/configs/cain/README.md @@ -24,9 +24,9 @@ Evaluated on RGB channels. The metrics are `PSNR / SSIM` . The learning rate adjustment strategy is `Step LR scheduler with min_lr clipping`. -| Method | PSNR | SSIM | GPU Info | Download | -| :------------------------------------------------------------------------------: | :-----: | :----: | :----------------------: | :---------------------------------------------------------------------------------: | -| [cain_b5_g1b32_vimeo90k_triplet](/configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py) | 34.6010 | 0.9578 | 1 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/video_interpolators/cain/cain_b5_g1b32_vimeo90k_triplet_20220530-3520b00c.pth)/[log](https://download.openmmlab.com/mmediting/video_interpolators/cain/cain_b5_g1b32_vimeo90k_triplet_20220530-3520b00c.log.json) | +| Method | PSNR | SSIM | GPU Info | Download | +| :---------------------------------------------------------------------: | :-----: | :----: | :----------------------: | :------------------------------------------------------------------------------------------: | +| [cain_b5_g1b32_vimeo90k_triplet](./cain_g1b32_1xb5_vimeo90k-triplet.py) | 34.6010 | 0.9578 | 1 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/video_interpolators/cain/cain_b5_g1b32_vimeo90k_triplet_20220530-3520b00c.pth)/[log](https://download.openmmlab.com/mmediting/video_interpolators/cain/cain_b5_g1b32_vimeo90k_triplet_20220530-3520b00c.log.json) | ## Quick Start diff --git a/configs/cain/README_zh-CN.md b/configs/cain/README_zh-CN.md index f81da09e57..82860f9781 100644 --- a/configs/cain/README_zh-CN.md +++ b/configs/cain/README_zh-CN.md @@ -27,9 +27,9 @@ 我们使用 `PSNR` 和 `SSIM` 作为指标。 学习率调整策略是等间隔调整策略。 -| 算法 | vimeo-90k-triplet | GPU 信息 | 下载 | -| :-----------------------------------------------------------------------------: | :---------------: | :----------------------: | :------------------------------------------------------------------------------: | -| [cain_b5_g1b32_vimeo90k_triplet](/configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py) | 34.6010 / 0.9578 | 1 (Tesla V100-SXM2-32GB) | [模型](https://download.openmmlab.com/mmediting/video_interpolators/cain/cain_b5_g1b32_vimeo90k_triplet_20220530-3520b00c.pth)/[日志](https://download.openmmlab.com/mmediting/video_interpolators/cain/cain_b5_g1b32_vimeo90k_triplet_20220530-3520b00c.log.json) | +| 算法 | vimeo-90k-triplet | GPU 信息 | 下载 | +| :---------------------------------------------------------------------: | :---------------: | :----------------------: | :--------------------------------------------------------------------------------------: | +| [cain_b5_g1b32_vimeo90k_triplet](./cain_g1b32_1xb5_vimeo90k-triplet.py) | 34.6010 / 0.9578 | 1 (Tesla V100-SXM2-32GB) | [模型](https://download.openmmlab.com/mmediting/video_interpolators/cain/cain_b5_g1b32_vimeo90k_triplet_20220530-3520b00c.pth)/[日志](https://download.openmmlab.com/mmediting/video_interpolators/cain/cain_b5_g1b32_vimeo90k_triplet_20220530-3520b00c.log.json) | ## 快速开始 diff --git a/configs/cyclegan/README.md b/configs/cyclegan/README.md index de27ba78d0..dd408b0d1b 100644 --- a/configs/cyclegan/README.md +++ b/configs/cyclegan/README.md @@ -27,21 +27,21 @@ Image-to-image translation is a class of vision and graphics problems where the We use `FID` and `IS` metrics to evaluate the generation performance of CycleGAN.1 -https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_80k_facades_20210902_165905-5e2c0876.pth -https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_in_1x1_80k_facades_20210902_165905-5e2c0876.pth - -| Models | Dataset | FID | IS | Config | Download | -| :----: | :---------------: | :------: | :---: | :-------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------: | -| Ours | facades | 124.8033 | 1.792 | [config](/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-80kiters_facades.py) | [model](https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_80k_facades_20210902_165905-5e2c0876.pth) \| [log](https://download.openmmlab.com/mmgen/cyclegan/base_cyclegan_in_1x1_80k_facades_20210317_160938.log.json) 2 | -| Ours | facades-id0 | 125.1694 | 1.905 | [config](/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-80kiters_facades.py) | [model](https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_80k_facades_convert-bgr_20210902_164411-d8e72b45.pth) | -| Ours | summer2winter | 83.7177 | 2.771 | [config](/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-250kiters_summer2winter.py) | [model](https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165932-fcf08dc1.pth) | -| Ours | summer2winter-id0 | 83.1418 | 2.720 | [config](/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-250kiters_summer2winter.py) | [model](https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165640-8b825581.pth) | -| Ours | winter2summer | 72.8025 | 3.129 | [config](/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-250kiters_summer2winter.py) | [model](https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165932-fcf08dc1.pth) | -| Ours | winter2summer-id0 | 73.5001 | 3.107 | [config](/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-250kiters_summer2winter.py) | [model](https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165640-8b825581.pth) | -| Ours | horse2zebra | 64.5225 | 1.418 | [config](/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-270kiters_horse2zebra.py) | [model](https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_170004-a32c733a.pth) | -| Ours | horse2zebra-id0 | 74.7770 | 1.542 | [config](/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-270kiters_horse2zebra.py) | [model](https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_165724-77c9c806.pth) | -| Ours | zebra2horse | 141.1517 | 3.154 | [config](/configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-270kiters_horse2zebra.py) | [model](https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_170004-a32c733a.pth) | -| Ours | zebra2horse-id0 | 134.3728 | 3.091 | [config](/configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-270kiters_horse2zebra.py) | [model](https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_165724-77c9c806.pth) | +https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_80k_facades_20210902_165905-5e2c0876.pth +https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_in_1x1_80k_facades_20210902_165905-5e2c0876.pth + +| Models | Dataset | FID | IS | Config | Download | +| :----: | :---------------: | :------: | :---: | :----------------------------------------------------------------------: | :------------------------------------------------------------------------------------------: | +| Ours | facades | 124.8033 | 1.792 | [config](./cyclegan_lsgan-resnet-in_1xb1-80kiters_facades.py) | [model](https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_80k_facades_20210902_165905-5e2c0876.pth) \| [log](https://download.openmmlab.com/mmediting/cyclegan/cyclegan_lsgan_resnet_in_1x1_80k_facades_20210317_160938.log.json) 2 | +| Ours | facades-id0 | 125.1694 | 1.905 | [config](./cyclegan_lsgan-id0-resnet-in_1xb1-80kiters_facades.py) | [model](https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_80k_facades_convert-bgr_20210902_164411-d8e72b45.pth) | +| Ours | summer2winter | 83.7177 | 2.771 | [config](./cyclegan_lsgan-resnet-in_1xb1-250kiters_summer2winter.py) | [model](https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165932-fcf08dc1.pth) | +| Ours | summer2winter-id0 | 83.1418 | 2.720 | [config](./cyclegan_lsgan-id0-resnet-in_1xb1-250kiters_summer2winter.py) | [model](https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165640-8b825581.pth) | +| Ours | winter2summer | 72.8025 | 3.129 | [config](./cyclegan_lsgan-resnet-in_1xb1-250kiters_summer2winter.py) | [model](https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165932-fcf08dc1.pth) | +| Ours | winter2summer-id0 | 73.5001 | 3.107 | [config](./cyclegan_lsgan-id0-resnet-in_1xb1-250kiters_summer2winter.py) | [model](https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165640-8b825581.pth) | +| Ours | horse2zebra | 64.5225 | 1.418 | [config](./cyclegan_lsgan-resnet-in_1xb1-270kiters_horse2zebra.py) | [model](https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_170004-a32c733a.pth) | +| Ours | horse2zebra-id0 | 74.7770 | 1.542 | [config](./cyclegan_lsgan-id0-resnet-in_1xb1-270kiters_horse2zebra.py) | [model](https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_165724-77c9c806.pth) | +| Ours | zebra2horse | 141.1517 | 3.154 | [config](./cyclegan_lsgan-resnet-in_1xb1-270kiters_horse2zebra.py) | [model](https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_170004-a32c733a.pth) | +| Ours | zebra2horse-id0 | 134.3728 | 3.091 | [config](./cyclegan_lsgan-id0-resnet-in_1xb1-270kiters_horse2zebra.py) | [model](https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_165724-77c9c806.pth) | `FID` comparison with official: diff --git a/configs/cyclegan/metafile.yml b/configs/cyclegan/metafile.yml index 573265939e..29e3eddfd5 100644 --- a/configs/cyclegan/metafile.yml +++ b/configs/cyclegan/metafile.yml @@ -21,7 +21,7 @@ Models: FID: 124.8033 IS: 1.792 Task: Image2Image - Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_80k_facades_20210902_165905-5e2c0876.pth + Weights: https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_80k_facades_20210902_165905-5e2c0876.pth - Config: configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-80kiters_facades.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent Adversarial Networks' @@ -34,7 +34,7 @@ Models: FID: 125.1694 IS: 1.905 Task: Image2Image - Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_80k_facades_convert-bgr_20210902_164411-d8e72b45.pth + Weights: https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_80k_facades_convert-bgr_20210902_164411-d8e72b45.pth - Config: configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-250kiters_summer2winter.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent Adversarial Networks' @@ -47,7 +47,7 @@ Models: FID: 83.7177 IS: 2.771 Task: Image2Image - Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165932-fcf08dc1.pth + Weights: https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165932-fcf08dc1.pth - Config: configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-250kiters_summer2winter.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent Adversarial Networks' @@ -60,7 +60,7 @@ Models: FID: 83.1418 IS: 2.72 Task: Image2Image - Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165640-8b825581.pth + Weights: https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165640-8b825581.pth - Config: configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-250kiters_summer2winter.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent Adversarial Networks' @@ -73,7 +73,7 @@ Models: FID: 72.8025 IS: 3.129 Task: Image2Image - Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165932-fcf08dc1.pth + Weights: https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165932-fcf08dc1.pth - Config: configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-250kiters_summer2winter.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent Adversarial Networks' @@ -86,7 +86,7 @@ Models: FID: 73.5001 IS: 3.107 Task: Image2Image - Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165640-8b825581.pth + Weights: https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_246200_summer2winter_convert-bgr_20210902_165640-8b825581.pth - Config: configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-270kiters_horse2zebra.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent Adversarial Networks' @@ -99,7 +99,7 @@ Models: FID: 64.5225 IS: 1.418 Task: Image2Image - Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_170004-a32c733a.pth + Weights: https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_170004-a32c733a.pth - Config: configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-270kiters_horse2zebra.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent Adversarial Networks' @@ -112,7 +112,7 @@ Models: FID: 74.777 IS: 1.542 Task: Image2Image - Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_165724-77c9c806.pth + Weights: https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_165724-77c9c806.pth - Config: configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-270kiters_horse2zebra.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent Adversarial Networks' @@ -125,7 +125,7 @@ Models: FID: 141.1517 IS: 3.154 Task: Image2Image - Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_170004-a32c733a.pth + Weights: https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_170004-a32c733a.pth - Config: configs/cyclegan/cyclegan_lsgan-id0-resnet-in_1xb1-270kiters_horse2zebra.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent Adversarial Networks' @@ -138,4 +138,4 @@ Models: FID: 134.3728 IS: 3.091 Task: Image2Image - Weights: https://download.openmmlab.com/mmgen/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_165724-77c9c806.pth + Weights: https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_lsgan_id0_resnet_in_1x1_266800_horse2zebra_convert-bgr_20210902_165724-77c9c806.pth diff --git a/configs/dcgan/README.md b/configs/dcgan/README.md index 22315a4092..cce01969a8 100644 --- a/configs/dcgan/README.md +++ b/configs/dcgan/README.md @@ -26,11 +26,11 @@ In recent years, supervised learning with convolutional networks (CNNs) has seen -| Models | Dataset | SWD | MS-SSIM | Config | Download | -| :---------: | :------------: | :----------------------: | :-----: | :---------------------------------------------------------------------: | :-----------------------------------------------------------------------: | -| DCGAN 64x64 | MNIST (64x64) | 21.16, 4.4, 8.41/11.32 | 0.1395 | [config](/configs/dcgan/dcgan_Glr4e-4_Dlr1e-4_1xb128-5kiters_mnist-64x64.py) | [model](https://download.openmmlab.com/mmgen/base_dcgan_mnist-64_b128x1_Glr4e-4_Dlr1e-4_5k_20210512_163926-207a1eaf.pth) \| [log](https://download.openmmlab.com//mmgen/dcgan/dcgan_mnist-64_b128x1_Glr4e-4_Dlr1e-4_5k_20210512_163926-207a1eaf.json) | -| DCGAN 64x64 | CelebA-Cropped | 8.93,10.53,50.32/23.26 | 0.2899 | [config](/configs/dcgan/dcgan_1xb128-300kiters_celeba-cropped-64.py) | [model](https://download.openmmlab.com/mmgen/base_dcgan_celeba-cropped_64_b128x1_300kiter_20210408_161607-1f8a2277.pth) \| [log](https://download.openmmlab.com/mmgen/dcgan/base_dcgan_celeba-cropped_64_b128x1_300kiter_20210408_161607-1f8a2277.json) | -| DCGAN 64x64 | LSUN-Bedroom | 42.79, 34.55, 98.46/58.6 | 0.2095 | [config](/configs/dcgan/dcgan_1xb128-5epoches_lsun-bedroom-64x64.py) | [model](https://download.openmmlab.com/mmgen/base_dcgan_lsun-bedroom_64_b128x1_5e_20210408_161713-117c498b.pth) \| [log](https://download.openmmlab.com/mmgen/dcgan/base_dcgan_lsun-bedroom_64_b128x1_5e_20210408_161713-117c498b.json) | +| Models | Dataset | SWD | MS-SSIM | Config | Download | +| :---------: | :------------: | :----------------------: | :-----: | :-------------------------------------------------------------: | :-------------------------------------------------------------------------------: | +| DCGAN 64x64 | MNIST (64x64) | 21.16, 4.4, 8.41/11.32 | 0.1395 | [config](./dcgan_Glr4e-4_Dlr1e-4_1xb128-5kiters_mnist-64x64.py) | [model](https://download.openmmlab.com/mmediting/dcgan/dcgan_mnist-64_b128x1_Glr4e-4_Dlr1e-4_5k_20210512_163926-207a1eaf.pth) \| [log](https://download.openmmlab.com//mmgen/dcgan/dcgan_mnist-64_b128x1_Glr4e-4_Dlr1e-4_5k_20210512_163926-207a1eaf.json) | +| DCGAN 64x64 | CelebA-Cropped | 8.93,10.53,50.32/23.26 | 0.2899 | [config](./dcgan_1xb128-300kiters_celeba-cropped-64.py) | [model](https://download.openmmlab.com/mmediting/dcgan/dcgan_celeba-cropped_64_b128x1_300kiter_20210408_161607-1f8a2277.pth) \| [log](https://download.openmmlab.com/mmediting/dcgan/dcgan_celeba-cropped_64_b128x1_300kiter_20210408_161607-1f8a2277.json) | +| DCGAN 64x64 | LSUN-Bedroom | 42.79, 34.55, 98.46/58.6 | 0.2095 | [config](./dcgan_1xb128-5epoches_lsun-bedroom-64x64.py) | [model](https://download.openmmlab.com/mmediting/dcgan/dcgan_lsun-bedroom_64_b128x1_5e_20210408_161713-117c498b.pth) \| [log](https://download.openmmlab.com/mmediting/dcgan/dcgan_lsun-bedroom_64_b128x1_5e_20210408_161713-117c498b.json) | ## Citation diff --git a/configs/dcgan/metafile.yml b/configs/dcgan/metafile.yml index 62d38230c5..5f549b9bce 100644 --- a/configs/dcgan/metafile.yml +++ b/configs/dcgan/metafile.yml @@ -20,7 +20,7 @@ Models: Metrics: MS-SSIM: 0.1395 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/base_dcgan_mnist-64_b128x1_Glr4e-4_Dlr1e-4_5k_20210512_163926-207a1eaf.pth + Weights: https://download.openmmlab.com/mmediting/dcgan/dcgan_mnist-64_b128x1_Glr4e-4_Dlr1e-4_5k_20210512_163926-207a1eaf.pth - Config: configs/dcgan/dcgan_1xb128-300kiters_celeba-cropped-64.py In Collection: Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks @@ -32,7 +32,7 @@ Models: Metrics: MS-SSIM: 0.2899 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/base_dcgan_celeba-cropped_64_b128x1_300kiter_20210408_161607-1f8a2277.pth + Weights: https://download.openmmlab.com/mmediting/dcgan/dcgan_celeba-cropped_64_b128x1_300kiter_20210408_161607-1f8a2277.pth - Config: configs/dcgan/dcgan_1xb128-5epoches_lsun-bedroom-64x64.py In Collection: Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks @@ -44,4 +44,4 @@ Models: Metrics: MS-SSIM: 0.2095 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/base_dcgan_lsun-bedroom_64_b128x1_5e_20210408_161713-117c498b.pth + Weights: https://download.openmmlab.com/mmediting/dcgan/dcgan_lsun-bedroom_64_b128x1_5e_20210408_161713-117c498b.pth diff --git a/configs/deepfillv1/README.md b/configs/deepfillv1/README.md index d68c28523c..a020f898ea 100644 --- a/configs/deepfillv1/README.md +++ b/configs/deepfillv1/README.md @@ -22,15 +22,15 @@ Recent deep learning based approaches have shown promising results for the chall **Places365-Challenge** -| Method | Mask Type | Resolution | Train Iters | Test Set | l1 error | PSNR | SSIM | GPU Info | Download | -| :-------------------------------------------------------------: | :---------: | :--------: | :---------: | :-----------: | :------: | :----: | :---: | :------: | :---------------------------------------------------------------: | -| [DeepFillv1](/configs/deepfillv1/deepfillv1_8xb2_places-256x256.py) | square bbox | 256x256 | 3500k | Places365-val | 11.019 | 23.429 | 0.862 | 8 | [model](https://download.openmmlab.com/mmediting/inpainting/deepfillv1/deepfillv1_256x256_8x2_places_20200619-c00a0e21.pth) \| [log](https://download.openmmlab.com/mmediting/inpainting/deepfillv1/deepfillv1_256x256_8x2_places_20200619-c00a0e21.log.json) | +| Method | Mask Type | Resolution | Train Iters | Test Set | l1 error | PSNR | SSIM | GPU Info | Download | +| :-----------------------------------------------: | :---------: | :--------: | :---------: | :-----------: | :------: | :----: | :---: | :------: | :-----------------------------------------------------------------------------: | +| [DeepFillv1](./deepfillv1_8xb2_places-256x256.py) | square bbox | 256x256 | 3500k | Places365-val | 11.019 | 23.429 | 0.862 | 8 | [model](https://download.openmmlab.com/mmediting/inpainting/deepfillv1/deepfillv1_256x256_8x2_places_20200619-c00a0e21.pth) \| [log](https://download.openmmlab.com/mmediting/inpainting/deepfillv1/deepfillv1_256x256_8x2_places_20200619-c00a0e21.log.json) | **CelebA-HQ** -| Method | Mask Type | Resolution | Train Iters | Test Set | l1 error | PSNR | SSIM | GPU Info | Download | -| :--------------------------------------------------------------: | :---------: | :--------: | :---------: | :--------: | :------: | :----: | :---: | :------: | :-----------------------------------------------------------------: | -| [DeepFillv1](/configs/deepfillv1/deepfillv1_4xb4_celeba-256x256.py) | square bbox | 256x256 | 1500k | CelebA-val | 6.677 | 26.878 | 0.911 | 4 | [model](https://download.openmmlab.com/mmediting/inpainting/deepfillv1/deepfillv1_256x256_4x4_celeba_20200619-dd51a855.pth) \| [log](https://download.openmmlab.com/mmediting/inpainting/deepfillv1/deepfillv1_256x256_4x4_celeba_20200619-dd51a855.log.json) | +| Method | Mask Type | Resolution | Train Iters | Test Set | l1 error | PSNR | SSIM | GPU Info | Download | +| :-----------------------------------------------: | :---------: | :--------: | :---------: | :--------: | :------: | :----: | :---: | :------: | :--------------------------------------------------------------------------------: | +| [DeepFillv1](./deepfillv1_4xb4_celeba-256x256.py) | square bbox | 256x256 | 1500k | CelebA-val | 6.677 | 26.878 | 0.911 | 4 | [model](https://download.openmmlab.com/mmediting/inpainting/deepfillv1/deepfillv1_256x256_4x4_celeba_20200619-dd51a855.pth) \| [log](https://download.openmmlab.com/mmediting/inpainting/deepfillv1/deepfillv1_256x256_4x4_celeba_20200619-dd51a855.log.json) | ## Quick Start diff --git a/configs/deepfillv1/README_zh-CN.md b/configs/deepfillv1/README_zh-CN.md index 273a29ac0a..db7625e8ba 100644 --- a/configs/deepfillv1/README_zh-CN.md +++ b/configs/deepfillv1/README_zh-CN.md @@ -23,15 +23,15 @@ **Places365-Challenge** -| 算法 | 掩膜类型 | 分辨率 | 训练集容量 | 测试集 | l1 损失 | PSNR | SSIM | GPU 信息 | 下载 | -| :----------------------------------------------------------------: | :---------: | :-----: | :--------: | :-----------: | :-----: | :----: | :---: | :------: | :-----------------------------------------------------------------: | -| [DeepFillv1](/configs/deepfillv1/deepfillv1_8xb2_places-256x256.py) | square bbox | 256x256 | 3500k | Places365-val | 11.019 | 23.429 | 0.862 | 8 | [模型](https://download.openmmlab.com/mmediting/inpainting/deepfillv1/deepfillv1_256x256_8x2_places_20200619-c00a0e21.pth) \| [日志](https://download.openmmlab.com/mmediting/inpainting/deepfillv1/deepfillv1_256x256_8x2_places_20200619-c00a0e21.log.json) | +| 算法 | 掩膜类型 | 分辨率 | 训练集容量 | 测试集 | l1 损失 | PSNR | SSIM | GPU 信息 | 下载 | +| :-----------------------------------------------: | :---------: | :-----: | :--------: | :-----------: | :-----: | :----: | :---: | :------: | :----------------------------------------------------------------------------------: | +| [DeepFillv1](./deepfillv1_8xb2_places-256x256.py) | square bbox | 256x256 | 3500k | Places365-val | 11.019 | 23.429 | 0.862 | 8 | [模型](https://download.openmmlab.com/mmediting/inpainting/deepfillv1/deepfillv1_256x256_8x2_places_20200619-c00a0e21.pth) \| [日志](https://download.openmmlab.com/mmediting/inpainting/deepfillv1/deepfillv1_256x256_8x2_places_20200619-c00a0e21.log.json) | **CelebA-HQ** -| 算法 | 掩膜类型 | 分辨率 | 训练集容量 | 测试集 | l1 损失 | PSNR | SSIM | GPU 信息 | 下载 | -| :-----------------------------------------------------------------: | :---------: | :-----: | :--------: | :--------: | :-----: | :----: | :---: | :------: | :-------------------------------------------------------------------: | -| [DeepFillv1](/configs/deepfillv1/deepfillv1_4xb4_celeba-256x256.py) | square bbox | 256x256 | 1500k | CelebA-val | 6.677 | 26.878 | 0.911 | 4 | [模型](https://download.openmmlab.com/mmediting/inpainting/deepfillv1/deepfillv1_256x256_4x4_celeba_20200619-dd51a855.pth) \| [日志](https://download.openmmlab.com/mmediting/inpainting/deepfillv1/deepfillv1_256x256_4x4_celeba_20200619-dd51a855.log.json) | +| 算法 | 掩膜类型 | 分辨率 | 训练集容量 | 测试集 | l1 损失 | PSNR | SSIM | GPU 信息 | 下载 | +| :-----------------------------------------------: | :---------: | :-----: | :--------: | :--------: | :-----: | :----: | :---: | :------: | :-------------------------------------------------------------------------------------: | +| [DeepFillv1](./deepfillv1_4xb4_celeba-256x256.py) | square bbox | 256x256 | 1500k | CelebA-val | 6.677 | 26.878 | 0.911 | 4 | [模型](https://download.openmmlab.com/mmediting/inpainting/deepfillv1/deepfillv1_256x256_4x4_celeba_20200619-dd51a855.pth) \| [日志](https://download.openmmlab.com/mmediting/inpainting/deepfillv1/deepfillv1_256x256_4x4_celeba_20200619-dd51a855.log.json) | ## 快速开始 diff --git a/configs/deepfillv2/README.md b/configs/deepfillv2/README.md index dce7150cb5..096bb2f16c 100644 --- a/configs/deepfillv2/README.md +++ b/configs/deepfillv2/README.md @@ -22,15 +22,15 @@ We present a generative image inpainting system to complete images with free-for **Places365-Challenge** -| Method | Mask Type | Resolution | Train Iters | Test Set | l1 error | PSNR | SSIM | GPU Info | Download | -| :--------------------------------------------------------------: | :-------: | :--------: | :---------: | :-----------: | :------: | :----: | :---: | :------: | :----------------------------------------------------------------: | -| [DeepFillv2](/configs/deepfillv2/deepfillv2_8xb2_places-256x256.py) | free-form | 256x256 | 100k | Places365-val | 8.635 | 22.398 | 0.815 | 8 | [model](https://download.openmmlab.com/mmediting/inpainting/deepfillv2/deepfillv2_256x256_8x2_places_20200619-10d15793.pth) \| [log](https://download.openmmlab.com/mmediting/inpainting/deepfillv2/deepfillv2_256x256_8x2_places_20200619-10d15793.log.json) | +| Method | Mask Type | Resolution | Train Iters | Test Set | l1 error | PSNR | SSIM | GPU Info | Download | +| :-----------------------------------------------: | :-------: | :--------: | :---------: | :-----------: | :------: | :----: | :---: | :------: | :-------------------------------------------------------------------------------: | +| [DeepFillv2](./deepfillv2_8xb2_places-256x256.py) | free-form | 256x256 | 100k | Places365-val | 8.635 | 22.398 | 0.815 | 8 | [model](https://download.openmmlab.com/mmediting/inpainting/deepfillv2/deepfillv2_256x256_8x2_places_20200619-10d15793.pth) \| [log](https://download.openmmlab.com/mmediting/inpainting/deepfillv2/deepfillv2_256x256_8x2_places_20200619-10d15793.log.json) | **CelebA-HQ** -| Method | Mask Type | Resolution | Train Iters | Test Set | l1 error | PSNR | SSIM | GPU Info | Download | -| :---------------------------------------------------------------: | :-------: | :--------: | :---------: | :--------: | :------: | :----: | :---: | :------: | :------------------------------------------------------------------: | -| [DeepFillv2](/configs/deepfillv2/deepfillv2_8xb2_celeba-256x256.py) | free-form | 256x256 | 20k | CelebA-val | 5.411 | 25.721 | 0.871 | 8 | [model](https://download.openmmlab.com/mmediting/inpainting/deepfillv2/deepfillv2_256x256_8x2_celeba_20200619-c96e5f12.pth) \| [log](https://download.openmmlab.com/mmediting/inpainting/deepfillv2/deepfillv2_256x256_8x2_celeba_20200619-c96e5f12.log.json) | +| Method | Mask Type | Resolution | Train Iters | Test Set | l1 error | PSNR | SSIM | GPU Info | Download | +| :-----------------------------------------------: | :-------: | :--------: | :---------: | :--------: | :------: | :----: | :---: | :------: | :----------------------------------------------------------------------------------: | +| [DeepFillv2](./deepfillv2_8xb2_celeba-256x256.py) | free-form | 256x256 | 20k | CelebA-val | 5.411 | 25.721 | 0.871 | 8 | [model](https://download.openmmlab.com/mmediting/inpainting/deepfillv2/deepfillv2_256x256_8x2_celeba_20200619-c96e5f12.pth) \| [log](https://download.openmmlab.com/mmediting/inpainting/deepfillv2/deepfillv2_256x256_8x2_celeba_20200619-c96e5f12.log.json) | ## Quick Start diff --git a/configs/deepfillv2/README_zh-CN.md b/configs/deepfillv2/README_zh-CN.md index 3c71037056..eaa1a31f4a 100644 --- a/configs/deepfillv2/README_zh-CN.md +++ b/configs/deepfillv2/README_zh-CN.md @@ -23,15 +23,15 @@ **Places365-Challenge** -| 算法 | 掩膜类型 | 分辨率 | 训练集容量 | 测试集 | l1 损失 | PSNR | SSIM | GPU 信息 | 下载 | -| :-----------------------------------------------------------------: | :-------: | :-----: | :--------: | :-----------: | :-----: | :----: | :---: | :------: | :------------------------------------------------------------------: | -| [DeepFillv2](/configs/deepfillv2/deepfillv2_8xb2_places-256x256.py) | free-form | 256x256 | 100k | Places365-val | 8.635 | 22.398 | 0.815 | 8 | [模型](https://download.openmmlab.com/mmediting/inpainting/deepfillv2/deepfillv2_256x256_8x2_places_20200619-10d15793.pth) \| [日志](https://download.openmmlab.com/mmediting/inpainting/deepfillv2/deepfillv2_256x256_8x2_places_20200619-10d15793.log.json) | +| 算法 | 掩膜类型 | 分辨率 | 训练集容量 | 测试集 | l1 损失 | PSNR | SSIM | GPU 信息 | 下载 | +| :-----------------------------------------------: | :-------: | :-----: | :--------: | :-----------: | :-----: | :----: | :---: | :------: | :------------------------------------------------------------------------------------: | +| [DeepFillv2](./deepfillv2_8xb2_places-256x256.py) | free-form | 256x256 | 100k | Places365-val | 8.635 | 22.398 | 0.815 | 8 | [模型](https://download.openmmlab.com/mmediting/inpainting/deepfillv2/deepfillv2_256x256_8x2_places_20200619-10d15793.pth) \| [日志](https://download.openmmlab.com/mmediting/inpainting/deepfillv2/deepfillv2_256x256_8x2_places_20200619-10d15793.log.json) | **CelebA-HQ** -| 算法 | 掩膜类型 | 分辨率 | 训练集容量 | 测试集 | l1 损失 | PSNR | SSIM | GPU 信息 | 下载 | -| :-----------------------------------------------------------------: | :-------: | :-----: | :--------: | :--------: | :-----: | :----: | :---: | :------: | :---------------------------------------------------------------------: | -| [DeepFillv2](/configs/deepfillv2/deepfillv2_8xb2_celeba-256x256.py) | free-form | 256x256 | 20k | CelebA-val | 5.411 | 25.721 | 0.871 | 8 | [模型](https://download.openmmlab.com/mmediting/inpainting/deepfillv2/deepfillv2_256x256_8x2_celeba_20200619-c96e5f12.pth) \| [日志](https://download.openmmlab.com/mmediting/inpainting/deepfillv2/deepfillv2_256x256_8x2_celeba_20200619-c96e5f12.log.json) | +| 算法 | 掩膜类型 | 分辨率 | 训练集容量 | 测试集 | l1 损失 | PSNR | SSIM | GPU 信息 | 下载 | +| :-----------------------------------------------: | :-------: | :-----: | :--------: | :--------: | :-----: | :----: | :---: | :------: | :---------------------------------------------------------------------------------------: | +| [DeepFillv2](./deepfillv2_8xb2_celeba-256x256.py) | free-form | 256x256 | 20k | CelebA-val | 5.411 | 25.721 | 0.871 | 8 | [模型](https://download.openmmlab.com/mmediting/inpainting/deepfillv2/deepfillv2_256x256_8x2_celeba_20200619-c96e5f12.pth) \| [日志](https://download.openmmlab.com/mmediting/inpainting/deepfillv2/deepfillv2_256x256_8x2_celeba_20200619-c96e5f12.log.json) | ## 快速开始 diff --git a/configs/dic/README.md b/configs/dic/README.md index 69b808f74b..90215ae6b8 100644 --- a/configs/dic/README.md +++ b/configs/dic/README.md @@ -27,10 +27,10 @@ In the log data of `dic_gan_x8c48b6_g4_150k_CelebAHQ`, DICGAN is verified on the `GPU Info`: GPU information during training. -| Method | scale | PSNR | SSIM | GPU Info | Download | -| :------------------------------------------------------------------------------: | :---: | :-----: | :----: | :-----------------: | :---------------------------------------------------------------------------------: | -| [dic_x8c48b6_g4_150k_CelebAHQ](/configs/dic/dic_x8c48b6_4xb2-150k_celeba-hq.py) | x8 | 25.2319 | 0.7422 | 4 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/restorers/dic/dic_x8c48b6_g4_150k_CelebAHQ_20210611-5d3439ca.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/dic/dic_x8c48b6_g4_150k_CelebAHQ_20210611-5d3439ca.log.json) | -| [dic_gan_x8c48b6_g4_500k_CelebAHQ](/configs/dic/dic_gan-x8c48b6_4xb2-500k_celeba-hq.py) | x8 | 23.6241 | 0.6721 | 4 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/restorers/dic/dic_gan_x8c48b6_g4_500k_CelebAHQ_20210625-3b89a358.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/dic/dic_gan_x8c48b6_g4_500k_CelebAHQ_20210625-3b89a358.log.json) | +| Method | scale | PSNR | SSIM | GPU Info | Download | +| :--------------------------------------------------------------------------: | :---: | :-----: | :----: | :-----------------: | :-------------------------------------------------------------------------------------: | +| [dic_x8c48b6_g4_150k_CelebAHQ](./dic_x8c48b6_4xb2-150k_celeba-hq.py) | x8 | 25.2319 | 0.7422 | 4 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/restorers/dic/dic_x8c48b6_g4_150k_CelebAHQ_20210611-5d3439ca.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/dic/dic_x8c48b6_g4_150k_CelebAHQ_20210611-5d3439ca.log.json) | +| [dic_gan_x8c48b6_g4_500k_CelebAHQ](./dic_gan-x8c48b6_4xb2-500k_celeba-hq.py) | x8 | 23.6241 | 0.6721 | 4 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/restorers/dic/dic_gan_x8c48b6_g4_500k_CelebAHQ_20210625-3b89a358.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/dic/dic_gan_x8c48b6_g4_500k_CelebAHQ_20210625-3b89a358.log.json) | ## Quick Start diff --git a/configs/dic/README_zh-CN.md b/configs/dic/README_zh-CN.md index 8333162f54..74ef56d31b 100644 --- a/configs/dic/README_zh-CN.md +++ b/configs/dic/README_zh-CN.md @@ -29,10 +29,10 @@ `GPU 信息`: 训练过程中的 GPU 信息. -| 算法 | scale | CelebA-HQ | GPU 信息 | 下载 | -| :------------------------------------------------------------------------------: | :---: | :--------------: | :-----------------: | :------------------------------------------------------------------------------: | -| [dic_x8c48b6_g4_150k_CelebAHQ](/configs/dic/dic_x8c48b6_4xb2-150k_celeba-hq.py) | x8 | 25.2319 / 0.7422 | 4 (Tesla PG503-216) | [模型](https://download.openmmlab.com/mmediting/restorers/dic/dic_x8c48b6_g4_150k_CelebAHQ_20210611-5d3439ca.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/dic/dic_x8c48b6_g4_150k_CelebAHQ_20210611-5d3439ca.log.json) | -| [dic_gan_x8c48b6_g4_500k_CelebAHQ](/configs/dic/dic_gan-x8c48b6_4xb2-500k_celeba-hq.py) | x8 | 23.6241 / 0.6721 | 4 (Tesla PG503-216) | [模型](https://download.openmmlab.com/mmediting/restorers/dic/dic_gan_x8c48b6_g4_500k_CelebAHQ_20210625-3b89a358.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/dic/dic_gan_x8c48b6_g4_500k_CelebAHQ_20210625-3b89a358.log.json) | +| 算法 | scale | CelebA-HQ | GPU 信息 | 下载 | +| :--------------------------------------------------------------------------: | :---: | :--------------: | :-----------------: | :----------------------------------------------------------------------------------: | +| [dic_x8c48b6_g4_150k_CelebAHQ](./dic_x8c48b6_4xb2-150k_celeba-hq.py) | x8 | 25.2319 / 0.7422 | 4 (Tesla PG503-216) | [模型](https://download.openmmlab.com/mmediting/restorers/dic/dic_x8c48b6_g4_150k_CelebAHQ_20210611-5d3439ca.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/dic/dic_x8c48b6_g4_150k_CelebAHQ_20210611-5d3439ca.log.json) | +| [dic_gan_x8c48b6_g4_500k_CelebAHQ](./dic_gan-x8c48b6_4xb2-500k_celeba-hq.py) | x8 | 23.6241 / 0.6721 | 4 (Tesla PG503-216) | [模型](https://download.openmmlab.com/mmediting/restorers/dic/dic_gan_x8c48b6_g4_500k_CelebAHQ_20210625-3b89a358.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/dic/dic_gan_x8c48b6_g4_500k_CelebAHQ_20210625-3b89a358.log.json) | ## 快速开始 diff --git a/configs/dim/README.md b/configs/dim/README.md index f2c768d070..283ceef496 100644 --- a/configs/dim/README.md +++ b/configs/dim/README.md @@ -20,13 +20,13 @@ Image matting is a fundamental computer vision problem and has many applications ## Results and models -| Method | SAD | MSE | GRAD | CONN | GPU Info | Download | -| :------------------------------------------------------------------: | :------: | :-------: | :------: | :------: | :------: | :-----------------------------------------------------------------------------------------: | -| stage1 (paper) | 54.6 | 0.017 | 36.7 | 55.3 | - | - | -| stage3 (paper) | **50.4** | **0.014** | 31.0 | 50.8 | - | - | -| [stage1 (our)](/configs/dim/dim_stage1-v16_1xb1-1000k_comp1k.py) | 53.8 | 0.017 | 32.7 | 54.5 | 1 | [model](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage1_v16_1x1_1000k_comp1k_SAD-53.8_20200605_140257-979a420f.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage1_v16_1x1_1000k_comp1k_20200605_140257.log.json) | -| [stage2 (our)](/configs/dim/dim_stage2-v16-pln_1xb1-1000k_comp1k.py) | 52.3 | 0.016 | 29.4 | 52.4 | 1 | [model](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage2_v16_pln_1x1_1000k_comp1k_SAD-52.3_20200607_171909-d83c4775.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage2_v16_pln_1x1_1000k_comp1k_20200607_171909.log.json) | -| [stage3 (our)](/configs/dim/dim_stage3-v16-pln_1xb1-1000k_comp1k.py) | 50.6 | 0.015 | **29.0** | **50.7** | 1 | [model](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_SAD-50.6_20200609_111851-647f24b6.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_20200609_111851.log.json) | +| Method | SAD | MSE | GRAD | CONN | GPU Info | Download | +| :-------------------------------------------------------: | :------: | :-------: | :------: | :------: | :------: | :----------------------------------------------------------------------------------------------------: | +| stage1 (paper) | 54.6 | 0.017 | 36.7 | 55.3 | - | - | +| stage3 (paper) | **50.4** | **0.014** | 31.0 | 50.8 | - | - | +| [stage1 (our)](./dim_stage1-v16_1xb1-1000k_comp1k.py) | 53.8 | 0.017 | 32.7 | 54.5 | 1 | [model](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage1_v16_1x1_1000k_comp1k_SAD-53.8_20200605_140257-979a420f.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage1_v16_1x1_1000k_comp1k_20200605_140257.log.json) | +| [stage2 (our)](./dim_stage2-v16-pln_1xb1-1000k_comp1k.py) | 52.3 | 0.016 | 29.4 | 52.4 | 1 | [model](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage2_v16_pln_1x1_1000k_comp1k_SAD-52.3_20200607_171909-d83c4775.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage2_v16_pln_1x1_1000k_comp1k_20200607_171909.log.json) | +| [stage3 (our)](./dim_stage3-v16-pln_1xb1-1000k_comp1k.py) | 50.6 | 0.015 | **29.0** | **50.7** | 1 | [model](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_SAD-50.6_20200609_111851-647f24b6.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_20200609_111851.log.json) | **NOTE** diff --git a/configs/dim/README_zh-CN.md b/configs/dim/README_zh-CN.md index 4683b3efc0..681b592b66 100644 --- a/configs/dim/README_zh-CN.md +++ b/configs/dim/README_zh-CN.md @@ -21,13 +21,13 @@
-| 算法 | SAD | MSE | GRAD | CONN | GPU 信息 | 下载 | -| :---------------------------------------------------------------------: | :------: | :-------: | :------: | :------: | :------: | :--------------------------------------------------------------------------------------: | -| 第一阶段 (原文) | 54.6 | 0.017 | 36.7 | 55.3 | - | - | -| 第三阶段 (原文) | **50.4** | **0.014** | 31.0 | 50.8 | - | - | -| [第一阶段 (复现)](/configs/dim/dim_stage1-v16_1xb1-1000k_comp1k.py) | 53.8 | 0.017 | 32.7 | 54.5 | 1 | [模型](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage1_v16_1x1_1000k_comp1k_SAD-53.8_20200605_140257-979a420f.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage1_v16_1x1_1000k_comp1k_20200605_140257.log.json) | -| [第二阶段 (复现)](/configs/dim/dim_stage2-v16-pln_1xb1-1000k_comp1k.py) | 52.3 | 0.016 | 29.4 | 52.4 | 1 | [模型](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage2_v16_pln_1x1_1000k_comp1k_SAD-52.3_20200607_171909-d83c4775.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage2_v16_pln_1x1_1000k_comp1k_20200607_171909.log.json) | -| [第三阶段 (复现)](/configs/dim/dim_stage3-v16-pln_1xb1-1000k_comp1k.py) | 50.6 | 0.015 | **29.0** | **50.7** | 1 | [模型](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_SAD-50.6_20200609_111851-647f24b6.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_20200609_111851.log.json) | +| 算法 | SAD | MSE | GRAD | CONN | GPU 信息 | 下载 | +| :----------------------------------------------------------: | :------: | :-------: | :------: | :------: | :------: | :-------------------------------------------------------------------------------------------------: | +| 第一阶段 (原文) | 54.6 | 0.017 | 36.7 | 55.3 | - | - | +| 第三阶段 (原文) | **50.4** | **0.014** | 31.0 | 50.8 | - | - | +| [第一阶段 (复现)](./dim_stage1-v16_1xb1-1000k_comp1k.py) | 53.8 | 0.017 | 32.7 | 54.5 | 1 | [模型](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage1_v16_1x1_1000k_comp1k_SAD-53.8_20200605_140257-979a420f.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage1_v16_1x1_1000k_comp1k_20200605_140257.log.json) | +| [第二阶段 (复现)](./dim_stage2-v16-pln_1xb1-1000k_comp1k.py) | 52.3 | 0.016 | 29.4 | 52.4 | 1 | [模型](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage2_v16_pln_1x1_1000k_comp1k_SAD-52.3_20200607_171909-d83c4775.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage2_v16_pln_1x1_1000k_comp1k_20200607_171909.log.json) | +| [第三阶段 (复现)](./dim_stage3-v16-pln_1xb1-1000k_comp1k.py) | 50.6 | 0.015 | **29.0** | **50.7** | 1 | [模型](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_SAD-50.6_20200609_111851-647f24b6.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_20200609_111851.log.json) | **注** diff --git a/configs/edsr/README.md b/configs/edsr/README.md index b375f49f0d..c49922a093 100644 --- a/configs/edsr/README.md +++ b/configs/edsr/README.md @@ -25,9 +25,9 @@ The metrics are `PSNR / SSIM` . | Method | Set5 PSNR | Set14 PSNR | DIV2K PSNR | Set5 SSIM | Set14 SSIM | DIV2K SSIM | GPU Info | Download | | :----------------------------------------------------------------: | :-------: | :--------: | :--------: | :-------: | :--------: | :--------: | :------: | :------------------------------------------------------------------: | -| [edsr_x2c64b16_1x16_300k_div2k](/configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py) | 35.7592 | 31.4290 | 34.5896 | 0.9372 | 0.8874 | 0.9352 | 1 | [model](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x2c64b16_1x16_300k_div2k_20200604-19fe95ea.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x2c64b16_1x16_300k_div2k_20200604_221933.log.json) | -| [edsr_x3c64b16_1x16_300k_div2k](/configs/edsr/edsr_x3c64b16_1xb16-300k_div2k.py) | 32.3301 | 28.4125 | 30.9154 | 0.8912 | 0.8022 | 0.8711 | 1 | [model](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x3c64b16_1x16_300k_div2k_20200608-36d896f4.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x3c64b16_1x16_300k_div2k_20200608_114850.log.json) | -| [edsr_x4c64b16_1x16_300k_div2k](/configs/edsr/edsr_x4c64b16_1xb16-300k_div2k.py) | 30.2223 | 26.7870 | 28.9675 | 0.8500 | 0.7366 | 0.8172 | 1 | [model](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x4c64b16_1x16_300k_div2k_20200608-3c2af8a3.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x4c64b16_1x16_300k_div2k_20200608_115148.log.json) | +| [edsr_x2c64b16_1x16_300k_div2k](./edsr_x2c64b16_1xb16-300k_div2k.py) | 35.7592 | 31.4290 | 34.5896 | 0.9372 | 0.8874 | 0.9352 | 1 | [model](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x2c64b16_1x16_300k_div2k_20200604-19fe95ea.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x2c64b16_1x16_300k_div2k_20200604_221933.log.json) | +| [edsr_x3c64b16_1x16_300k_div2k](./edsr_x3c64b16_1xb16-300k_div2k.py) | 32.3301 | 28.4125 | 30.9154 | 0.8912 | 0.8022 | 0.8711 | 1 | [model](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x3c64b16_1x16_300k_div2k_20200608-36d896f4.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x3c64b16_1x16_300k_div2k_20200608_114850.log.json) | +| [edsr_x4c64b16_1x16_300k_div2k](./edsr_x4c64b16_1xb16-300k_div2k.py) | 30.2223 | 26.7870 | 28.9675 | 0.8500 | 0.7366 | 0.8172 | 1 | [model](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x4c64b16_1x16_300k_div2k_20200608-3c2af8a3.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x4c64b16_1x16_300k_div2k_20200608_115148.log.json) | ## Quick Start diff --git a/configs/edsr/README_zh-CN.md b/configs/edsr/README_zh-CN.md index 59579d6728..1668c56959 100644 --- a/configs/edsr/README_zh-CN.md +++ b/configs/edsr/README_zh-CN.md @@ -24,11 +24,11 @@ 在 RGB 通道上进行评估,在评估之前裁剪每个边界中的 `scale` 像素。 我们使用 `PSNR` 和 `SSIM` 作为指标。 -| 算法 | Set5 | Set14 | DIV2K | GPU 信息 | 下载 | -| :----------------------------------------------------------------------: | :--------------: | :--------------: | :--------------: | :------: | :----------------------------------------------------------------------: | -| [edsr_x2c64b16_1x16_300k_div2k](/configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py) | 35.7592 / 0.9372 | 31.4290 / 0.8874 | 34.5896 / 0.9352 | 1 | [模型](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x2c64b16_1x16_300k_div2k_20200604-19fe95ea.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x2c64b16_1x16_300k_div2k_20200604_221933.log.json) | -| [edsr_x3c64b16_1x16_300k_div2k](/configs/edsr/edsr_x3c64b16_1xb16-300k_div2k.py) | 32.3301 / 0.8912 | 28.4125 / 0.8022 | 30.9154 / 0.8711 | 1 | [模型](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x3c64b16_1x16_300k_div2k_20200608-36d896f4.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x3c64b16_1x16_300k_div2k_20200608_114850.log.json) | -| [edsr_x4c64b16_1x16_300k_div2k](/configs/edsr/edsr_x4c64b16_1xb16-300k_div2k.py) | 30.2223 / 0.8500 | 26.7870 / 0.7366 | 28.9675 / 0.8172 | 1 | [模型](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x4c64b16_1x16_300k_div2k_20200608-3c2af8a3.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x4c64b16_1x16_300k_div2k_20200608_115148.log.json) | +| 算法 | Set5 | Set14 | DIV2K | GPU 信息 | 下载 | +| :------------------------------------------------------------------: | :--------------: | :--------------: | :--------------: | :------: | :--------------------------------------------------------------------------: | +| [edsr_x2c64b16_1x16_300k_div2k](./edsr_x2c64b16_1xb16-300k_div2k.py) | 35.7592 / 0.9372 | 31.4290 / 0.8874 | 34.5896 / 0.9352 | 1 | [模型](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x2c64b16_1x16_300k_div2k_20200604-19fe95ea.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x2c64b16_1x16_300k_div2k_20200604_221933.log.json) | +| [edsr_x3c64b16_1x16_300k_div2k](./edsr_x3c64b16_1xb16-300k_div2k.py) | 32.3301 / 0.8912 | 28.4125 / 0.8022 | 30.9154 / 0.8711 | 1 | [模型](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x3c64b16_1x16_300k_div2k_20200608-36d896f4.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x3c64b16_1x16_300k_div2k_20200608_114850.log.json) | +| [edsr_x4c64b16_1x16_300k_div2k](./edsr_x4c64b16_1xb16-300k_div2k.py) | 30.2223 / 0.8500 | 26.7870 / 0.7366 | 28.9675 / 0.8172 | 1 | [模型](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x4c64b16_1x16_300k_div2k_20200608-3c2af8a3.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/edsr/edsr_x4c64b16_1x16_300k_div2k_20200608_115148.log.json) | ## 快速开始 diff --git a/configs/edvr/README.md b/configs/edvr/README.md index d0c74c9299..e5de63a3de 100644 --- a/configs/edvr/README.md +++ b/configs/edvr/README.md @@ -25,17 +25,17 @@ The metrics are `PSNR and SSIM` . | Method | PSNR | GPU Info | Download | | :---------------------------------------------------------------------------------: | :-----: | :----------------------: | :------------------------------------------------------------------------------------: | -| [edvrm_wotsa_x4_8x4_600k_reds](/configs/edvr/edvrm_wotsa_8xb4-600k_reds.py) | 30.3430 | 8 | [model](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522_141644.log.json) | -| [edvrm_x4_8x4_600k_reds](/configs/edvr/edvrm_8xb4-600k_reds.py) | 30.4194 | 8 | [model](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_x4_8x4_600k_reds_20210625-e29b71b5.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_x4_8x4_600k_reds_20200622_102544.log.json) | -| [edvrl_wotsa_c128b40_8x8_lr2e-4_600k_reds4](/configs/edvr/edvrl_wotsa-c128b40_8xb8-lr2e-4-600k_reds4.py) | 31.0010 | 8 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_wotsa_c128b40_8x8_lr2e-4_600k_reds4_20211228-d895a769.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_wotsa_c128b40_8x8_lr2e-4_600k_reds4_20211228_144658.log.json) | -| [edvrl_c128b40_8x8_lr2e-4_600k_reds4](/configs/edvr/edvrl_c128b40_8xb8-lr2e-4-600k_reds4.py) | 31.0467 | 8 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_c128b40_8x8_lr2e-4_600k_reds4_20220104-4509865f.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_c128b40_8x8_lr2e-4_600k_reds4_20220104_171823.log.json) | +| [edvrm_wotsa_x4_8x4_600k_reds](./edvrm_wotsa_8xb4-600k_reds.py) | 30.3430 | 8 | [model](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522_141644.log.json) | +| [edvrm_x4_8x4_600k_reds](./edvrm_8xb4-600k_reds.py) | 30.4194 | 8 | [model](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_x4_8x4_600k_reds_20210625-e29b71b5.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_x4_8x4_600k_reds_20200622_102544.log.json) | +| [edvrl_wotsa_c128b40_8x8_lr2e-4_600k_reds4](./edvrl_wotsa-c128b40_8xb8-lr2e-4-600k_reds4.py) | 31.0010 | 8 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_wotsa_c128b40_8x8_lr2e-4_600k_reds4_20211228-d895a769.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_wotsa_c128b40_8x8_lr2e-4_600k_reds4_20211228_144658.log.json) | +| [edvrl_c128b40_8x8_lr2e-4_600k_reds4](./edvrl_c128b40_8xb8-lr2e-4-600k_reds4.py) | 31.0467 | 8 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_c128b40_8x8_lr2e-4_600k_reds4_20220104-4509865f.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_c128b40_8x8_lr2e-4_600k_reds4_20220104_171823.log.json) | | Method | SSIM | GPU Info | Download | | :----------------------------------------------------------------------------------: | :----: | :----------------------: | :------------------------------------------------------------------------------------: | -| [edvrm_wotsa_x4_8x4_600k_reds](/configs/edvr/edvrm_wotsa_8xb4-600k_reds.py) | 0.8664 | 8 | [model](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522_141644.log.json) | -| [edvrm_x4_8x4_600k_reds](/configs/edvr/edvrm_8xb4-600k_reds.py) | 0.8684 | 8 | [model](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_x4_8x4_600k_reds_20210625-e29b71b5.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_x4_8x4_600k_reds_20200622_102544.log.json) | -| [edvrl_wotsa_c128b40_8x8_lr2e-4_600k_reds4](/configs/edvr/edvrl_wotsa-c128b40_8xb8-lr2e-4-600k_reds4.py) | 0.8784 | 8 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_wotsa_c128b40_8x8_lr2e-4_600k_reds4_20211228-d895a769.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_wotsa_c128b40_8x8_lr2e-4_600k_reds4_20211228_144658.log.json) | -| [edvrl_c128b40_8x8_lr2e-4_600k_reds4](/configs/edvr/edvrl_c128b40_8xb8-lr2e-4-600k_reds4.py) | 0.8793 | 8 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_c128b40_8x8_lr2e-4_600k_reds4_20220104-4509865f.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_c128b40_8x8_lr2e-4_600k_reds4_20220104_171823.log.json) | +| [edvrm_wotsa_x4_8x4_600k_reds](./edvrm_wotsa_8xb4-600k_reds.py) | 0.8664 | 8 | [model](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522_141644.log.json) | +| [edvrm_x4_8x4_600k_reds](./edvrm_8xb4-600k_reds.py) | 0.8684 | 8 | [model](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_x4_8x4_600k_reds_20210625-e29b71b5.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_x4_8x4_600k_reds_20200622_102544.log.json) | +| [edvrl_wotsa_c128b40_8x8_lr2e-4_600k_reds4](./edvrl_wotsa-c128b40_8xb8-lr2e-4-600k_reds4.py) | 0.8784 | 8 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_wotsa_c128b40_8x8_lr2e-4_600k_reds4_20211228-d895a769.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_wotsa_c128b40_8x8_lr2e-4_600k_reds4_20211228_144658.log.json) | +| [edvrl_c128b40_8x8_lr2e-4_600k_reds4](./edvrl_c128b40_8xb8-lr2e-4-600k_reds4.py) | 0.8793 | 8 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_c128b40_8x8_lr2e-4_600k_reds4_20220104-4509865f.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_c128b40_8x8_lr2e-4_600k_reds4_20220104_171823.log.json) | ## Quick Start diff --git a/configs/edvr/README_zh-CN.md b/configs/edvr/README_zh-CN.md index d5bdfe52a2..d8d14809d2 100644 --- a/configs/edvr/README_zh-CN.md +++ b/configs/edvr/README_zh-CN.md @@ -26,10 +26,10 @@ | 算法 | REDS4 | GPU 信息 | 下载 | | :------------------------------------------------------------------------------: | :--------------: | :----------------------: | :------------------------------------------------------------------------------: | -| [edvrm_wotsa_x4_8x4_600k_reds](/configs/edvr/edvrm_wotsa_8xb4-600k_reds.py) | 30.3430 / 0.8664 | 8 | [模型](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522_141644.log.json) | -| [edvrm_x4_8x4_600k_reds](/configs/edvr/edvrm_8xb4-600k_reds.py) | 30.4194 / 0.8684 | 8 | [模型](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_x4_8x4_600k_reds_20210625-e29b71b5.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_x4_8x4_600k_reds_20200622_102544.log.json) | -| [edvrl_wotsa_c128b40_8x8_lr2e-4_600k_reds4](/configs/edvr/edvrl_wotsa-c128b40_8xb8-lr2e-4-600k_reds4.py) | 31.0010 / 0.8784 | 8 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_wotsa_c128b40_8x8_lr2e-4_600k_reds4_20211228-d895a769.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_wotsa_c128b40_8x8_lr2e-4_600k_reds4_20211228_144658.log.json) | -| [edvrl_c128b40_8x8_lr2e-4_600k_reds4](/configs/edvr/edvrl_c128b40_8xb8-lr2e-4-600k_reds4.py) | 31.0467 / 0.8793 | 8 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_c128b40_8x8_lr2e-4_600k_reds4_20220104-4509865f.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_c128b40_8x8_lr2e-4_600k_reds4_20220104_171823.log.json) | +| [edvrm_wotsa_x4_8x4_600k_reds](./edvrm_wotsa_8xb4-600k_reds.py) | 30.3430 / 0.8664 | 8 | [模型](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522-0570e567.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_wotsa_x4_8x4_600k_reds_20200522_141644.log.json) | +| [edvrm_x4_8x4_600k_reds](./edvrm_8xb4-600k_reds.py) | 30.4194 / 0.8684 | 8 | [模型](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_x4_8x4_600k_reds_20210625-e29b71b5.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/edvr/edvrm_x4_8x4_600k_reds_20200622_102544.log.json) | +| [edvrl_wotsa_c128b40_8x8_lr2e-4_600k_reds4](./edvrl_wotsa-c128b40_8xb8-lr2e-4-600k_reds4.py) | 31.0010 / 0.8784 | 8 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_wotsa_c128b40_8x8_lr2e-4_600k_reds4_20211228-d895a769.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_wotsa_c128b40_8x8_lr2e-4_600k_reds4_20211228_144658.log.json) | +| [edvrl_c128b40_8x8_lr2e-4_600k_reds4](./edvrl_c128b40_8xb8-lr2e-4-600k_reds4.py) | 31.0467 / 0.8793 | 8 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_c128b40_8x8_lr2e-4_600k_reds4_20220104-4509865f.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/edvr/edvrl_c128b40_8x8_lr2e-4_600k_reds4_20220104_171823.log.json) | ## 快速开始 diff --git a/configs/eg3d/README.md b/configs/eg3d/README.md index a1de6c75f8..7ef79dcf32 100644 --- a/configs/eg3d/README.md +++ b/configs/eg3d/README.md @@ -20,11 +20,11 @@ Unsupervised generation of high-quality multi-view-consistent images and 3D shap ## Results and Models -| Model | Comment | FID50k | FID50k-Camera | Config | Download | -| :----------: | :-------------: | :----: | :-----------: | :---------------------------------------------------------------: | :---------------------------------------------------------------------------------------: | -| ShapeNet-Car | official weight | 5.6573 | 5.2325 | [config](/configs/eg3d/eg3d_cvt-official-rgb_shapenet-128x128.py) | [model](https://download.openmmlab.com/mmediting/eg3d/eg3d_cvt-official-rgb_shapenet-128x128-85757f4d.pth) | -| AFHQ | official weight | 2.9134 | 6.4213 | [config](/configs/eg3d/eg3d_cvt-official-rgb_afhq-512x512.py) | [model](https://download.openmmlab.com/mmediting/eg3d/eg3d_cvt-official-rgb_afhq-512x512-ca1dd7c9.pth) | -| FFHQ | official weight | 4.3076 | 6.4453 | [config](configs/eg3d/eg3d_cvt-official-rgb_ffhq-512x512.py) | [model](https://download.openmmlab.com/mmediting/eg3d/eg3d_cvt-official-rgb_ffhq-512x512-5a0ddcb6.pth) | +| Model | Comment | FID50k | FID50k-Camera | Config | Download | +| :----------: | :-------------: | :----: | :-----------: | :---------------------------------------------------: | :---------------------------------------------------------------------------------------------------: | +| ShapeNet-Car | official weight | 5.6573 | 5.2325 | [config](./eg3d_cvt-official-rgb_shapenet-128x128.py) | [model](https://download.openmmlab.com/mmediting/eg3d/eg3d_cvt-official-rgb_shapenet-128x128-85757f4d.pth) | +| AFHQ | official weight | 2.9134 | 6.4213 | [config](./eg3d_cvt-official-rgb_afhq-512x512.py) | [model](https://download.openmmlab.com/mmediting/eg3d/eg3d_cvt-official-rgb_afhq-512x512-ca1dd7c9.pth) | +| FFHQ | official weight | 4.3076 | 6.4453 | [config](./eg3d_cvt-official-rgb_ffhq-512x512.py) | [model](https://download.openmmlab.com/mmediting/eg3d/eg3d_cvt-official-rgb_ffhq-512x512-5a0ddcb6.pth) | - `FID50k-Camera` denotes image generated with random sampled camera position. - `FID50k` denotes image generated with camera position randomly sampled from the original dataset. @@ -32,7 +32,7 @@ Unsupervised generation of high-quality multi-view-consistent images and 3D shap ### Influence of FP16 All metrics are evaluated under FP32, and it's hard to determine how they will change if we use FP16. -For example, if we use FP16 at the super resolution module in [FFHQ model](/configs/eg3d_ffhq.py), the output images will be slightly blurrier than the ones generated under FP32, but FID (**4.03**) will be better than FP32 ones. +For example, if we use FP16 at the super resolution module in [FFHQ model](./eg3d_cvt-official-rgb_ffhq-512x512.py), the output images will be slightly blurrier than the ones generated under FP32, but FID (**4.03**) will be better than FP32 ones. ## About generate images and videos with High-Level API diff --git a/configs/esrgan/README.md b/configs/esrgan/README.md index dd5f84b783..95af8fead6 100644 --- a/configs/esrgan/README.md +++ b/configs/esrgan/README.md @@ -25,8 +25,8 @@ The metrics are `PSNR / SSIM` . | Method | Set5 PSNR | Set14 PSNR | DIV2K PSNR | Set5 SSIM | Set14 SSIM | DIV2K SSIM | GPU Info | Download | | :----------------------------------------------------------------: | :-------: | :--------: | :--------: | :-------: | :--------: | :--------: | :------: | :------------------------------------------------------------------: | -| [esrgan_psnr_x4c64b23g32_1x16_1000k_div2k](/configs/esrgan/esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py) | 30.6428 | 27.0543 | 29.3354 | 0.8559 | 0.7447 | 0.8263 | 1 | [model](https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_psnr_x4c64b23g32_1x16_1000k_div2k_20200420-bf5c993c.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_psnr_x4c64b23g32_1x16_1000k_div2k_20200420_112550.log.json) | -| [esrgan_x4c64b23g32_1x16_400k_div2k](/configs/esrgan/esrgan_x4c64b23g32_1xb16-400k_div2k.py) | 28.2700 | 24.6328 | 26.6531 | 0.7778 | 0.6491 | 0.7340 | 1 | [model](https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508_191042.log.json) | +| [esrgan_psnr_x4c64b23g32_1x16_1000k_div2k](./esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py) | 30.6428 | 27.0543 | 29.3354 | 0.8559 | 0.7447 | 0.8263 | 1 | [model](https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_psnr_x4c64b23g32_1x16_1000k_div2k_20200420-bf5c993c.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_psnr_x4c64b23g32_1x16_1000k_div2k_20200420_112550.log.json) | +| [esrgan_x4c64b23g32_1x16_400k_div2k](./esrgan_x4c64b23g32_1xb16-400k_div2k.py) | 28.2700 | 24.6328 | 26.6531 | 0.7778 | 0.6491 | 0.7340 | 1 | [model](https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508_191042.log.json) | ## Quick Start diff --git a/configs/esrgan/README_zh-CN.md b/configs/esrgan/README_zh-CN.md index 48ba0ac400..c569397179 100644 --- a/configs/esrgan/README_zh-CN.md +++ b/configs/esrgan/README_zh-CN.md @@ -26,8 +26,8 @@ | 算法 | Set5 | Set14 | DIV2K | GPU 信息 | 下载 | | :---------------------------------------------------------------------: | :---------------: | :--------------: | :--------------: | :------: | :----------------------------------------------------------------------: | -| [esrgan_psnr_x4c64b23g32_1x16_1000k_div2k](/configs/esrgan/esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py) | 30.6428 / 0.8559 | 27.0543 / 0.7447 | 29.3354 / 0.8263 | 1 | [模型](https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_psnr_x4c64b23g32_1x16_1000k_div2k_20200420-bf5c993c.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_psnr_x4c64b23g32_1x16_1000k_div2k_20200420_112550.log.json) | -| [esrgan_x4c64b23g32_1x16_400k_div2k](/configs/esrgan/esrgan_x4c64b23g32_1xb16-400k_div2k.py) | 28.2700 / 0.7778 | 24.6328 / 0.6491 | 26.6531 / 0.7340 | 1 | [模型](https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508_191042.log.json) | +| [esrgan_psnr_x4c64b23g32_1x16_1000k_div2k](./esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py) | 30.6428 / 0.8559 | 27.0543 / 0.7447 | 29.3354 / 0.8263 | 1 | [模型](https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_psnr_x4c64b23g32_1x16_1000k_div2k_20200420-bf5c993c.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_psnr_x4c64b23g32_1x16_1000k_div2k_20200420_112550.log.json) | +| [esrgan_x4c64b23g32_1x16_400k_div2k](./esrgan_x4c64b23g32_1xb16-400k_div2k.py) | 28.2700 / 0.7778 | 24.6328 / 0.6491 | 26.6531 / 0.7340 | 1 | [模型](https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508_191042.log.json) | ## 快速开始 diff --git a/configs/flavr/README.md b/configs/flavr/README.md index b9e1a8c817..453137d8b1 100644 --- a/configs/flavr/README.md +++ b/configs/flavr/README.md @@ -25,7 +25,7 @@ The metrics are `PSNR / SSIM` . | Method | scale | PSNR | SSIM | GPU Info | Download | | :------------------------------------------------------------------------------: | :---: | :-----: | :-----: | :-----------------: | :--------------------------------------------------------------------------------: | -| [flavr_in4out1_g8b4_vimeo90k_septuplet](/configs/flavr/flavr_in4out1_8xb4_vimeo90k-septuplet.py) | x2 | 36.3340 | 0.96015 | 8 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/flavr/flavr_in4out1_g8b4_vimeo90k_septuplet_20220509-c2468995.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/flavr/flavr_in4out1_g8b4_vimeo90k_septuplet_20220509-c2468995.log.json) | +| [flavr_in4out1_g8b4_vimeo90k_septuplet](./flavr_in4out1_8xb4_vimeo90k-septuplet.py) | x2 | 36.3340 | 0.96015 | 8 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/flavr/flavr_in4out1_g8b4_vimeo90k_septuplet_20220509-c2468995.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/flavr/flavr_in4out1_g8b4_vimeo90k_septuplet_20220509-c2468995.log.json) | Note: FLAVR for x8 VFI task will supported in the future. diff --git a/configs/flavr/README_zh-CN.md b/configs/flavr/README_zh-CN.md index 31ff68a917..1ec3783c28 100644 --- a/configs/flavr/README_zh-CN.md +++ b/configs/flavr/README_zh-CN.md @@ -13,7 +13,7 @@ | 算法 | scale | Vimeo90k-triplet | GPU 信息 | 下载 | | :-----------------------------------------------------------------------------: | :---: | :---------------: | :-----------------: | :------------------------------------------------------------------------------: | -| [flavr_in4out1_g8b4_vimeo90k_septuplet](/configs/flavr/flavr_in4out1_8xb4_vimeo90k-septuplet.py) | x2 | 36.3340 / 0.96015 | 8 (Tesla PG503-216) | [模型](https://download.openmmlab.com/mmediting/video_interpolators/flavr/flavr_in4out1_g8b4_vimeo90k_septuplet_20220509-c2468995.pth) \| [日志](https://download.openmmlab.com/mmediting/video_interpolators/flavr/flavr_in4out1_g8b4_vimeo90k_septuplet_20220509-c2468995.log.json) | +| [flavr_in4out1_g8b4_vimeo90k_septuplet](./flavr_in4out1_8xb4_vimeo90k-septuplet.py) | x2 | 36.3340 / 0.96015 | 8 (Tesla PG503-216) | [模型](https://download.openmmlab.com/mmediting/video_interpolators/flavr/flavr_in4out1_g8b4_vimeo90k_septuplet_20220509-c2468995.pth) \| [日志](https://download.openmmlab.com/mmediting/video_interpolators/flavr/flavr_in4out1_g8b4_vimeo90k_septuplet_20220509-c2468995.log.json) | 注:FLAVR 中的 8 倍视频插帧算法将会在未来版本中支持。 diff --git a/configs/gca/README.md b/configs/gca/README.md index 7c8a9b8913..8abbe00c06 100644 --- a/configs/gca/README.md +++ b/configs/gca/README.md @@ -20,19 +20,19 @@ Over the last few years, deep learning based approaches have achieved outstandin ## Results and models -| Method | SAD | MSE | GRAD | CONN | GPU Info | Download | -| :--------------------------------------------------------------: | :-------: | :--------: | :-------: | :-------: | :------: | :-----------------------------------------------------------------------------------------: | -| baseline (paper) | 40.62 | 0.0106 | 21.53 | 38.43 | - | - | -| GCA (paper) | 35.28 | 0.0091 | 16.92 | 32.53 | - | - | -| [baseline (our)](/configs/gca/baseline_r34_4xb10-200k_comp1k.py) | 34.61 | 0.0083 | 16.21 | 32.12 | 4 | [model](https://download.openmmlab.com/mmediting/mattors/gca/baseline_r34_4x10_200k_comp1k_SAD-34.61_20220620-96f85d56.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/gca/baseline_r34_4x10_200k_comp1k_SAD-34.61_20220620-96f85d56.log) | -| [GCA (our)](/configs/gca/gca_r34_4xb10-200k_comp1k.py) | **33.38** | **0.0081** | **14.96** | **30.59** | 4 | [model](https://download.openmmlab.com/mmediting/mattors/gca/gca_r34_4x10_200k_comp1k_SAD-33.38_20220615-65595f39.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/gca/gca_r34_4x10_200k_comp1k_SAD-33.38_20220615-65595f39.log) | +| Method | SAD | MSE | GRAD | CONN | GPU Info | Download | +| :---------------------------------------------------: | :-------: | :--------: | :-------: | :-------: | :------: | :----------------------------------------------------------------------------------------------------: | +| baseline (paper) | 40.62 | 0.0106 | 21.53 | 38.43 | - | - | +| GCA (paper) | 35.28 | 0.0091 | 16.92 | 32.53 | - | - | +| [baseline (our)](./baseline_r34_4xb10-200k_comp1k.py) | 34.61 | 0.0083 | 16.21 | 32.12 | 4 | [model](https://download.openmmlab.com/mmediting/mattors/gca/baseline_r34_4x10_200k_comp1k_SAD-34.61_20220620-96f85d56.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/gca/baseline_r34_4x10_200k_comp1k_SAD-34.61_20220620-96f85d56.log) | +| [GCA (our)](./gca_r34_4xb10-200k_comp1k.py) | **33.38** | **0.0081** | **14.96** | **30.59** | 4 | [model](https://download.openmmlab.com/mmediting/mattors/gca/gca_r34_4x10_200k_comp1k_SAD-33.38_20220615-65595f39.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/gca/gca_r34_4x10_200k_comp1k_SAD-33.38_20220615-65595f39.log) | **More results** -| Method | SAD | MSE | GRAD | CONN | GPU Info | Download | -| :----------------------------------------------------------------------------------: | :---: | :----: | :---: | :---: | :------: | :-------------------------------------------------------------------------------------: | -| [baseline (with DIM pipeline)](/configs/gca/baseline_r34_4xb10-dimaug-200k_comp1k.py) | 49.95 | 0.0144 | 30.21 | 49.67 | 4 | [model](https://download.openmmlab.com/mmediting/mattors/gca/baseline_dimaug_r34_4x10_200k_comp1k_SAD-49.95_20200626_231612-535c9a11.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/gca/baseline_dimaug_r34_4x10_200k_comp1k_20200626_231612.log.json) | -| [GCA (with DIM pipeline)](/configs/gca/gca_r34_4xb10-dimaug-200k_comp1k.py) | 49.42 | 0.0129 | 28.07 | 49.47 | 4 | [model](https://download.openmmlab.com/mmediting/mattors/gca/gca_dimaug_r34_4x10_200k_comp1k_SAD-49.42_20200626_231422-8e9cc127.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/gca/gca_dimaug_r34_4x10_200k_comp1k_20200626_231422.log.json) | +| Method | SAD | MSE | GRAD | CONN | GPU Info | Download | +| :------------------------------------------------------------------------: | :---: | :----: | :---: | :---: | :------: | :-----------------------------------------------------------------------------------------------: | +| [baseline (with DIM pipeline)](./baseline_r34_4xb10-dimaug-200k_comp1k.py) | 49.95 | 0.0144 | 30.21 | 49.67 | 4 | [model](https://download.openmmlab.com/mmediting/mattors/gca/baseline_dimaug_r34_4x10_200k_comp1k_SAD-49.95_20200626_231612-535c9a11.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/gca/baseline_dimaug_r34_4x10_200k_comp1k_20200626_231612.log.json) | +| [GCA (with DIM pipeline)](./gca_r34_4xb10-dimaug-200k_comp1k.py) | 49.42 | 0.0129 | 28.07 | 49.47 | 4 | [model](https://download.openmmlab.com/mmediting/mattors/gca/gca_dimaug_r34_4x10_200k_comp1k_SAD-49.42_20200626_231422-8e9cc127.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/gca/gca_dimaug_r34_4x10_200k_comp1k_20200626_231422.log.json) | ## Quick Start diff --git a/configs/gca/README_zh-CN.md b/configs/gca/README_zh-CN.md index ac7ad9e407..c995d8141b 100644 --- a/configs/gca/README_zh-CN.md +++ b/configs/gca/README_zh-CN.md @@ -20,19 +20,19 @@
-| 算法 | SAD | MSE | GRAD | CONN | GPU 信息 | 下载 | -| :-----------------------------------------------------------: | :-------: | :--------: | :-------: | :-------: | :------: | :--------------------------------------------------------------------------------------------: | -| 基线 (原文) | 40.62 | 0.0106 | 21.53 | 38.43 | - | - | -| GCA (原文) | 35.28 | 0.0091 | 16.92 | 32.53 | - | - | -| [基线 (复现)](/configs/gca/baseline_r34_4xb10-200k_comp1k.py) | 34.61 | 0.0083 | 16.21 | 32.12 | 4 | [模型](https://download.openmmlab.com/mmediting/mattors/gca/baseline_r34_4x10_200k_comp1k_SAD-34.61_20220620-96f85d56.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/gca/baseline_r34_4x10_200k_comp1k_SAD-34.61_20220620-96f85d56.log) | -| [GCA (复现)](/configs/gca/gca_r34_4xb10-200k_comp1k.py) | **33.38** | **0.0081** | **14.96** | **30.59** | 4 | [模型](https://download.openmmlab.com/mmediting/mattors/gca/gca_r34_4x10_200k_comp1k_SAD-33.38_20220615-65595f39.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/gca/gca_r34_4x10_200k_comp1k_SAD-33.38_20220615-65595f39.log) | +| 算法 | SAD | MSE | GRAD | CONN | GPU 信息 | 下载 | +| :------------------------------------------------: | :-------: | :--------: | :-------: | :-------: | :------: | :-------------------------------------------------------------------------------------------------------: | +| 基线 (原文) | 40.62 | 0.0106 | 21.53 | 38.43 | - | - | +| GCA (原文) | 35.28 | 0.0091 | 16.92 | 32.53 | - | - | +| [基线 (复现)](./baseline_r34_4xb10-200k_comp1k.py) | 34.61 | 0.0083 | 16.21 | 32.12 | 4 | [模型](https://download.openmmlab.com/mmediting/mattors/gca/baseline_r34_4x10_200k_comp1k_SAD-34.61_20220620-96f85d56.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/gca/baseline_r34_4x10_200k_comp1k_SAD-34.61_20220620-96f85d56.log) | +| [GCA (复现)](./gca_r34_4xb10-200k_comp1k.py) | **33.38** | **0.0081** | **14.96** | **30.59** | 4 | [模型](https://download.openmmlab.com/mmediting/mattors/gca/gca_r34_4x10_200k_comp1k_SAD-33.38_20220615-65595f39.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/gca/gca_r34_4x10_200k_comp1k_SAD-33.38_20220615-65595f39.log) | **其他结果** -| 算法 | SAD | MSE | GRAD | CONN | GPU 信息 | 下载 | -| :-----------------------------------------------------------------------------: | :---: | :----: | :---: | :---: | :------: | :------------------------------------------------------------------------------------------: | -| [基线 (使用 DIM 流水线)](/configs/gca/baseline_r34_4xb10-dimaug-200k_comp1k.py) | 49.95 | 0.0144 | 30.21 | 49.67 | 4 | [模型](https://download.openmmlab.com/mmediting/mattors/gca/baseline_dimaug_r34_4x10_200k_comp1k_SAD-49.95_20200626_231612-535c9a11.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/gca/baseline_dimaug_r34_4x10_200k_comp1k_20200626_231612.log.json) | -| [GCA (使用 DIM 流水线)](/configs/gca/gca_r34_4xb10-dimaug-200k_comp1k.py) | 49.42 | 0.0129 | 28.07 | 49.47 | 4 | [模型](https://download.openmmlab.com/mmediting/mattors/gca/gca_dimaug_r34_4x10_200k_comp1k_SAD-49.42_20200626_231422-8e9cc127.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/gca/gca_dimaug_r34_4x10_200k_comp1k_20200626_231422.log.json) | +| 算法 | SAD | MSE | GRAD | CONN | GPU 信息 | 下载 | +| :------------------------------------------------------------------: | :---: | :----: | :---: | :---: | :------: | :-----------------------------------------------------------------------------------------------------: | +| [基线 (使用 DIM 流水线)](./baseline_r34_4xb10-dimaug-200k_comp1k.py) | 49.95 | 0.0144 | 30.21 | 49.67 | 4 | [模型](https://download.openmmlab.com/mmediting/mattors/gca/baseline_dimaug_r34_4x10_200k_comp1k_SAD-49.95_20200626_231612-535c9a11.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/gca/baseline_dimaug_r34_4x10_200k_comp1k_20200626_231612.log.json) | +| [GCA (使用 DIM 流水线)](./gca_r34_4xb10-dimaug-200k_comp1k.py) | 49.42 | 0.0129 | 28.07 | 49.47 | 4 | [模型](https://download.openmmlab.com/mmediting/mattors/gca/gca_dimaug_r34_4x10_200k_comp1k_SAD-49.42_20200626_231422-8e9cc127.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/gca/gca_dimaug_r34_4x10_200k_comp1k_20200626_231422.log.json) | ## 快速开始 diff --git a/configs/ggan/README.md b/configs/ggan/README.md index d282f0c258..f09f6062ab 100644 --- a/configs/ggan/README.md +++ b/configs/ggan/README.md @@ -28,9 +28,9 @@ Generative Adversarial Nets (GANs) represent an important milestone for effectiv | Models | Dataset | SWD | MS-SSIM | FID | Config | Download | | :----------: | :------------: | :-----------------------------: | :-----: | :-----: | :-------------------------------------------------------------: | :----------------------------------------------------------------: | -| GGAN 64x64 | CelebA-Cropped | 11.18, 12.21, 39.16/20.85 | 0.3318 | 20.1797 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/ggan/ggan_dcgan-archi_lr1e-3-1xb128-12Mimgs_celeba-cropped-64x64.py) | [model](https://download.openmmlab.com/mmgen/ggan/ggan_celeba-cropped_dcgan-archi_lr-1e-3_64_b128x1_12m.pth) \| [log](https://download.openmmlab.com/mmgen/ggan/ggan_celeba-cropped_dcgan-archi_lr-1e-3_64_b128x1_12m_20210430_113839.log.json) | -| GGAN 128x128 | CelebA-Cropped | 9.81, 11.29, 19.22, 47.79/22.03 | 0.3149 | 18.7647 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/ggan/ggan_dcgan-archi_lr1e-4-1xb64-10Mimgs_celeba-cropped-128x128.py) | [model](https://download.openmmlab.com/mmgen/ggan/ggan_celeba-cropped_dcgan-archi_lr-1e-4_128_b64x1_10m_20210430_143027-516423dc.pth) \| [log](https://download.openmmlab.com/mmgen/ggan/ggan_celeba-cropped_dcgan-archi_lr-1e-4_128_b64x1_10m_20210423_154258.log.json) | -| GGAN 64x64 | LSUN-Bedroom | 9.1, 6.2, 12.27/9.19 | 0.0649 | 39.9261 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/ggan/ggan_lsgan-archi_lr1e-4-1xb128-20Mimgs_lsun-bedroom-64x64.py) | [model](https://download.openmmlab.com/mmgen/ggan/ggan_lsun-bedroom_lsgan_archi_lr-1e-4_64_b128x1_20m_20210430_143114-5d99b76c.pth) \| [log](https://download.openmmlab.com/mmgen/ggan/ggan_lsun-bedroom_lsgan_archi_lr-1e-4_64_b128x1_20m_20210428_202027.log.json) | +| GGAN 64x64 | CelebA-Cropped | 11.18, 12.21, 39.16/20.85 | 0.3318 | 20.1797 | [config](./ggan_dcgan-archi_lr1e-3-1xb128-12Mimgs_celeba-cropped-64x64.py) | [model](https://download.openmmlab.com/mmediting/ggan/ggan_celeba-cropped_dcgan-archi_lr-1e-3_64_b128x1_12m.pth) \| [log](https://download.openmmlab.com/mmediting/ggan/ggan_celeba-cropped_dcgan-archi_lr-1e-3_64_b128x1_12m_20210430_113839.log.json) | +| GGAN 128x128 | CelebA-Cropped | 9.81, 11.29, 19.22, 47.79/22.03 | 0.3149 | 18.7647 | [config](./ggan_dcgan-archi_lr1e-4-1xb64-10Mimgs_celeba-cropped-128x128.py) | [model](https://download.openmmlab.com/mmediting/ggan/ggan_celeba-cropped_dcgan-archi_lr-1e-4_128_b64x1_10m_20210430_143027-516423dc.pth) \| [log](https://download.openmmlab.com/mmediting/ggan/ggan_celeba-cropped_dcgan-archi_lr-1e-4_128_b64x1_10m_20210423_154258.log.json) | +| GGAN 64x64 | LSUN-Bedroom | 9.1, 6.2, 12.27/9.19 | 0.0649 | 39.9261 | [config](./ggan_lsgan-archi_lr1e-4-1xb128-20Mimgs_lsun-bedroom-64x64.py) | [model](https://download.openmmlab.com/mmediting/ggan/ggan_lsun-bedroom_lsgan_archi_lr-1e-4_64_b128x1_20m_20210430_143114-5d99b76c.pth) \| [log](https://download.openmmlab.com/mmediting/ggan/ggan_lsun-bedroom_lsgan_archi_lr-1e-4_64_b128x1_20m_20210428_202027.log.json) | Note: In the original implementation of [GGAN](https://github.com/lim0606/pytorch-geometric-gan), they set `G_iters` to 10. However our framework does not support `G_iters` currently, so we dropped the settings in the original implementation and conducted several experiments with our own settings. We have shown above the experiment results with the lowest `fid` score. \ Original settings and our settings: diff --git a/configs/ggan/metafile.yml b/configs/ggan/metafile.yml index ace7d6e4eb..e545e21b65 100644 --- a/configs/ggan/metafile.yml +++ b/configs/ggan/metafile.yml @@ -18,7 +18,7 @@ Models: FID: 20.1797 MS-SSIM: 0.3318 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/ggan/ggan_celeba-cropped_dcgan-archi_lr-1e-3_64_b128x1_12m.pth + Weights: https://download.openmmlab.com/mmediting/ggan/ggan_celeba-cropped_dcgan-archi_lr-1e-3_64_b128x1_12m.pth - Config: configs/ggan/ggan_dcgan-archi_lr1e-4-1xb64-10Mimgs_celeba-cropped-128x128.py In Collection: GGAN Metadata: @@ -30,7 +30,7 @@ Models: FID: 18.7647 MS-SSIM: 0.3149 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/ggan/ggan_celeba-cropped_dcgan-archi_lr-1e-4_128_b64x1_10m_20210430_143027-516423dc.pth + Weights: https://download.openmmlab.com/mmediting/ggan/ggan_celeba-cropped_dcgan-archi_lr-1e-4_128_b64x1_10m_20210430_143027-516423dc.pth - Config: configs/ggan/ggan_lsgan-archi_lr1e-4-1xb128-20Mimgs_lsun-bedroom-64x64.py In Collection: GGAN Metadata: @@ -42,4 +42,4 @@ Models: FID: 39.9261 MS-SSIM: 0.0649 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/ggan/ggan_lsun-bedroom_lsgan_archi_lr-1e-4_64_b128x1_20m_20210430_143114-5d99b76c.pth + Weights: https://download.openmmlab.com/mmediting/ggan/ggan_lsun-bedroom_lsgan_archi_lr-1e-4_64_b128x1_20m_20210430_143114-5d99b76c.pth diff --git a/configs/glean/README.md b/configs/glean/README.md index 6d881993d0..3da41f7b98 100644 --- a/configs/glean/README.md +++ b/configs/glean/README.md @@ -24,13 +24,13 @@ For the meta info used in training and test, please refer to [here](https://gith | Method | PSNR | GPU Info | Download | | :----------------------------------------------------------------------------------: | :---: | :----------------------: | :-------------------------------------------------------------------------------------: | -| [glean_cat_8x](/configs/glean/glean_x8_2xb8_cat.py) | 23.98 | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/glean/glean_cat_8x_20210614-d3ac8683.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/glean/glean_cat_8x_20210614_145540.log.json) | -| [glean_ffhq_16x](/configs/glean/glean_x16_2xb8_ffhq.py) | 26.91 | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/glean/glean_ffhq_16x_20210527-61a3afad.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/glean/glean_ffhq_16x_20210527_194536.log.json) | -| [glean_cat_16x](/configs/glean/glean_x16_2xb8_cat.py) | 20.88 | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/glean/glean_cat_16x_20210527-68912543.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/glean/glean_cat_16x_20210527_103708.log.json) | -| [glean_in128out1024_4x2_300k_ffhq_celebahq](/configs/glean/glean_in128out1024_4xb2-300k_ffhq-celeba-hq.py) | 27.94 | 4 (Tesla V100-SXM3-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/glean/glean_in128out1024_4x2_300k_ffhq_celebahq_20210812-acbcb04f.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/glean/glean_in128out1024_4x2_300k_ffhq_celebahq_20210812_100549.log.json) | -| [glean_fp16_cat_8x](/configs/glean/glean_x8-fp16_2xb8_cat.py) | - | - | - | -| [glean_fp16_ffhq_16x](/configs/glean/glean_x16-fp16_2xb8_ffhq.py) | - | - | - | -| [glean_fp16_in128out1024_4x2_300k_ffhq_celebahq](/configs/glean/glean_in128out1024-fp16_4xb2-300k_ffhq-celeba-hq.py) | - | - | - | +| [glean_cat_8x](./glean_x8_2xb8_cat.py) | 23.98 | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/glean/glean_cat_8x_20210614-d3ac8683.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/glean/glean_cat_8x_20210614_145540.log.json) | +| [glean_ffhq_16x](./glean_x16_2xb8_ffhq.py) | 26.91 | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/glean/glean_ffhq_16x_20210527-61a3afad.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/glean/glean_ffhq_16x_20210527_194536.log.json) | +| [glean_cat_16x](./glean_x16_2xb8_cat.py) | 20.88 | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/glean/glean_cat_16x_20210527-68912543.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/glean/glean_cat_16x_20210527_103708.log.json) | +| [glean_in128out1024_4x2_300k_ffhq_celebahq](./glean_in128out1024_4xb2-300k_ffhq-celeba-hq.py) | 27.94 | 4 (Tesla V100-SXM3-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/glean/glean_in128out1024_4x2_300k_ffhq_celebahq_20210812-acbcb04f.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/glean/glean_in128out1024_4x2_300k_ffhq_celebahq_20210812_100549.log.json) | +| [glean_fp16_cat_8x](./glean_x8-fp16_2xb8_cat.py) | - | - | - | +| [glean_fp16_ffhq_16x](./glean_x16-fp16_2xb8_ffhq.py) | - | - | - | +| [glean_fp16_in128out1024_4x2_300k_ffhq_celebahq](./glean_in128out1024-fp16_4xb2-300k_ffhq-celeba-hq.py) | - | - | - | ## Quick Start diff --git a/configs/glean/README_zh-CN.md b/configs/glean/README_zh-CN.md index 2d47a7c713..3bd66eb8ce 100644 --- a/configs/glean/README_zh-CN.md +++ b/configs/glean/README_zh-CN.md @@ -24,13 +24,13 @@ | 算法 | PSNR | GPU 信息 | 下载 | | :-----------------------------------------------------------------------------------: | :---: | :----------------------: | :------------------------------------------------------------------------------------: | -| [glean_cat_8x](/configs/glean/glean_x8_2xb8_cat.py) | 23.98 | 2 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/glean/glean_cat_8x_20210614-d3ac8683.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/glean/glean_cat_8x_20210614_145540.log.json) | -| [glean_ffhq_16x](/configs/glean/glean_x16_2xb8_ffhq.py) | 26.91 | 2 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/glean/glean_ffhq_16x_20210527-61a3afad.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/glean/glean_ffhq_16x_20210527_194536.log.json) | -| [glean_cat_16x](/configs/glean/glean_x16_2xb8_cat.py) | 20.88 | 2 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/glean/glean_cat_16x_20210527-68912543.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/glean/glean_cat_16x_20210527_103708.log.json) | -| [glean_in128out1024_4x2_300k_ffhq_celebahq](/configs/glean/glean_in128out1024_4xb2-300k_ffhq-celeba-hq.py) | 27.94 | 4 (Tesla V100-SXM3-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/glean/glean_in128out1024_4x2_300k_ffhq_celebahq_20210812-acbcb04f.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/glean/glean_in128out1024_4x2_300k_ffhq_celebahq_20210812_100549.log.json) | -| [glean_fp16_cat_8x](/configs/glean/glean_x8-fp16_2xb8_cat.py) | - | - | - | -| [glean_fp16_ffhq_16x](/configs/glean/glean_x16-fp16_2xb8_ffhq.py) | - | - | - | -| [glean_fp16_in128out1024_4x2_300k_ffhq_celebahq](/configs/glean/glean_in128out1024-fp16_4xb2-300k_ffhq-celeba-hq.py) | - | - | - | +| [glean_cat_8x](./glean_x8_2xb8_cat.py) | 23.98 | 2 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/glean/glean_cat_8x_20210614-d3ac8683.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/glean/glean_cat_8x_20210614_145540.log.json) | +| [glean_ffhq_16x](./glean_x16_2xb8_ffhq.py) | 26.91 | 2 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/glean/glean_ffhq_16x_20210527-61a3afad.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/glean/glean_ffhq_16x_20210527_194536.log.json) | +| [glean_cat_16x](./glean_x16_2xb8_cat.py) | 20.88 | 2 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/glean/glean_cat_16x_20210527-68912543.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/glean/glean_cat_16x_20210527_103708.log.json) | +| [glean_in128out1024_4x2_300k_ffhq_celebahq](./glean_in128out1024_4xb2-300k_ffhq-celeba-hq.py) | 27.94 | 4 (Tesla V100-SXM3-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/glean/glean_in128out1024_4x2_300k_ffhq_celebahq_20210812-acbcb04f.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/glean/glean_in128out1024_4x2_300k_ffhq_celebahq_20210812_100549.log.json) | +| [glean_fp16_cat_8x](./glean_x8-fp16_2xb8_cat.py) | - | - | - | +| [glean_fp16_ffhq_16x](./glean_x16-fp16_2xb8_ffhq.py) | - | - | - | +| [glean_fp16_in128out1024_4x2_300k_ffhq_celebahq](./glean_in128out1024-fp16_4xb2-300k_ffhq-celeba-hq.py) | - | - | - | ## 快速开始 diff --git a/configs/glean/glean_in128out1024_4xb2-300k_ffhq-celeba-hq.py b/configs/glean/glean_in128out1024_4xb2-300k_ffhq-celeba-hq.py index 2ecea3757d..ace9f0e59f 100644 --- a/configs/glean/glean_in128out1024_4xb2-300k_ffhq-celeba-hq.py +++ b/configs/glean/glean_in128out1024_4xb2-300k_ffhq-celeba-hq.py @@ -15,7 +15,7 @@ style_channels=512, init_cfg=dict( type='Pretrained', - checkpoint='http://download.openmmlab.com/mmgen/stylegan2/' + checkpoint='http://download.openmmlab.com/mmediting/stylegan2/' 'official_weights/stylegan2-ffhq-config-f-official_20210327' '_171224-bce9310c.pth', prefix='generator_ema')), @@ -24,7 +24,7 @@ in_size=1024, init_cfg=dict( type='Pretrained', - checkpoint='http://download.openmmlab.com/mmgen/stylegan2/' + checkpoint='http://download.openmmlab.com/mmediting/stylegan2/' 'official_weights/stylegan2-ffhq-config-f-official_20210327' '_171224-bce9310c.pth', prefix='discriminator')), diff --git a/configs/glean/glean_x16_2xb8_cat.py b/configs/glean/glean_x16_2xb8_cat.py index 601de1c61e..c90e673b59 100644 --- a/configs/glean/glean_x16_2xb8_cat.py +++ b/configs/glean/glean_x16_2xb8_cat.py @@ -15,7 +15,7 @@ style_channels=512, init_cfg=dict( type='Pretrained', - checkpoint='http://download.openmmlab.com/mmgen/stylegan2/' + checkpoint='http://download.openmmlab.com/mmediting/stylegan2/' 'official_weights/stylegan2-cat-config-f-official_20210327' '_172444-15bc485b.pth', prefix='generator_ema')), @@ -24,7 +24,7 @@ in_size=256, init_cfg=dict( type='Pretrained', - checkpoint='http://download.openmmlab.com/mmgen/stylegan2/' + checkpoint='http://download.openmmlab.com/mmediting/stylegan2/' 'official_weights/stylegan2-cat-config-f-official_20210327' '_172444-15bc485b.pth', prefix='discriminator')), diff --git a/configs/glean/glean_x16_2xb8_ffhq.py b/configs/glean/glean_x16_2xb8_ffhq.py index 84d4d70205..cdd902b8da 100644 --- a/configs/glean/glean_x16_2xb8_ffhq.py +++ b/configs/glean/glean_x16_2xb8_ffhq.py @@ -15,7 +15,7 @@ style_channels=512, init_cfg=dict( type='Pretrained', - checkpoint='http://download.openmmlab.com/mmgen/stylegan2/' + checkpoint='http://download.openmmlab.com/mmediting/stylegan2/' 'official_weights/stylegan2-ffhq-config-f-official_20210327' '_171224-bce9310c.pth', prefix='generator_ema')), @@ -24,7 +24,7 @@ in_size=1024, init_cfg=dict( type='Pretrained', - checkpoint='http://download.openmmlab.com/mmgen/stylegan2/' + checkpoint='http://download.openmmlab.com/mmediting/stylegan2/' 'official_weights/stylegan2-ffhq-config-f-official_20210327' '_171224-bce9310c.pth', prefix='discriminator')), diff --git a/configs/glean/glean_x8_2xb8_cat.py b/configs/glean/glean_x8_2xb8_cat.py index 50023da0e6..e0d501f940 100644 --- a/configs/glean/glean_x8_2xb8_cat.py +++ b/configs/glean/glean_x8_2xb8_cat.py @@ -15,7 +15,7 @@ style_channels=512, init_cfg=dict( type='Pretrained', - checkpoint='http://download.openmmlab.com/mmgen/stylegan2/' + checkpoint='http://download.openmmlab.com/mmediting/stylegan2/' 'official_weights/stylegan2-cat-config-f-official_20210327' '_172444-15bc485b.pth', prefix='generator_ema')), @@ -24,7 +24,7 @@ in_size=256, init_cfg=dict( type='Pretrained', - checkpoint='http://download.openmmlab.com/mmgen/stylegan2/' + checkpoint='http://download.openmmlab.com/mmediting/stylegan2/' 'official_weights/stylegan2-cat-config-f-official_20210327' '_172444-15bc485b.pth', prefix='discriminator')), diff --git a/configs/global_local/README.md b/configs/global_local/README.md index 62067e062e..210ce5b732 100644 --- a/configs/global_local/README.md +++ b/configs/global_local/README.md @@ -24,15 +24,15 @@ We present a novel approach for image completion that results in images that are **Places365-Challenge** -| Method | Mask Type | Resolution | Train Iters | Test Set | l1 error | PSNR | SSIM | GPU Info | Download | -| :-------------------------------------------------------------: | :---------: | :--------: | :---------: | :-----------: | :------: | :----: | :---: | :------: | :---------------------------------------------------------------: | -| [Global&Local](/configs/global_local/gl_8xb12_places-256x256.py) | square bbox | 256x256 | 500k | Places365-val | 11.164 | 23.152 | 0.862 | 8 | [model](https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_places_20200619-52a040a8.pth) \| [log](https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_places_20200619-52a040a8.log.json) | +| Method | Mask Type | Resolution | Train Iters | Test Set | l1 error | PSNR | SSIM | GPU Info | Download | +| :------------------------------------------: | :---------: | :--------: | :---------: | :-----------: | :------: | :----: | :---: | :------: | :----------------------------------------------------------------------------------: | +| [Global&Local](./gl_8xb12_places-256x256.py) | square bbox | 256x256 | 500k | Places365-val | 11.164 | 23.152 | 0.862 | 8 | [model](https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_places_20200619-52a040a8.pth) \| [log](https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_places_20200619-52a040a8.log.json) | **CelebA-HQ** -| Method | Mask Type | Resolution | Train Iters | Test Set | l1 error | PSNR | SSIM | GPU Info | Download | -| :--------------------------------------------------------------: | :---------: | :--------: | :---------: | :--------: | :------: | :----: | :---: | :------: | :-----------------------------------------------------------------: | -| [Global&Local](/configs/global_local/gl_8xb12_celeba-256x256.py) | square bbox | 256x256 | 500k | CelebA-val | 6.678 | 26.780 | 0.904 | 8 | [model](https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_celeba_20200619-5af0493f.pth) \| [log](https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_celeba_20200619-5af0493f.log.json) | +| Method | Mask Type | Resolution | Train Iters | Test Set | l1 error | PSNR | SSIM | GPU Info | Download | +| :------------------------------------------: | :---------: | :--------: | :---------: | :--------: | :------: | :----: | :---: | :------: | :-------------------------------------------------------------------------------------: | +| [Global&Local](./gl_8xb12_celeba-256x256.py) | square bbox | 256x256 | 500k | CelebA-val | 6.678 | 26.780 | 0.904 | 8 | [model](https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_celeba_20200619-5af0493f.pth) \| [log](https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_celeba_20200619-5af0493f.log.json) | ## Quick Start diff --git a/configs/global_local/README_zh-CN.md b/configs/global_local/README_zh-CN.md index 3836593023..827227a03e 100644 --- a/configs/global_local/README_zh-CN.md +++ b/configs/global_local/README_zh-CN.md @@ -28,15 +28,15 @@ **Places365-Challenge** -| 算法 | 掩膜类型 | 分辨率 | 训练集容量 | 测试集 | l1 损失 | PSNR | SSIM | GPU 信息 | 下载 | -| :--------------------------------------------------------------: | :---------: | :-----: | :--------: | :-----------: | :-----: | :----: | :---: | :------: | :-------------------------------------------------------------------: | -| [Global&Local](/configs/global_local/gl_8xb12_places-256x256.py) | square bbox | 256x256 | 500k | Places365-val | 11.164 | 23.152 | 0.862 | 8 | [模型](https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_places_20200619-52a040a8.pth) \| [日志](https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_places_20200619-52a040a8.log.json) | +| 算法 | 掩膜类型 | 分辨率 | 训练集容量 | 测试集 | l1 损失 | PSNR | SSIM | GPU 信息 | 下载 | +| :------------------------------------------: | :---------: | :-----: | :--------: | :-----------: | :-----: | :----: | :---: | :------: | :---------------------------------------------------------------------------------------: | +| [Global&Local](./gl_8xb12_places-256x256.py) | square bbox | 256x256 | 500k | Places365-val | 11.164 | 23.152 | 0.862 | 8 | [模型](https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_places_20200619-52a040a8.pth) \| [日志](https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_places_20200619-52a040a8.log.json) | **CelebA-HQ** -| 算法 | 掩膜类型 | 分辨率 | 训练集容量 | 测试集 | l1 损失 | PSNR | SSIM | GPU 信息 | 下载 | -| :--------------------------------------------------------------: | :---------: | :-----: | :--------: | :--------: | :-----: | :----: | :---: | :------: | :----------------------------------------------------------------------: | -| [Global&Local](/configs/global_local/gl_8xb12_celeba-256x256.py) | square bbox | 256x256 | 500k | CelebA-val | 6.678 | 26.780 | 0.904 | 8 | [模型](https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_celeba_20200619-5af0493f.pth) \| [日志](https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_celeba_20200619-5af0493f.log.json) | +| 算法 | 掩膜类型 | 分辨率 | 训练集容量 | 测试集 | l1 损失 | PSNR | SSIM | GPU 信息 | 下载 | +| :------------------------------------------: | :---------: | :-----: | :--------: | :--------: | :-----: | :----: | :---: | :------: | :------------------------------------------------------------------------------------------: | +| [Global&Local](./gl_8xb12_celeba-256x256.py) | square bbox | 256x256 | 500k | CelebA-val | 6.678 | 26.780 | 0.904 | 8 | [模型](https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_celeba_20200619-5af0493f.pth) \| [日志](https://download.openmmlab.com/mmediting/inpainting/global_local/gl_256x256_8x12_celeba_20200619-5af0493f.log.json) | ## 快速开始 diff --git a/configs/guided_diffusion/README.md b/configs/guided_diffusion/README.md index eb659b8e72..f21407d179 100644 --- a/configs/guided_diffusion/README.md +++ b/configs/guided_diffusion/README.md @@ -22,10 +22,10 @@ We show that diffusion models can achieve image sample quality superior to the c **ImageNet** -| Method | Resolution | Config | Weights | -| ------ | ---------- | ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------- | -| adm-u | 64x64 | [config](configs/guided_diffusion/adm-u_8xb32_imagenet-64x64.py) | [model](https://download.openmmlab.com/mmgen/guided_diffusion/adm-u-cvt-rgb_8xb32_imagenet-64x64-7ff0080b.pth) | -| adm-u | 512x512 | [config](configs/guided_diffusion/adm-u_8xb32_imagenet-512x512.py) | [model](https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmgen/guided_diffusion/adm-u_8xb32_imagenet-512x512-60b381cb.pth) | +| Method | Resolution | Config | Weights | +| ------ | ---------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| adm-u | 64x64 | [config](./adm-u_8xb32_imagenet-64x64.py) | [model](https://download.openmmlab.com/mmediting/guided_diffusion/adm-u-cvt-rgb_8xb32_imagenet-64x64-7ff0080b.pth) | +| adm-u | 512x512 | [config](./adm-u_8xb32_imagenet-512x512.py) | [model](https://download.openmmlab.com/mmediting/guided_diffusion/adm-u_8xb32_imagenet-512x512-60b381cb.pth) | **Note** To support disco diffusion, we support guided diffusion briefly. Complete support of guided diffusion with metrics and test/train logs will come soom! diff --git a/configs/iconvsr/README.md b/configs/iconvsr/README.md index 2925949748..869e49e76a 100644 --- a/configs/iconvsr/README.md +++ b/configs/iconvsr/README.md @@ -25,15 +25,15 @@ The pretrained weights of the IconVSR components can be found here: [SPyNet](htt | Method | REDS4 (BIx4) PSNR (RGB) | Vimeo-90K-T (BIx4) PSNR (Y) | Vid4 (BIx4) PSNR (Y) | UDM10 (BDx4) PSNR (Y) | Vimeo-90K-T (BDx4) PSNR (Y) | Vid4 (BDx4) PSNR (Y) | GPU Info | Download | | :-----------------: | :---------------------: | :-------------------------: | :------------------: | :-------------------: | :-------------------------: | :------------------: | :-------------------: | :--------------------: | -| [iconvsr_reds4](/configs/iconvsr/iconvsr_2xb4_reds4.py) | **31.6926** | 36.4983 | **27.4809** | 35.3377 | 34.4299 | 25.2110 | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_reds4_20210413-9e09d621.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_reds4_20210413_222735.log.json) | -| [iconvsr_vimeo90k_bi](/configs/iconvsr/iconvsr_2xb4_vimeo90k-bi.py) | 30.3452 | **37.3729** | 27.4238 | 34.2595 | 34.5548 | 24.6666 | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bi_20210413-7c7418dc.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bi_20210413_222757.log.json) | -| [iconvsr_vimeo90k_bd](/configs/iconvsr/iconvsr_2xb4_vimeo90k-bd.py) | 29.0150 | 34.6780 | 26.3109 | **40.0640** | **37.7573** | **28.2464** | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bd_20210414-5f38cb34.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bd_20210414_084128.log.json) | +| [iconvsr_reds4](./iconvsr_2xb4_reds4.py) | **31.6926** | 36.4983 | **27.4809** | 35.3377 | 34.4299 | 25.2110 | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_reds4_20210413-9e09d621.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_reds4_20210413_222735.log.json) | +| [iconvsr_vimeo90k_bi](./iconvsr_2xb4_vimeo90k-bi.py) | 30.3452 | **37.3729** | 27.4238 | 34.2595 | 34.5548 | 24.6666 | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bi_20210413-7c7418dc.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bi_20210413_222757.log.json) | +| [iconvsr_vimeo90k_bd](./iconvsr_2xb4_vimeo90k-bd.py) | 29.0150 | 34.6780 | 26.3109 | **40.0640** | **37.7573** | **28.2464** | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bd_20210414-5f38cb34.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bd_20210414_084128.log.json) | | Method | REDS4 (BIx4) SSIM (RGB) | Vimeo-90K-T (BIx4) SSIM (Y) | Vid4 (BIx4) SSIM (Y) | UDM10 (BDx4) SSIM (Y) | Vimeo-90K-T (BDx4) SSIM (Y) | Vid4 (BDx4) SSIM (Y) | GPU Info | Download | | :-----------------: | :---------------------: | :-------------------------: | :------------------: | :-------------------: | :-------------------------: | :------------------: | :-------------------: | :--------------------: | -| [iconvsr_reds4](/configs/iconvsr/iconvsr_2xb4_reds4.py) | **0.8951** | 0.9416 | **0.8354** | 0.9471 | 0.9287 | 0.7732 | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_reds4_20210413-9e09d621.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_reds4_20210413_222735.log.json) | -| [iconvsr_vimeo90k_bi](/configs/iconvsr/iconvsr_2xb4_vimeo90k-bi.py) | 0.8659 | **0.9467** | 0.8297 | 0.9398 | 0.9295 | 0.7491 | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bi_20210413-7c7418dc.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bi_20210413_222757.log.json) | -| [iconvsr_vimeo90k_bd](/configs/iconvsr/iconvsr_2xb4_vimeo90k-bd.py) | 0.8465 | 0.9339 | 0.8028 | **0.9697** | **0.9517** | **0.8612** | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bd_20210414-5f38cb34.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bd_20210414_084128.log.json) | +| [iconvsr_reds4](./iconvsr_2xb4_reds4.py) | **0.8951** | 0.9416 | **0.8354** | 0.9471 | 0.9287 | 0.7732 | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_reds4_20210413-9e09d621.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_reds4_20210413_222735.log.json) | +| [iconvsr_vimeo90k_bi](./iconvsr_2xb4_vimeo90k-bi.py) | 0.8659 | **0.9467** | 0.8297 | 0.9398 | 0.9295 | 0.7491 | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bi_20210413-7c7418dc.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bi_20210413_222757.log.json) | +| [iconvsr_vimeo90k_bd](./iconvsr_2xb4_vimeo90k-bd.py) | 0.8465 | 0.9339 | 0.8028 | **0.9697** | **0.9517** | **0.8612** | 2 (Tesla V100-PCIE-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bd_20210414-5f38cb34.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bd_20210414_084128.log.json) | ## Quick Start diff --git a/configs/iconvsr/README_zh-CN.md b/configs/iconvsr/README_zh-CN.md index 90c21e71c0..02fe20589a 100644 --- a/configs/iconvsr/README_zh-CN.md +++ b/configs/iconvsr/README_zh-CN.md @@ -25,9 +25,9 @@ IconVSR 组件的预训练权重可以在这里找到:[SPyNet](https://downloa | 算法 | REDS4 (BIx4)
PSNR/SSIM (RGB) | Vimeo-90K-T (BIx4)
PSNR/SSIM (Y) | Vid4 (BIx4)
PSNR/SSIM (Y) | UDM10 (BDx4)
PSNR/SSIM (Y) | Vimeo-90K-T (BDx4)
PSNR/SSIM (Y) | Vid4 (BDx4)
PSNR/SSIM (Y) | GPU 信息 | 下载 | | :-: | :-----------------------------: | :---------------------------------: | :--------------------------: | :---------------------------: | :---------------------------------: | :--------------------------: | :-----: | :--: | -| [iconvsr_reds4](/configs/iconvsr/iconvsr_2xb4_reds4.py) | **31.6926/0.8951** | 36.4983/0.9416 | **27.4809/0.8354** | 35.3377/0.9471 | 34.4299/0.9287 | 25.2110/0.7732 | 2 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_reds4_20210413-9e09d621.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_reds4_20210413_222735.log.json) | -| [iconvsr_vimeo90k_bi](/configs/iconvsr/iconvsr_2xb4_vimeo90k-bi.py) | 30.3452/0.8659 | **37.3729/0.9467** | 27.4238/0.8297 | 34.2595/0.9398 | 34.5548/0.9295 | 24.6666/0.7491 | 2 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bi_20210413-7c7418dc.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bi_20210413_222757.log.json) | -| [iconvsr_vimeo90k_bd](/configs/iconvsr/iconvsr_2xb4_vimeo90k-bd.py) | 29.0150/0.8465 | 34.6780/0.9339 | 26.3109/0.8028 | **40.0640/0.9697** | **37.7573/0.9517** | **28.2464/0.8612** | 2 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bd_20210414-5f38cb34.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bd_20210414_084128.log.json) | +| [iconvsr_reds4](./iconvsr_2xb4_reds4.py) | **31.6926/0.8951** | 36.4983/0.9416 | **27.4809/0.8354** | 35.3377/0.9471 | 34.4299/0.9287 | 25.2110/0.7732 | 2 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_reds4_20210413-9e09d621.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_reds4_20210413_222735.log.json) | +| [iconvsr_vimeo90k_bi](./iconvsr_2xb4_vimeo90k-bi.py) | 30.3452/0.8659 | **37.3729/0.9467** | 27.4238/0.8297 | 34.2595/0.9398 | 34.5548/0.9295 | 24.6666/0.7491 | 2 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bi_20210413-7c7418dc.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bi_20210413_222757.log.json) | +| [iconvsr_vimeo90k_bd](./iconvsr_2xb4_vimeo90k-bd.py) | 29.0150/0.8465 | 34.6780/0.9339 | 26.3109/0.8028 | **40.0640/0.9697** | **37.7573/0.9517** | **28.2464/0.8612** | 2 (Tesla V100-PCIE-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bd_20210414-5f38cb34.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/iconvsr/iconvsr_vimeo90k_bd_20210414_084128.log.json) | ## 快速开始 diff --git a/configs/indexnet/README.md b/configs/indexnet/README.md index 6ea2e18e83..2a44aa751e 100644 --- a/configs/indexnet/README.md +++ b/configs/indexnet/README.md @@ -20,18 +20,18 @@ We show that existing upsampling operators can be unified with the notion of the ## Results and models -| Method | SAD | MSE | GRAD | CONN | GPU Info | Download | -| :--------------------------------------------------------------------: | :------: | :-------: | :------: | :------: | :------: | :---------------------------------------------------------------------------------------: | -| M2O DINs (paper) | 45.8 | 0.013 | 25.9 | **43.7** | - | - | -| [M2O DINs (our)](/configs/indexnet/indexnet_mobv2_1xb16-78k_comp1k.py) | **45.6** | **0.012** | **25.5** | 44.8 | 1 | [model](https://download.openmmlab.com/mmediting/mattors/indexnet/indexnet_mobv2_1x16_78k_comp1k_SAD-45.6_20200618_173817-26dd258d.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/indexnet/indexnet_mobv2_1x16_78k_comp1k_20200618_173817.log.json) | +| Method | SAD | MSE | GRAD | CONN | GPU Info | Download | +| :----------------------------------------------------: | :------: | :-------: | :------: | :------: | :------: | :-------------------------------------------------------------------------------------------------------: | +| M2O DINs (paper) | 45.8 | 0.013 | 25.9 | **43.7** | - | - | +| [M2O DINs (our)](./indexnet_mobv2_1xb16-78k_comp1k.py) | **45.6** | **0.012** | **25.5** | 44.8 | 1 | [model](https://download.openmmlab.com/mmediting/mattors/indexnet/indexnet_mobv2_1x16_78k_comp1k_SAD-45.6_20200618_173817-26dd258d.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/indexnet/indexnet_mobv2_1x16_78k_comp1k_20200618_173817.log.json) | > The performance of training (best performance) with different random seeds diverges in a large range. You may need to run several experiments for each setting to obtain the above performance. **More result** -| Method | SAD | MSE | GRAD | CONN | GPU Info | Download | -| :------------------------------------------------------------------------------------: | :--: | :---: | :--: | :--: | :------: | :---------------------------------------------------------------------------------------: | -| [M2O DINs (with DIM pipeline)](/configs/indexnet/indexnet_mobv2-dimaug_1xb16-78k_comp1k.py) | 50.1 | 0.016 | 30.8 | 49.5 | 1 | [model](https://download.openmmlab.com/mmediting/mattors/indexnet/indexnet_dimaug_mobv2_1x16_78k_comp1k_SAD-50.1_20200626_231857-af359436.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/indexnet/indexnet_dimaug_mobv2_1x16_78k_comp1k_20200626_231857.log.json) | +| Method | SAD | MSE | GRAD | CONN | GPU Info | Download | +| :-------------------------------------------------------------------------: | :--: | :---: | :--: | :--: | :------: | :--------------------------------------------------------------------------------------------------: | +| [M2O DINs (with DIM pipeline)](./indexnet_mobv2-dimaug_1xb16-78k_comp1k.py) | 50.1 | 0.016 | 30.8 | 49.5 | 1 | [model](https://download.openmmlab.com/mmediting/mattors/indexnet/indexnet_dimaug_mobv2_1x16_78k_comp1k_SAD-50.1_20200626_231857-af359436.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/indexnet/indexnet_dimaug_mobv2_1x16_78k_comp1k_20200626_231857.log.json) | ## Quick Start diff --git a/configs/indexnet/README_zh-CN.md b/configs/indexnet/README_zh-CN.md index c54e9a6530..3a3ddd6156 100644 --- a/configs/indexnet/README_zh-CN.md +++ b/configs/indexnet/README_zh-CN.md @@ -20,18 +20,18 @@
-| 算法 | SAD | MSE | GRAD | CONN | GPU 信息 | 下载 | -| :---------------------------------------------------------------------: | :------: | :-------: | :------: | :------: | :------: | :--------------------------------------------------------------------------------------: | -| M2O DINs (原文) | 45.8 | 0.013 | 25.9 | **43.7** | - | - | -| [M2O DINs (复现)](/configs/indexnet/indexnet_mobv2_1xb16-78k_comp1k.py) | **45.6** | **0.012** | **25.5** | 44.8 | 1 | [模型](https://download.openmmlab.com/mmediting/mattors/indexnet/indexnet_mobv2_1x16_78k_comp1k_SAD-45.6_20200618_173817-26dd258d.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/indexnet/indexnet_mobv2_1x16_78k_comp1k_20200618_173817.log.json) | +| 算法 | SAD | MSE | GRAD | CONN | GPU 信息 | 下载 | +| :-----------------------------------------------------: | :------: | :-------: | :------: | :------: | :------: | :------------------------------------------------------------------------------------------------------: | +| M2O DINs (原文) | 45.8 | 0.013 | 25.9 | **43.7** | - | - | +| [M2O DINs (复现)](./indexnet_mobv2_1xb16-78k_comp1k.py) | **45.6** | **0.012** | **25.5** | 44.8 | 1 | [模型](https://download.openmmlab.com/mmediting/mattors/indexnet/indexnet_mobv2_1x16_78k_comp1k_SAD-45.6_20200618_173817-26dd258d.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/indexnet/indexnet_mobv2_1x16_78k_comp1k_20200618_173817.log.json) | > The performance of training (best performance) with different random seeds diverges in a large range. You may need to run several experiments for each setting to obtain the above performance. **其他结果** -| 算法 | SAD | MSE | GRAD | CONN | GPU 信息 | 下载 | -| :-------------------------------------------------------------------------------------: | :--: | :---: | :--: | :--: | :------: | :--------------------------------------------------------------------------------------: | -| [M2O DINs (使用 DIM 流水线)](/configs/indexnet/indexnet_mobv2-dimaug_1xb16-78k_comp1k.py) | 50.1 | 0.016 | 30.8 | 49.5 | 1 | [模型](https://download.openmmlab.com/mmediting/mattors/indexnet/indexnet_dimaug_mobv2_1x16_78k_comp1k_SAD-50.1_20200626_231857-af359436.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/indexnet/indexnet_dimaug_mobv2_1x16_78k_comp1k_20200626_231857.log.json) | +| 算法 | SAD | MSE | GRAD | CONN | GPU 信息 | 下载 | +| :-----------------------------------------------------------------------: | :--: | :---: | :--: | :--: | :------: | :----------------------------------------------------------------------------------------------------: | +| [M2O DINs (使用 DIM 流水线)](./indexnet_mobv2-dimaug_1xb16-78k_comp1k.py) | 50.1 | 0.016 | 30.8 | 49.5 | 1 | [模型](https://download.openmmlab.com/mmediting/mattors/indexnet/indexnet_dimaug_mobv2_1x16_78k_comp1k_SAD-50.1_20200626_231857-af359436.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/indexnet/indexnet_dimaug_mobv2_1x16_78k_comp1k_20200626_231857.log.json) | ## 快速开始 diff --git a/configs/inst_colorization/README.md b/configs/inst_colorization/README.md index fdfdfb9e50..cc5a5585e8 100644 --- a/configs/inst_colorization/README.md +++ b/configs/inst_colorization/README.md @@ -20,9 +20,9 @@ Image colorization is inherently an ill-posed problem with multi-modal uncertain ## Results and models -| Method | Download | -| :-------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------: | -| [instance_aware_colorization_officiial](/configs/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256.py) | [model](https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmediting/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256-5b9d4eee.pth) | +| Method | Download | +| :----------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------: | +| [instance_aware_colorization_officiial](./inst-colorizatioon_full_official_cocostuff-256x256.py) | [model](https://download.openmmlab.com/mmediting/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256-5b9d4eee.pth) | ## Quick Start @@ -33,7 +33,7 @@ You can use the following commands to colorize an image. ```shell -python demo/colorization_demo.py configs/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256.py https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmediting/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256-5b9d4eee.pth input.jpg output.jpg +python demo/colorization_demo.py configs/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256.py https://download.openmmlab.com/mmediting/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256-5b9d4eee.pth input.jpg output.jpg ``` For more demos, you can refer to [Tutorial 3: inference with pre-trained models](https://mmediting.readthedocs.io/en/1.x/user_guides/3_inference.html). diff --git a/configs/inst_colorization/README_zh-CN.md b/configs/inst_colorization/README_zh-CN.md index 19e59c64fc..b73dbe46df 100644 --- a/configs/inst_colorization/README_zh-CN.md +++ b/configs/inst_colorization/README_zh-CN.md @@ -20,9 +20,9 @@ Image colorization is inherently an ill-posed problem with multi-modal uncertain ## 结果和模型 -| Method | Download | -| :-------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------: | -| [instance_aware_colorization_officiial](/configs/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256.py) | [model](https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmediting/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256-5b9d4eee.pth) | +| Method | Download | +| :----------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------: | +| [instance_aware_colorization_officiial](./inst-colorizatioon_full_official_cocostuff-256x256.py) | [model](https://download.openmmlab.com/mmediting/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256-5b9d4eee.pth) | ## 快速开始 @@ -32,7 +32,7 @@ Image colorization is inherently an ill-posed problem with multi-modal uncertain 您可以使用以下命令来对一张图像进行上色。 ```shell -python demo/colorization_demo.py configs/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256.py https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmediting/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256-5b9d4eee.pth input.jpg output.jpg +python demo/colorization_demo.py configs/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256.py https://download.openmmlab.com/mmediting/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256-5b9d4eee.pth input.jpg output.jpg ``` 更多细节可以参考 [Tutorial 3: inference with pre-trained models](https://mmediting.readthedocs.io/en/1.x/user_guides/3_inference.html)。 diff --git a/configs/inst_colorization/metafile.yml b/configs/inst_colorization/metafile.yml index eec9463695..eee2d2a606 100644 --- a/configs/inst_colorization/metafile.yml +++ b/configs/inst_colorization/metafile.yml @@ -16,4 +16,4 @@ Models: - Dataset: Others Metrics: {} Task: Colorization - Weights: https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmediting/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256-5b9d4eee.pth + Weights: https://download.openmmlab.com/mmediting/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256-5b9d4eee.pth diff --git a/configs/liif/README.md b/configs/liif/README.md index f19b3940ee..d9d0229bde 100644 --- a/configs/liif/README.md +++ b/configs/liif/README.md @@ -22,13 +22,13 @@ How to represent an image? While the visual world is presented in a continuous m | Method | scale | Set5 PSNR | Set5 SSIM | Set14 PSNR | Set14 SSIM | DIV2K PSNR | DIV2K SSIM | GPU Info | Download | | :-----------------------------------------------------------: | :---: | :-------: | :-------: | :--------: | :--------: | :--------: | :--------: | :----------: | :--------------------------------------------------------------: | -| [liif_edsr_norm_c64b16_g1_1000k_div2k](/configs/liif/liif-edsr-norm_c64b16_1xb16-1000k_div2k.py) | x2 | 35.7131 | 0.9366 | 31.5579 | 0.8889 | 34.6647 | 0.9355 | 1 (TITAN Xp) | [model](https://download.openmmlab.com/mmediting/restorers/liif/liif_edsr_norm_c64b16_g1_1000k_div2k_20210715-ab7ce3fc.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/liif/liif_edsr_norm_c64b16_g1_1000k_div2k_20210715-ab7ce3fc.log.json) | +| [liif_edsr_norm_c64b16_g1_1000k_div2k](./liif-edsr-norm_c64b16_1xb16-1000k_div2k.py) | x2 | 35.7131 | 0.9366 | 31.5579 | 0.8889 | 34.6647 | 0.9355 | 1 (TITAN Xp) | [model](https://download.openmmlab.com/mmediting/restorers/liif/liif_edsr_norm_c64b16_g1_1000k_div2k_20210715-ab7ce3fc.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/liif/liif_edsr_norm_c64b16_g1_1000k_div2k_20210715-ab7ce3fc.log.json) | | △ | x3 | 32.3805 | 0.8915 | 28.4605 | 0.8039 | 30.9808 | 0.8724 | △ | △ | | △ | x4 | 30.2748 | 0.8509 | 26.8415 | 0.7381 | 29.0245 | 0.8187 | △ | △ | | △ | x6 | 27.1187 | 0.7774 | 24.7461 | 0.6444 | 26.7770 | 0.7425 | △ | △ | | △ | x18 | 20.8516 | 0.5406 | 20.0096 | 0.4525 | 22.1987 | 0.5955 | △ | △ | | △ | x30 | 18.8467 | 0.5010 | 18.1321 | 0.3963 | 20.5050 | 0.5577 | △ | △ | -| [liif_rdn_norm_c64b16_g1_1000k_div2k](/configs/liif/liif-rdn-norm_c64b16_1xb16-1000k_div2k.py) | x2 | 35.7874 | 0.9366 | 31.6866 | 0.8896 | 34.7548 | 0.9356 | 1 (TITAN Xp) | [model](https://download.openmmlab.com/mmediting/restorers/liif/liif_rdn_norm_c64b16_g1_1000k_div2k_20210717-22d6fdc8.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/liif/liif_rdn_norm_c64b16_g1_1000k_div2k_20210717-22d6fdc8.log.json) | +| [liif_rdn_norm_c64b16_g1_1000k_div2k](./liif-rdn-norm_c64b16_1xb16-1000k_div2k.py) | x2 | 35.7874 | 0.9366 | 31.6866 | 0.8896 | 34.7548 | 0.9356 | 1 (TITAN Xp) | [model](https://download.openmmlab.com/mmediting/restorers/liif/liif_rdn_norm_c64b16_g1_1000k_div2k_20210717-22d6fdc8.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/liif/liif_rdn_norm_c64b16_g1_1000k_div2k_20210717-22d6fdc8.log.json) | | △ | x3 | 32.4992 | 0.8923 | 28.4905 | 0.8037 | 31.0744 | 0.8731 | △ | △ | | △ | x4 | 30.3835 | 0.8513 | 26.8734 | 0.7373 | 29.1101 | 0.8197 | △ | △ | | △ | x6 | 27.1914 | 0.7751 | 24.7824 | 0.6434 | 26.8693 | 0.7437 | △ | △ | diff --git a/configs/liif/README_zh-CN.md b/configs/liif/README_zh-CN.md index 97fa1da352..e6a21b9e43 100644 --- a/configs/liif/README_zh-CN.md +++ b/configs/liif/README_zh-CN.md @@ -23,13 +23,13 @@ | 算法 | scale | Set5
PSNR / SSIM | Set14
PSNR / SSIM | DIV2K
PSNR / SSIM | GPU 信息 | 下载 | | :-----------------------------------------------------------: | :---: | :-----------------: | :------------------: | :-------------------: | :----------: | :------------------------------------------------------------: | -| [liif_edsr_norm_c64b16_g1_1000k_div2k](/configs/liif/liif-edsr-norm_c64b16_1xb16-1000k_div2k.py) | x2 | 35.7131 / 0.9366 | 31.5579 / 0.8889 | 34.6647 / 0.9355 | 1 (TITAN Xp) | [模型](https://download.openmmlab.com/mmediting/restorers/liif/liif_edsr_norm_c64b16_g1_1000k_div2k_20210715-ab7ce3fc.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/liif/liif_edsr_norm_c64b16_g1_1000k_div2k_20210715-ab7ce3fc.log.json) | +| [liif_edsr_norm_c64b16_g1_1000k_div2k](./liif-edsr-norm_c64b16_1xb16-1000k_div2k.py) | x2 | 35.7131 / 0.9366 | 31.5579 / 0.8889 | 34.6647 / 0.9355 | 1 (TITAN Xp) | [模型](https://download.openmmlab.com/mmediting/restorers/liif/liif_edsr_norm_c64b16_g1_1000k_div2k_20210715-ab7ce3fc.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/liif/liif_edsr_norm_c64b16_g1_1000k_div2k_20210715-ab7ce3fc.log.json) | | △ | x3 | 32.3805 / 0.8915 | 28.4605 / 0.8039 | 30.9808 / 0.8724 | △ | △ | | △ | x4 | 30.2748 / 0.8509 | 26.8415 / 0.7381 | 29.0245 / 0.8187 | △ | △ | | △ | x6 | 27.1187 / 0.7774 | 24.7461 / 0.6444 | 26.7770 / 0.7425 | △ | △ | | △ | x18 | 20.8516 / 0.5406 | 20.0096 / 0.4525 | 22.1987 / 0.5955 | △ | △ | | △ | x30 | 18.8467 / 0.5010 | 18.1321 / 0.3963 | 20.5050 / 0.5577 | △ | △ | -| [liif_rdn_norm_c64b16_g1_1000k_div2k](/configs/liif/liif-rdn-norm_c64b16_1xb16-1000k_div2k.py) | x2 | 35.7874 / 0.9366 | 31.6866 / 0.8896 | 34.7548 / 0.9356 | 1 (TITAN Xp) | [模型](https://download.openmmlab.com/mmediting/restorers/liif/liif_rdn_norm_c64b16_g1_1000k_div2k_20210717-22d6fdc8.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/liif/liif_rdn_norm_c64b16_g1_1000k_div2k_20210717-22d6fdc8.log.json) | +| [liif_rdn_norm_c64b16_g1_1000k_div2k](./liif-rdn-norm_c64b16_1xb16-1000k_div2k.py) | x2 | 35.7874 / 0.9366 | 31.6866 / 0.8896 | 34.7548 / 0.9356 | 1 (TITAN Xp) | [模型](https://download.openmmlab.com/mmediting/restorers/liif/liif_rdn_norm_c64b16_g1_1000k_div2k_20210717-22d6fdc8.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/liif/liif_rdn_norm_c64b16_g1_1000k_div2k_20210717-22d6fdc8.log.json) | | △ | x3 | 32.4992 / 0.8923 | 28.4905 / 0.8037 | 31.0744 / 0.8731 | △ | △ | | △ | x4 | 30.3835 / 0.8513 | 26.8734 / 0.7373 | 29.1101 / 0.8197 | △ | △ | | △ | x6 | 27.1914 / 0.7751 | 24.7824 / 0.6434 | 26.8693 / 0.7437 | △ | △ | @@ -40,7 +40,7 @@ - △ 指同上。 - 这两个配置仅在 _testing pipeline_ 上有所不同。 所以他们使用相同的检查点。 -- 数据根据 [EDSR](/configs/restorers/edsr) 进行正则化。 +- 数据根据 [EDSR](../edsr/README.md) 进行正则化。 - 在 RGB 通道上进行评估,在评估之前裁剪每个边界中的 `scale` 像素。 ## 快速开始 diff --git a/configs/lsgan/README.md b/configs/lsgan/README.md index f0d8626ef4..75a10b5a60 100644 --- a/configs/lsgan/README.md +++ b/configs/lsgan/README.md @@ -28,10 +28,10 @@ Unsupervised learning with generative adversarial networks (GANs) has proven hug | Models | Dataset | SWD | MS-SSIM | FID | Config | Download | | :-----------: | :------------: | :-----------------------------: | :-----: | :-----: | :-------------------------------------------------------------: | :---------------------------------------------------------------: | -| LSGAN 64x64 | CelebA-Cropped | 6.16, 6.83, 37.64/16.87 | 0.3216 | 11.9258 | [config](/configs/lsgan/lsgan_dcgan-archi_lr1e-3-1xb128-12Mimgs_celeba-cropped-64x64.py) | [model](https://download.openmmlab.com/mmgen/lsgan/lsgan_celeba-cropped_dcgan-archi_lr-1e-3_64_b128x1_12m_20210429_144001-92ca1d0d.pth)\| [log](https://download.openmmlab.com/mmgen/lsgan/lsgan_celeba-cropped_dcgan-archi_lr-1e-3_64_b128x1_12m_20210422_131925.log.json) | -| LSGAN 64x64 | LSUN-Bedroom | 5.66, 9.0, 18.6/11.09 | 0.0671 | 30.7390 | [config](/configs/lsgan/lsgan_dcgan-archi_lr1e-4-1xb128-12Mimgs_lsun-bedroom-64x64.py) | [model](https://download.openmmlab.com/mmgen/lsgan/lsgan_lsun-bedroom_dcgan-archi_lr-1e-4_64_b128x1_12m_20210429_144602-ec4ec6bb.pth)\| [log](https://download.openmmlab.com/mmgen/lsgan/lsgan_lsun-bedroom_dcgan-archi_lr-1e-4_64_b128x1_12m_20210423_005020.log.json) | -| LSGAN 128x128 | CelebA-Cropped | 21.66, 9.83, 16.06, 70.76/29.58 | 0.3691 | 38.3752 | [config](/configs/lsgan/lsgan_dcgan-archi_lr1e-4-1xb64-10Mimgs_celeba-cropped-128x128.py) | [model](https://download.openmmlab.com/mmgen/lsgan/lsgan_celeba-cropped_dcgan-archi_lr-1e-4_128_b64x1_10m_20210429_144229-01ba67dc.pth)\| [log](https://download.openmmlab.com/mmgen/lsgan/lsgan_celeba-cropped_dcgan-archi_lr-1e-4_128_b64x1_10m_20210423_132126.log.json) | -| LSGAN 128x128 | LSUN-Bedroom | 19.52, 9.99, 7.48, 14.3/12.82 | 0.0612 | 51.5500 | [config](/configs/lsgan/lsgan_lsgan-archi_lr1e-4-1xb64-10Mimgs_lsun-bedroom-128x128.py) | [model](https://download.openmmlab.com/mmgen/lsgan/lsgan_lsun-bedroom_lsgan-archi_lr-1e-4_128_b64x1_10m_20210429_155605-cf78c0a8.pth)\| [log](https://download.openmmlab.com/mmgen/lsgan/lsgan_lsun-bedroom_lsgan-archi_lr-1e-4_128_b64x1_10m_20210429_142302.log.json) | +| LSGAN 64x64 | CelebA-Cropped | 6.16, 6.83, 37.64/16.87 | 0.3216 | 11.9258 | [config](./lsgan_dcgan-archi_lr1e-3-1xb128-12Mimgs_celeba-cropped-64x64.py) | [model](https://download.openmmlab.com/mmediting/lsgan/lsgan_celeba-cropped_dcgan-archi_lr-1e-3_64_b128x1_12m_20210429_144001-92ca1d0d.pth)\| [log](https://download.openmmlab.com/mmediting/lsgan/lsgan_celeba-cropped_dcgan-archi_lr-1e-3_64_b128x1_12m_20210422_131925.log.json) | +| LSGAN 64x64 | LSUN-Bedroom | 5.66, 9.0, 18.6/11.09 | 0.0671 | 30.7390 | [config](./lsgan_dcgan-archi_lr1e-4-1xb128-12Mimgs_lsun-bedroom-64x64.py) | [model](https://download.openmmlab.com/mmediting/lsgan/lsgan_lsun-bedroom_dcgan-archi_lr-1e-4_64_b128x1_12m_20210429_144602-ec4ec6bb.pth)\| [log](https://download.openmmlab.com/mmediting/lsgan/lsgan_lsun-bedroom_dcgan-archi_lr-1e-4_64_b128x1_12m_20210423_005020.log.json) | +| LSGAN 128x128 | CelebA-Cropped | 21.66, 9.83, 16.06, 70.76/29.58 | 0.3691 | 38.3752 | [config](./lsgan_dcgan-archi_lr1e-4-1xb64-10Mimgs_celeba-cropped-128x128.py) | [model](https://download.openmmlab.com/mmediting/lsgan/lsgan_celeba-cropped_dcgan-archi_lr-1e-4_128_b64x1_10m_20210429_144229-01ba67dc.pth)\| [log](https://download.openmmlab.com/mmediting/lsgan/lsgan_celeba-cropped_dcgan-archi_lr-1e-4_128_b64x1_10m_20210423_132126.log.json) | +| LSGAN 128x128 | LSUN-Bedroom | 19.52, 9.99, 7.48, 14.3/12.82 | 0.0612 | 51.5500 | [config](./lsgan_lsgan-archi_lr1e-4-1xb64-10Mimgs_lsun-bedroom-128x128.py) | [model](https://download.openmmlab.com/mmediting/lsgan/lsgan_lsun-bedroom_lsgan-archi_lr-1e-4_128_b64x1_10m_20210429_155605-cf78c0a8.pth)\| [log](https://download.openmmlab.com/mmediting/lsgan/lsgan_lsun-bedroom_lsgan-archi_lr-1e-4_128_b64x1_10m_20210429_142302.log.json) | ## Citation diff --git a/configs/lsgan/metafile.yml b/configs/lsgan/metafile.yml index 43aa2678b8..d7ce0fc2f5 100644 --- a/configs/lsgan/metafile.yml +++ b/configs/lsgan/metafile.yml @@ -18,7 +18,7 @@ Models: FID: 11.9258 MS-SSIM: 0.3216 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/lsgan/lsgan_celeba-cropped_dcgan-archi_lr-1e-3_64_b128x1_12m_20210429_144001-92ca1d0d.pth + Weights: https://download.openmmlab.com/mmediting/lsgan/lsgan_celeba-cropped_dcgan-archi_lr-1e-3_64_b128x1_12m_20210429_144001-92ca1d0d.pth - Config: configs/lsgan/lsgan_dcgan-archi_lr1e-4-1xb128-12Mimgs_lsun-bedroom-64x64.py In Collection: LSGAN Metadata: @@ -30,7 +30,7 @@ Models: FID: 30.739 MS-SSIM: 0.0671 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/lsgan/lsgan_lsun-bedroom_dcgan-archi_lr-1e-4_64_b128x1_12m_20210429_144602-ec4ec6bb.pth + Weights: https://download.openmmlab.com/mmediting/lsgan/lsgan_lsun-bedroom_dcgan-archi_lr-1e-4_64_b128x1_12m_20210429_144602-ec4ec6bb.pth - Config: configs/lsgan/lsgan_dcgan-archi_lr1e-4-1xb64-10Mimgs_celeba-cropped-128x128.py In Collection: LSGAN Metadata: @@ -42,7 +42,7 @@ Models: FID: 38.3752 MS-SSIM: 0.3691 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/lsgan/lsgan_celeba-cropped_dcgan-archi_lr-1e-4_128_b64x1_10m_20210429_144229-01ba67dc.pth + Weights: https://download.openmmlab.com/mmediting/lsgan/lsgan_celeba-cropped_dcgan-archi_lr-1e-4_128_b64x1_10m_20210429_144229-01ba67dc.pth - Config: configs/lsgan/lsgan_lsgan-archi_lr1e-4-1xb64-10Mimgs_lsun-bedroom-128x128.py In Collection: LSGAN Metadata: @@ -54,4 +54,4 @@ Models: FID: 51.55 MS-SSIM: 0.0612 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/lsgan/lsgan_lsun-bedroom_lsgan-archi_lr-1e-4_128_b64x1_10m_20210429_155605-cf78c0a8.pth + Weights: https://download.openmmlab.com/mmediting/lsgan/lsgan_lsun-bedroom_lsgan-archi_lr-1e-4_128_b64x1_10m_20210429_155605-cf78c0a8.pth diff --git a/configs/nafnet/README.md b/configs/nafnet/README.md index e1ec757413..48e9bc872a 100644 --- a/configs/nafnet/README.md +++ b/configs/nafnet/README.md @@ -22,8 +22,8 @@ Although there have been significant advances in the field of image restoration | Method | image size | PSNR | SSIM | GPU Info | Download | | :-------------------------------------------------------------------------: | :--------: | :--------------: | :------------: | :------: | :---------------------------------------------------------------------------: | -| [nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd](/configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py) | 256X256 | 40.3045(40.3045) | 0.9253(0.9614) | 1 (A100) | [model](https://download.openmmlab.com/mmediting/nafnet/NAFNet-SIDD-midc64.pth) \| log(coming soon) | -| [nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro](/configs/nafnet/nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py) | 1280x720 | 33.7246(33.7103) | 0.9479(0.9668) | 1 (A100) | [model](https://download.openmmlab.com/mmediting/nafnet/NAFNet-GoPro-midc64.pth) \| log(coming soon) | +| [nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd](./nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py) | 256X256 | 40.3045(40.3045) | 0.9253(0.9614) | 1 (A100) | [model](https://download.openmmlab.com/mmediting/nafnet/NAFNet-SIDD-midc64.pth) \| log(coming soon) | +| [nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro](./nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py) | 1280x720 | 33.7246(33.7103) | 0.9479(0.9668) | 1 (A100) | [model](https://download.openmmlab.com/mmediting/nafnet/NAFNet-GoPro-midc64.pth) \| log(coming soon) | Note: @@ -51,7 +51,7 @@ python tools/train.py configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k ./tools/dist_train.sh configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py 8 ``` -For more details, you can refer to **Train a model** part in [train_test.md](/docs/en/user_guides/train_test.md#Train-a-model-in-MMEditing). +For more details, you can refer to **Train a model** part in [train_test.md](../../docs/en/user_guides/train_test.md).
@@ -75,7 +75,7 @@ python tools/test.py configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_ Pretrained checkpoints will come soon. -For more details, you can refer to **Test a pre-trained model** part in [train_test.md](/docs/en/user_guides/train_test.md#Test-a-pre-trained-model-in-MMEditing). +For more details, you can refer to **Test a pre-trained model** part in [train_test.md](../../docs/en/user_guides/train_test.md).
diff --git a/configs/nafnet/README_zh-CN.md b/configs/nafnet/README_zh-CN.md index f9151c2d61..4c337a8864 100644 --- a/configs/nafnet/README_zh-CN.md +++ b/configs/nafnet/README_zh-CN.md @@ -20,8 +20,8 @@ | 方法 | 图片尺寸 | PSNR | SSIM | GPU信息 | 下载 | | :---------------------------------------------------------------------------: | :------: | :--------------: | :------------: | :------: | :---------------------------------------------------------------------------: | -| [nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd](/configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py) | 256X256 | 40.3045(40.3045) | 0.9253(0.9614) | 1 (A100) | [模型](https://download.openmmlab.com/mmediting/nafnet/NAFNet-SIDD-midc64.pth) \| 日志(即将到来) | -| [nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro](/configs/nafnet/nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py) | 1280x720 | 33.7246(33.7103) | 0.9479(0.9668) | 1 (A100) | [模型](https://download.openmmlab.com/mmediting/nafnet/NAFNet-GoPro-midc64.pth) \| 日志(即将到来) | +| [nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd](./nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py) | 256X256 | 40.3045(40.3045) | 0.9253(0.9614) | 1 (A100) | [模型](https://download.openmmlab.com/mmediting/nafnet/NAFNet-SIDD-midc64.pth) \| 日志(即将到来) | +| [nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro](./nafnet_c64eb11128mb1db1111_8xb8-lr1e-3-400k_gopro.py) | 1280x720 | 33.7246(33.7103) | 0.9479(0.9668) | 1 (A100) | [模型](https://download.openmmlab.com/mmediting/nafnet/NAFNet-GoPro-midc64.pth) \| 日志(即将到来) | Note: @@ -49,7 +49,7 @@ python tools/train.py configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k ./tools/dist_train.sh configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py 8 ``` -更多细节可以参考 [train_test.md](/docs/zh_cn/user_guides/train_test.md) 中的 **Train a model** 部分。 +更多细节可以参考 [train_test.md](../../docs/zh_cn/user_guides/train_test.md) 中的 **Train a model** 部分。 @@ -72,6 +72,6 @@ python tools/test.py configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_ ``` 预训练模型未来将会上传,敬请等待。 -更多细节可以参考 [train_test.md](/docs/zh_cn/user_guides/train_test.md) 中的 **Test a pre-trained model** 部分。 +更多细节可以参考 [train_test.md](../../docs/zh_cn/user_guides/train_test.md) 中的 **Test a pre-trained model** 部分。 diff --git a/configs/partial_conv/README.md b/configs/partial_conv/README.md index 0315a12030..9d02a7c33c 100644 --- a/configs/partial_conv/README.md +++ b/configs/partial_conv/README.md @@ -22,17 +22,17 @@ Existing deep learning based image inpainting methods use a standard convolution **Places365-Challenge** -| Method | Mask Type | Resolution | Train Iters | Test Set | l1 error | PSNR | SSIM | GPU Info | Download | -| :--------------------------------------------------------------: | :-------: | :--------: | :---------: | :-----------: | :------: | :----: | :---: | :------: | :----------------------------------------------------------------: | -| [PConv_Stage1](/configs/partial_conv/pconv_stage1_8xb12_places-256x256.py) | free-form | 256x256 | 500k | Places365-val | - | - | - | 8 | - | -| [PConv_Stage2](/configs/partial_conv/pconv_stage2_4xb2_places-256x256.py) | free-form | 256x256 | 500k | Places365-val | 8.776 | 22.762 | 0.801 | 4 | [model](https://download.openmmlab.com/mmediting/inpainting/pconv/pconv_256x256_stage2_4x2_places_20200619-1ffed0e8.pth) \| [log](https://download.openmmlab.com/mmediting/inpainting/pconv/pconv_256x256_stage2_4x2_places_20200619-1ffed0e8.log.json) | +| Method | Mask Type | Resolution | Train Iters | Test Set | l1 error | PSNR | SSIM | GPU Info | Download | +| :----------------------------------------------------: | :-------: | :--------: | :---------: | :-----------: | :------: | :----: | :---: | :------: | :--------------------------------------------------------------------------: | +| [PConv_Stage1](./pconv_stage1_8xb12_places-256x256.py) | free-form | 256x256 | 500k | Places365-val | - | - | - | 8 | - | +| [PConv_Stage2](./pconv_stage2_4xb2_places-256x256.py) | free-form | 256x256 | 500k | Places365-val | 8.776 | 22.762 | 0.801 | 4 | [model](https://download.openmmlab.com/mmediting/inpainting/pconv/pconv_256x256_stage2_4x2_places_20200619-1ffed0e8.pth) \| [log](https://download.openmmlab.com/mmediting/inpainting/pconv/pconv_256x256_stage2_4x2_places_20200619-1ffed0e8.log.json) | **CelebA-HQ** -| Method | Mask Type | Resolution | Train Iters | Test Set | l1 error | PSNR | SSIM | GPU Info | Download | -| :---------------------------------------------------------------: | :-------: | :--------: | :---------: | :--------: | :------: | :----: | :---: | :------: | :------------------------------------------------------------------: | -| [PConv_Stage1](/configs/partial_conv/pconv_stage1_8xb1_celeba-256x256.py) | free-form | 256x256 | 500k | CelebA-val | - | - | - | 8 | - | -| [PConv_Stage2](/configs/partial_conv/pconv_stage2_4xb2_celeba-256x256.py) | free-form | 256x256 | 500k | CelebA-val | 5.990 | 25.404 | 0.853 | 4 | [model](https://download.openmmlab.com/mmediting/inpainting/pconv/pconv_256x256_stage2_4x2_celeba_20200619-860f8b95.pth) \| [log](https://download.openmmlab.com/mmediting/inpainting/pconv/pconv_256x256_stage2_4x2_celeba_20200619-860f8b95.log.json) | +| Method | Mask Type | Resolution | Train Iters | Test Set | l1 error | PSNR | SSIM | GPU Info | Download | +| :---------------------------------------------------: | :-------: | :--------: | :---------: | :--------: | :------: | :----: | :---: | :------: | :------------------------------------------------------------------------------: | +| [PConv_Stage1](./pconv_stage1_8xb1_celeba-256x256.py) | free-form | 256x256 | 500k | CelebA-val | - | - | - | 8 | - | +| [PConv_Stage2](./pconv_stage2_4xb2_celeba-256x256.py) | free-form | 256x256 | 500k | CelebA-val | 5.990 | 25.404 | 0.853 | 4 | [model](https://download.openmmlab.com/mmediting/inpainting/pconv/pconv_256x256_stage2_4x2_celeba_20200619-860f8b95.pth) \| [log](https://download.openmmlab.com/mmediting/inpainting/pconv/pconv_256x256_stage2_4x2_celeba_20200619-860f8b95.log.json) | ## Quick Start diff --git a/configs/partial_conv/README_zh-CN.md b/configs/partial_conv/README_zh-CN.md index dace459583..3f09969a1d 100644 --- a/configs/partial_conv/README_zh-CN.md +++ b/configs/partial_conv/README_zh-CN.md @@ -23,17 +23,17 @@ **Places365-Challenge** -| 算法 | 掩膜类型 | 分辨率 | 训练集容量 | 测试集 | l1 损失 | PSNR | SSIM | GPU 信息 | 下载 | -| :-----------------------------------------------------------------: | :-------: | :-----: | :--------: | :-----------: | :-----: | :----: | :---: | :------: | :------------------------------------------------------------------: | -| [PConv_Stage1](/configs/partial_conv/pconv_stage1_8xb12_places-256x256.py) | free-form | 256x256 | 500k | Places365-val | - | - | - | 8 | - | -| [PConv_Stage2](/configs/partial_conv/pconv_stage2_4xb2_places-256x256.py) | free-form | 256x256 | 500k | Places365-val | 8.776 | 22.762 | 0.801 | 4 | [模型](https://download.openmmlab.com/mmediting/inpainting/pconv/pconv_256x256_stage2_4x2_places_20200619-1ffed0e8.pth) \| [日志](https://download.openmmlab.com/mmediting/inpainting/pconv/pconv_256x256_stage2_4x2_places_20200619-1ffed0e8.log.json) | +| 算法 | 掩膜类型 | 分辨率 | 训练集容量 | 测试集 | l1 损失 | PSNR | SSIM | GPU 信息 | 下载 | +| :----------------------------------------------------: | :-------: | :-----: | :--------: | :-----------: | :-----: | :----: | :---: | :------: | :-------------------------------------------------------------------------------: | +| [PConv_Stage1](./pconv_stage1_8xb12_places-256x256.py) | free-form | 256x256 | 500k | Places365-val | - | - | - | 8 | - | +| [PConv_Stage2](./pconv_stage2_4xb2_places-256x256.py) | free-form | 256x256 | 500k | Places365-val | 8.776 | 22.762 | 0.801 | 4 | [模型](https://download.openmmlab.com/mmediting/inpainting/pconv/pconv_256x256_stage2_4x2_places_20200619-1ffed0e8.pth) \| [日志](https://download.openmmlab.com/mmediting/inpainting/pconv/pconv_256x256_stage2_4x2_places_20200619-1ffed0e8.log.json) | **CelebA-HQ** -| 算法 | 掩膜类型 | 分辨率 | 训练集容量 | 测试集 | l1 损失 | PSNR | SSIM | GPU 信息 | 下载 | -| :-------------------------------------------------------------------: | :-------: | :-----: | :--------: | :--------: | :-----: | :----: | :---: | :------: | :-------------------------------------------------------------------: | -| [PConv_Stage1](/configs/partial_conv/pconv_stage1_8xb1_celeba-256x256.py) | free-form | 256x256 | 500k | CelebA-val | - | - | - | 8 | - | -| [PConv_Stage2](/configs/partial_conv/pconv_stage2_4xb2_celeba-256x256.py) | free-form | 256x256 | 500k | CelebA-val | 5.990 | 25.404 | 0.853 | 4 | [模型](https://download.openmmlab.com/mmediting/inpainting/pconv/pconv_256x256_stage2_4x2_celeba_20200619-860f8b95.pth) \| [日志](https://download.openmmlab.com/mmediting/inpainting/pconv/pconv_256x256_stage2_4x2_celeba_20200619-860f8b95.log.json) | +| 算法 | 掩膜类型 | 分辨率 | 训练集容量 | 测试集 | l1 损失 | PSNR | SSIM | GPU 信息 | 下载 | +| :---------------------------------------------------: | :-------: | :-----: | :--------: | :--------: | :-----: | :----: | :---: | :------: | :-----------------------------------------------------------------------------------: | +| [PConv_Stage1](./pconv_stage1_8xb1_celeba-256x256.py) | free-form | 256x256 | 500k | CelebA-val | - | - | - | 8 | - | +| [PConv_Stage2](./pconv_stage2_4xb2_celeba-256x256.py) | free-form | 256x256 | 500k | CelebA-val | 5.990 | 25.404 | 0.853 | 4 | [模型](https://download.openmmlab.com/mmediting/inpainting/pconv/pconv_256x256_stage2_4x2_celeba_20200619-860f8b95.pth) \| [日志](https://download.openmmlab.com/mmediting/inpainting/pconv/pconv_256x256_stage2_4x2_celeba_20200619-860f8b95.log.json) | ## 快速开始 diff --git a/configs/pggan/README.md b/configs/pggan/README.md index 6810b50e59..2b8f7316e9 100644 --- a/configs/pggan/README.md +++ b/configs/pggan/README.md @@ -26,11 +26,11 @@ We describe a new training methodology for generative adversarial networks. The -| Models | Details | MS-SSIM | SWD(xx,xx,xx,xx/avg) | Config | Download | -| :-------------: | :------------: | :-----: | :--------------------------: | :-----------------------------------------------------------------: | :-------------------------------------------------------------------: | -| pggan_128x128 | celeba-cropped | 0.3023 | 3.42, 4.04, 4.78, 20.38/8.15 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/pggan/pggan_8xb4-12Mimgs_celeba-cropped-128x128.py) | [model](https://download.openmmlab.com/mmgen/pggan/pggan_celeba-cropped_128_g8_20210408_181931-85a2e72c.pth) | -| pggan_128x128 | lsun-bedroom | 0.0602 | 3.5, 2.96, 2.76, 9.65/4.72 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/pggan/pggan_8xb4-12Mimgs_lsun-bedroom-128x128.py) | [model](https://download.openmmlab.com/mmgen/pggan/pggan_lsun-bedroom_128x128_g8_20210408_182033-5e59f45d.pth) | -| pggan_1024x1024 | celeba-hq | 0.3379 | 8.93, 3.98, 3.07, 2.64/4.655 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/pggan/pggan_8xb4-12Mimg_celeba-hq-1024x1024.py) | [model](https://download.openmmlab.com/mmgen/pggan/pggan_celeba-hq_1024_g8_20210408_181911-f1ef51c3.pth) | +| Models | Details | MS-SSIM | SWD(xx,xx,xx,xx/avg) | Config | Download | +| :-------------: | :------------: | :-----: | :--------------------------: | :------------------------------------------------------: | :------------------------------------------------------------------------------: | +| pggan_128x128 | celeba-cropped | 0.3023 | 3.42, 4.04, 4.78, 20.38/8.15 | [config](./pggan_8xb4-12Mimgs_celeba-cropped-128x128.py) | [model](https://download.openmmlab.com/mmediting/pggan/pggan_celeba-cropped_128_g8_20210408_181931-85a2e72c.pth) | +| pggan_128x128 | lsun-bedroom | 0.0602 | 3.5, 2.96, 2.76, 9.65/4.72 | [config](./pggan_8xb4-12Mimgs_lsun-bedroom-128x128.py) | [model](https://download.openmmlab.com/mmediting/pggan/pggan_lsun-bedroom_128x128_g8_20210408_182033-5e59f45d.pth) | +| pggan_1024x1024 | celeba-hq | 0.3379 | 8.93, 3.98, 3.07, 2.64/4.655 | [config](./pggan_8xb4-12Mimg_celeba-hq-1024x1024.py) | [model](https://download.openmmlab.com/mmediting/pggan/pggan_celeba-hq_1024_g8_20210408_181911-f1ef51c3.pth) | ## Citation diff --git a/configs/pggan/metafile.yml b/configs/pggan/metafile.yml index dfc524f6c4..c8b6f71ca4 100644 --- a/configs/pggan/metafile.yml +++ b/configs/pggan/metafile.yml @@ -17,7 +17,7 @@ Models: Metrics: MS-SSIM: 0.3023 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pggan/pggan_celeba-cropped_128_g8_20210408_181931-85a2e72c.pth + Weights: https://download.openmmlab.com/mmediting/pggan/pggan_celeba-cropped_128_g8_20210408_181931-85a2e72c.pth - Config: configs/pggan/pggan_8xb4-12Mimgs_lsun-bedroom-128x128.py In Collection: PGGAN Metadata: @@ -28,7 +28,7 @@ Models: Metrics: MS-SSIM: 0.0602 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pggan/pggan_lsun-bedroom_128x128_g8_20210408_182033-5e59f45d.pth + Weights: https://download.openmmlab.com/mmediting/pggan/pggan_lsun-bedroom_128x128_g8_20210408_182033-5e59f45d.pth - Config: configs/pggan/pggan_8xb4-12Mimg_celeba-hq-1024x1024.py In Collection: PGGAN Metadata: @@ -39,4 +39,4 @@ Models: Metrics: MS-SSIM: 0.3379 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pggan/pggan_celeba-hq_1024_g8_20210408_181911-f1ef51c3.pth + Weights: https://download.openmmlab.com/mmediting/pggan/pggan_celeba-hq_1024_g8_20210408_181911-f1ef51c3.pth diff --git a/configs/pix2pix/README.md b/configs/pix2pix/README.md index 10ceeb3069..3d0d7b4f5a 100644 --- a/configs/pix2pix/README.md +++ b/configs/pix2pix/README.md @@ -27,12 +27,12 @@ We investigate conditional adversarial networks as a general-purpose solution to We use `FID` and `IS` metrics to evaluate the generation performance of pix2pix.1 -| Models | Dataset | FID | IS | Config | Download | -| :----: | :---------: | :------: | :---: | :----------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------: | -| Ours | facades | 124.9773 | 1.620 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-80kiters_facades.py) | [model](https://download.openmmlab.com/mmgen/pix2pix/refactor/pix2pix_vanilla_unet_bn_1x1_80k_facades_20210902_170442-c0958d50.pth) \| [log](https://download.openmmlab.com/mmgen/pix2pix/pix2pix_vanilla_unet_bn_1x1_80k_facades_20210317_172625.log.json)2 | -| Ours | aerial2maps | 122.5856 | 3.137 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_aerial2maps.py) | [model](https://download.openmmlab.com/mmgen/pix2pix/refactor/pix2pix_vanilla_unet_bn_a2b_1x1_219200_maps_convert-bgr_20210902_170729-59a31517.pth) | -| Ours | maps2aerial | 88.4635 | 3.310 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_maps2aerial.py) | [model](https://download.openmmlab.com/mmgen/pix2pix/refactor/pix2pix_vanilla_unet_bn_b2a_1x1_219200_maps_convert-bgr_20210902_170814-6d2eac4a.pth) | -| Ours | edges2shoes | 84.3750 | 2.815 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/pix2pix/pix2pix_vanilla-unet-bn_wo-jitter-flip-1xb4-190kiters_edges2shoes.py) | [model](https://download.openmmlab.com/mmgen/pix2pix/refactor/pix2pix_vanilla_unet_bn_wo_jitter_flip_1x4_186840_edges2shoes_convert-bgr_20210902_170902-0c828552.pth) | +| Models | Dataset | FID | IS | Config | Download | +| :----: | :---------: | :------: | :---: | :------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------: | +| Ours | facades | 124.9773 | 1.620 | [config](./pix2pix_vanilla-unet-bn_1xb1-80kiters_facades.py) | [model](https://download.openmmlab.com/mmediting/pix2pix/refactor/pix2pix_vanilla_unet_bn_1x1_80k_facades_20210902_170442-c0958d50.pth) \| [log](https://download.openmmlab.com/mmediting/pix2pix/pix2pix_vanilla_unet_bn_1x1_80k_facades_20210317_172625.log.json)2 | +| Ours | aerial2maps | 122.5856 | 3.137 | [config](./pix2pix_vanilla-unet-bn_1xb1-220kiters_aerial2maps.py) | [model](https://download.openmmlab.com/mmediting/pix2pix/refactor/pix2pix_vanilla_unet_bn_a2b_1x1_219200_maps_convert-bgr_20210902_170729-59a31517.pth) | +| Ours | maps2aerial | 88.4635 | 3.310 | [config](./pix2pix_vanilla-unet-bn_1xb1-220kiters_maps2aerial.py) | [model](https://download.openmmlab.com/mmediting/pix2pix/refactor/pix2pix_vanilla_unet_bn_b2a_1x1_219200_maps_convert-bgr_20210902_170814-6d2eac4a.pth) | +| Ours | edges2shoes | 84.3750 | 2.815 | [config](./pix2pix_vanilla-unet-bn_wo-jitter-flip-1xb4-190kiters_edges2shoes.py) | [model](https://download.openmmlab.com/mmediting/pix2pix/refactor/pix2pix_vanilla_unet_bn_wo_jitter_flip_1x4_186840_edges2shoes_convert-bgr_20210902_170902-0c828552.pth) | `FID` comparison with official: diff --git a/configs/pix2pix/metafile.yml b/configs/pix2pix/metafile.yml index aa96448b7c..1344b00198 100644 --- a/configs/pix2pix/metafile.yml +++ b/configs/pix2pix/metafile.yml @@ -18,7 +18,7 @@ Models: FID: 124.9773 IS: 1.62 Task: Image2Image - Weights: https://download.openmmlab.com/mmgen/pix2pix/refactor/pix2pix_vanilla_unet_bn_1x1_80k_facades_20210902_170442-c0958d50.pth + Weights: https://download.openmmlab.com/mmediting/pix2pix/refactor/pix2pix_vanilla_unet_bn_1x1_80k_facades_20210902_170442-c0958d50.pth - Config: configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_aerial2maps.py In Collection: Pix2Pix Metadata: @@ -30,7 +30,7 @@ Models: FID: 122.5856 IS: 3.137 Task: Image2Image - Weights: https://download.openmmlab.com/mmgen/pix2pix/refactor/pix2pix_vanilla_unet_bn_a2b_1x1_219200_maps_convert-bgr_20210902_170729-59a31517.pth + Weights: https://download.openmmlab.com/mmediting/pix2pix/refactor/pix2pix_vanilla_unet_bn_a2b_1x1_219200_maps_convert-bgr_20210902_170729-59a31517.pth - Config: configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-220kiters_maps2aerial.py In Collection: Pix2Pix Metadata: @@ -42,7 +42,7 @@ Models: FID: 88.4635 IS: 3.31 Task: Image2Image - Weights: https://download.openmmlab.com/mmgen/pix2pix/refactor/pix2pix_vanilla_unet_bn_b2a_1x1_219200_maps_convert-bgr_20210902_170814-6d2eac4a.pth + Weights: https://download.openmmlab.com/mmediting/pix2pix/refactor/pix2pix_vanilla_unet_bn_b2a_1x1_219200_maps_convert-bgr_20210902_170814-6d2eac4a.pth - Config: configs/pix2pix/pix2pix_vanilla-unet-bn_wo-jitter-flip-1xb4-190kiters_edges2shoes.py In Collection: Pix2Pix Metadata: @@ -54,4 +54,4 @@ Models: FID: 84.375 IS: 2.815 Task: Image2Image - Weights: https://download.openmmlab.com/mmgen/pix2pix/refactor/pix2pix_vanilla_unet_bn_wo_jitter_flip_1x4_186840_edges2shoes_convert-bgr_20210902_170902-0c828552.pth + Weights: https://download.openmmlab.com/mmediting/pix2pix/refactor/pix2pix_vanilla_unet_bn_wo_jitter_flip_1x4_186840_edges2shoes_convert-bgr_20210902_170902-0c828552.pth diff --git a/configs/positional_encoding_in_gans/README.md b/configs/positional_encoding_in_gans/README.md index 4301a696f5..54d7ed8412 100644 --- a/configs/positional_encoding_in_gans/README.md +++ b/configs/positional_encoding_in_gans/README.md @@ -23,40 +23,40 @@ SinGAN shows impressive capability in learning internal patch distribution despi
896x896 results generated from a 256 generator using MS-PIE
- +
| Models | Reference in Paper | Scales | FID50k | P&R10k | Config | Download | | :--------------------------: | :----------------: | :------------: | :----: | :---------: | :----------------------------------------------------------: | :-------------------------------------------------------------: | -| stylegan2_c2_256_baseline | Tab.5 config-a | 256 | 5.56 | 75.92/51.24 | [stylegan2_c2_8xb3-1100kiters_ffhq-256x256](/configs/positional_encoding_in_gans/stylegan2_c2_8xb3-1100kiters_ffhq-256x256.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/stylegan2_c2_config-a_ffhq_256x256_b3x8_1100k_20210406_145127-71d9634b.pth) | -| stylegan2_c2_512_baseline | Tab.5 config-b | 512 | 4.91 | 75.65/54.58 | [stylegan2_c2_8xb3-1100kiters_ffhq-512x512](/configs/positional_encoding_in_gans/stylegan2_c2_8xb3-1100kiters_ffhq-512x512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/stylegan2_c2_config-b_ffhq_512x512_b3x8_1100k_20210406_145142-e85e5cf4.pth) | -| ms-pie_stylegan2_c2_config-c | Tab.5 config-c | 256, 384, 512 | 3.35 | 73.84/55.77 | [mspie-stylegan2-config-c_c2_8xb3-1100kiters_ffhq-256-512](/configs/positional_encoding_in_gans/mspie-stylegan2-config-c_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-c_ffhq_256-512_b3x8_1100k_20210406_144824-9f43b07d.pth) | -| ms-pie_stylegan2_c2_config-d | Tab.5 config-d | 256, 384, 512 | 3.50 | 73.28/56.16 | [mspie-stylegan2-config-d_c2_8xb3-1100kiters_ffhq-256-512](/configs/positional_encoding_in_gans/mspie-stylegan2-config-d_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-d_ffhq_256-512_b3x8_1100k_20210406_144840-dbefacf6.pth) | -| ms-pie_stylegan2_c2_config-e | Tab.5 config-e | 256, 384, 512 | 3.15 | 74.13/56.88 | [mspie-stylegan2-config-e_c2_8xb3-1100kiters_ffhq-256-512](/configs/positional_encoding_in_gans/mspie-stylegan2-config-e_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-e_ffhq_256-512_b3x8_1100k_20210406_144906-98d5a42a.pth) | -| ms-pie_stylegan2_c2_config-f | Tab.5 config-f | 256, 384, 512 | 2.93 | 73.51/57.32 | [mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-512](/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-f_ffhq_256-512_b3x8_1100k_20210406_144927-4f4d5391.pth) | -| ms-pie_stylegan2_c1_config-g | Tab.5 config-g | 256, 384, 512 | 3.40 | 73.05/56.45 | [mspie-stylegan2-config-g_c1_8xb3-1100kiters_ffhq-256-512](/configs/positional_encoding_in_gans/mspie-stylegan2-config-g_c1_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c1_config-g_ffhq_256-512_b3x8_1100k_20210406_144758-2df61752.pth) | -| ms-pie_stylegan2_c2_config-h | Tab.5 config-h | 256, 384, 512 | 4.01 | 72.81/54.35 | [mspie-stylegan2-config-h_c2_8xb3-1100kiters_ffhq-256-512](/configs/positional_encoding_in_gans/mspie-stylegan2-config-h_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-h_ffhq_256-512_b3x8_1100k_20210406_145006-84cf3f48.pth) | -| ms-pie_stylegan2_c2_config-i | Tab.5 config-i | 256, 384, 512 | 3.76 | 73.26/54.71 | [mspie-stylegan2-config-i_c2_8xb3-1100kiters_ffhq-256-512](/configs/positional_encoding_in_gans/mspie-stylegan2-config-i_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-i_ffhq_256-512_b3x8_1100k_20210406_145023-c2b0accf.pth) | -| ms-pie_stylegan2_c2_config-j | Tab.5 config-j | 256, 384, 512 | 4.23 | 73.11/54.63 | [mspie-stylegan2-config-j_c2_8xb3-1100kiters_ffhq-256-512](/configs/positional_encoding_in_gans/mspie-stylegan2-config-j_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-j_ffhq_256-512_b3x8_1100k_20210406_145044-c407481b.pth) | -| ms-pie_stylegan2_c2_config-k | Tab.5 config-k | 256, 384, 512 | 4.17 | 73.05/51.07 | [mspie-stylegan2-config-k_c2_8xb3-1100kiters_ffhq-256-512](/configs/positional_encoding_in_gans/mspie-stylegan2-config-k_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-k_ffhq_256-512_b3x8_1100k_20210406_145105-6d8cc39f.pth) | -| ms-pie_stylegan2_c2_config-f | higher-resolution | 256, 512, 896 | 4.10 | 72.21/50.29 | [mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-896](/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-896.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-f_ffhq_256-896_b3x8_1100k_20210406_144943-6c18ad5d.pth) | -| ms-pie_stylegan2_c1_config-f | higher-resolution | 256, 512, 1024 | 6.24 | 71.79/49.92 | [mspie-stylegan2-config-f_c1_8xb2-1600kiters_ffhq-256-1024](/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c1_8xb2-1600kiters_ffhq-256-1024.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c1_config-f_ffhq_256-1024_b2x8_1600k_20210406_144716-81cbdc96.pth) | +| stylegan2_c2_256_baseline | Tab.5 config-a | 256 | 5.56 | 75.92/51.24 | [stylegan2_c2_8xb3-1100kiters_ffhq-256x256](./stylegan2_c2_8xb3-1100kiters_ffhq-256x256.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/stylegan2_c2_config-a_ffhq_256x256_b3x8_1100k_20210406_145127-71d9634b.pth) | +| stylegan2_c2_512_baseline | Tab.5 config-b | 512 | 4.91 | 75.65/54.58 | [stylegan2_c2_8xb3-1100kiters_ffhq-512x512](./stylegan2_c2_8xb3-1100kiters_ffhq-512x512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/stylegan2_c2_config-b_ffhq_512x512_b3x8_1100k_20210406_145142-e85e5cf4.pth) | +| ms-pie_stylegan2_c2_config-c | Tab.5 config-c | 256, 384, 512 | 3.35 | 73.84/55.77 | [mspie-stylegan2-config-c_c2_8xb3-1100kiters_ffhq-256-512](./mspie-stylegan2-config-c_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-c_ffhq_256-512_b3x8_1100k_20210406_144824-9f43b07d.pth) | +| ms-pie_stylegan2_c2_config-d | Tab.5 config-d | 256, 384, 512 | 3.50 | 73.28/56.16 | [mspie-stylegan2-config-d_c2_8xb3-1100kiters_ffhq-256-512](./mspie-stylegan2-config-d_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-d_ffhq_256-512_b3x8_1100k_20210406_144840-dbefacf6.pth) | +| ms-pie_stylegan2_c2_config-e | Tab.5 config-e | 256, 384, 512 | 3.15 | 74.13/56.88 | [mspie-stylegan2-config-e_c2_8xb3-1100kiters_ffhq-256-512](./mspie-stylegan2-config-e_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-e_ffhq_256-512_b3x8_1100k_20210406_144906-98d5a42a.pth) | +| ms-pie_stylegan2_c2_config-f | Tab.5 config-f | 256, 384, 512 | 2.93 | 73.51/57.32 | [mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-512](./mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-f_ffhq_256-512_b3x8_1100k_20210406_144927-4f4d5391.pth) | +| ms-pie_stylegan2_c1_config-g | Tab.5 config-g | 256, 384, 512 | 3.40 | 73.05/56.45 | [mspie-stylegan2-config-g_c1_8xb3-1100kiters_ffhq-256-512](./mspie-stylegan2-config-g_c1_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c1_config-g_ffhq_256-512_b3x8_1100k_20210406_144758-2df61752.pth) | +| ms-pie_stylegan2_c2_config-h | Tab.5 config-h | 256, 384, 512 | 4.01 | 72.81/54.35 | [mspie-stylegan2-config-h_c2_8xb3-1100kiters_ffhq-256-512](./mspie-stylegan2-config-h_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-h_ffhq_256-512_b3x8_1100k_20210406_145006-84cf3f48.pth) | +| ms-pie_stylegan2_c2_config-i | Tab.5 config-i | 256, 384, 512 | 3.76 | 73.26/54.71 | [mspie-stylegan2-config-i_c2_8xb3-1100kiters_ffhq-256-512](./mspie-stylegan2-config-i_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-i_ffhq_256-512_b3x8_1100k_20210406_145023-c2b0accf.pth) | +| ms-pie_stylegan2_c2_config-j | Tab.5 config-j | 256, 384, 512 | 4.23 | 73.11/54.63 | [mspie-stylegan2-config-j_c2_8xb3-1100kiters_ffhq-256-512](./mspie-stylegan2-config-j_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-j_ffhq_256-512_b3x8_1100k_20210406_145044-c407481b.pth) | +| ms-pie_stylegan2_c2_config-k | Tab.5 config-k | 256, 384, 512 | 4.17 | 73.05/51.07 | [mspie-stylegan2-config-k_c2_8xb3-1100kiters_ffhq-256-512](./mspie-stylegan2-config-k_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-k_ffhq_256-512_b3x8_1100k_20210406_145105-6d8cc39f.pth) | +| ms-pie_stylegan2_c2_config-f | higher-resolution | 256, 512, 896 | 4.10 | 72.21/50.29 | [mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-896](./mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-896.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-f_ffhq_256-896_b3x8_1100k_20210406_144943-6c18ad5d.pth) | +| ms-pie_stylegan2_c1_config-f | higher-resolution | 256, 512, 1024 | 6.24 | 71.79/49.92 | [mspie-stylegan2-config-f_c1_8xb2-1600kiters_ffhq-256-1024](./mspie-stylegan2-config-f_c1_8xb2-1600kiters_ffhq-256-1024.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c1_config-f_ffhq_256-1024_b2x8_1600k_20210406_144716-81cbdc96.pth) | | Models | Reference in Paper | Scales | FID50k | Precision10k | Recall10k | Config | Download | | :--------------------------: | :----------------: | :------------: | :----: | :----------: | :-------: | :-----------------------------------------------------: | :--------------------------------------------------------: | -| stylegan2_c2_256_baseline | Tab.5 config-a | 256 | 5.56 | 75.92 | 51.24 | [stylegan2_c2_8xb3-1100kiters_ffhq-256x256](/configs/positional_encoding_in_gans/stylegan2_c2_8xb3-1100kiters_ffhq-256x256.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/stylegan2_c2_config-a_ffhq_256x256_b3x8_1100k_20210406_145127-71d9634b.pth) | -| stylegan2_c2_512_baseline | Tab.5 config-b | 512 | 4.91 | 75.65 | 54.58 | [stylegan2_c2_8xb3-1100kiters_ffhq-512x512](/configs/positional_encoding_in_gans/stylegan2_c2_8xb3-1100kiters_ffhq-512x512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/stylegan2_c2_config-b_ffhq_512x512_b3x8_1100k_20210406_145142-e85e5cf4.pth) | -| ms-pie_stylegan2_c2_config-c | Tab.5 config-c | 256, 384, 512 | 3.35 | 73.84 | 55.77 | [mspie-stylegan2-config-c_c2_8xb3-1100kiters_ffhq-256-512](/configs/positional_encoding_in_gans/mspie-stylegan2-config-c_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-c_ffhq_256-512_b3x8_1100k_20210406_144824-9f43b07d.pth) | -| ms-pie_stylegan2_c2_config-d | Tab.5 config-d | 256, 384, 512 | 3.50 | 73.28 | 56.16 | [mspie-stylegan2-config-d_c2_8xb3-1100kiters_ffhq-256-512](/configs/positional_encoding_in_gans/mspie-stylegan2-config-d_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-d_ffhq_256-512_b3x8_1100k_20210406_144840-dbefacf6.pth) | -| ms-pie_stylegan2_c2_config-e | Tab.5 config-e | 256, 384, 512 | 3.15 | 74.13 | 56.88 | [mspie-stylegan2-config-e_c2_8xb3-1100kiters_ffhq-256-512](/configs/positional_encoding_in_gans/mspie-stylegan2-config-e_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-e_ffhq_256-512_b3x8_1100k_20210406_144906-98d5a42a.pth) | -| ms-pie_stylegan2_c2_config-f | Tab.5 config-f | 256, 384, 512 | 2.93 | 73.51 | 57.32 | [mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-512](/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-f_ffhq_256-512_b3x8_1100k_20210406_144927-4f4d5391.pth) | -| ms-pie_stylegan2_c1_config-g | Tab.5 config-g | 256, 384, 512 | 3.40 | 73.05 | 56.45 | [mspie-stylegan2-config-g_c1_8xb3-1100kiters_ffhq-256-512](/configs/positional_encoding_in_gans/mspie-stylegan2-config-g_c1_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c1_config-g_ffhq_256-512_b3x8_1100k_20210406_144758-2df61752.pth) | -| ms-pie_stylegan2_c2_config-h | Tab.5 config-h | 256, 384, 512 | 4.01 | 72.81 | 54.35 | [mspie-stylegan2-config-h_c2_8xb3-1100kiters_ffhq-256-512](/configs/positional_encoding_in_gans/mspie-stylegan2-config-h_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-h_ffhq_256-512_b3x8_1100k_20210406_145006-84cf3f48.pth) | -| ms-pie_stylegan2_c2_config-i | Tab.5 config-i | 256, 384, 512 | 3.76 | 73.26 | 54.71 | [mspie-stylegan2-config-i_c2_8xb3-1100kiters_ffhq-256-512](/configs/positional_encoding_in_gans/mspie-stylegan2-config-i_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-i_ffhq_256-512_b3x8_1100k_20210406_145023-c2b0accf.pth) | -| ms-pie_stylegan2_c2_config-j | Tab.5 config-j | 256, 384, 512 | 4.23 | 73.11 | 54.63 | [mspie-stylegan2-config-j_c2_8xb3-1100kiters_ffhq-256-512](/configs/positional_encoding_in_gans/mspie-stylegan2-config-j_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-j_ffhq_256-512_b3x8_1100k_20210406_145044-c407481b.pth) | -| ms-pie_stylegan2_c2_config-k | Tab.5 config-k | 256, 384, 512 | 4.17 | 73.05 | 51.07 | [mspie-stylegan2-config-k_c2_8xb3-1100kiters_ffhq-256-512](/configs/positional_encoding_in_gans/mspie-stylegan2-config-k_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-k_ffhq_256-512_b3x8_1100k_20210406_145105-6d8cc39f.pth) | -| ms-pie_stylegan2_c2_config-f | higher-resolution | 256, 512, 896 | 4.10 | 72.21 | 50.29 | [mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-896](/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-896.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-f_ffhq_256-896_b3x8_1100k_20210406_144943-6c18ad5d.pth) | -| ms-pie_stylegan2_c1_config-f | higher-resolution | 256, 512, 1024 | 6.24 | 71.79 | 49.92 | [mspie-stylegan2-config-f_c1_8xb2-1600kiters_ffhq-256-1024](/configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c1_8xb2-1600kiters_ffhq-256-1024.py) | [model](https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c1_config-f_ffhq_256-1024_b2x8_1600k_20210406_144716-81cbdc96.pth) | +| stylegan2_c2_256_baseline | Tab.5 config-a | 256 | 5.56 | 75.92 | 51.24 | [stylegan2_c2_8xb3-1100kiters_ffhq-256x256](./stylegan2_c2_8xb3-1100kiters_ffhq-256x256.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/stylegan2_c2_config-a_ffhq_256x256_b3x8_1100k_20210406_145127-71d9634b.pth) | +| stylegan2_c2_512_baseline | Tab.5 config-b | 512 | 4.91 | 75.65 | 54.58 | [stylegan2_c2_8xb3-1100kiters_ffhq-512x512](./stylegan2_c2_8xb3-1100kiters_ffhq-512x512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/stylegan2_c2_config-b_ffhq_512x512_b3x8_1100k_20210406_145142-e85e5cf4.pth) | +| ms-pie_stylegan2_c2_config-c | Tab.5 config-c | 256, 384, 512 | 3.35 | 73.84 | 55.77 | [mspie-stylegan2-config-c_c2_8xb3-1100kiters_ffhq-256-512](./mspie-stylegan2-config-c_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-c_ffhq_256-512_b3x8_1100k_20210406_144824-9f43b07d.pth) | +| ms-pie_stylegan2_c2_config-d | Tab.5 config-d | 256, 384, 512 | 3.50 | 73.28 | 56.16 | [mspie-stylegan2-config-d_c2_8xb3-1100kiters_ffhq-256-512](./mspie-stylegan2-config-d_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-d_ffhq_256-512_b3x8_1100k_20210406_144840-dbefacf6.pth) | +| ms-pie_stylegan2_c2_config-e | Tab.5 config-e | 256, 384, 512 | 3.15 | 74.13 | 56.88 | [mspie-stylegan2-config-e_c2_8xb3-1100kiters_ffhq-256-512](./mspie-stylegan2-config-e_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-e_ffhq_256-512_b3x8_1100k_20210406_144906-98d5a42a.pth) | +| ms-pie_stylegan2_c2_config-f | Tab.5 config-f | 256, 384, 512 | 2.93 | 73.51 | 57.32 | [mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-512](./mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-f_ffhq_256-512_b3x8_1100k_20210406_144927-4f4d5391.pth) | +| ms-pie_stylegan2_c1_config-g | Tab.5 config-g | 256, 384, 512 | 3.40 | 73.05 | 56.45 | [mspie-stylegan2-config-g_c1_8xb3-1100kiters_ffhq-256-512](./mspie-stylegan2-config-g_c1_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c1_config-g_ffhq_256-512_b3x8_1100k_20210406_144758-2df61752.pth) | +| ms-pie_stylegan2_c2_config-h | Tab.5 config-h | 256, 384, 512 | 4.01 | 72.81 | 54.35 | [mspie-stylegan2-config-h_c2_8xb3-1100kiters_ffhq-256-512](./mspie-stylegan2-config-h_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-h_ffhq_256-512_b3x8_1100k_20210406_145006-84cf3f48.pth) | +| ms-pie_stylegan2_c2_config-i | Tab.5 config-i | 256, 384, 512 | 3.76 | 73.26 | 54.71 | [mspie-stylegan2-config-i_c2_8xb3-1100kiters_ffhq-256-512](./mspie-stylegan2-config-i_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-i_ffhq_256-512_b3x8_1100k_20210406_145023-c2b0accf.pth) | +| ms-pie_stylegan2_c2_config-j | Tab.5 config-j | 256, 384, 512 | 4.23 | 73.11 | 54.63 | [mspie-stylegan2-config-j_c2_8xb3-1100kiters_ffhq-256-512](./mspie-stylegan2-config-j_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-j_ffhq_256-512_b3x8_1100k_20210406_145044-c407481b.pth) | +| ms-pie_stylegan2_c2_config-k | Tab.5 config-k | 256, 384, 512 | 4.17 | 73.05 | 51.07 | [mspie-stylegan2-config-k_c2_8xb3-1100kiters_ffhq-256-512](./mspie-stylegan2-config-k_c2_8xb3-1100kiters_ffhq-256-512.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-k_ffhq_256-512_b3x8_1100k_20210406_145105-6d8cc39f.pth) | +| ms-pie_stylegan2_c2_config-f | higher-resolution | 256, 512, 896 | 4.10 | 72.21 | 50.29 | [mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-896](./mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-896.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-f_ffhq_256-896_b3x8_1100k_20210406_144943-6c18ad5d.pth) | +| ms-pie_stylegan2_c1_config-f | higher-resolution | 256, 512, 1024 | 6.24 | 71.79 | 49.92 | [mspie-stylegan2-config-f_c1_8xb2-1600kiters_ffhq-256-1024](./mspie-stylegan2-config-f_c1_8xb2-1600kiters_ffhq-256-1024.py) | [model](https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c1_config-f_ffhq_256-1024_b2x8_1600k_20210406_144716-81cbdc96.pth) | Note that we report the FID and P&R metric (FFHQ dataset) in the largest scale. @@ -70,14 +70,14 @@ Note that we report the FID and P&R metric (FFHQ dataset) in the largest scale. | Model | Data | Num Scales | Config | Download | | :-----------------------------: | :-------------------------------------------------: | :--------: | :---------------------------------------------------: | :-----------------------------------------------------: | -| SinGAN + no pad | [balloons.png](https://download.openmmlab.com/mmgen/dataset/singan/balloons.png) | 8 | [singan_interp-pad_balloons](/configs/positional_encoding_in_gans/singan_interp-pad_balloons.py) | [ckpt](https://download.openmmlab.com/mmgen/pe_in_gans/singan_interp-pad_balloons_20210406_180014-96f51555.pth) \| [pkl](https://download.openmmlab.com/mmgen/pe_in_gans/singan_interp-pad_balloons_20210406_180014-96f51555.pkl) | -| SinGAN + no pad + no bn in disc | [balloons.png](https://download.openmmlab.com/mmgen/dataset/singan/balloons.png) | 8 | [singan_interp-pad_disc-nobn_balloons](/configs/positional_encoding_in_gans/singan_interp-pad_disc-nobn_balloons.py) | [ckpt](https://download.openmmlab.com/mmgen/pe_in_gans/singan_interp-pad_disc-nobn_balloons_20210406_180059-7d63e65d.pth) \| [pkl](https://download.openmmlab.com/mmgen/pe_in_gans/singan_interp-pad_disc-nobn_balloons_20210406_180059-7d63e65d.pkl) | -| SinGAN + no pad + no bn in disc | [fish.jpg](https://download.openmmlab.com/mmgen/dataset/singan/fish-crop.jpg) | 10 | [singan_interp-pad_disc-nobn_fish](/configs/positional_encoding_in_gans/singan_interp-pad_disc-nobn_fish.py) | [ckpt](https://download.openmmlab.com/mmgen/pe_in_gans/singan_interp-pad_disc-nobn_fis_20210406_175720-9428517a.pth) \| [pkl](https://download.openmmlab.com/mmgen/pe_in_gans/singan_interp-pad_disc-nobn_fis_20210406_175720-9428517a.pkl) | -| SinGAN + CSG | [fish.jpg](https://download.openmmlab.com/mmgen/dataset/singan/fish-crop.jpg) | 10 | [singan-csg_fish](/configs/positional_encoding_in_gans/singan-csg_fish.py) | [ckpt](https://download.openmmlab.com/mmgen/pe_in_gans/singan_csg_fis_20210406_175532-f0ec7b61.pth) \| [pkl](https://download.openmmlab.com/mmgen/pe_in_gans/singan_csg_fis_20210406_175532-f0ec7b61.pkl) | -| SinGAN + CSG | [bohemian.png](https://download.openmmlab.com/mmgen/dataset/singan/bohemian.png) | 10 | [singan-csg_bohemian](/configs/positional_encoding_in_gans/singan-csg_bohemian.py) | [ckpt](https://download.openmmlab.com/mmgen/pe_in_gans/singan_csg_bohemian_20210407_195455-5ed56db2.pth) \| [pkl](https://download.openmmlab.com/mmgen/pe_in_gans/singan_csg_bohemian_20210407_195455-5ed56db2.pkl) | -| SinGAN + SPE-dim4 | [fish.jpg](https://download.openmmlab.com/mmgen/dataset/singan/fish-crop.jpg) | 10 | [singan_spe-dim4_fish](/configs/positional_encoding_in_gans/singan_spe-dim4_fish.py) | [ckpt](https://download.openmmlab.com/mmgen/pe_in_gans/singan_spe-dim4_fish_20210406_175933-f483a7e3.pth) \| [pkl](https://download.openmmlab.com/mmgen/pe_in_gans/singan_spe-dim4_fish_20210406_175933-f483a7e3.pkl) | -| SinGAN + SPE-dim4 | [bohemian.png](https://download.openmmlab.com/mmgen/dataset/singan/bohemian.png) | 10 | [singan_spe-dim4_bohemian](/configs/positional_encoding_in_gans/singan_spe-dim4_bohemian.py) | [ckpt](https://download.openmmlab.com/mmgen/pe_in_gans/singan_spe-dim4_bohemian_20210406_175820-6e484a35.pth) \| [pkl](https://download.openmmlab.com/mmgen/pe_in_gans/singan_spe-dim4_bohemian_20210406_175820-6e484a35.pkl) | -| SinGAN + SPE-dim8 | [bohemian.png](https://download.openmmlab.com/mmgen/dataset/singan/bohemian.png) | 10 | [singan_spe-dim8_bohemian](/configs/positional_encoding_in_gans/singan_spe-dim8_bohemian.py) | [ckpt](https://download.openmmlab.com/mmgen/pe_in_gans/singan_spe-dim8_bohemian_20210406_175858-7faa50f3.pth) \| [pkl](https://download.openmmlab.com/mmgen/pe_in_gans/singan_spe-dim8_bohemian_20210406_175858-7faa50f3.pkl) | +| SinGAN + no pad | [balloons.png](https://download.openmmlab.com/mmediting/dataset/singan/balloons.png) | 8 | [singan_interp-pad_balloons](./singan_interp-pad_balloons.py) | [ckpt](https://download.openmmlab.com/mmediting/pe_in_gans/singan_interp-pad_balloons_20210406_180014-96f51555.pth) \| [pkl](https://download.openmmlab.com/mmediting/pe_in_gans/singan_interp-pad_balloons_20210406_180014-96f51555.pkl) | +| SinGAN + no pad + no bn in disc | [balloons.png](https://download.openmmlab.com/mmediting/dataset/singan/balloons.png) | 8 | [singan_interp-pad_disc-nobn_balloons](./singan_interp-pad_disc-nobn_balloons.py) | [ckpt](https://download.openmmlab.com/mmediting/pe_in_gans/singan_interp-pad_disc-nobn_balloons_20210406_180059-7d63e65d.pth) \| [pkl](https://download.openmmlab.com/mmediting/pe_in_gans/singan_interp-pad_disc-nobn_balloons_20210406_180059-7d63e65d.pkl) | +| SinGAN + no pad + no bn in disc | [fish.jpg](https://download.openmmlab.com/mmediting/dataset/singan/fish-crop.jpg) | 10 | [singan_interp-pad_disc-nobn_fish](./singan_interp-pad_disc-nobn_fish.py) | [ckpt](https://download.openmmlab.com/mmediting/pe_in_gans/singan_interp-pad_disc-nobn_fis_20210406_175720-9428517a.pth) \| [pkl](https://download.openmmlab.com/mmediting/pe_in_gans/singan_interp-pad_disc-nobn_fis_20210406_175720-9428517a.pkl) | +| SinGAN + CSG | [fish.jpg](https://download.openmmlab.com/mmediting/dataset/singan/fish-crop.jpg) | 10 | [singan-csg_fish](./singan-csg_fish.py) | [ckpt](https://download.openmmlab.com/mmediting/pe_in_gans/singan_csg_fis_20210406_175532-f0ec7b61.pth) \| [pkl](https://download.openmmlab.com/mmediting/pe_in_gans/singan_csg_fis_20210406_175532-f0ec7b61.pkl) | +| SinGAN + CSG | [bohemian.png](https://download.openmmlab.com/mmediting/dataset/singan/bohemian.png) | 10 | [singan-csg_bohemian](./singan-csg_bohemian.py) | [ckpt](https://download.openmmlab.com/mmediting/pe_in_gans/singan_csg_bohemian_20210407_195455-5ed56db2.pth) \| [pkl](https://download.openmmlab.com/mmediting/pe_in_gans/singan_csg_bohemian_20210407_195455-5ed56db2.pkl) | +| SinGAN + SPE-dim4 | [fish.jpg](https://download.openmmlab.com/mmediting/dataset/singan/fish-crop.jpg) | 10 | [singan_spe-dim4_fish](./singan_spe-dim4_fish.py) | [ckpt](https://download.openmmlab.com/mmediting/pe_in_gans/singan_spe-dim4_fish_20210406_175933-f483a7e3.pth) \| [pkl](https://download.openmmlab.com/mmediting/pe_in_gans/singan_spe-dim4_fish_20210406_175933-f483a7e3.pkl) | +| SinGAN + SPE-dim4 | [bohemian.png](https://download.openmmlab.com/mmediting/dataset/singan/bohemian.png) | 10 | [singan_spe-dim4_bohemian](./singan_spe-dim4_bohemian.py) | [ckpt](https://download.openmmlab.com/mmediting/pe_in_gans/singan_spe-dim4_bohemian_20210406_175820-6e484a35.pth) \| [pkl](https://download.openmmlab.com/mmediting/pe_in_gans/singan_spe-dim4_bohemian_20210406_175820-6e484a35.pkl) | +| SinGAN + SPE-dim8 | [bohemian.png](https://download.openmmlab.com/mmediting/dataset/singan/bohemian.png) | 10 | [singan_spe-dim8_bohemian](./singan_spe-dim8_bohemian.py) | [ckpt](https://download.openmmlab.com/mmediting/pe_in_gans/singan_spe-dim8_bohemian_20210406_175858-7faa50f3.pth) \| [pkl](https://download.openmmlab.com/mmediting/pe_in_gans/singan_spe-dim8_bohemian_20210406_175858-7faa50f3.pkl) | ## Citation diff --git a/configs/positional_encoding_in_gans/metafile.yml b/configs/positional_encoding_in_gans/metafile.yml index d649dc171c..8cbea69b6d 100644 --- a/configs/positional_encoding_in_gans/metafile.yml +++ b/configs/positional_encoding_in_gans/metafile.yml @@ -21,7 +21,7 @@ Models: SSIM: 51.24 Scales: 256.0 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/stylegan2_c2_config-a_ffhq_256x256_b3x8_1100k_20210406_145127-71d9634b.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/stylegan2_c2_config-a_ffhq_256x256_b3x8_1100k_20210406_145127-71d9634b.pth - Config: configs/positional_encoding_in_gans/stylegan2_c2_8xb3-1100kiters_ffhq-512x512.py In Collection: Positional Encoding in GANs Metadata: @@ -36,7 +36,7 @@ Models: SSIM: 54.58 Scales: 512.0 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/stylegan2_c2_config-b_ffhq_512x512_b3x8_1100k_20210406_145142-e85e5cf4.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/stylegan2_c2_config-b_ffhq_512x512_b3x8_1100k_20210406_145142-e85e5cf4.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-c_c2_8xb3-1100kiters_ffhq-256-512.py In Collection: Positional Encoding in GANs Metadata: @@ -50,7 +50,7 @@ Models: PSNR: 73.84 SSIM: 55.77 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-c_ffhq_256-512_b3x8_1100k_20210406_144824-9f43b07d.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-c_ffhq_256-512_b3x8_1100k_20210406_144824-9f43b07d.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-d_c2_8xb3-1100kiters_ffhq-256-512.py In Collection: Positional Encoding in GANs Metadata: @@ -64,7 +64,7 @@ Models: PSNR: 73.28 SSIM: 56.16 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-d_ffhq_256-512_b3x8_1100k_20210406_144840-dbefacf6.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-d_ffhq_256-512_b3x8_1100k_20210406_144840-dbefacf6.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-e_c2_8xb3-1100kiters_ffhq-256-512.py In Collection: Positional Encoding in GANs Metadata: @@ -78,7 +78,7 @@ Models: PSNR: 74.13 SSIM: 56.88 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-e_ffhq_256-512_b3x8_1100k_20210406_144906-98d5a42a.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-e_ffhq_256-512_b3x8_1100k_20210406_144906-98d5a42a.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-512.py In Collection: Positional Encoding in GANs Metadata: @@ -92,7 +92,7 @@ Models: PSNR: 73.51 SSIM: 57.32 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-f_ffhq_256-512_b3x8_1100k_20210406_144927-4f4d5391.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-f_ffhq_256-512_b3x8_1100k_20210406_144927-4f4d5391.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-g_c1_8xb3-1100kiters_ffhq-256-512.py In Collection: Positional Encoding in GANs Metadata: @@ -106,7 +106,7 @@ Models: PSNR: 73.05 SSIM: 56.45 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c1_config-g_ffhq_256-512_b3x8_1100k_20210406_144758-2df61752.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c1_config-g_ffhq_256-512_b3x8_1100k_20210406_144758-2df61752.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-h_c2_8xb3-1100kiters_ffhq-256-512.py In Collection: Positional Encoding in GANs Metadata: @@ -120,7 +120,7 @@ Models: PSNR: 72.81 SSIM: 54.35 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-h_ffhq_256-512_b3x8_1100k_20210406_145006-84cf3f48.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-h_ffhq_256-512_b3x8_1100k_20210406_145006-84cf3f48.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-i_c2_8xb3-1100kiters_ffhq-256-512.py In Collection: Positional Encoding in GANs Metadata: @@ -134,7 +134,7 @@ Models: PSNR: 73.26 SSIM: 54.71 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-i_ffhq_256-512_b3x8_1100k_20210406_145023-c2b0accf.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-i_ffhq_256-512_b3x8_1100k_20210406_145023-c2b0accf.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-j_c2_8xb3-1100kiters_ffhq-256-512.py In Collection: Positional Encoding in GANs Metadata: @@ -148,7 +148,7 @@ Models: PSNR: 73.11 SSIM: 54.63 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-j_ffhq_256-512_b3x8_1100k_20210406_145044-c407481b.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-j_ffhq_256-512_b3x8_1100k_20210406_145044-c407481b.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-k_c2_8xb3-1100kiters_ffhq-256-512.py In Collection: Positional Encoding in GANs Metadata: @@ -162,7 +162,7 @@ Models: PSNR: 73.05 SSIM: 51.07 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-k_ffhq_256-512_b3x8_1100k_20210406_145105-6d8cc39f.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-k_ffhq_256-512_b3x8_1100k_20210406_145105-6d8cc39f.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-896.py In Collection: Positional Encoding in GANs Metadata: @@ -176,7 +176,7 @@ Models: PSNR: 72.21 SSIM: 50.29 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-f_ffhq_256-896_b3x8_1100k_20210406_144943-6c18ad5d.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-f_ffhq_256-896_b3x8_1100k_20210406_144943-6c18ad5d.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c1_8xb2-1600kiters_ffhq-256-1024.py In Collection: Positional Encoding in GANs Metadata: @@ -190,7 +190,7 @@ Models: PSNR: 71.79 SSIM: 49.92 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c1_config-f_ffhq_256-1024_b2x8_1600k_20210406_144716-81cbdc96.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c1_config-f_ffhq_256-1024_b2x8_1600k_20210406_144716-81cbdc96.pth - Config: configs/positional_encoding_in_gans/stylegan2_c2_8xb3-1100kiters_ffhq-256x256.py In Collection: Positional Encoding in GANs Metadata: @@ -204,7 +204,7 @@ Models: Recall10k: 51.24 Scales: 256.0 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/stylegan2_c2_config-a_ffhq_256x256_b3x8_1100k_20210406_145127-71d9634b.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/stylegan2_c2_config-a_ffhq_256x256_b3x8_1100k_20210406_145127-71d9634b.pth - Config: configs/positional_encoding_in_gans/stylegan2_c2_8xb3-1100kiters_ffhq-512x512.py In Collection: Positional Encoding in GANs Metadata: @@ -218,7 +218,7 @@ Models: Recall10k: 54.58 Scales: 512.0 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/stylegan2_c2_config-b_ffhq_512x512_b3x8_1100k_20210406_145142-e85e5cf4.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/stylegan2_c2_config-b_ffhq_512x512_b3x8_1100k_20210406_145142-e85e5cf4.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-c_c2_8xb3-1100kiters_ffhq-256-512.py In Collection: Positional Encoding in GANs Metadata: @@ -231,7 +231,7 @@ Models: Precision10k: 73.84 Recall10k: 55.77 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-c_ffhq_256-512_b3x8_1100k_20210406_144824-9f43b07d.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-c_ffhq_256-512_b3x8_1100k_20210406_144824-9f43b07d.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-d_c2_8xb3-1100kiters_ffhq-256-512.py In Collection: Positional Encoding in GANs Metadata: @@ -244,7 +244,7 @@ Models: Precision10k: 73.28 Recall10k: 56.16 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-d_ffhq_256-512_b3x8_1100k_20210406_144840-dbefacf6.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-d_ffhq_256-512_b3x8_1100k_20210406_144840-dbefacf6.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-e_c2_8xb3-1100kiters_ffhq-256-512.py In Collection: Positional Encoding in GANs Metadata: @@ -257,7 +257,7 @@ Models: Precision10k: 74.13 Recall10k: 56.88 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-e_ffhq_256-512_b3x8_1100k_20210406_144906-98d5a42a.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-e_ffhq_256-512_b3x8_1100k_20210406_144906-98d5a42a.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-512.py In Collection: Positional Encoding in GANs Metadata: @@ -270,7 +270,7 @@ Models: Precision10k: 73.51 Recall10k: 57.32 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-f_ffhq_256-512_b3x8_1100k_20210406_144927-4f4d5391.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-f_ffhq_256-512_b3x8_1100k_20210406_144927-4f4d5391.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-g_c1_8xb3-1100kiters_ffhq-256-512.py In Collection: Positional Encoding in GANs Metadata: @@ -283,7 +283,7 @@ Models: Precision10k: 73.05 Recall10k: 56.45 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c1_config-g_ffhq_256-512_b3x8_1100k_20210406_144758-2df61752.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c1_config-g_ffhq_256-512_b3x8_1100k_20210406_144758-2df61752.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-h_c2_8xb3-1100kiters_ffhq-256-512.py In Collection: Positional Encoding in GANs Metadata: @@ -296,7 +296,7 @@ Models: Precision10k: 72.81 Recall10k: 54.35 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-h_ffhq_256-512_b3x8_1100k_20210406_145006-84cf3f48.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-h_ffhq_256-512_b3x8_1100k_20210406_145006-84cf3f48.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-i_c2_8xb3-1100kiters_ffhq-256-512.py In Collection: Positional Encoding in GANs Metadata: @@ -309,7 +309,7 @@ Models: Precision10k: 73.26 Recall10k: 54.71 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-i_ffhq_256-512_b3x8_1100k_20210406_145023-c2b0accf.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-i_ffhq_256-512_b3x8_1100k_20210406_145023-c2b0accf.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-j_c2_8xb3-1100kiters_ffhq-256-512.py In Collection: Positional Encoding in GANs Metadata: @@ -322,7 +322,7 @@ Models: Precision10k: 73.11 Recall10k: 54.63 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-j_ffhq_256-512_b3x8_1100k_20210406_145044-c407481b.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-j_ffhq_256-512_b3x8_1100k_20210406_145044-c407481b.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-k_c2_8xb3-1100kiters_ffhq-256-512.py In Collection: Positional Encoding in GANs Metadata: @@ -335,7 +335,7 @@ Models: Precision10k: 73.05 Recall10k: 51.07 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-k_ffhq_256-512_b3x8_1100k_20210406_145105-6d8cc39f.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-k_ffhq_256-512_b3x8_1100k_20210406_145105-6d8cc39f.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c2_8xb3-1100kiters_ffhq-256-896.py In Collection: Positional Encoding in GANs Metadata: @@ -348,7 +348,7 @@ Models: Precision10k: 72.21 Recall10k: 50.29 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c2_config-f_ffhq_256-896_b3x8_1100k_20210406_144943-6c18ad5d.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c2_config-f_ffhq_256-896_b3x8_1100k_20210406_144943-6c18ad5d.pth - Config: configs/positional_encoding_in_gans/mspie-stylegan2-config-f_c1_8xb2-1600kiters_ffhq-256-1024.py In Collection: Positional Encoding in GANs Metadata: @@ -361,7 +361,7 @@ Models: Precision10k: 71.79 Recall10k: 49.92 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/mspie-stylegan2_c1_config-f_ffhq_256-1024_b2x8_1600k_20210406_144716-81cbdc96.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/mspie-stylegan2_c1_config-f_ffhq_256-1024_b2x8_1600k_20210406_144716-81cbdc96.pth - Config: configs/positional_encoding_in_gans/singan_interp-pad_balloons.py In Collection: Positional Encoding in GANs Metadata: @@ -372,7 +372,7 @@ Models: Metrics: Num Scales: 8.0 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/singan_interp-pad_balloons_20210406_180014-96f51555.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/singan_interp-pad_balloons_20210406_180014-96f51555.pth - Config: configs/positional_encoding_in_gans/singan_interp-pad_disc-nobn_balloons.py In Collection: Positional Encoding in GANs Metadata: @@ -383,7 +383,7 @@ Models: Metrics: Num Scales: 8.0 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/singan_interp-pad_disc-nobn_balloons_20210406_180059-7d63e65d.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/singan_interp-pad_disc-nobn_balloons_20210406_180059-7d63e65d.pth - Config: configs/positional_encoding_in_gans/singan_interp-pad_disc-nobn_fish.py In Collection: Positional Encoding in GANs Metadata: @@ -394,7 +394,7 @@ Models: Metrics: Num Scales: 10.0 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/singan_interp-pad_disc-nobn_fis_20210406_175720-9428517a.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/singan_interp-pad_disc-nobn_fis_20210406_175720-9428517a.pth - Config: configs/positional_encoding_in_gans/singan-csg_fish.py In Collection: Positional Encoding in GANs Metadata: @@ -405,7 +405,7 @@ Models: Metrics: Num Scales: 10.0 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/singan_csg_fis_20210406_175532-f0ec7b61.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/singan_csg_fis_20210406_175532-f0ec7b61.pth - Config: configs/positional_encoding_in_gans/singan-csg_bohemian.py In Collection: Positional Encoding in GANs Metadata: @@ -416,7 +416,7 @@ Models: Metrics: Num Scales: 10.0 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/singan_csg_bohemian_20210407_195455-5ed56db2.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/singan_csg_bohemian_20210407_195455-5ed56db2.pth - Config: configs/positional_encoding_in_gans/singan_spe-dim4_fish.py In Collection: Positional Encoding in GANs Metadata: @@ -427,7 +427,7 @@ Models: Metrics: Num Scales: 10.0 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/singan_spe-dim4_fish_20210406_175933-f483a7e3.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/singan_spe-dim4_fish_20210406_175933-f483a7e3.pth - Config: configs/positional_encoding_in_gans/singan_spe-dim4_bohemian.py In Collection: Positional Encoding in GANs Metadata: @@ -438,7 +438,7 @@ Models: Metrics: Num Scales: 10.0 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/singan_spe-dim4_bohemian_20210406_175820-6e484a35.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/singan_spe-dim4_bohemian_20210406_175820-6e484a35.pth - Config: configs/positional_encoding_in_gans/singan_spe-dim8_bohemian.py In Collection: Positional Encoding in GANs Metadata: @@ -449,4 +449,4 @@ Models: Metrics: Num Scales: 10.0 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/pe_in_gans/singan_spe-dim8_bohemian_20210406_175858-7faa50f3.pth + Weights: https://download.openmmlab.com/mmediting/pe_in_gans/singan_spe-dim8_bohemian_20210406_175858-7faa50f3.pth diff --git a/configs/rdn/README.md b/configs/rdn/README.md index 88a05ec7a3..827bc90192 100644 --- a/configs/rdn/README.md +++ b/configs/rdn/README.md @@ -25,9 +25,9 @@ The metrics are `PSNR and SSIM` . | Method | Set5 PSNR | Set14 PSNR | DIV2K PSNR | Set5 SSIM | Set14 SSIM | DIV2K SSIM | GPU Info | Download | | :--------------------------------------------------------------: | :-------: | :--------: | :--------: | :-------: | :--------: | :--------: | :----------: | :----------------------------------------------------------------: | -| [rdn_x4c64b16_g1_1000k_div2k](/configs/rdn/rdn_x4c64b16_1xb16-1000k_div2k.py) | 30.4922 | 26.9570 | 29.1925 | 0.8548 | 0.7423 | 0.8233 | 1 (TITAN Xp) | [model](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x4c64b16_g1_1000k_div2k_20210419-3577d44f.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x4c64b16_g1_1000k_div2k_20210419-3577d44f.log.json) | -| [rdn_x3c64b16_g1_1000k_div2k](/configs/rdn/rdn_x3c64b16_1xb16-1000k_div2k.py) | 32.6051 | 28.6338 | 31.2153 | 0.8943 | 0.8077 | 0.8763 | 1 (TITAN Xp) | [model](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x3c64b16_g1_1000k_div2k_20210419-b93cb6aa.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x3c64b16_g1_1000k_div2k_20210419-b93cb6aa.log.json) | -| [rdn_x2c64b16_g1_1000k_div2k](/configs/rdn/rdn_x2c64b16_1xb16-1000k_div2k.py) | 35.9883 | 31.8366 | 34.9392 | 0.9385 | 0.8920 | 0.9380 | 1 (TITAN Xp) | [model](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x2c64b16_g1_1000k_div2k_20210419-dc146009.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x2c64b16_g1_1000k_div2k_20210419-dc146009.log.json) | +| [rdn_x4c64b16_g1_1000k_div2k](./rdn_x4c64b16_1xb16-1000k_div2k.py) | 30.4922 | 26.9570 | 29.1925 | 0.8548 | 0.7423 | 0.8233 | 1 (TITAN Xp) | [model](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x4c64b16_g1_1000k_div2k_20210419-3577d44f.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x4c64b16_g1_1000k_div2k_20210419-3577d44f.log.json) | +| [rdn_x3c64b16_g1_1000k_div2k](./rdn_x3c64b16_1xb16-1000k_div2k.py) | 32.6051 | 28.6338 | 31.2153 | 0.8943 | 0.8077 | 0.8763 | 1 (TITAN Xp) | [model](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x3c64b16_g1_1000k_div2k_20210419-b93cb6aa.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x3c64b16_g1_1000k_div2k_20210419-b93cb6aa.log.json) | +| [rdn_x2c64b16_g1_1000k_div2k](./rdn_x2c64b16_1xb16-1000k_div2k.py) | 35.9883 | 31.8366 | 34.9392 | 0.9385 | 0.8920 | 0.9380 | 1 (TITAN Xp) | [model](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x2c64b16_g1_1000k_div2k_20210419-dc146009.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x2c64b16_g1_1000k_div2k_20210419-dc146009.log.json) | ## Quick Start diff --git a/configs/rdn/README_zh-CN.md b/configs/rdn/README_zh-CN.md index e183d7b650..77082fa95d 100644 --- a/configs/rdn/README_zh-CN.md +++ b/configs/rdn/README_zh-CN.md @@ -24,11 +24,11 @@ 在 RGB 通道上进行评估,在评估之前裁剪每个边界中的 `scale` 像素。 我们使用 `PSNR` 和 `SSIM` 作为指标。 -| 算法 | Set5 | Set14 | DIV2K | GPU 信息 | 下载 | -| :--------------------------------------------------------------------: | :--------------: | :--------------: | :--------------: | :----------: | :--------------------------------------------------------------------: | -| [rdn_x2c64b16_g1_1000k_div2k](/configs/rdn/rdn_x2c64b16_1xb16-1000k_div2k.py) | 35.9883 / 0.9385 | 31.8366 / 0.8920 | 34.9392 / 0.9380 | 1 (TITAN Xp) | [模型](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x2c64b16_g1_1000k_div2k_20210419-dc146009.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x2c64b16_g1_1000k_div2k_20210419-dc146009.log.json) | -| [rdn_x3c64b16_g1_1000k_div2k](/configs/rdn/rdn_x3c64b16_1xb16-1000k_div2k.py) | 32.6051 / 0.8943 | 28.6338 / 0.8077 | 31.2153 / 0.8763 | 1 (TITAN Xp) | [模型](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x3c64b16_g1_1000k_div2k_20210419-b93cb6aa.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x3c64b16_g1_1000k_div2k_20210419-b93cb6aa.log.json) | -| [rdn_x4c64b16_g1_1000k_div2k](/configs/rdn/rdn_x4c64b16_1xb16-1000k_div2k.py) | 30.4922 / 0.8548 | 26.9570 / 0.7423 | 29.1925 / 0.8233 | 1 (TITAN Xp) | [模型](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x4c64b16_g1_1000k_div2k_20210419-3577d44f.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x4c64b16_g1_1000k_div2k_20210419-3577d44f.log.json) | +| 算法 | Set5 | Set14 | DIV2K | GPU 信息 | 下载 | +| :----------------------------------------------------------------: | :--------------: | :--------------: | :--------------: | :----------: | :------------------------------------------------------------------------: | +| [rdn_x2c64b16_g1_1000k_div2k](./rdn_x2c64b16_1xb16-1000k_div2k.py) | 35.9883 / 0.9385 | 31.8366 / 0.8920 | 34.9392 / 0.9380 | 1 (TITAN Xp) | [模型](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x2c64b16_g1_1000k_div2k_20210419-dc146009.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x2c64b16_g1_1000k_div2k_20210419-dc146009.log.json) | +| [rdn_x3c64b16_g1_1000k_div2k](./rdn_x3c64b16_1xb16-1000k_div2k.py) | 32.6051 / 0.8943 | 28.6338 / 0.8077 | 31.2153 / 0.8763 | 1 (TITAN Xp) | [模型](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x3c64b16_g1_1000k_div2k_20210419-b93cb6aa.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x3c64b16_g1_1000k_div2k_20210419-b93cb6aa.log.json) | +| [rdn_x4c64b16_g1_1000k_div2k](./rdn_x4c64b16_1xb16-1000k_div2k.py) | 30.4922 / 0.8548 | 26.9570 / 0.7423 | 29.1925 / 0.8233 | 1 (TITAN Xp) | [模型](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x4c64b16_g1_1000k_div2k_20210419-3577d44f.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/rdn/rdn_x4c64b16_g1_1000k_div2k_20210419-3577d44f.log.json) | ## 快速开始 diff --git a/configs/real_basicvsr/README.md b/configs/real_basicvsr/README.md index 60a662a6a0..7b0e6c6e7a 100644 --- a/configs/real_basicvsr/README.md +++ b/configs/real_basicvsr/README.md @@ -24,8 +24,8 @@ Evaluated on Y channel. The code for computing NRQM, NIQE, and PI can be found [ | Method | NRQM (Y) | NIQE (Y) | PI (Y) | BRISQUE (Y) | GPU Info | Download | | :--------------------------------------------------------------------: | :------: | :------: | :----: | :---------: | :----------------------: | :-----------------------------------------------------------------------: | -| [realbasicvsr_c64b20_1x30x8_lr5e-5_150k_reds](/configs/real_basicvsr/realbasicvsr_c64b20-1x30x8_8xb1-lr5e-5-150k_reds.py) | 6.0477 | 3.7662 | 3.8593 | 29.030 | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/real_basicvsr/realbasicvsr_c64b20_1x30x8_lr5e-5_150k_reds_20211104-52f77c2c.pth)/[log](https://download.openmmlab.com/mmediting/restorers/real_basicvsr/realbasicvsr_c64b20_1x30x8_lr5e-5_150k_reds_20211104_183640.log.json) | -| [realbasicvsr_wogan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds](/configs/real_basicvsr/realbasicvsr_wogan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/real_basicvsr/realbasicvsr_wogan_c64b20_2x30x8_lr1e-4_300k_reds_20211027-0e2ff207.pth)/[log](http://download.openmmlab.com/mmediting/restorers/real_basicvsr/realbasicvsr_wogan_c64b20_2x30x8_lr1e-4_300k_reds_20211027_114039.log.json) | +| [realbasicvsr_c64b20_1x30x8_lr5e-5_150k_reds](./realbasicvsr_c64b20-1x30x8_8xb1-lr5e-5-150k_reds.py) | 6.0477 | 3.7662 | 3.8593 | 29.030 | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/real_basicvsr/realbasicvsr_c64b20_1x30x8_lr5e-5_150k_reds_20211104-52f77c2c.pth)/[log](https://download.openmmlab.com/mmediting/restorers/real_basicvsr/realbasicvsr_c64b20_1x30x8_lr5e-5_150k_reds_20211104_183640.log.json) | +| [realbasicvsr_wogan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds](./realbasicvsr_wogan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/real_basicvsr/realbasicvsr_wogan_c64b20_2x30x8_lr1e-4_300k_reds_20211027-0e2ff207.pth)/[log](http://download.openmmlab.com/mmediting/restorers/real_basicvsr/realbasicvsr_wogan_c64b20_2x30x8_lr1e-4_300k_reds_20211027_114039.log.json) | ## Quick Start diff --git a/configs/real_basicvsr/README_zh-CN.md b/configs/real_basicvsr/README_zh-CN.md index 45d40cb39f..e753988416 100644 --- a/configs/real_basicvsr/README_zh-CN.md +++ b/configs/real_basicvsr/README_zh-CN.md @@ -24,19 +24,19 @@ | 算法 | NRQM (Y) | NIQE (Y) | PI (Y) | BRISQUE (Y) | GPU 信息 | Download | | :------------------------------------------------------------------: | :------: | :------: | :----: | :---------: | :----------------------: | :-------------------------------------------------------------------------: | -| [realbasicvsr_c64b20_1x30x8_lr5e-5_150k_reds](/configs/real_basicvsr/realbasicvsr_c64b20-1x30x8_8xb1-lr5e-5-150k_reds.py) | 6.0477 | 3.7662 | 3.8593 | 29.030 | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/real_basicvsr/realbasicvsr_c64b20_1x30x8_lr5e-5_150k_reds_20211104-52f77c2c.pth)/[log](https://download.openmmlab.com/mmediting/restorers/real_basicvsr/realbasicvsr_c64b20_1x30x8_lr5e-5_150k_reds_20211104_183640.log.json) | -| [realbasicvsr_wogan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds](/configs/real_basicvsr/realbasicvsr_wogan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | [model](http://download.openmmlab.com/mmediting/restorers/real_basicvsr/realbasicvsr_wogan_c64b20_2x30x8_lr1e-4_300k_reds_20211027-0e2ff207.pth)/[log](http://download.openmmlab.com/mmediting/restorers/real_basicvsr/realbasicvsr_wogan_c64b20_2x30x8_lr1e-4_300k_reds_20211027_114039.log.json) | +| [realbasicvsr_c64b20_1x30x8_lr5e-5_150k_reds](./realbasicvsr_c64b20-1x30x8_8xb1-lr5e-5-150k_reds.py) | 6.0477 | 3.7662 | 3.8593 | 29.030 | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/real_basicvsr/realbasicvsr_c64b20_1x30x8_lr5e-5_150k_reds_20211104-52f77c2c.pth)/[log](https://download.openmmlab.com/mmediting/restorers/real_basicvsr/realbasicvsr_c64b20_1x30x8_lr5e-5_150k_reds_20211104_183640.log.json) | +| [realbasicvsr_wogan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds](./realbasicvsr_wogan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | [model](http://download.openmmlab.com/mmediting/restorers/real_basicvsr/realbasicvsr_wogan_c64b20_2x30x8_lr1e-4_300k_reds_20211027-0e2ff207.pth)/[log](http://download.openmmlab.com/mmediting/restorers/real_basicvsr/realbasicvsr_wogan_c64b20_2x30x8_lr1e-4_300k_reds_20211027_114039.log.json) | ## 训练 训练分为两个阶段: -1. 使用 [realbasicvsr_wogan_c64b20_2x30x8_lr1e-4_300k_reds.py](realbasicvsr_wogan_c64b20_2x30x8_lr1e-4_300k_reds.py) 训练一个没有感知损失和对抗性损失的模型。 -2. 使用感知损失和对抗性损失 [realbasicvsr_c64b20_1x30x8_lr5e-5_150k_reds.py](realbasicvsr_c64b20_1x30x8_lr5e-5_150k_reds.py) 微调模型。 +1. 使用 [realbasicvsr_wogan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds.py](realbasicvsr_wogan-c64b20-2x30x8_8xb2-lr1e-4-300k_reds.py) 训练一个没有感知损失和对抗性损失的模型。 +2. 使用感知损失和对抗性损失 [realbasicvsr_c64b20-1x30x8_8xb1-lr5e-5-150k_reds.py ](realbasicvsr_c64b20-1x30x8_8xb1-lr5e-5-150k_reds.py) 微调模型。 **注:** -1. 您可能希望将图像裁剪为子图像以加快 IO。请参阅[此处](/tools/data/super-resolution/reds/preprocess_reds_dataset.py)了解更多详情。 +1. 您可能希望将图像裁剪为子图像以加快 IO。请参阅[此处](../../tools/dataset_converters/reds/preprocess_reds_dataset.py)了解更多详情。 ## 快速开始 diff --git a/configs/real_esrgan/README.md b/configs/real_esrgan/README.md index 596ccad510..b908beda44 100644 --- a/configs/real_esrgan/README.md +++ b/configs/real_esrgan/README.md @@ -24,8 +24,8 @@ Evaluated on Set5 dataset with RGB channels. The metrics are `PSNR` and `SSIM`. | Method | PSNR | SSIM | GPU Info | Download | | :------------------------------------------------------------------------------: | :-----: | :----: | :----------------------: | :---------------------------------------------------------------------------------: | -| [realesrnet_c64b23g32_12x4_lr2e-4_1000k_df2k_ost](/configs/real_esrgan/realesrnet_c64b23g32_4xb12-lr2e-4-1000k_df2k-ost.py) | 28.0297 | 0.8236 | 4 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/real_esrgan/realesrnet_c64b23g32_12x4_lr2e-4_1000k_df2k_ost_20210816-4ae3b5a4.pth)/log | -| [realesrgan_c64b23g32_12x4_lr1e-4_400k_df2k_ost](/configs/real_esrgan/realesrgan_c64b23g32_4xb12-lr1e-4-400k_df2k-ost.py) | 26.2204 | 0.7655 | 4 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/real_esrgan/realesrgan_c64b23g32_12x4_lr1e-4_400k_df2k_ost_20211010-34798885.pth) /[log](https://download.openmmlab.com/mmediting/restorers/real_esrgan/realesrgan_c64b23g32_12x4_lr1e-4_400k_df2k_ost_20210922_142838.log.json) | +| [realesrnet_c64b23g32_12x4_lr2e-4_1000k_df2k_ost](./realesrnet_c64b23g32_4xb12-lr2e-4-1000k_df2k-ost.py) | 28.0297 | 0.8236 | 4 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/real_esrgan/realesrnet_c64b23g32_12x4_lr2e-4_1000k_df2k_ost_20210816-4ae3b5a4.pth)/log | +| [realesrgan_c64b23g32_12x4_lr1e-4_400k_df2k_ost](./realesrgan_c64b23g32_4xb12-lr1e-4-400k_df2k-ost.py) | 26.2204 | 0.7655 | 4 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/real_esrgan/realesrgan_c64b23g32_12x4_lr1e-4_400k_df2k_ost_20211010-34798885.pth) /[log](https://download.openmmlab.com/mmediting/restorers/real_esrgan/realesrgan_c64b23g32_12x4_lr1e-4_400k_df2k_ost_20210922_142838.log.json) | ## Quick Start diff --git a/configs/real_esrgan/README_zh-CN.md b/configs/real_esrgan/README_zh-CN.md index 54485dd2de..c35f4ac571 100644 --- a/configs/real_esrgan/README_zh-CN.md +++ b/configs/real_esrgan/README_zh-CN.md @@ -25,8 +25,8 @@ | 算法 | Set5 | GPU 信息 | 下载 | | :-------------------------------------------------------------------------------: | :------------: | :----------------------: | :-------------------------------------------------------------------------------: | -| [realesrnet_c64b23g32_12x4_lr2e-4_1000k_df2k_ost](/configs/real_esrgan/realesrnet_c64b23g32_4xb12-lr2e-4-1000k_df2k-ost.py) | 28.0297/0.8236 | 4 (Tesla V100-SXM2-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/real_esrgan/realesrnet_c64b23g32_12x4_lr2e-4_1000k_df2k_ost_20210816-4ae3b5a4.pth)/日志 | -| [realesrgan_c64b23g32_12x4_lr1e-4_400k_df2k_ost](/configs/real_esrgan/realesrgan_c64b23g32_4xb12-lr1e-4-400k_df2k-ost.py) | 26.2204/0.7655 | 4 (Tesla V100-SXM2-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/real_esrgan/realesrgan_c64b23g32_12x4_lr1e-4_400k_df2k_ost_20211010-34798885.pth) /[日志](https://download.openmmlab.com/mmediting/restorers/real_esrgan/realesrgan_c64b23g32_12x4_lr1e-4_400k_df2k_ost_20210922_142838.log.json) | +| [realesrnet_c64b23g32_12x4_lr2e-4_1000k_df2k_ost](./realesrnet_c64b23g32_4xb12-lr2e-4-1000k_df2k-ost.py) | 28.0297/0.8236 | 4 (Tesla V100-SXM2-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/real_esrgan/realesrnet_c64b23g32_12x4_lr2e-4_1000k_df2k_ost_20210816-4ae3b5a4.pth)/日志 | +| [realesrgan_c64b23g32_12x4_lr1e-4_400k_df2k_ost](./realesrgan_c64b23g32_4xb12-lr1e-4-400k_df2k-ost.py) | 26.2204/0.7655 | 4 (Tesla V100-SXM2-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/real_esrgan/realesrgan_c64b23g32_12x4_lr1e-4_400k_df2k_ost_20211010-34798885.pth) /[日志](https://download.openmmlab.com/mmediting/restorers/real_esrgan/realesrgan_c64b23g32_12x4_lr1e-4_400k_df2k_ost_20210922_142838.log.json) | ## 快速开始 diff --git a/configs/restormer/README.md b/configs/restormer/README.md index 2bc7c1f5c8..32d0cca049 100644 --- a/configs/restormer/README.md +++ b/configs/restormer/README.md @@ -26,7 +26,7 @@ Evaluated on Y channels. The metrics are `PSNR` / `SSIM` . | Method | Rain100H
PSNR/SSIM (Y) | Rain100L
PSNR/SSIM (Y) | Test100
PSNR/SSIM (Y) | Test1200
PSNR/SSIM (Y) | Test2800
PSNR/SSIM (Y) | GPU Info | Download | | :-------------------------------: | :-----------------------: | :-----------------------: | :----------------------: | :-----------------------: | :-----------------------: | :------: | :---------------------------------: | -| [restormer_official_rain13k](/configs/restormer/restormer_official_rain13k.py) | 31.4804/0.9056 | 39.1023/0.9787 | 32.0287/0.9239 | 33.2251/0.9272 | 34.2170/0.9451 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_rain13k-2be7b550.pth) \| log | +| [restormer_official_rain13k](./restormer_official_rain13k.py) | 31.4804/0.9056 | 39.1023/0.9787 | 32.0287/0.9239 | 33.2251/0.9272 | 34.2170/0.9451 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_rain13k-2be7b550.pth) \| log | ### **Motion Deblurring** @@ -34,16 +34,16 @@ Evaluated on RGB channels for GoPro and HIDE, and Y channel for ReakBlur-J and R | Method | GoPro
PSNR/SSIM (RGB) | HIDE
PSNR/SSIM (RGB) | RealBlur-J
PSNR/SSIM (Y) | RealBlur-R
PSNR/SSIM (Y) | GPU Info | Download | | :------------------------------------------: | :----------------------: | :---------------------: | :-------------------------: | :-------------------------: | :------: | :---------------------------------------------: | -| [restormer_official_gopro](/configs/restormer/restormer_official_gopro.py) | 32.9295/0.9496 | 31.2289/0.9345 | 28.4356/0.8681 | 35.9141/0.9707 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_gopro-db7363a0.pth) \| log | +| [restormer_official_gopro](./restormer_official_gopro.py) | 32.9295/0.9496 | 31.2289/0.9345 | 28.4356/0.8681 | 35.9141/0.9707 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_gopro-db7363a0.pth) \| log | ### **Defocus Deblurring** Evaluated on RGB channels. The metrics are `PSNR` / `SSIM` / `MAE` / `LPIPS`. -| Method | Indoor Scenes PSNR | Indoor Scenes SSIM | Indoor Scenes MAE | Indoor Scenes LPIPS | Outdoor Scenes PSNR | Outdoor Scenes SSIM | Outdoor Scenes MAE | Outdoor Scenes LPIPS | Combined PSNR | Combined SSIM | Combined MAE | Combined LPIPS | GPU Info | Download | -| :------------------------------------------------------------------------------------: | :----------------: | :----------------: | :---------------: | :-----------------: | :-----------------: | :-----------------: | :----------------: | :------------------: | :-----------: | :-----------: | :----------: | :------------: | :------: | :------------------------------------------------------------------------------------------------------------: | -| [restormer_official_dpdd-single](/configs/restormer/restormer_official_dpdd-single.py) | 28.8681 | 0.8859 | 0.0251 | - | 23.2410 | 0.7509 | 0.0499 | - | 25.9805 | 0.8166 | 0.0378 | - | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth) \| log | -| [restormer_official_dpdd-dual](/configs/restormer/restormer_official_dpdd-dual.py) | 26.6160 | 0.8346 | 0.0354 | - | 26.6160 | 0.8346 | 0.0354 | - | 26.6160 | 0.8346 | 0.0354 | - | 1 | [model](https://download.openmmlab.com/mmediting/restormer_official_dpdd-dual-52c94c00.pth) \| log | +| Method | Indoor Scenes PSNR | Indoor Scenes SSIM | Indoor Scenes MAE | Indoor Scenes LPIPS | Outdoor Scenes PSNR | Outdoor Scenes SSIM | Outdoor Scenes MAE | Outdoor Scenes LPIPS | Combined PSNR | Combined SSIM | Combined MAE | Combined LPIPS | GPU Info | Download | +| :-------------------------------------------------------------------: | :----------------: | :----------------: | :---------------: | :-----------------: | :-----------------: | :-----------------: | :----------------: | :------------------: | :-----------: | :-----------: | :----------: | :------------: | :------: | :------------------------------------------------------------------------------------------------------------: | +| [restormer_official_dpdd-single](./restormer_official_dpdd-single.py) | 28.8681 | 0.8859 | 0.0251 | - | 23.2410 | 0.7509 | 0.0499 | - | 25.9805 | 0.8166 | 0.0378 | - | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth) \| log | +| [restormer_official_dpdd-dual](./restormer_official_dpdd-dual.py) | 26.6160 | 0.8346 | 0.0354 | - | 26.6160 | 0.8346 | 0.0354 | - | 26.6160 | 0.8346 | 0.0354 | - | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-dual-52c94c00.pth) \| log | ### **Gaussian Denoising** @@ -53,13 +53,13 @@ Evaluated on grayscale images. The metrics are `PSNR` / `SSIM` . | Method | $\\sigma$ | Set12
PSNR/SSIM | BSD68
PSNR/SSIM | Urban100
PSNR/SSIM | GPU Info | Download | | :------------------------------------------------------------: | :-------: | :----------------: | :----------------: | :-------------------: | :------: | :--------------------------------------------------------------: | -| [restormer_official_dfwb-gray-sigma15](/configs/restormer/restormer_official_dfwb-gray-sigma15.py) | 15 | 34.0182/0.9160 | 32.4987/0.8940 | 34.4336/0.9419 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma15-da74417f.pth) \| log | -| [restormer_official_dfwb-gray-sigma25](/configs/restormer/restormer_official_dfwb-gray-sigma25.py) | 25 | 31.7289/0.8811 | 30.1613/0.8370 | 32.1162/0.9140 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma25-08010841.pth) \| log | -| [restormer_official_dfwb-gray-sigma50](/configs/restormer/restormer_official_dfwb-gray-sigma50.py) | 50 | 28.6269/0.8188 | 27.3266/0.7434 | 28.9636/0.8571 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma50-ee852dfe.pth) \| log | +| [restormer_official_dfwb-gray-sigma15](./restormer_official_dfwb-gray-sigma15.py) | 15 | 34.0182/0.9160 | 32.4987/0.8940 | 34.4336/0.9419 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma15-da74417f.pth) \| log | +| [restormer_official_dfwb-gray-sigma25](./restormer_official_dfwb-gray-sigma25.py) | 25 | 31.7289/0.8811 | 30.1613/0.8370 | 32.1162/0.9140 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma25-08010841.pth) \| log | +| [restormer_official_dfwb-gray-sigma50](./restormer_official_dfwb-gray-sigma50.py) | 50 | 28.6269/0.8188 | 27.3266/0.7434 | 28.9636/0.8571 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma50-ee852dfe.pth) \| log | | | | | | | | | -| [restormer_official_dfwb-gray-sigma15](/configs/restormer/restormer_official_dfwb-gray-sigma15.py) | 15 | 33.9642/0.9153 | 32.4994/0.8928 | 34.3152/0.9409 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth) \| log | -| [restormer_official_dfwb-gray-sigma25](/configs/restormer/restormer_official_dfwb-gray-sigma25.py) | 25 | 31.7106/0.8810 | 30.1486/0.8360 | 32.0457/0.9131 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth) \| log | -| [restormer_official_dfwb-gray-sigma50](/configs/restormer/restormer_official_dfwb-gray-sigma50.py) | 50 | 28.6614/0.8197 | 27.3537/0.7422 | 28.9848/0.8571 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth) \| log | +| [restormer_official_dfwb-gray-sigma15](./restormer_official_dfwb-gray-sigma15.py) | 15 | 33.9642/0.9153 | 32.4994/0.8928 | 34.3152/0.9409 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth) \| log | +| [restormer_official_dfwb-gray-sigma25](./restormer_official_dfwb-gray-sigma25.py) | 25 | 31.7106/0.8810 | 30.1486/0.8360 | 32.0457/0.9131 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth) \| log | +| [restormer_official_dfwb-gray-sigma50](./restormer_official_dfwb-gray-sigma50.py) | 50 | 28.6614/0.8197 | 27.3537/0.7422 | 28.9848/0.8571 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth) \| log | > Top super-row: training a separate model for each noise level. Bottom super-row: learning a single model to handle various noise levels. @@ -69,13 +69,13 @@ Evaluated on RGB channels. The metrics are `PSNR` / `SSIM` . | Method | $\\sigma$ | CBSD68
PSNR/SSIM (RGB) | Kodak24
PSNR/SSIM (RGB) | McMaster
PSNR/SSIM (RGB) | Urban100
PSNR/SSIM (RGB) | GPU Info | Download | | :------------------------------------: | :-------: | :-----------------------: | :------------------------: | :-------------------------: | :-------------------------: | :------: | :--------------------------------------: | -| [restormer_official_dfwb-color-sigma15](/configs/restormer/restormer_official_dfwb-color-sigma15.py) | 15 | 34.3506/0.9352 | 35.4900/0.9312 | 35.6072/0.9352 | 35.1522/0.9530 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma15-012ceb71.pth) \| log | -| [restormer_official_dfwb-color-sigma25](/configs/restormer/restormer_official_dfwb-color-sigma25.py) | 25 | 31.7457/0.8942 | 33.0489/0.8943 | 33.3260/0.9066 | 32.9670/0.9317 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma25-e307f222.pth) \| log | -| [restormer_official_dfwb-color-sigma50](/configs/restormer/restormer_official_dfwb-color-sigma50.py) | 50 | 28.5569/0.8127 | 30.0122/0.8238 | 30.2608/0.8515 | 30.0230/0.8902 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma50-a991983d.pth) \| log | +| [restormer_official_dfwb-color-sigma15](./restormer_official_dfwb-color-sigma15.py) | 15 | 34.3506/0.9352 | 35.4900/0.9312 | 35.6072/0.9352 | 35.1522/0.9530 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma15-012ceb71.pth) \| log | +| [restormer_official_dfwb-color-sigma25](./restormer_official_dfwb-color-sigma25.py) | 25 | 31.7457/0.8942 | 33.0489/0.8943 | 33.3260/0.9066 | 32.9670/0.9317 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma25-e307f222.pth) \| log | +| [restormer_official_dfwb-color-sigma50](./restormer_official_dfwb-color-sigma50.py) | 50 | 28.5569/0.8127 | 30.0122/0.8238 | 30.2608/0.8515 | 30.0230/0.8902 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma50-a991983d.pth) \| log | | | | | | | | | | -| [restormer_official_dfwb-color-sigma15](/configs/restormer/restormer_official_dfwb-color-sigma15.py) | 15 | 34.3422/0.9356 | 35.4544/0.9308 | 35.5473/0.9344 | 35.0754/0.9524 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth) \| log | -| [restormer_official_dfwb-color-sigma25](/configs/restormer/restormer_official_dfwb-color-sigma25.py) | 25 | 31.7391/0.8945 | 33.0380/0.8941 | 33.3040/0.9063 | 32.9165/0.9312 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth) \| log | -| [restormer_official_dfwb-color-sigma50](/configs/restormer/restormer_official_dfwb-color-sigma50.py) | 50 | 28.5582/0.8126 | 30.0074/0.8233 | 30.2671/0.8520 | 30.0172/0.8898 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth) \| log | +| [restormer_official_dfwb-color-sigma15](./restormer_official_dfwb-color-sigma15.py) | 15 | 34.3422/0.9356 | 35.4544/0.9308 | 35.5473/0.9344 | 35.0754/0.9524 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth) \| log | +| [restormer_official_dfwb-color-sigma25](./restormer_official_dfwb-color-sigma25.py) | 25 | 31.7391/0.8945 | 33.0380/0.8941 | 33.3040/0.9063 | 32.9165/0.9312 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth) \| log | +| [restormer_official_dfwb-color-sigma50](./restormer_official_dfwb-color-sigma50.py) | 50 | 28.5582/0.8126 | 30.0074/0.8233 | 30.2671/0.8520 | 30.0172/0.8898 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth) \| log | > Top super-row: training a separate model for each noise level. Bottom super-row: learning a single model to handle various noise levels. @@ -83,9 +83,9 @@ Evaluated on RGB channels. The metrics are `PSNR` / `SSIM` . Evaluated on RGB channels. The metrics are `PSNR` / `SSIM` . -| Method | SIDD
PSNR/SSIM | GPU Info | Download | -| :----------------------------------------------------------------------: | :---------------: | :------: | :-----------------------------------------------------------------------------------------------------: | -| [restormer_official_sidd](/configs/restormer/restormer_official_sidd.py) | 40.0156/0.9225 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_sidd-9e7025db.pth) \| log | +| Method | SIDD
PSNR/SSIM | GPU Info | Download | +| :-----------------------------------------------------: | :---------------: | :------: | :-----------------------------------------------------------------------------------------------------: | +| [restormer_official_sidd](./restormer_official_sidd.py) | 40.0156/0.9225 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_sidd-9e7025db.pth) \| log | ## Quick Start @@ -114,7 +114,7 @@ CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_officia # Single CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dpdd-dual.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth # Dual -CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dpdd-single.py https://download.openmmlab.com/mmediting/restormer_official_dpdd-dual-52c94c00.pth +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dpdd-single.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-dual-52c94c00.pth # Gaussian Denoising # Test Grayscale Gaussian Noise @@ -160,7 +160,7 @@ python tools/test.py configs/restormer/restormer_official_gopro.py https://downl # Single python tools/test.py configs/restormer/restormer_official_dpdd-dual.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth # Dual -python tools/test.py configs/restormer/restormer_official_dpdd-single.py https://download.openmmlab.com/mmediting/restormer_official_dpdd-dual-52c94c00.pth +python tools/test.py configs/restormer/restormer_official_dpdd-single.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-dual-52c94c00.pth # Gaussian Denoising # Test Grayscale Gaussian Noise @@ -207,7 +207,7 @@ python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma50.py # Single ./tools/dist_test.sh configs/restormer/restormer_official_dpdd-dual.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth # Dual -./tools/dist_test.sh configs/restormer/restormer_official_dpdd-single.py https://download.openmmlab.com/mmediting/restormer_official_dpdd-dual-52c94c00.pth +./tools/dist_test.sh configs/restormer/restormer_official_dpdd-single.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-dual-52c94c00.pth # Gaussian Denoising # Test Grayscale Gaussian Noise diff --git a/configs/restormer/README_zh-CN.md b/configs/restormer/README_zh-CN.md index 400f597d62..91c669f492 100644 --- a/configs/restormer/README_zh-CN.md +++ b/configs/restormer/README_zh-CN.md @@ -18,7 +18,7 @@ | 方法 | Rain100H
PSNR/SSIM (Y) | Rain100L
PSNR/SSIM (Y) | Test100
PSNR/SSIM (Y) | Test1200
PSNR/SSIM (Y) | Test2800
PSNR/SSIM (Y) | GPU信息 | 下载 | | :--------------------------------: | :-----------------------: | :-----------------------: | :----------------------: | :-----------------------: | :-----------------------: | :-----: | :---------------------------------: | -| [restormer_official_rain13k](/configs/restormer/restormer_official_rain13k.py) | 31.4804/0.9056 | 39.1023/0.9787 | 32.0287/0.9239 | 33.2251/0.9272 | 34.2170/0.9451 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_rain13k-2be7b550.pth) \| log | +| [restormer_official_rain13k](./restormer_official_rain13k.py) | 31.4804/0.9056 | 39.1023/0.9787 | 32.0287/0.9239 | 33.2251/0.9272 | 34.2170/0.9451 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_rain13k-2be7b550.pth) \| log | ### **图像去模糊** @@ -26,7 +26,7 @@ Gopro和HIDE数据集上使用RGB通道测试,ReakBlur-J 和 ReakBlur-R数据 | 方法 | GoPro
PSNR/SSIM (RGB) | HIDE
PSNR/SSIM (RGB) | RealBlur-J
PSNR/SSIM (Y) | RealBlur-R
PSNR/SSIM (Y) | GPU信息 | 下载 | | :--------------------------------------------: | :----------------------: | :---------------------: | :-------------------------: | :-------------------------: | :-----: | :--------------------------------------------: | -| [restormer_official_gopro](/configs/restormer/restormer_official_gopro.py) | 32.9295/0.9496 | 31.2289/0.9345 | 28.4356/0.8681 | 35.9141/0.9707 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_gopro-db7363a0.pth) \| log | +| [restormer_official_gopro](./restormer_official_gopro.py) | 32.9295/0.9496 | 31.2289/0.9345 | 28.4356/0.8681 | 35.9141/0.9707 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_gopro-db7363a0.pth) \| log | ### **图像去失焦模糊** @@ -34,8 +34,8 @@ Gopro和HIDE数据集上使用RGB通道测试,ReakBlur-J 和 ReakBlur-R数据 | 方法 | 室内场景图像的PSNR | 室内场景图像的SSIM | 室内场景图像的MAE | 室内场景图像的LPIPS | 室外场景图像的PSNR | 室外场景图像的SSIM | 室外场景图像的MAE | 室外场景图像的LPIPS | 所有图像平均PSNR | 所有图像平均SSIM | 所有图像平均MAE | 所有图像平均LPIPS | GPU 信息 | 下载 | | :----: | :-------------: | :-------------: | :------------: | :--------------: | :-------------: | :-------------: | :------------: | :--------------: | :------------: | :-------------: | :------------: | :--------------: | :------: | :-----: | -| [restormer_official_dpdd-single](/configs/restormer/restormer_official_dpdd-single.py) | 28.8681 | 0.8859 | 0.0251 | - | 23.2410 | 0.7509 | 0.0499 | - | 25.9805 | 0.8166 | 0.0378 | - | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth) \| log | -| [restormer_official_dpdd-dual](/configs/restormer/restormer_official_dpdd-dual.py) | 26.6160 | 0.8346 | 0.0354 | - | 26.6160 | 0.8346 | 0.0354 | - | 26.6160 | 0.8346 | 0.0354 | - | 1 | [model](https://download.openmmlab.com/mmediting/restormer_official_dpdd-dual-52c94c00.pth) \| log | +| [restormer_official_dpdd-single](./restormer_official_dpdd-single.py) | 28.8681 | 0.8859 | 0.0251 | - | 23.2410 | 0.7509 | 0.0499 | - | 25.9805 | 0.8166 | 0.0378 | - | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth) \| log | +| [restormer_official_dpdd-dual](./restormer_official_dpdd-dual.py) | 26.6160 | 0.8346 | 0.0354 | - | 26.6160 | 0.8346 | 0.0354 | - | 26.6160 | 0.8346 | 0.0354 | - | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-dual-52c94c00.pth) \| log | ### **图像高斯噪声去除** @@ -45,13 +45,13 @@ Gopro和HIDE数据集上使用RGB通道测试,ReakBlur-J 和 ReakBlur-R数据 | 方法 | $\\sigma$ | Set12
PSNR/SSIM | BSD68
PSNR/SSIM | Urban100
PSNR/SSIM | GPU信息 | 下载 | | :-------------------------------------------------------------: | :-------: | :----------------: | :----------------: | :-------------------: | :-----: | :--------------------------------------------------------------: | -| [restormer_official_dfwb-gray-sigma15](/configs/restormer/restormer_official_dfwb-gray-sigma15.py) | 15 | 34.0182/0.9160 | 32.4987/0.8940 | 34.4336/0.9419 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma15-da74417f.pth) \| log | -| [restormer_official_dfwb-gray-sigma25](/configs/restormer/restormer_official_dfwb-gray-sigma25.py) | 25 | 31.7289/0.8811 | 30.1613/0.8370 | 32.1162/0.9140 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma25-08010841.pth) \| log | -| [restormer_official_dfwb-gray-sigma50](/configs/restormer/restormer_official_dfwb-gray-sigma50.py) | 50 | 28.6269/0.8188 | 27.3266/0.7434 | 28.9636/0.8571 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma50-ee852dfe.pth) \| log | +| [restormer_official_dfwb-gray-sigma15](./restormer_official_dfwb-gray-sigma15.py) | 15 | 34.0182/0.9160 | 32.4987/0.8940 | 34.4336/0.9419 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma15-da74417f.pth) \| log | +| [restormer_official_dfwb-gray-sigma25](./restormer_official_dfwb-gray-sigma25.py) | 25 | 31.7289/0.8811 | 30.1613/0.8370 | 32.1162/0.9140 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma25-08010841.pth) \| log | +| [restormer_official_dfwb-gray-sigma50](./restormer_official_dfwb-gray-sigma50.py) | 50 | 28.6269/0.8188 | 27.3266/0.7434 | 28.9636/0.8571 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-sigma50-ee852dfe.pth) \| log | | | | | | | | | -| [restormer_official_dfwb-gray-sigma15](/configs/restormer/restormer_official_dfwb-gray-sigma15.py) | 15 | 33.9642/0.9153 | 32.4994/0.8928 | 34.3152/0.9409 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth) \| log | -| [restormer_official_dfwb-gray-sigma25](/configs/restormer/restormer_official_dfwb-gray-sigma25.py) | 25 | 31.7106/0.8810 | 30.1486/0.8360 | 32.0457/0.9131 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth) \| log | -| [restormer_official_dfwb-gray-sigma50](/configs/restormer/restormer_official_dfwb-gray-sigma50.py) | 50 | 28.6614/0.8197 | 27.3537/0.7422 | 28.9848/0.8571 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth) \| log | +| [restormer_official_dfwb-gray-sigma15](./restormer_official_dfwb-gray-sigma15.py) | 15 | 33.9642/0.9153 | 32.4994/0.8928 | 34.3152/0.9409 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth) \| log | +| [restormer_official_dfwb-gray-sigma25](./restormer_official_dfwb-gray-sigma25.py) | 25 | 31.7106/0.8810 | 30.1486/0.8360 | 32.0457/0.9131 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth) \| log | +| [restormer_official_dfwb-gray-sigma50](./restormer_official_dfwb-gray-sigma50.py) | 50 | 28.6614/0.8197 | 27.3537/0.7422 | 28.9848/0.8571 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-gray-blind-5f094bcc.pth) \| log | > 上面三行代表每个噪声等级训练一个单独的模型,下面三行代表学习一个单一的模型来处理各种噪音水平。 @@ -61,13 +61,13 @@ Gopro和HIDE数据集上使用RGB通道测试,ReakBlur-J 和 ReakBlur-R数据 | 方法 | $\\sigma$ | CBSD68
PSNR/SSIM (RGB) | Kodak24
PSNR/SSIM (RGB) | McMaster
PSNR/SSIM (RGB) | Urban100
PSNR/SSIM (RGB) | GPU信息 | 下载 | | :-------------------------------------: | :-------: | :-----------------------: | :------------------------: | :-------------------------: | :-------------------------: | :-----: | :--------------------------------------: | -| [restormer_official_dfwb-color-sigma15](/configs/restormer/restormer_official_dfwb-color-sigma15.py) | 15 | 34.3506/0.9352 | 35.4900/0.9312 | 35.6072/0.9352 | 35.1522/0.9530 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma15-012ceb71.pth) \| log | -| [restormer_official_dfwb-color-sigma25](/configs/restormer/restormer_official_dfwb-color-sigma25.py) | 25 | 31.7457/0.8942 | 33.0489/0.8943 | 33.3260/0.9066 | 32.9670/0.9317 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma25-e307f222.pth) \| log | -| [restormer_official_dfwb-color-sigma50](/configs/restormer/restormer_official_dfwb-color-sigma50.py) | 50 | 28.5569/0.8127 | 30.0122/0.8238 | 30.2608/0.8515 | 30.0230/0.8902 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma50-a991983d.pth) \| log | +| [restormer_official_dfwb-color-sigma15](./restormer_official_dfwb-color-sigma15.py) | 15 | 34.3506/0.9352 | 35.4900/0.9312 | 35.6072/0.9352 | 35.1522/0.9530 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma15-012ceb71.pth) \| log | +| [restormer_official_dfwb-color-sigma25](./restormer_official_dfwb-color-sigma25.py) | 25 | 31.7457/0.8942 | 33.0489/0.8943 | 33.3260/0.9066 | 32.9670/0.9317 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma25-e307f222.pth) \| log | +| [restormer_official_dfwb-color-sigma50](./restormer_official_dfwb-color-sigma50.py) | 50 | 28.5569/0.8127 | 30.0122/0.8238 | 30.2608/0.8515 | 30.0230/0.8902 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-sigma50-a991983d.pth) \| log | | | | | | | | | | -| [restormer_official_dfwb-color-sigma15](/configs/restormer/restormer_official_dfwb-color-sigma15.py) | 15 | 34.3422/0.9356 | 35.4544/0.9308 | 35.5473/0.9344 | 35.0754/0.9524 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth) \| log | -| [restormer_official_dfwb-color-sigma25](/configs/restormer/restormer_official_dfwb-color-sigma25.py) | 25 | 31.7391/0.8945 | 33.0380/0.8941 | 33.3040/0.9063 | 32.9165/0.9312 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth) \| log | -| [restormer_official_dfwb-color-sigma50](/configs/restormer/restormer_official_dfwb-color-sigma50.py) | 50 | 28.5582/0.8126 | 30.0074/0.8233 | 30.2671/0.8520 | 30.0172/0.8898 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth) \| log | +| [restormer_official_dfwb-color-sigma15](./restormer_official_dfwb-color-sigma15.py) | 15 | 34.3422/0.9356 | 35.4544/0.9308 | 35.5473/0.9344 | 35.0754/0.9524 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth) \| log | +| [restormer_official_dfwb-color-sigma25](./restormer_official_dfwb-color-sigma25.py) | 25 | 31.7391/0.8945 | 33.0380/0.8941 | 33.3040/0.9063 | 32.9165/0.9312 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth) \| log | +| [restormer_official_dfwb-color-sigma50](./restormer_official_dfwb-color-sigma50.py) | 50 | 28.5582/0.8126 | 30.0074/0.8233 | 30.2671/0.8520 | 30.0172/0.8898 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_dfwb-color-blind-dfd03c9f.pth) \| log | > 上面三行代表每个噪声等级训练一个单独的模型,下面三行代表学习一个单一的模型来处理各种噪音水平。 @@ -75,9 +75,9 @@ Gopro和HIDE数据集上使用RGB通道测试,ReakBlur-J 和 ReakBlur-R数据 所有指标均在RGB通道上进行测试,测试指标为PSNR和SSIM。 -| 方法 | SIDD
PSNR/SSIM | GPU信息 | 下载 | -| :----------------------------------------------------------------------: | :---------------: | :-----: | :-----------------------------------------------------------------------------------------------------: | -| [restormer_official_sidd](/configs/restormer/restormer_official_sidd.py) | 40.0156/0.9225 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_sidd-9e7025db.pth) \| log | +| 方法 | SIDD
PSNR/SSIM | GPU信息 | 下载 | +| :-----------------------------------------------------: | :---------------: | :-----: | :-----------------------------------------------------------------------------------------------------: | +| [restormer_official_sidd](./restormer_official_sidd.py) | 40.0156/0.9225 | 1 | [model](https://download.openmmlab.com/mmediting/restormer/restormer_official_sidd-9e7025db.pth) \| log | ## 使用方法 @@ -104,7 +104,7 @@ CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_officia # Single CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dpdd-dual.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth # Dual -CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dpdd-single.py https://download.openmmlab.com/mmediting/restormer_official_dpdd-dual-52c94c00.pth +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/restormer/restormer_official_dpdd-single.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-dual-52c94c00.pth # Gaussian Denoising # Test Grayscale Gaussian Noise @@ -150,7 +150,7 @@ python tools/test.py configs/restormer/restormer_official_gopro.py https://downl # Single python tools/test.py configs/restormer/restormer_official_dpdd-dual.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth # Dual -python tools/test.py configs/restormer/restormer_official_dpdd-single.py https://download.openmmlab.com/mmediting/restormer_official_dpdd-dual-52c94c00.pth +python tools/test.py configs/restormer/restormer_official_dpdd-single.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-dual-52c94c00.pth # Gaussian Denoising # Test Grayscale Gaussian Noise @@ -197,7 +197,7 @@ python tools/test.py configs/restormer/restormer_official_dfwb-color-sigma50.py # Single ./tools/dist_test.sh configs/restormer/restormer_official_dpdd-dual.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-single-6bc31582.pth # Dual -./tools/dist_test.sh configs/restormer/restormer_official_dpdd-single.py https://download.openmmlab.com/mmediting/restormer_official_dpdd-dual-52c94c00.pth +./tools/dist_test.sh configs/restormer/restormer_official_dpdd-single.py https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-dual-52c94c00.pth # Gaussian Denoising # Test Grayscale Gaussian Noise diff --git a/configs/restormer/metafile.yml b/configs/restormer/metafile.yml index 90e8f0b8a1..dbb62c29f7 100644 --- a/configs/restormer/metafile.yml +++ b/configs/restormer/metafile.yml @@ -95,7 +95,7 @@ Models: Outdoor Scenes PSNR: 26.616 Outdoor Scenes SSIM: 0.8346 Task: Denoising, Deblurring, Deraining - Weights: https://download.openmmlab.com/mmediting/restormer_official_dpdd-dual-52c94c00.pth + Weights: https://download.openmmlab.com/mmediting/restormer/restormer_official_dpdd-dual-52c94c00.pth - Config: configs/restormer/restormer_official_dfwb-gray-sigma15.py In Collection: Restormer Metadata: diff --git a/configs/sagan/README.md b/configs/sagan/README.md index 6e4a3cf5f9..ddb9d96149 100644 --- a/configs/sagan/README.md +++ b/configs/sagan/README.md @@ -28,14 +28,14 @@ In this paper, we propose the Self-Attention Generative Adversarial Network (SAG | Models | Dataset | Inplace ReLU | dist_step | Total Batchsize (BZ_PER_GPU * NGPU) | Total Iters\* | Iter | IS | FID | Config | Download | Log | | :------------------------: | :------: | :----------: | :-------: | :---------------------------------: | :-----------: | :----: | :-----: | :-----: | :------------------------: | :--------------------------: | :---------------------: | -| SAGAN-32x32-woInplaceReLU Best IS | CIFAR10 | w/o | 5 | 64x1 | 500000 | 400000 | 9.3217 | 10.5030 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py) | [model](https://download.openmmlab.com/mmgen/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_woReUinplace_is-iter400000_20210730_125743-4008a9ca.pth) | [Log](https://download.openmmlab.com/mmgen/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_woReUinplace_20210730_125449_fid-d50568a4_is-04008a9ca.json) | -| SAGAN-32x32-woInplaceReLU Best FID | CIFAR10 | w/o | 5 | 64x1 | 500000 | 480000 | 9.3174 | 9.4252 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py) | [model](https://download.openmmlab.com/mmgen/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_woReUinplace_fid-iter480000_20210730_125449-d50568a4.pth) | [Log](https://download.openmmlab.com/mmgen/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_woReUinplace_20210730_125449_fid-d50568a4_is-04008a9ca.json) | -| SAGAN-32x32-wInplaceReLU Best IS | CIFAR10 | w | 5 | 64x1 | 500000 | 380000 | 9.2286 | 11.7760 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py) | [model](https://download.openmmlab.com/mmgen/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_wReLUinplace_is-iter380000_20210730_124937-c77b4d25.pth) | [Log](https://download.openmmlab.com/mmgen/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_wReLUinplace_20210730_125155_fid-cbefb354_is-c77b4d25.json) | -| SAGAN-32x32-wInplaceReLU Best FID | CIFAR10 | w | 5 | 64x1 | 500000 | 460000 | 9.2061 | 10.7781 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py) | [model](https://download.openmmlab.com/mmgen/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_wReLUinplace_fid-iter460000_20210730_125155-cbefb354.pth) | [Log](https://download.openmmlab.com/mmgen/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_wReLUinplace_20210730_125155_fid-cbefb354_is-c77b4d25.json) | -| SAGAN-128x128-woInplaceReLU Best IS | ImageNet | w/o | 1 | 64x4 | 1000000 | 980000 | 31.5938 | 36.7712 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_woReLUinplace_Glr1e-4_Dlr4e-4_ndisc1-4xb64_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmgen/sagan/sagan_imagenet1k_128_Glr1e-4_Dlr4e-4_ndisc1_b32x4_woReLUinplace_is-iter980000_20210730_163140-cfbebfc6.pth) | [Log](https://download.openmmlab.com/mmgen/sagan/sagan_imagenet1k_128_Glr1e-4_Dlr4e-4_ndisc1_b32x4_woReLUinplace_20210730_163431_fid-d7916963_is-cfbebfc6.json) | -| SAGAN-128x128-woInplaceReLU Best FID | ImageNet | w/o | 1 | 64x4 | 1000000 | 950000 | 28.4936 | 34.7838 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_woReLUinplace_Glr1e-4_Dlr4e-4_ndisc1-4xb64_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmgen/sagan/sagan_imagenet1k_128_Glr1e-4_Dlr4e-4_ndisc1_b32x4_woReLUinplace_fid-iter950000_20210730_163431-d7916963.pth) | [Log](https://download.openmmlab.com/mmgen/sagan/sagan_imagenet1k_128_Glr1e-4_Dlr4e-4_ndisc1_b32x4_woReLUinplace_20210730_163431_fid-d7916963_is-cfbebfc6.json) | -| SAGAN-128x128-BigGAN Schedule Best IS | ImageNet | w/o | 1 | 32x8 | 1000000 | 826000 | 69.5350 | 12.8295 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_woReLUinplace-Glr1e-4_Dlr4e-4_noaug-ndisc1-8xb32-bigGAN-sch_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmgen/sagan/sagan_128_woReLUinplace_noaug_bigGAN_imagenet1k_b32x8_Glr1e-4_Dlr-4e-4_ndisc1_20210818_210232-3f5686af.pth) | [Log](https://download.openmmlab.com/mmgen/sagan/sagan_128_woReLUinplace_noaug_bigGAN_imagenet1k_b32x8_Glr1e-4_Dlr-4e-4_ndisc1_20210818_210232-3f5686af.json) | -| SAGAN-128x128-BigGAN Schedule Best FID | ImageNet | w/o | 1 | 32x8 | 1000000 | 826000 | 69.5350 | 12.8295 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_woReLUinplace-Glr1e-4_Dlr4e-4_noaug-ndisc1-8xb32-bigGAN-sch_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmgen/sagan/sagan_128_woReLUinplace_noaug_bigGAN_imagenet1k_b32x8_Glr1e-4_Dlr-4e-4_ndisc1_20210818_210232-3f5686af.pth) | [Log](https://download.openmmlab.com/mmgen/sagan/sagan_128_woReLUinplace_noaug_bigGAN_imagenet1k_b32x8_Glr1e-4_Dlr-4e-4_ndisc1_20210818_210232-3f5686af.json) | +| SAGAN-32x32-woInplaceReLU Best IS | CIFAR10 | w/o | 5 | 64x1 | 500000 | 400000 | 9.3217 | 10.5030 | [config](./sagan_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py) | [model](https://download.openmmlab.com/mmediting/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_woReUinplace_is-iter400000_20210730_125743-4008a9ca.pth) | [Log](https://download.openmmlab.com/mmediting/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_woReUinplace_20210730_125449_fid-d50568a4_is-04008a9ca.json) | +| SAGAN-32x32-woInplaceReLU Best FID | CIFAR10 | w/o | 5 | 64x1 | 500000 | 480000 | 9.3174 | 9.4252 | [config](./sagan_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py) | [model](https://download.openmmlab.com/mmediting/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_woReUinplace_fid-iter480000_20210730_125449-d50568a4.pth) | [Log](https://download.openmmlab.com/mmediting/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_woReUinplace_20210730_125449_fid-d50568a4_is-04008a9ca.json) | +| SAGAN-32x32-wInplaceReLU Best IS | CIFAR10 | w | 5 | 64x1 | 500000 | 380000 | 9.2286 | 11.7760 | [config](./sagan_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py) | [model](https://download.openmmlab.com/mmediting/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_wReLUinplace_is-iter380000_20210730_124937-c77b4d25.pth) | [Log](https://download.openmmlab.com/mmediting/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_wReLUinplace_20210730_125155_fid-cbefb354_is-c77b4d25.json) | +| SAGAN-32x32-wInplaceReLU Best FID | CIFAR10 | w | 5 | 64x1 | 500000 | 460000 | 9.2061 | 10.7781 | [config](./sagan_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py) | [model](https://download.openmmlab.com/mmediting/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_wReLUinplace_fid-iter460000_20210730_125155-cbefb354.pth) | [Log](https://download.openmmlab.com/mmediting/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_wReLUinplace_20210730_125155_fid-cbefb354_is-c77b4d25.json) | +| SAGAN-128x128-woInplaceReLU Best IS | ImageNet | w/o | 1 | 64x4 | 1000000 | 980000 | 31.5938 | 36.7712 | [config](./sagan_woReLUinplace_Glr1e-4_Dlr4e-4_ndisc1-4xb64_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmediting/sagan/sagan_imagenet1k_128_Glr1e-4_Dlr4e-4_ndisc1_b32x4_woReLUinplace_is-iter980000_20210730_163140-cfbebfc6.pth) | [Log](https://download.openmmlab.com/mmediting/sagan/sagan_imagenet1k_128_Glr1e-4_Dlr4e-4_ndisc1_b32x4_woReLUinplace_20210730_163431_fid-d7916963_is-cfbebfc6.json) | +| SAGAN-128x128-woInplaceReLU Best FID | ImageNet | w/o | 1 | 64x4 | 1000000 | 950000 | 28.4936 | 34.7838 | [config](./sagan_woReLUinplace_Glr1e-4_Dlr4e-4_ndisc1-4xb64_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmediting/sagan/sagan_imagenet1k_128_Glr1e-4_Dlr4e-4_ndisc1_b32x4_woReLUinplace_fid-iter950000_20210730_163431-d7916963.pth) | [Log](https://download.openmmlab.com/mmediting/sagan/sagan_imagenet1k_128_Glr1e-4_Dlr4e-4_ndisc1_b32x4_woReLUinplace_20210730_163431_fid-d7916963_is-cfbebfc6.json) | +| SAGAN-128x128-BigGAN Schedule Best IS | ImageNet | w/o | 1 | 32x8 | 1000000 | 826000 | 69.5350 | 12.8295 | [config](./sagan_woReLUinplace-Glr1e-4_Dlr4e-4_noaug-ndisc1-8xb32-bigGAN-sch_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmediting/sagan/sagan_128_woReLUinplace_noaug_bigGAN_imagenet1k_b32x8_Glr1e-4_Dlr-4e-4_ndisc1_20210818_210232-3f5686af.pth) | [Log](https://download.openmmlab.com/mmediting/sagan/sagan_128_woReLUinplace_noaug_bigGAN_imagenet1k_b32x8_Glr1e-4_Dlr-4e-4_ndisc1_20210818_210232-3f5686af.json) | +| SAGAN-128x128-BigGAN Schedule Best FID | ImageNet | w/o | 1 | 32x8 | 1000000 | 826000 | 69.5350 | 12.8295 | [config](./sagan_woReLUinplace-Glr1e-4_Dlr4e-4_noaug-ndisc1-8xb32-bigGAN-sch_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmediting/sagan/sagan_128_woReLUinplace_noaug_bigGAN_imagenet1k_b32x8_Glr1e-4_Dlr-4e-4_ndisc1_20210818_210232-3f5686af.pth) | [Log](https://download.openmmlab.com/mmediting/sagan/sagan_128_woReLUinplace_noaug_bigGAN_imagenet1k_b32x8_Glr1e-4_Dlr-4e-4_ndisc1_20210818_210232-3f5686af.json) | '\*' Iteration counting rule in our implementation is different from others. If you want to align with other codebases, you can use the following conversion formula: @@ -48,8 +48,8 @@ To be noted that, in Pytorch Studio GAN, **inplace ReLU** is used in generator a | Models | Dataset | Inplace ReLU | n_disc | Total Iters | IS (Our Pipeline) | FID (Our Pipeline) | IS (StudioGAN) | FID (StudioGAN) | Config | Download | Original Download link | | :------------------: | :------: | :----------: | :----: | :---------: | :---------------: | :----------------: | :------------: | :-------------: | :------------------: | :--------------------: | :-----------------------------------: | -| SAGAN-32x32 StudioGAN | CIFAR10 | w | 5 | 100000 | 9.116 | 10.2011 | 8.680 | 14.009 | [Config](https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_cvt-studioGAN_cifar10-32x32.py) | [model](https://download.openmmlab.com/mmgen/sagan/sagan_32_cifar10_convert-studio-rgb_20210730_153321-080da7e2.pth) | [model](https://drive.google.com/drive/folders/1FA8hcz4MB8-hgTwLuDA0ZUfr8slud5P_) | -| SAGAN0-128x128 StudioGAN | ImageNet | w | 1 | 1000000 | 27.367 | 40.1162 | 29.848 | 34.726 | [Config](https://github.com/open-mmlab/mmediting/tree/master/configs/sagan/sagan_128_cvt_studioGAN.py) | [model](https://download.openmmlab.com/mmgen/sagan/sagan_128_imagenet1k_convert-studio-rgb_20210730_153357-eddb0d1d.pth) | [model](https://drive.google.com/drive/folders/1ZYaqeeumDgxOPDhRR5QLeLFIpgBJ9S6B) | +| SAGAN-32x32 StudioGAN | CIFAR10 | w | 5 | 100000 | 9.116 | 10.2011 | 8.680 | 14.009 | [Config](./sagan_cvt-studioGAN_cifar10-32x32.py) | [model](https://download.openmmlab.com/mmediting/sagan/sagan_32_cifar10_convert-studio-rgb_20210730_153321-080da7e2.pth) | [model](https://drive.google.com/drive/folders/1FA8hcz4MB8-hgTwLuDA0ZUfr8slud5P_) | +| SAGAN0-128x128 StudioGAN | ImageNet | w | 1 | 1000000 | 27.367 | 40.1162 | 29.848 | 34.726 | [Config](./sagan_128_cvt_studioGAN.py) | [model](https://download.openmmlab.com/mmediting/sagan/sagan_128_imagenet1k_convert-studio-rgb_20210730_153357-eddb0d1d.pth) | [model](https://drive.google.com/drive/folders/1ZYaqeeumDgxOPDhRR5QLeLFIpgBJ9S6B) | - `Our Pipeline` denote results evaluated with our pipeline. - `StudioGAN` denote results released by Pytorch-StudioGAN. @@ -61,7 +61,7 @@ For IS metric, our implementation is different from PyTorch-Studio GAN in the fo For FID evaluation, we follow the pipeline of [BigGAN](https://github.com/ajbrock/BigGAN-PyTorch/blob/98459431a5d618d644d54cd1e9fceb1e5045648d/calculate_inception_moments.py#L52), where the whole training set is adopted to extract inception statistics, and Pytorch Studio GAN uses 50000 randomly selected samples. Besides, we also use [Tero's Inception](https://nvlabs-fi-cdn.nvidia.com/stylegan2-ada-pytorch/pretrained/metrics/inception-2015-12-05.pt) for feature extraction. -You can download the preprocessed inception state by the following url: [CIFAR10](https://download.openmmlab.com/mmgen/evaluation/fid_inception_pkl/cifar10.pkl) and [ImageNet1k](https://download.openmmlab.com/mmgen/evaluation/fid_inception_pkl/imagenet.pkl). +You can download the preprocessed inception state by the following url: [CIFAR10](https://download.openmmlab.com/mmediting/evaluation/fid_inception_pkl/cifar10.pkl) and [ImageNet1k](https://download.openmmlab.com/mmediting/evaluation/fid_inception_pkl/imagenet.pkl). You can use following commands to extract those inception states by yourself. diff --git a/configs/sagan/metafile.yml b/configs/sagan/metafile.yml index ee04fa7f3a..be7836aaf5 100644 --- a/configs/sagan/metafile.yml +++ b/configs/sagan/metafile.yml @@ -21,7 +21,7 @@ Models: Total Iters\*: 500000.0 dist_step: 5.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_woReUinplace_is-iter400000_20210730_125743-4008a9ca.pth + Weights: https://download.openmmlab.com/mmediting/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_woReUinplace_is-iter400000_20210730_125743-4008a9ca.pth - Config: configs/sagan/sagan_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py In Collection: SAGAN Metadata: @@ -36,7 +36,7 @@ Models: Total Iters\*: 500000.0 dist_step: 5.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_woReUinplace_fid-iter480000_20210730_125449-d50568a4.pth + Weights: https://download.openmmlab.com/mmediting/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_woReUinplace_fid-iter480000_20210730_125449-d50568a4.pth - Config: configs/sagan/sagan_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py In Collection: SAGAN Metadata: @@ -51,7 +51,7 @@ Models: Total Iters\*: 500000.0 dist_step: 5.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_wReLUinplace_is-iter380000_20210730_124937-c77b4d25.pth + Weights: https://download.openmmlab.com/mmediting/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_wReLUinplace_is-iter380000_20210730_124937-c77b4d25.pth - Config: configs/sagan/sagan_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py In Collection: SAGAN Metadata: @@ -66,7 +66,7 @@ Models: Total Iters\*: 500000.0 dist_step: 5.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_wReLUinplace_fid-iter460000_20210730_125155-cbefb354.pth + Weights: https://download.openmmlab.com/mmediting/sagan/sagan_cifar10_32_lr2e-4_ndisc5_b64x1_wReLUinplace_fid-iter460000_20210730_125155-cbefb354.pth - Config: configs/sagan/sagan_woReLUinplace_Glr1e-4_Dlr4e-4_ndisc1-4xb64_imagenet1k-128x128.py In Collection: SAGAN Metadata: @@ -81,7 +81,7 @@ Models: Total Iters\*: 1000000.0 dist_step: 1.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sagan/sagan_imagenet1k_128_Glr1e-4_Dlr4e-4_ndisc1_b32x4_woReLUinplace_is-iter980000_20210730_163140-cfbebfc6.pth + Weights: https://download.openmmlab.com/mmediting/sagan/sagan_imagenet1k_128_Glr1e-4_Dlr4e-4_ndisc1_b32x4_woReLUinplace_is-iter980000_20210730_163140-cfbebfc6.pth - Config: configs/sagan/sagan_woReLUinplace_Glr1e-4_Dlr4e-4_ndisc1-4xb64_imagenet1k-128x128.py In Collection: SAGAN Metadata: @@ -96,7 +96,7 @@ Models: Total Iters\*: 1000000.0 dist_step: 1.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sagan/sagan_imagenet1k_128_Glr1e-4_Dlr4e-4_ndisc1_b32x4_woReLUinplace_fid-iter950000_20210730_163431-d7916963.pth + Weights: https://download.openmmlab.com/mmediting/sagan/sagan_imagenet1k_128_Glr1e-4_Dlr4e-4_ndisc1_b32x4_woReLUinplace_fid-iter950000_20210730_163431-d7916963.pth - Config: configs/sagan/sagan_woReLUinplace-Glr1e-4_Dlr4e-4_noaug-ndisc1-8xb32-bigGAN-sch_imagenet1k-128x128.py In Collection: SAGAN Metadata: @@ -111,7 +111,7 @@ Models: Total Iters\*: 1000000.0 dist_step: 1.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sagan/sagan_128_woReLUinplace_noaug_bigGAN_imagenet1k_b32x8_Glr1e-4_Dlr-4e-4_ndisc1_20210818_210232-3f5686af.pth + Weights: https://download.openmmlab.com/mmediting/sagan/sagan_128_woReLUinplace_noaug_bigGAN_imagenet1k_b32x8_Glr1e-4_Dlr-4e-4_ndisc1_20210818_210232-3f5686af.pth - Config: configs/sagan/sagan_woReLUinplace-Glr1e-4_Dlr4e-4_noaug-ndisc1-8xb32-bigGAN-sch_imagenet1k-128x128.py In Collection: SAGAN Metadata: @@ -126,7 +126,7 @@ Models: Total Iters\*: 1000000.0 dist_step: 1.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sagan/sagan_128_woReLUinplace_noaug_bigGAN_imagenet1k_b32x8_Glr1e-4_Dlr-4e-4_ndisc1_20210818_210232-3f5686af.pth + Weights: https://download.openmmlab.com/mmediting/sagan/sagan_128_woReLUinplace_noaug_bigGAN_imagenet1k_b32x8_Glr1e-4_Dlr-4e-4_ndisc1_20210818_210232-3f5686af.pth - Config: configs/sagan/sagan_cvt-studioGAN_cifar10-32x32.py In Collection: SAGAN Metadata: @@ -142,7 +142,7 @@ Models: Total Iters: 100000.0 n_disc: 5.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sagan/sagan_32_cifar10_convert-studio-rgb_20210730_153321-080da7e2.pth + Weights: https://download.openmmlab.com/mmediting/sagan/sagan_32_cifar10_convert-studio-rgb_20210730_153321-080da7e2.pth - Config: configs/sagan/sagan_128_cvt_studioGAN.py In Collection: SAGAN Metadata: @@ -158,4 +158,4 @@ Models: Total Iters: 1000000.0 n_disc: 1.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sagan/sagan_128_imagenet1k_convert-studio-rgb_20210730_153357-eddb0d1d.pth + Weights: https://download.openmmlab.com/mmediting/sagan/sagan_128_imagenet1k_convert-studio-rgb_20210730_153357-eddb0d1d.pth diff --git a/configs/singan/README.md b/configs/singan/README.md index 7d13fe333f..e39785f5c3 100644 --- a/configs/singan/README.md +++ b/configs/singan/README.md @@ -26,11 +26,11 @@ We introduce SinGAN, an unconditional generative model that can be learned from -| Models | Data | Num Scales | Config | Download | -| :----: | :---------------------------------------------------------: | :--------: | :-----------------------------------------------------------: | :--------------------------------------------------------------: | -| SinGAN | [balloons.png](https://download.openmmlab.com/mmgen/dataset/singan/balloons.png) | 8 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/singan/singan_balloons.py) | [ckpt](https://download.openmmlab.com/mmgen/singan/singan_balloons_20210406_191047-8fcd94cf.pth) \| [pkl](https://download.openmmlab.com/mmgen/singan/singan_balloons_20210406_191047-8fcd94cf.pkl) | -| SinGAN | [fish.jpg](https://download.openmmlab.com/mmgen/dataset/singan/fish-crop.jpg) | 10 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/singan/singan_fish.py) | [ckpt](https://download.openmmlab.com/mmgen/singan/singan_fis_20210406_201006-860d91b6.pth) \| [pkl](https://download.openmmlab.com/mmgen/singan/singan_fis_20210406_201006-860d91b6.pkl) | -| SinGAN | [bohemian.png](https://download.openmmlab.com/mmgen/dataset/singan/bohemian.png) | 10 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/singan/singan_bohemian.py) | [ckpt](https://download.openmmlab.com/mmgen/singan/singan_bohemian_20210406_175439-f964ee38.pth) \| [pkl](https://download.openmmlab.com/mmgen/singan/singan_bohemian_20210406_175439-f964ee38.pkl) | +| Models | Data | Num Scales | Config | Download | +| :----: | :-------------------------------------------------------------------------: | :--------: | :----------------------------: | :-----------------------------------------------------------------------------: | +| SinGAN | [balloons.png](https://download.openmmlab.com/mmediting/dataset/singan/balloons.png) | 8 | [config](./singan_balloons.py) | [ckpt](https://download.openmmlab.com/mmediting/singan/singan_balloons_20210406_191047-8fcd94cf.pth) \| [pkl](https://download.openmmlab.com/mmediting/singan/singan_balloons_20210406_191047-8fcd94cf.pkl) | +| SinGAN | [fish.jpg](https://download.openmmlab.com/mmediting/dataset/singan/fish-crop.jpg) | 10 | [config](./singan_fish.py) | [ckpt](https://download.openmmlab.com/mmediting/singan/singan_fis_20210406_201006-860d91b6.pth) \| [pkl](https://download.openmmlab.com/mmediting/singan/singan_fis_20210406_201006-860d91b6.pkl) | +| SinGAN | [bohemian.png](https://download.openmmlab.com/mmediting/dataset/singan/bohemian.png) | 10 | [config](./singan_bohemian.py) | [ckpt](https://download.openmmlab.com/mmediting/singan/singan_bohemian_20210406_175439-f964ee38.pth) \| [pkl](https://download.openmmlab.com/mmediting/singan/singan_bohemian_20210406_175439-f964ee38.pkl) | ## Notes for using SinGAN diff --git a/configs/singan/metafile.yml b/configs/singan/metafile.yml index 20b67a3893..82ba78f349 100644 --- a/configs/singan/metafile.yml +++ b/configs/singan/metafile.yml @@ -17,7 +17,7 @@ Models: Metrics: Num Scales: 8.0 Task: Internal Learning - Weights: https://download.openmmlab.com/mmgen/singan/singan_balloons_20210406_191047-8fcd94cf.pth + Weights: https://download.openmmlab.com/mmediting/singan/singan_balloons_20210406_191047-8fcd94cf.pth - Config: configs/singan/singan_fish.py In Collection: SinGAN Metadata: @@ -28,7 +28,7 @@ Models: Metrics: Num Scales: 10.0 Task: Internal Learning - Weights: https://download.openmmlab.com/mmgen/singan/singan_fis_20210406_201006-860d91b6.pth + Weights: https://download.openmmlab.com/mmediting/singan/singan_fis_20210406_201006-860d91b6.pth - Config: configs/singan/singan_bohemian.py In Collection: SinGAN Metadata: @@ -39,4 +39,4 @@ Models: Metrics: Num Scales: 10.0 Task: Internal Learning - Weights: https://download.openmmlab.com/mmgen/singan/singan_bohemian_20210406_175439-f964ee38.pth + Weights: https://download.openmmlab.com/mmediting/singan/singan_bohemian_20210406_175439-f964ee38.pth diff --git a/configs/sngan_proj/README.md b/configs/sngan_proj/README.md index 8f3e4c0bec..adfda64dfc 100644 --- a/configs/sngan_proj/README.md +++ b/configs/sngan_proj/README.md @@ -29,14 +29,14 @@ One of the challenges in the study of generative adversarial networks is the ins | Models | Dataset | Inplace ReLU | disc_step | Total Iters\* | Iter | IS | FID | Config | Download | Log | | :--------------------------------: | :------: | :----------: | :-------: | :-----------: | :----: | :-----: | :-----: | :---------------------------------: | :-----------------------------------: | :------------------------------: | -| SNGAN_Proj-32x32-woInplaceReLU Best IS | CIFAR10 | w/o | 5 | 500000 | 400000 | 9.6919 | 9.8203 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py) | [ckpt](https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_woReLUinplace_is-iter400000_20210709_163823-902ce1ae.pth) | [Log](https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_woReLUinplace_20210624_065306_fid-ba0862a0_is-902ce1ae.json) | -| SNGAN_Proj-32x32-woInplaceReLU Best FID | CIFAR10 | w/o | 5 | 500000 | 490000 | 9.5659 | 8.1158 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py) | [ckpt](https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_woReLUinplace_fid-iter490000_20210709_163329-ba0862a0.pth) | [Log](https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_woReLUinplace_20210624_065306_fid-ba0862a0_is-902ce1ae.json) | -| SNGAN_Proj-32x32-wInplaceReLU Best IS | CIFAR10 | w | 5 | 500000 | 490000 | 9.5564 | 8.3462 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py) | [ckpt](https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_wReLUinplace_is-iter490000_20210709_202230-cd863c74.pth) | [Log](https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_wReLUinplace_20210624_065306_fid-ba0862a0_is-902ce1ae.json) | -| SNGAN_Proj-32x32-wInplaceReLU Best FID | CIFAR10 | w | 5 | 500000 | 490000 | 9.5564 | 8.3462 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py) | [ckpt](https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_cifar10_32_lr-2e-4-b64x1_wReLUinplace_fid-iter490000_20210709_203038-191b2648.pth) | [Log](https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_wReLUinplace_20210624_065306_fid-ba0862a0_is-902ce1ae.json) | -| SNGAN_Proj-128x128-woInplaceReLU Best IS | ImageNet | w/o | 5 | 1000000 | 952000 | 30.0651 | 33.4682 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj_woReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py) | [ckpt](https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_woReLUinplace_is-iter952000_20210730_132027-9c884a21.pth) | [Log](https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_woReLUinplace_20210730_131424_fid-061bf803_is-9c884a21.json) | -| SNGAN_Proj-128x128-woInplaceReLU Best FID | ImageNet | w/o | 5 | 1000000 | 989000 | 29.5779 | 32.6193 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj_woReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py) | [ckpt](https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_woReLUinplace_fid-iter988000_20210730_131424-061bf803.pth) | [Log](https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_woReLUinplace_20210730_131424_fid-061bf803_is-9c884a21.json) | -| SNGAN_Proj-128x128-wInplaceReLU Best IS | ImageNet | w | 5 | 1000000 | 944000 | 28.1799 | 34.3383 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj_wReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py) | [ckpt](https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_wReLUinplace_is-iter944000_20210730_132714-ca0ccd07.pth) | [Log](https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_wReLUinplace_20210730_132401_fid-9a682411_is-ca0ccd07.json) | -| SNGAN_Proj-128x128-wInplaceReLU Best FID | ImageNet | w | 5 | 1000000 | 988000 | 27.7948 | 33.4821 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj_wReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py) | [ckpt](https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_wReLUinplace_fid-iter988000_20210730_132401-9a682411.pth) | [Log](https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_wReLUinplace_20210730_132401_fid-9a682411_is-ca0ccd07.json) | +| SNGAN_Proj-32x32-woInplaceReLU Best IS | CIFAR10 | w/o | 5 | 500000 | 400000 | 9.6919 | 9.8203 | [config](./sngan-proj_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py) | [ckpt](https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_woReLUinplace_is-iter400000_20210709_163823-902ce1ae.pth) | [Log](https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_woReLUinplace_20210624_065306_fid-ba0862a0_is-902ce1ae.json) | +| SNGAN_Proj-32x32-woInplaceReLU Best FID | CIFAR10 | w/o | 5 | 500000 | 490000 | 9.5659 | 8.1158 | [config](./sngan-proj_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py) | [ckpt](https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_woReLUinplace_fid-iter490000_20210709_163329-ba0862a0.pth) | [Log](https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_woReLUinplace_20210624_065306_fid-ba0862a0_is-902ce1ae.json) | +| SNGAN_Proj-32x32-wInplaceReLU Best IS | CIFAR10 | w | 5 | 500000 | 490000 | 9.5564 | 8.3462 | [config](./sngan-proj_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py) | [ckpt](https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_wReLUinplace_is-iter490000_20210709_202230-cd863c74.pth) | [Log](https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_wReLUinplace_20210624_063454_is-cd863c74_fid-191b2648.json) | +| SNGAN_Proj-32x32-wInplaceReLU Best FID | CIFAR10 | w | 5 | 500000 | 490000 | 9.5564 | 8.3462 | [config](./sngan-proj_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py) | [ckpt](https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_cifar10_32_lr-2e-4-b64x1_wReLUinplace_fid-iter490000_20210709_203038-191b2648.pth) | [Log](https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_wReLUinplace_20210624_063454_is-cd863c74_fid-191b2648.json) | +| SNGAN_Proj-128x128-woInplaceReLU Best IS | ImageNet | w/o | 5 | 1000000 | 952000 | 30.0651 | 33.4682 | [config](./sngan-proj_woReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py) | [ckpt](https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_woReLUinplace_is-iter952000_20210730_132027-9c884a21.pth) | [Log](https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_woReLUinplace_20210730_131424_fid-061bf803_is-9c884a21.json) | +| SNGAN_Proj-128x128-woInplaceReLU Best FID | ImageNet | w/o | 5 | 1000000 | 989000 | 29.5779 | 32.6193 | [config](./sngan-proj_woReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py) | [ckpt](https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_woReLUinplace_fid-iter988000_20210730_131424-061bf803.pth) | [Log](https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_woReLUinplace_20210730_131424_fid-061bf803_is-9c884a21.json) | +| SNGAN_Proj-128x128-wInplaceReLU Best IS | ImageNet | w | 5 | 1000000 | 944000 | 28.1799 | 34.3383 | [config](./sngan-proj_wReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py) | [ckpt](https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_wReLUinplace_is-iter944000_20210730_132714-ca0ccd07.pth) | [Log](https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_wReLUinplace_20210730_132401_fid-9a682411_is-ca0ccd07.json) | +| SNGAN_Proj-128x128-wInplaceReLU Best FID | ImageNet | w | 5 | 1000000 | 988000 | 27.7948 | 33.4821 | [config](./sngan-proj_wReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py) | [ckpt](https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_wReLUinplace_fid-iter988000_20210730_132401-9a682411.pth) | [Log](https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_wReLUinplace_20210730_132401_fid-9a682411_is-ca0ccd07.json) | '\*' Iteration counting rule in our implementation is different from others. If you want to align with other codebases, you can use the following conversion formula: @@ -49,8 +49,8 @@ To be noted that, in Pytorch Studio GAN, **inplace ReLU** is used in generator a | Models | Dataset | Inplace ReLU | disc_step | Total Iters | IS (Our Pipeline) | FID (Our Pipeline) | IS (StudioGAN) | FID (StudioGAN) | Config | Download | Original Download link | | :-----------------: | :------: | :----------: | :-------: | :---------: | :---------------: | :----------------: | :------------: | :-------------: | :-----------------: | :--------------------: | :----------------------------------: | -| SAGAN_Proj-32x32 StudioGAN | CIFAR10 | w | 5 | 100000 | 9.372 | 10.2011 | 8.677 | 13.248 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj-cvt-studioGAN_cifar10-32x32.py) | [model](https://download.openmmlab.com/mmgen/sngan_proj/sngan_cifar10_convert-studio-rgb_20210709_111346-2979202d.pth) | [model](https://drive.google.com/drive/folders/16s5Cr-V-NlfLyy_uyXEkoNxLBt-8wYSM) | -| SAGAN_Proj-128x128 StudioGAN | ImageNet | w | 2 | 1000000 | 30.218 | 29.8199 | 32.247 | 26.792 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/sngan_proj/sngan-proj-cvt-studioGAN_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmgen/sngan_proj/sngan_imagenet1k_convert-studio-rgb_20210709_111406-877b1130.pth) | [model](https://drive.google.com/drive/folders/1Ek2wAMlxpajL_M8aub4DKQ9B313K8XhS) | +| SAGAN_Proj-32x32 StudioGAN | CIFAR10 | w | 5 | 100000 | 9.372 | 10.2011 | 8.677 | 13.248 | [config](./sngan-proj-cvt-studioGAN_cifar10-32x32.py) | [model](https://download.openmmlab.com/mmediting/sngan_proj/sngan_cifar10_convert-studio-rgb_20210709_111346-2979202d.pth) | [model](https://drive.google.com/drive/folders/16s5Cr-V-NlfLyy_uyXEkoNxLBt-8wYSM) | +| SAGAN_Proj-128x128 StudioGAN | ImageNet | w | 2 | 1000000 | 30.218 | 29.8199 | 32.247 | 26.792 | [config](./sngan-proj-cvt-studioGAN_imagenet1k-128x128.py) | [model](https://download.openmmlab.com/mmediting/sngan_proj/sngan_imagenet1k_convert-studio-rgb_20210709_111406-877b1130.pth) | [model](https://drive.google.com/drive/folders/1Ek2wAMlxpajL_M8aub4DKQ9B313K8XhS) | - `Our Pipeline` denote results evaluated with our pipeline. - `StudioGAN` denote results released by Pytorch-StudioGAN. @@ -62,7 +62,7 @@ For IS metric, our implementation is different from PyTorch-Studio GAN in the fo For FID evaluation, we follow the pipeline of [BigGAN](https://github.com/ajbrock/BigGAN-PyTorch/blob/98459431a5d618d644d54cd1e9fceb1e5045648d/calculate_inception_moments.py#L52), where the whole training set is adopted to extract inception statistics, and Pytorch Studio GAN uses 50000 randomly selected samples. Besides, we also use [Tero's Inception](https://nvlabs-fi-cdn.nvidia.com/stylegan2-ada-pytorch/pretrained/metrics/inception-2015-12-05.pt) for feature extraction. -You can download the preprocessed inception state by the following url: [CIFAR10](https://download.openmmlab.com/mmgen/evaluation/fid_inception_pkl/cifar10.pkl) and [ImageNet1k](https://download.openmmlab.com/mmgen/evaluation/fid_inception_pkl/imagenet.pkl). +You can download the preprocessed inception state by the following url: [CIFAR10](https://download.openmmlab.com/mmediting/evaluation/fid_inception_pkl/cifar10.pkl) and [ImageNet1k](https://download.openmmlab.com/mmediting/evaluation/fid_inception_pkl/imagenet.pkl). You can use following commands to extract those inception states by yourself. diff --git a/configs/sngan_proj/metafile.yml b/configs/sngan_proj/metafile.yml index b47f0bf097..37efed84ea 100644 --- a/configs/sngan_proj/metafile.yml +++ b/configs/sngan_proj/metafile.yml @@ -21,7 +21,7 @@ Models: Total Iters\*: 500000.0 disc_step: 5.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_woReLUinplace_is-iter400000_20210709_163823-902ce1ae.pth + Weights: https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_woReLUinplace_is-iter400000_20210709_163823-902ce1ae.pth - Config: configs/sngan_proj/sngan-proj_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py In Collection: SNGAN Metadata: @@ -36,7 +36,7 @@ Models: Total Iters\*: 500000.0 disc_step: 5.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_woReLUinplace_fid-iter490000_20210709_163329-ba0862a0.pth + Weights: https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_woReLUinplace_fid-iter490000_20210709_163329-ba0862a0.pth - Config: configs/sngan_proj/sngan-proj_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py In Collection: SNGAN Metadata: @@ -51,7 +51,7 @@ Models: Total Iters\*: 500000.0 disc_step: 5.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_wReLUinplace_is-iter490000_20210709_202230-cd863c74.pth + Weights: https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_cifar10_32_lr-2e-4_b64x1_wReLUinplace_is-iter490000_20210709_202230-cd863c74.pth - Config: configs/sngan_proj/sngan-proj_wReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py In Collection: SNGAN Metadata: @@ -66,7 +66,7 @@ Models: Total Iters\*: 500000.0 disc_step: 5.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_cifar10_32_lr-2e-4-b64x1_wReLUinplace_fid-iter490000_20210709_203038-191b2648.pth + Weights: https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_cifar10_32_lr-2e-4-b64x1_wReLUinplace_fid-iter490000_20210709_203038-191b2648.pth - Config: configs/sngan_proj/sngan-proj_woReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py In Collection: SNGAN Metadata: @@ -81,7 +81,7 @@ Models: Total Iters\*: 1000000.0 disc_step: 5.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_woReLUinplace_is-iter952000_20210730_132027-9c884a21.pth + Weights: https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_woReLUinplace_is-iter952000_20210730_132027-9c884a21.pth - Config: configs/sngan_proj/sngan-proj_woReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py In Collection: SNGAN Metadata: @@ -96,7 +96,7 @@ Models: Total Iters\*: 1000000.0 disc_step: 5.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_woReLUinplace_fid-iter988000_20210730_131424-061bf803.pth + Weights: https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_woReLUinplace_fid-iter988000_20210730_131424-061bf803.pth - Config: configs/sngan_proj/sngan-proj_wReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py In Collection: SNGAN Metadata: @@ -111,7 +111,7 @@ Models: Total Iters\*: 1000000.0 disc_step: 5.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_wReLUinplace_is-iter944000_20210730_132714-ca0ccd07.pth + Weights: https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_wReLUinplace_is-iter944000_20210730_132714-ca0ccd07.pth - Config: configs/sngan_proj/sngan-proj_wReLUinplace_Glr2e-4_Dlr5e-5_ndisc5-2xb128_imagenet1k-128x128.py In Collection: SNGAN Metadata: @@ -126,7 +126,7 @@ Models: Total Iters\*: 1000000.0 disc_step: 5.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_wReLUinplace_fid-iter988000_20210730_132401-9a682411.pth + Weights: https://download.openmmlab.com/mmediting/sngan_proj/sngan_proj_imagenet1k_128_Glr2e-4_Dlr5e-5_ndisc5_b128x2_wReLUinplace_fid-iter988000_20210730_132401-9a682411.pth - Config: configs/sngan_proj/sngan-proj-cvt-studioGAN_cifar10-32x32.py In Collection: SNGAN Metadata: @@ -142,7 +142,7 @@ Models: Total Iters: 100000.0 disc_step: 5.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_cifar10_convert-studio-rgb_20210709_111346-2979202d.pth + Weights: https://download.openmmlab.com/mmediting/sngan_proj/sngan_cifar10_convert-studio-rgb_20210709_111346-2979202d.pth - Config: configs/sngan_proj/sngan-proj-cvt-studioGAN_imagenet1k-128x128.py In Collection: SNGAN Metadata: @@ -158,4 +158,4 @@ Models: Total Iters: 1000000.0 disc_step: 2.0 Task: Conditional GANs - Weights: https://download.openmmlab.com/mmgen/sngan_proj/sngan_imagenet1k_convert-studio-rgb_20210709_111406-877b1130.pth + Weights: https://download.openmmlab.com/mmediting/sngan_proj/sngan_imagenet1k_convert-studio-rgb_20210709_111406-877b1130.pth diff --git a/configs/srcnn/README.md b/configs/srcnn/README.md index 990c5b9c03..520fc41da6 100644 --- a/configs/srcnn/README.md +++ b/configs/srcnn/README.md @@ -25,7 +25,7 @@ The metrics are `PSNR / SSIM` . | Method | Set5 PSNR | Set14 PSNR | DIV2K PSNR | Set5 SSIM | Set14 SSIM | DIV2K SSIM | GPU Info | Download | | :----------------------------------------------------------------: | :-------: | :--------: | :--------: | :-------: | :--------: | :--------: | :------: | :------------------------------------------------------------------: | -| [srcnn_x4k915_1x16_1000k_div2k](/configs/srcnn/srcnn_x4k915_1xb16-1000k_div2k.py) | 28.4316 | 25.6486 | 27.7460 | 0.8099 | 0.7014 | 0.7854 | 1 | [model](https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608_120159.log.json) | +| [srcnn_x4k915_1x16_1000k_div2k](./srcnn_x4k915_1xb16-1000k_div2k.py) | 28.4316 | 25.6486 | 27.7460 | 0.8099 | 0.7014 | 0.7854 | 1 | [model](https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608_120159.log.json) | ## Quick Start diff --git a/configs/srcnn/README_zh-CN.md b/configs/srcnn/README_zh-CN.md index 757f2c8edc..fb5cc9e83e 100644 --- a/configs/srcnn/README_zh-CN.md +++ b/configs/srcnn/README_zh-CN.md @@ -27,9 +27,9 @@ 在 RGB 通道上进行评估,在评估之前裁剪每个边界中的 `scale` 像素。 我们使用 `PSNR` 和 `SSIM` 作为指标。 -| 算法 | Set5 | Set14 | DIV2K | GPU 信息 | 下载 | -| :---------------------------------------------------------------------: | :--------------: | :---------------: | :--------------: | :------: | :----------------------------------------------------------------------: | -| [srcnn_x4k915_1x16_1000k_div2k](/configs/srcnn/srcnn_x4k915_1xb16-1000k_div2k.py) | 28.4316 / 0.8099 | 25.6486 / 0.7014 | 27.7460 / 0.7854 | 1 | [模型](https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608_120159.log.json) | +| 算法 | Set5 | Set14 | DIV2K | GPU 信息 | 下载 | +| :------------------------------------------------------------------: | :--------------: | :---------------: | :--------------: | :------: | :-------------------------------------------------------------------------: | +| [srcnn_x4k915_1x16_1000k_div2k](./srcnn_x4k915_1xb16-1000k_div2k.py) | 28.4316 / 0.8099 | 25.6486 / 0.7014 | 27.7460 / 0.7854 | 1 | [模型](https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608_120159.log.json) | ## 快速开始 diff --git a/configs/srgan_resnet/README.md b/configs/srgan_resnet/README.md index 3b51828e1f..b40bb093d3 100644 --- a/configs/srgan_resnet/README.md +++ b/configs/srgan_resnet/README.md @@ -26,8 +26,8 @@ The metrics are `PSNR / SSIM` . | Method | Set5 PSNR | Set14 PSNR | DIV2K PSNR | Set5 SSIM | Set14 SSIM | DIV2K SSIM | GPU Info | Download | | :----------------------------------------------------------------: | :-------: | :--------: | :--------: | :-------: | :--------: | :--------: | :------: | :------------------------------------------------------------------: | -| [msrresnet_x4c64b16_1x16_300k_div2k](/configs/srgan_resnet/msrresnet_x4c64b16_1xb16-1000k_div2k.py) | 30.2252 | 26.7762 | 28.9748 | 0.8491 | 0.7369 | 0.8178 | 1 | [model](https://download.openmmlab.com/mmediting/restorers/srresnet_srgan/msrresnet_x4c64b16_1x16_300k_div2k_20200521-61556be5.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/srresnet_srgan/msrresnet_x4c64b16_1x16_300k_div2k_20200521_110246.log.json) | -| [srgan_x4c64b16_1x16_1000k_div2k](/configs/srgan_resnet/srgan_x4c64b16_1xb16-1000k_div2k.py) | 27.9499 | 24.7383 | 26.5697 | 0.7846 | 0.6491 | 0.7365 | 1 | [model](https://download.openmmlab.com/mmediting/restorers/srresnet_srgan/srgan_x4c64b16_1x16_1000k_div2k_20200606-a1f0810e.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/srresnet_srgan/srgan_x4c64b16_1x16_1000k_div2k_20200506_191442.log.json) | +| [msrresnet_x4c64b16_1x16_300k_div2k](./msrresnet_x4c64b16_1xb16-1000k_div2k.py) | 30.2252 | 26.7762 | 28.9748 | 0.8491 | 0.7369 | 0.8178 | 1 | [model](https://download.openmmlab.com/mmediting/restorers/srresnet_srgan/msrresnet_x4c64b16_1x16_300k_div2k_20200521-61556be5.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/srresnet_srgan/msrresnet_x4c64b16_1x16_300k_div2k_20200521_110246.log.json) | +| [srgan_x4c64b16_1x16_1000k_div2k](./srgan_x4c64b16_1xb16-1000k_div2k.py) | 27.9499 | 24.7383 | 26.5697 | 0.7846 | 0.6491 | 0.7365 | 1 | [model](https://download.openmmlab.com/mmediting/restorers/srresnet_srgan/srgan_x4c64b16_1x16_1000k_div2k_20200606-a1f0810e.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/srresnet_srgan/srgan_x4c64b16_1x16_1000k_div2k_20200506_191442.log.json) | ## Quick Start diff --git a/configs/srgan_resnet/README_zh-CN.md b/configs/srgan_resnet/README_zh-CN.md index 5d16d8db50..3758d4c1b1 100644 --- a/configs/srgan_resnet/README_zh-CN.md +++ b/configs/srgan_resnet/README_zh-CN.md @@ -25,8 +25,8 @@ | 算法 | Set5 | Set14 | DIV2K | GPU 信息 | 下载 | | :---------------------------------------------------------------------: | :---------------: | :--------------: | :--------------: | :------: | :----------------------------------------------------------------------: | -| [msrresnet_x4c64b16_1x16_300k_div2k](/configs/srgan_resnet/msrresnet_x4c64b16_1xb16-1000k_div2k.py) | 30.2252 / 0.8491 | 26.7762 / 0.7369 | 28.9748 / 0.8178 | 1 | [模型](https://download.openmmlab.com/mmediting/restorers/srresnet_srgan/msrresnet_x4c64b16_1x16_300k_div2k_20200521-61556be5.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/srresnet_srgan/msrresnet_x4c64b16_1x16_300k_div2k_20200521_110246.log.json) | -| [srgan_x4c64b16_1x16_1000k_div2k](/configs/srgan_resnet/srgan_x4c64b16_1xb16-1000k_div2k.py) | 27.9499 / 0.7846 | 24.7383 / 0.6491 | 26.5697 / 0.7365 | 1 | [模型](https://download.openmmlab.com/mmediting/restorers/srresnet_srgan/srgan_x4c64b16_1x16_1000k_div2k_20200606-a1f0810e.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/srresnet_srgan/srgan_x4c64b16_1x16_1000k_div2k_20200506_191442.log.json) | +| [msrresnet_x4c64b16_1x16_300k_div2k](./msrresnet_x4c64b16_1xb16-1000k_div2k.py) | 30.2252 / 0.8491 | 26.7762 / 0.7369 | 28.9748 / 0.8178 | 1 | [模型](https://download.openmmlab.com/mmediting/restorers/srresnet_srgan/msrresnet_x4c64b16_1x16_300k_div2k_20200521-61556be5.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/srresnet_srgan/msrresnet_x4c64b16_1x16_300k_div2k_20200521_110246.log.json) | +| [srgan_x4c64b16_1x16_1000k_div2k](./srgan_x4c64b16_1xb16-1000k_div2k.py) | 27.9499 / 0.7846 | 24.7383 / 0.6491 | 26.5697 / 0.7365 | 1 | [模型](https://download.openmmlab.com/mmediting/restorers/srresnet_srgan/srgan_x4c64b16_1x16_1000k_div2k_20200606-a1f0810e.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/srresnet_srgan/srgan_x4c64b16_1x16_1000k_div2k_20200506_191442.log.json) | ## 快速开始 diff --git a/configs/styleganv1/README.md b/configs/styleganv1/README.md index 1df71be75d..e9f0d331f1 100644 --- a/configs/styleganv1/README.md +++ b/configs/styleganv1/README.md @@ -26,10 +26,10 @@ We propose an alternative generator architecture for generative adversarial netw -| Model | FID50k | P&R50k_full | Config | Download | -| :------------------: | :----: | :-----------: | :-----------------------------------------------------------------------------: | :--------------------------------------------------------------------------------: | -| styleganv1_ffhq_256 | 6.090 | 70.228/27.050 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv1/styleganv1_ffhq-256x256_8xb4-25Mimgs.py) | [model](https://download.openmmlab.com/mmgen/styleganv1/styleganv1_ffhq_256_g8_25Mimg_20210407_161748-0094da86.pth) | -| styleganv1_ffhq_1024 | 4.056 | 70.302/36.869 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv1/styleganv1_ffhq-1024x1024_8xb4-25Mimgs.py) | [model](https://download.openmmlab.com/mmgen/styleganv1/styleganv1_ffhq_1024_g8_25Mimg_20210407_161627-850a7234.pth) | +| Model | FID50k | P&R50k_full | Config | Download | +| :------------------: | :----: | :-----------: | :---------------------------------------------------: | :----------------------------------------------------------------------------------------------------------: | +| styleganv1_ffhq_256 | 6.090 | 70.228/27.050 | [config](./styleganv1_ffhq-256x256_8xb4-25Mimgs.py) | [model](https://download.openmmlab.com/mmediting/styleganv1/styleganv1_ffhq_256_g8_25Mimg_20210407_161748-0094da86.pth) | +| styleganv1_ffhq_1024 | 4.056 | 70.302/36.869 | [config](./styleganv1_ffhq-1024x1024_8xb4-25Mimgs.py) | [model](https://download.openmmlab.com/mmediting/styleganv1/styleganv1_ffhq_1024_g8_25Mimg_20210407_161627-850a7234.pth) | ## Citation diff --git a/configs/styleganv1/metafile.yml b/configs/styleganv1/metafile.yml index ed2d62c759..812f8aaf16 100644 --- a/configs/styleganv1/metafile.yml +++ b/configs/styleganv1/metafile.yml @@ -20,7 +20,7 @@ Models: PSNR: 70.228 SSIM: 27.05 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/styleganv1/styleganv1_ffhq_256_g8_25Mimg_20210407_161748-0094da86.pth + Weights: https://download.openmmlab.com/mmediting/styleganv1/styleganv1_ffhq_256_g8_25Mimg_20210407_161748-0094da86.pth - Config: configs/styleganv1/styleganv1_ffhq-1024x1024_8xb4-25Mimgs.py In Collection: StyleGANv1 Metadata: @@ -34,4 +34,4 @@ Models: PSNR: 70.302 SSIM: 36.869 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/styleganv1/styleganv1_ffhq_1024_g8_25Mimg_20210407_161627-850a7234.pth + Weights: https://download.openmmlab.com/mmediting/styleganv1/styleganv1_ffhq_1024_g8_25Mimg_20210407_161627-850a7234.pth diff --git a/configs/styleganv2/README.md b/configs/styleganv2/README.md index 631ea0dbb4..37a45a7d8a 100644 --- a/configs/styleganv2/README.md +++ b/configs/styleganv2/README.md @@ -28,14 +28,14 @@ The style-based GAN architecture (StyleGAN) yields state-of-the-art results in d | Model | Comment | FID50k | Precision50k | Recall50k | Config | Download | | :---------------------------------: | :-------------: | :----: | :----------: | :-------: | :----------------------------------------------------------: | :-------------------------------------------------------------: | -| stylegan2_config-f_ffhq_1024 | official weight | 2.8134 | 62.856 | 49.400 | [stylegan2_c2_8xb4_ffhq-1024x1024](/configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth) | -| stylegan2_config-f_lsun-car_384x512 | official weight | 5.4316 | 65.986 | 48.190 | [stylegan2_c2_8xb4_lsun-car-384x512](/configs/styleganv2/stylegan2_c2_8xb4_lsun-car-384x512.py) | [model](https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-car-config-f-official_20210327_172340-8cfe053c.pth) | -| stylegan2_config-f_horse_256 | official weight | - | - | - | [stylegan2_c2_8xb4-800kiters_lsun-horse-256x256](/configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-horse-256x256.py) | [model](https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-horse-config-f-official_20210327_173203-ef3e69ca.pth) | -| stylegan2_config-f_church_256 | official weight | - | - | - | [stylegan2_c2_8xb4-800kiters_lsun-church-256x256](/configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-church-256x256.py) | [model](https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-church-config-f-official_20210327_172657-1d42b7d1.pth) | -| stylegan2_config-f_cat_256 | official weight | - | - | - | [stylegan2_c2_8xb4-800kiters_lsun-cat-256x256](/configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-cat-256x256.py) | [model](https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-cat-config-f-official_20210327_172444-15bc485b.pth) | -| stylegan2_config-f_ffhq_256 | our training | 3.992 | 69.012 | 40.417 | [stylegan2_c2_8xb4-800kiters_ffhq-256x256](/configs/styleganv2/stylegan2_c2_8xb4-800kiters_ffhq-256x256.py) | [model](https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_ffhq_256_b4x8_20210407_160709-7890ae1f.pth) | -| stylegan2_config-f_ffhq_1024 | our training | 2.8185 | 68.236 | 49.583 | [stylegan2_c2_8xb4_ffhq-1024x1024](/configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_ffhq_1024_b4x8_20210407_150045-618c9024.pth) | -| stylegan2_config-f_lsun-car_384x512 | our training | 2.4116 | 66.760 | 50.576 | [stylegan2_c2_8xb4_lsun-car-384x512](/configs/styleganv2/stylegan2_c2_8xb4_lsun-car-384x512.py) | [model](https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_lsun-car_384x512_b4x8_1800k_20210424_160929-fc9072ca.pth) | +| stylegan2_config-f_ffhq_1024 | official weight | 2.8134 | 62.856 | 49.400 | [stylegan2_c2_8xb4_ffhq-1024x1024](./stylegan2_c2_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth) | +| stylegan2_config-f_lsun-car_384x512 | official weight | 5.4316 | 65.986 | 48.190 | [stylegan2_c2_8xb4_lsun-car-384x512](./stylegan2_c2_8xb4_lsun-car-384x512.py) | [model](https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-car-config-f-official_20210327_172340-8cfe053c.pth) | +| stylegan2_config-f_horse_256 | official weight | - | - | - | [stylegan2_c2_8xb4-800kiters_lsun-horse-256x256](./stylegan2_c2_8xb4-800kiters_lsun-horse-256x256.py) | [model](https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-horse-config-f-official_20210327_173203-ef3e69ca.pth) | +| stylegan2_config-f_church_256 | official weight | - | - | - | [stylegan2_c2_8xb4-800kiters_lsun-church-256x256](./stylegan2_c2_8xb4-800kiters_lsun-church-256x256.py) | [model](https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-church-config-f-official_20210327_172657-1d42b7d1.pth) | +| stylegan2_config-f_cat_256 | official weight | - | - | - | [stylegan2_c2_8xb4-800kiters_lsun-cat-256x256](./stylegan2_c2_8xb4-800kiters_lsun-cat-256x256.py) | [model](https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-cat-config-f-official_20210327_172444-15bc485b.pth) | +| stylegan2_config-f_ffhq_256 | our training | 3.992 | 69.012 | 40.417 | [stylegan2_c2_8xb4-800kiters_ffhq-256x256](./stylegan2_c2_8xb4-800kiters_ffhq-256x256.py) | [model](https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_ffhq_256_b4x8_20210407_160709-7890ae1f.pth) | +| stylegan2_config-f_ffhq_1024 | our training | 2.8185 | 68.236 | 49.583 | [stylegan2_c2_8xb4_ffhq-1024x1024](./stylegan2_c2_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_ffhq_1024_b4x8_20210407_150045-618c9024.pth) | +| stylegan2_config-f_lsun-car_384x512 | our training | 2.4116 | 66.760 | 50.576 | [stylegan2_c2_8xb4_lsun-car-384x512](./stylegan2_c2_8xb4_lsun-car-384x512.py) | [model](https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_lsun-car_384x512_b4x8_1800k_20210424_160929-fc9072ca.pth) | ## FP16 Support and Experiments @@ -49,18 +49,18 @@ Currently, we have supported FP16 training for StyleGAN2, and here are the resul As shown in the figure, we provide **3** ways to do mixed-precision training for `StyleGAN2`: -- [stylegan2_c2_fp16_PL-no-scaler](/configs/styleganv2/stylegan2_c2-PL_8xb4-fp16-partial-GD-no-scaler-800kiters_ffhq-256x256.py): In this setting, we try our best to follow the official FP16 implementation in [StyleGAN2-ADA](https://github.com/NVlabs/stylegan2-ada). Similar to the official version, we only adopt FP16 training for the higher-resolution feature maps (the last 4 stages in G and the first 4 stages). Note that we do not adopt the `clamp` way to avoid gradient overflow used in the official implementation. We use the `autocast` function from `torch.cuda.amp` package. -- [stylegan2_c2_fp16-globalG-partialD_PL-R1-no-scaler](/configs/styleganv2/stylegan2_c2-PL-R1_8xb4-fp16-globalG-partialD-no-scaler-800kiters_ffhq-256x256.py): In this config, we try to adopt mixed-precision training for the whole generator, but in partial discriminator (the first 4 higher-resolution stages). Note that we do not apply the loss scaler in the path length loss and gradient penalty loss. Because we always meet divergence after adopting the loss scaler to scale the gradient in these two losses. -- [stylegan2_c2_apex_fp16_PL-R1-no-scaler](/configs/styleganv2/stylegan2_c2-PL-R1_8xb4-apex-fp16-no-scaler-800kiters_ffhq-256x256.py): In this setting, we adopt the [APEX](https://github.com/NVIDIA/apex) toolkit to implement mixed-precision training with multiple loss/gradient scalers. In APEX, you can assign different loss scalers for the generator and the discriminator respectively. Note that we still ignore the gradient scaler in the path length loss and gradient penalty loss. +- [stylegan2_c2_fp16_PL-no-scaler](./stylegan2_c2-PL_8xb4-fp16-partial-GD-no-scaler-800kiters_ffhq-256x256.py): In this setting, we try our best to follow the official FP16 implementation in [StyleGAN2-ADA](https://github.com/NVlabs/stylegan2-ada). Similar to the official version, we only adopt FP16 training for the higher-resolution feature maps (the last 4 stages in G and the first 4 stages). Note that we do not adopt the `clamp` way to avoid gradient overflow used in the official implementation. We use the `autocast` function from `torch.cuda.amp` package. +- [stylegan2_c2_fp16-globalG-partialD_PL-R1-no-scaler](./stylegan2_c2-PL-R1_8xb4-fp16-globalG-partialD-no-scaler-800kiters_ffhq-256x256.py): In this config, we try to adopt mixed-precision training for the whole generator, but in partial discriminator (the first 4 higher-resolution stages). Note that we do not apply the loss scaler in the path length loss and gradient penalty loss. Because we always meet divergence after adopting the loss scaler to scale the gradient in these two losses. +- [stylegan2_c2_apex_fp16_PL-R1-no-scaler](./stylegan2_c2-PL-R1_8xb4-apex-fp16-no-scaler-800kiters_ffhq-256x256.py): In this setting, we adopt the [APEX](https://github.com/NVIDIA/apex) toolkit to implement mixed-precision training with multiple loss/gradient scalers. In APEX, you can assign different loss scalers for the generator and the discriminator respectively. Note that we still ignore the gradient scaler in the path length loss and gradient penalty loss. | Model | Comment | Dataset | FID50k | Config | Download | | :----------------------------------------------: | :-------------------------------------: | :-----: | :----: | :-----------------------------------------------: | :-------------------------------------------------: | -| stylegan2_config-f_ffhq_256 | baseline | FFHQ256 | 3.992 | [stylegan2_c2_8xb4-800kiters_ffhq-256x256](/configs/styleganv2/stylegan2_c2_8xb4-800kiters_ffhq-256x256.py) | [ckpt](https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_ffhq_256_b4x8_20210407_160709-7890ae1f.pth) | -| stylegan2_c2_fp16_partial-GD_PL-no-scaler_ffhq_256_b4x8_800k | partial layers in fp16 | FFHQ256 | 4.331 | [stylegan2_c2-PL_8xb4-fp16-partial-GD-no-scaler-800kiters_ffhq-256x256](/configs/styleganv2/stylegan2_c2-PL_8xb4-fp16-partial-GD-no-scaler-800kiters_ffhq-256x256.py) | [ckpt](https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_fp16_partial-GD_PL-no-scaler_ffhq_256_b4x8_800k_20210508_114854-dacbe4c9.pth) | -| stylegan2_c2_fp16-globalG-partialD_PL-R1-no-scaler_ffhq_256_b4x8_800k | the whole G in fp16 | FFHQ256 | 4.362 | [stylegan2_c2-PL-R1_8xb4-fp16-globalG-partialD-no-scaler-800kiters_ffhq-256x256](/configs/styleganv2/stylegan2_c2-PL-R1_8xb4-fp16-globalG-partialD-no-scaler-800kiters_ffhq-256x256.py) | [ckpt](https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_fp16-globalG-partialD_PL-R1-no-scaler_ffhq_256_b4x8_800k_20210508_114930-ef8270d4.pth) | -| stylegan2_c2_apex_fp16_PL-R1-no-scaler_ffhq_256_b4x8_800k | the whole G&D in fp16 + two loss scaler | FFHQ256 | 4.614 | [stylegan2_c2-PL-R1_8xb4-apex-fp16-no-scaler-800kiters_ffhq-256x256](/configs/styleganv2/stylegan2_c2-PL-R1_8xb4-apex-fp16-no-scaler-800kiters_ffhq-256x256.py) | [ckpt](https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_apex_fp16_PL-R1-no-scaler_ffhq_256_b4x8_800k_20210508_114701-c2bb8afd.pth) | +| stylegan2_config-f_ffhq_256 | baseline | FFHQ256 | 3.992 | [stylegan2_c2_8xb4-800kiters_ffhq-256x256](./stylegan2_c2_8xb4-800kiters_ffhq-256x256.py) | [ckpt](https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_ffhq_256_b4x8_20210407_160709-7890ae1f.pth) | +| stylegan2_c2_fp16_partial-GD_PL-no-scaler_ffhq_256_b4x8_800k | partial layers in fp16 | FFHQ256 | 4.331 | [stylegan2_c2-PL_8xb4-fp16-partial-GD-no-scaler-800kiters_ffhq-256x256](./stylegan2_c2-PL_8xb4-fp16-partial-GD-no-scaler-800kiters_ffhq-256x256.py) | [ckpt](https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_fp16_partial-GD_PL-no-scaler_ffhq_256_b4x8_800k_20210508_114854-dacbe4c9.pth) | +| stylegan2_c2_fp16-globalG-partialD_PL-R1-no-scaler_ffhq_256_b4x8_800k | the whole G in fp16 | FFHQ256 | 4.362 | [stylegan2_c2-PL-R1_8xb4-fp16-globalG-partialD-no-scaler-800kiters_ffhq-256x256](./stylegan2_c2-PL-R1_8xb4-fp16-globalG-partialD-no-scaler-800kiters_ffhq-256x256.py) | [ckpt](https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_fp16-globalG-partialD_PL-R1-no-scaler_ffhq_256_b4x8_800k_20210508_114930-ef8270d4.pth) | +| stylegan2_c2_apex_fp16_PL-R1-no-scaler_ffhq_256_b4x8_800k | the whole G&D in fp16 + two loss scaler | FFHQ256 | 4.614 | [stylegan2_c2-PL-R1_8xb4-apex-fp16-no-scaler-800kiters_ffhq-256x256](./stylegan2_c2-PL-R1_8xb4-apex-fp16-no-scaler-800kiters_ffhq-256x256.py) | [ckpt](https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_apex_fp16_PL-R1-no-scaler_ffhq_256_b4x8_800k_20210508_114701-c2bb8afd.pth) | -In addition, we also provide `QuickTestImageDataset` to users for quickly checking whether the code can be run correctly. It's more important for FP16 experiments, because some cuda operations may no support mixed precision training. Esepcially for `APEX`, you can use [this config](/configs/styleganv2/stylegan2_c2_8xb4-apex-fp16-800kiters_quicktest-ffhq-256x256.py) in your local machine by running: +In addition, we also provide `QuickTestImageDataset` to users for quickly checking whether the code can be run correctly. It's more important for FP16 experiments, because some cuda operations may no support mixed precision training. Esepcially for `APEX`, you can use [this config](./stylegan2_c2_8xb4-apex-fp16-800kiters_quicktest-ffhq-256x256.py) in your local machine by running: ```bash bash tools/dist_train.sh \ @@ -68,7 +68,7 @@ bash tools/dist_train.sh \ --work-dir ./work_dirs/quick-test ``` -With a similar way, users can switch to [config for partial-GD](/configs/styleganv2/stylegan2_c2_8xb4-fp16-800kiters_quicktest-ffhq-256x256.py) and [config for globalG-partialD](/configs/styleganv2/stylegan2_c2_8xb4-fp16-global-800kiters_quicktest-ffhq-256x256.py) to test the other two mixed precision training configuration. +With a similar way, users can switch to [config for partial-GD](./stylegan2_c2_8xb4-fp16-800kiters_quicktest-ffhq-256x256.py) and [config for globalG-partialD](./stylegan2_c2_8xb4-fp16-global-800kiters_quicktest-ffhq-256x256.py) to test the other two mixed precision training configuration. *Note that to use the [APEX](https://github.com/NVIDIA/apex) toolkit, you have to installed it following the official guidance. (APEX is not included in our requirements.) If you are using GPUs without tensor core, you would better to switch to the newer PyTorch version (>= 1.7,0). Otherwise, the APEX installation or running may meet several bugs.* @@ -76,17 +76,17 @@ With a similar way, users can switch to [config for partial-GD](/configs/stylega | Model | Comment | FID50k | FID Version | Config | Download | | :--------------------------: | :-------------: | :----: | :-------------: | :-----------------------------------------------------------------: | :-------------------------------------------------------------------: | -| stylegan2_config-f_ffhq_1024 | official weight | 2.8732 | Tero's StyleGAN | [stylegan2_c2_8xb4_ffhq-1024x1024](/configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth) \| [FID-Reals](https://download.openmmlab.com/mmgen/evaluation/fid_inception_pkl/ffhq-1024-50k-stylegan.pkl) | -| stylegan2_config-f_ffhq_1024 | our training | 2.9413 | Tero's StyleGAN | [stylegan2_c2_8xb4_ffhq-1024x1024](/configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_ffhq_1024_b4x8_20210407_150045-618c9024.pth) \| [FID-Reals](https://download.openmmlab.com/mmgen/evaluation/fid_inception_pkl/ffhq-1024-50k-stylegan.pkl) | -| stylegan2_config-f_ffhq_1024 | official weight | 2.8134 | Our PyTorch | [stylegan2_c2_8xb4_ffhq-1024x1024](/configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth) \| [FID-Reals](https://download.openmmlab.com/mmgen/evaluation/fid_inception_pkl/ffhq-1024-50k-rgb.pkl) | -| stylegan2_config-f_ffhq_1024 | our training | 2.8185 | Our PyTorch | [stylegan2_c2_8xb4_ffhq-1024x1024](/configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_ffhq_1024_b4x8_20210407_150045-618c9024.pth) \| [FID-Reals](https://download.openmmlab.com/mmgen/evaluation/fid_inception_pkl/ffhq-1024-50k-rgb.pkl) | +| stylegan2_config-f_ffhq_1024 | official weight | 2.8732 | Tero's StyleGAN | [stylegan2_c2_8xb4_ffhq-1024x1024](./stylegan2_c2_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth) \| [FID-Reals](https://download.openmmlab.com/mmediting/evaluation/fid_inception_pkl/ffhq-1024-50k-stylegan.pkl) | +| stylegan2_config-f_ffhq_1024 | our training | 2.9413 | Tero's StyleGAN | [stylegan2_c2_8xb4_ffhq-1024x1024](./stylegan2_c2_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_ffhq_1024_b4x8_20210407_150045-618c9024.pth) \| [FID-Reals](https://download.openmmlab.com/mmediting/evaluation/fid_inception_pkl/ffhq-1024-50k-stylegan.pkl) | +| stylegan2_config-f_ffhq_1024 | official weight | 2.8134 | Our PyTorch | [stylegan2_c2_8xb4_ffhq-1024x1024](./stylegan2_c2_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth) \| [FID-Reals](https://download.openmmlab.com/mmediting/evaluation/fid_inception_pkl/ffhq-1024-50k-rgb.pkl) | +| stylegan2_config-f_ffhq_1024 | our training | 2.8185 | Our PyTorch | [stylegan2_c2_8xb4_ffhq-1024x1024](./stylegan2_c2_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_ffhq_1024_b4x8_20210407_150045-618c9024.pth) \| [FID-Reals](https://download.openmmlab.com/mmediting/evaluation/fid_inception_pkl/ffhq-1024-50k-rgb.pkl) | In this table, we observe that the FID with Tero's inception network is similar to that with PyTorch Inception (in mmediting). Thus, we use the FID with PyTorch's Inception net (but the weight is not the official model zoo) by default. Because it can be run on different PyTorch versions. If you use [Tero's Inception net](https://nvlabs-fi-cdn.nvidia.com/stylegan2-ada-pytorch/pretrained/metrics/inception-2015-12-05.pt), your PyTorch must meet `>=1.6.0`. More precalculated inception pickle files are listed here: -- FFHQ 256x256 real inceptions, PyTorch InceptionV3. [download](https://download.openmmlab.com/mmgen/evaluation/fid_inception_pkl/ffhq-256-50k-rgb.pkl) -- LSUN-Car 384x512 real inceptions, PyTorch InceptionV3. [download](https://download.openmmlab.com/mmgen/evaluation/fid_inception_pkl/lsun-car-512_50k_rgb.pkl) +- FFHQ 256x256 real inceptions, PyTorch InceptionV3. [download](https://download.openmmlab.com/mmediting/evaluation/fid_inception_pkl/ffhq-256-50k-rgb.pkl) +- LSUN-Car 384x512 real inceptions, PyTorch InceptionV3. [download](https://download.openmmlab.com/mmediting/evaluation/fid_inception_pkl/lsun-car-512_50k_rgb.pkl) ## About Different Implementation and Setting of PR Metric diff --git a/configs/styleganv2/metafile.yml b/configs/styleganv2/metafile.yml index e8c2a5f8bf..88d6b0e23e 100644 --- a/configs/styleganv2/metafile.yml +++ b/configs/styleganv2/metafile.yml @@ -19,7 +19,7 @@ Models: Precision50k: 62.856 Recall50k: 49.4 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth + Weights: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth - Config: configs/styleganv2/stylegan2_c2_8xb4_lsun-car-384x512.py In Collection: StyleGANv2 Metadata: @@ -32,7 +32,7 @@ Models: Precision50k: 65.986 Recall50k: 48.19 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-car-config-f-official_20210327_172340-8cfe053c.pth + Weights: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-car-config-f-official_20210327_172340-8cfe053c.pth - Config: configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-horse-256x256.py In Collection: StyleGANv2 Metadata: @@ -42,7 +42,7 @@ Models: - Dataset: Others Metrics: {} Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-horse-config-f-official_20210327_173203-ef3e69ca.pth + Weights: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-horse-config-f-official_20210327_173203-ef3e69ca.pth - Config: configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-church-256x256.py In Collection: StyleGANv2 Metadata: @@ -52,7 +52,7 @@ Models: - Dataset: Others Metrics: {} Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-church-config-f-official_20210327_172657-1d42b7d1.pth + Weights: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-church-config-f-official_20210327_172657-1d42b7d1.pth - Config: configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-cat-256x256.py In Collection: StyleGANv2 Metadata: @@ -62,7 +62,7 @@ Models: - Dataset: CAT Metrics: {} Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-cat-config-f-official_20210327_172444-15bc485b.pth + Weights: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-cat-config-f-official_20210327_172444-15bc485b.pth - Config: configs/styleganv2/stylegan2_c2_8xb4-800kiters_ffhq-256x256.py In Collection: StyleGANv2 Metadata: @@ -75,7 +75,7 @@ Models: Precision50k: 69.012 Recall50k: 40.417 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_ffhq_256_b4x8_20210407_160709-7890ae1f.pth + Weights: https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_ffhq_256_b4x8_20210407_160709-7890ae1f.pth - Config: configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py In Collection: StyleGANv2 Metadata: @@ -88,7 +88,7 @@ Models: Precision50k: 68.236 Recall50k: 49.583 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_ffhq_1024_b4x8_20210407_150045-618c9024.pth + Weights: https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_ffhq_1024_b4x8_20210407_150045-618c9024.pth - Config: configs/styleganv2/stylegan2_c2_8xb4_lsun-car-384x512.py In Collection: StyleGANv2 Metadata: @@ -101,7 +101,7 @@ Models: Precision50k: 66.76 Recall50k: 50.576 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_lsun-car_384x512_b4x8_1800k_20210424_160929-fc9072ca.pth + Weights: https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_lsun-car_384x512_b4x8_1800k_20210424_160929-fc9072ca.pth - Config: configs/styleganv2/stylegan2_c2_8xb4-800kiters_ffhq-256x256.py In Collection: StyleGANv2 Metadata: @@ -112,7 +112,7 @@ Models: Metrics: FID50k: 3.992 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_ffhq_256_b4x8_20210407_160709-7890ae1f.pth + Weights: https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_ffhq_256_b4x8_20210407_160709-7890ae1f.pth - Config: configs/styleganv2/stylegan2_c2-PL_8xb4-fp16-partial-GD-no-scaler-800kiters_ffhq-256x256.py In Collection: StyleGANv2 Metadata: @@ -123,7 +123,7 @@ Models: Metrics: FID50k: 4.331 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_fp16_partial-GD_PL-no-scaler_ffhq_256_b4x8_800k_20210508_114854-dacbe4c9.pth + Weights: https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_fp16_partial-GD_PL-no-scaler_ffhq_256_b4x8_800k_20210508_114854-dacbe4c9.pth - Config: configs/styleganv2/stylegan2_c2-PL-R1_8xb4-fp16-globalG-partialD-no-scaler-800kiters_ffhq-256x256.py In Collection: StyleGANv2 Metadata: @@ -134,7 +134,7 @@ Models: Metrics: FID50k: 4.362 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_fp16-globalG-partialD_PL-R1-no-scaler_ffhq_256_b4x8_800k_20210508_114930-ef8270d4.pth + Weights: https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_fp16-globalG-partialD_PL-R1-no-scaler_ffhq_256_b4x8_800k_20210508_114930-ef8270d4.pth - Config: configs/styleganv2/stylegan2_c2-PL-R1_8xb4-apex-fp16-no-scaler-800kiters_ffhq-256x256.py In Collection: StyleGANv2 Metadata: @@ -145,7 +145,7 @@ Models: Metrics: FID50k: 4.614 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_apex_fp16_PL-R1-no-scaler_ffhq_256_b4x8_800k_20210508_114701-c2bb8afd.pth + Weights: https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_apex_fp16_PL-R1-no-scaler_ffhq_256_b4x8_800k_20210508_114701-c2bb8afd.pth - Config: configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py In Collection: StyleGANv2 Metadata: @@ -156,7 +156,7 @@ Models: Metrics: FID50k: 2.8732 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth + Weights: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth - Config: configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py In Collection: StyleGANv2 Metadata: @@ -167,7 +167,7 @@ Models: Metrics: FID50k: 2.9413 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_ffhq_1024_b4x8_20210407_150045-618c9024.pth + Weights: https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_ffhq_1024_b4x8_20210407_150045-618c9024.pth - Config: configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py In Collection: StyleGANv2 Metadata: @@ -178,7 +178,7 @@ Models: Metrics: FID50k: 2.8134 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth + Weights: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth - Config: configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py In Collection: StyleGANv2 Metadata: @@ -189,4 +189,4 @@ Models: Metrics: FID50k: 2.8185 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_ffhq_1024_b4x8_20210407_150045-618c9024.pth + Weights: https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_ffhq_1024_b4x8_20210407_150045-618c9024.pth diff --git a/configs/styleganv3/README.md b/configs/styleganv3/README.md index bcb1c677d4..7c67da280c 100644 --- a/configs/styleganv3/README.md +++ b/configs/styleganv3/README.md @@ -40,26 +40,26 @@ For user convenience, we also offer the converted version of official weights. | Model | Dataset | Iter | FID50k | Config | Log | Download | | :-------------: | :---------------: | :----: | :---------------: | :----------------------------------------------: | :--------------------------------------------: | :-------------------------------------------------: | -| stylegan3-t | ffhq 1024x1024 | 490000 | 3.37\* | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv3/stylegan3-t_gamma32.8_8xb4-fp16-noaug_ffhq-1024x1024.py) | [log](https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_noaug_fp16_gamma32.8_ffhq_1024_b4x8_20220322_090417.log.json) | [model](https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_noaug_fp16_gamma32.8_ffhq_1024_b4x8_best_fid_iter_490000_20220401_120733-4ff83434.pth) | -| stylegan3-t-ada | metface 1024x1024 | 130000 | 15.09 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv3/stylegan3-t_ada-gamma6.6_8xb4-fp16_metfaces-1024x1024.py) | [log](https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_ada_fp16_gamma6.6_metfaces_1024_b4x8_20220328_142211.log.json) | [model](https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_ada_fp16_gamma6.6_metfaces_1024_b4x8_best_fid_iter_130000_20220401_115101-f2ef498e.pth) | +| stylegan3-t | ffhq 1024x1024 | 490000 | 3.37\* | [config](./stylegan3-t_gamma32.8_8xb4-fp16-noaug_ffhq-1024x1024.py) | [log](https://download.openmmlab.com/mmediting/stylegan3/stylegan3_t_noaug_fp16_gamma32.8_ffhq_1024_b4x8_20220322_090417.log.json) | [model](https://download.openmmlab.com/mmediting/stylegan3/stylegan3_t_noaug_fp16_gamma32.8_ffhq_1024_b4x8_best_fid_iter_490000_20220401_120733-4ff83434.pth) | +| stylegan3-t-ada | metface 1024x1024 | 130000 | 15.09 | [config](./stylegan3-t_ada-gamma6.6_8xb4-fp16_metfaces-1024x1024.py) | [log](https://download.openmmlab.com/mmediting/stylegan3/stylegan3_t_ada_fp16_gamma6.6_metfaces_1024_b4x8_20220328_142211.log.json) | [model](https://download.openmmlab.com/mmediting/stylegan3/stylegan3_t_ada_fp16_gamma6.6_metfaces_1024_b4x8_best_fid_iter_130000_20220401_115101-f2ef498e.pth) | ### Experimental Settings | Model | Dataset | Iter | FID50k | Config | Log | Download | | :-------------: | :------------: | :----: | :----: | :---------------------------------------------------: | :------------------------------------------------: | :------------------------------------------------------: | -| stylegan3-t | ffhq 256x256 | 740000 | 4.51 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv3/stylegan3-t_gamma2.0_8xb4-fp16-noaug_ffhq-256x256.py) | [log](https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_noaug_fp16_gamma2.0_ffhq_256_b4x8_20220323_144815.log.json) | [model](https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_noaug_fp16_gamma2.0_ffhq_256_b4x8_best_fid_iter_740000_20220401_122456-730e1fba.pth) | -| stylegan3-r-ada | ffhq 1024x1024 | - | - | [config](/configs/styleganv3/stylegan3-r_ada-gamma3.3_8xb4-fp16_metfaces-1024x1024.py) | - | - | +| stylegan3-t | ffhq 256x256 | 740000 | 4.51 | [config](./stylegan3-t_gamma2.0_8xb4-fp16-noaug_ffhq-256x256.py) | [log](https://download.openmmlab.com/mmediting/stylegan3/stylegan3_t_noaug_fp16_gamma2.0_ffhq_256_b4x8_20220323_144815.log.json) | [model](https://download.openmmlab.com/mmediting/stylegan3/stylegan3_t_noaug_fp16_gamma2.0_ffhq_256_b4x8_best_fid_iter_740000_20220401_122456-730e1fba.pth) | +| stylegan3-r-ada | ffhq 1024x1024 | - | - | [config](./stylegan3-r_ada-gamma3.3_8xb4-fp16_metfaces-1024x1024.py) | - | - | ### Converted Weights -| Model | Dataset | Comment | FID50k | EQ-T | EQ-R | Config | Download | -| :---------: | :------------: | :-------------: | :----: | :---: | :---: | :---------------------------------------------------------------------: | :-----------------------------------------------------------------------: | -| stylegan3-t | ffhqu 256x256 | official weight | 4.62 | 63.01 | 13.12 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv3/stylegan3-t_cvt-official-rgb_8xb4_ffhqu-256x256.py) | [model](https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_ffhqu_256_b4x8_cvt_official_rgb_20220329_235046-153df4c8.pth) | -| stylegan3-t | afhqv2 512x512 | official weight | 4.04 | 60.15 | 13.51 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv3/stylegan3-t_cvt-official-rgb_8xb4_afhqv2-512x512.py) | [model](https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_afhqv2_512_b4x8_cvt_official_rgb_20220329_235017-ee6b037a.pth) | -| stylegan3-t | ffhq 1024x1024 | official weight | 2.79 | 61.21 | 13.82 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv3/stylegan3-t_cvt-official-rgb_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_ffhq_1024_b4x8_cvt_official_rgb_20220329_235113-db6c6580.pth) | -| stylegan3-r | ffhqu 256x256 | official weight | 4.50 | 66.65 | 40.48 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv3/stylegan3-r_cvt-official-rgb_8xb4_ffhqu-256x256.py) | [model](https://download.openmmlab.com/mmgen/stylegan3/stylegan3_r_ffhqu_256_b4x8_cvt_official_rgb_20220329_234909-4521d963.pth) | -| stylegan3-r | afhqv2 512x512 | official weight | 4.40 | 64.89 | 40.34 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv3/stylegan3-r_cvt-official-rgb_8xb4x8_afhqv2-512x512.py) | [model](https://download.openmmlab.com/mmgen/stylegan3/stylegan3_r_afhqv2_512_b4x8_cvt_official_rgb_20220329_234829-f2eaca72.pth) | -| stylegan3-r | ffhq 1024x1024 | official weight | 3.07 | 64.76 | 46.62 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/styleganv3/stylegan3-r_cvt-official-rgb_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmgen/stylegan3/stylegan3_r_ffhq_1024_b4x8_cvt_official_rgb_20220329_234933-ac0500a1.pth) | +| Model | Dataset | Comment | FID50k | EQ-T | EQ-R | Config | Download | +| :---------: | :------------: | :-------------: | :----: | :---: | :---: | :---------------------------------------------------------------: | :-----------------------------------------------------------------------------: | +| stylegan3-t | ffhqu 256x256 | official weight | 4.62 | 63.01 | 13.12 | [config](./stylegan3-t_cvt-official-rgb_8xb4_ffhqu-256x256.py) | [model](https://download.openmmlab.com/mmediting/stylegan3/stylegan3_t_ffhqu_256_b4x8_cvt_official_rgb_20220329_235046-153df4c8.pth) | +| stylegan3-t | afhqv2 512x512 | official weight | 4.04 | 60.15 | 13.51 | [config](./stylegan3-t_cvt-official-rgb_8xb4_afhqv2-512x512.py) | [model](https://download.openmmlab.com/mmediting/stylegan3/stylegan3_t_afhqv2_512_b4x8_cvt_official_rgb_20220329_235017-ee6b037a.pth) | +| stylegan3-t | ffhq 1024x1024 | official weight | 2.79 | 61.21 | 13.82 | [config](./stylegan3-t_cvt-official-rgb_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmediting/stylegan3/stylegan3_t_ffhq_1024_b4x8_cvt_official_rgb_20220329_235113-db6c6580.pth) | +| stylegan3-r | ffhqu 256x256 | official weight | 4.50 | 66.65 | 40.48 | [config](./stylegan3-r_cvt-official-rgb_8xb4_ffhqu-256x256.py) | [model](https://download.openmmlab.com/mmediting/stylegan3/stylegan3_r_ffhqu_256_b4x8_cvt_official_rgb_20220329_234909-4521d963.pth) | +| stylegan3-r | afhqv2 512x512 | official weight | 4.40 | 64.89 | 40.34 | [config](./stylegan3-r_cvt-official-rgb_8xb4x8_afhqv2-512x512.py) | [model](https://download.openmmlab.com/mmediting/stylegan3/stylegan3_r_afhqv2_512_b4x8_cvt_official_rgb_20220329_234829-f2eaca72.pth) | +| stylegan3-r | ffhq 1024x1024 | official weight | 3.07 | 64.76 | 46.62 | [config](./stylegan3-r_cvt-official-rgb_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmediting/stylegan3/stylegan3_r_ffhq_1024_b4x8_cvt_official_rgb_20220329_234933-ac0500a1.pth) | ## Interpolation @@ -67,7 +67,7 @@ We provide a tool to generate video by walking through GAN's latent space. Run this command to get the following video. ```bash -python apps/interpolate_sample.py configs/styleganv3/stylegan3_t_afhqv2_512_b4x8_official.py https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_afhqv2_512_b4x8_cvt_official.pkl --export-video --samples-path work_dirs/demos/ --endpoint 6 --interval 60 --space z --seed 2022 --sample-cfg truncation=0.8 +python apps/interpolate_sample.py configs/styleganv3/stylegan3_t_afhqv2_512_b4x8_official.py https://download.openmmlab.com/mmediting/stylegan3/stylegan3_t_afhqv2_512_b4x8_cvt_official.pkl --export-video --samples-path work_dirs/demos/ --endpoint 6 --interval 60 --space z --seed 2022 --sample-cfg truncation=0.8 ``` https://user-images.githubusercontent.com/22982797/151506918-83da9ee3-0d63-4c5b-ad53-a41562b92075.mp4 @@ -78,11 +78,11 @@ We also provide a tool to visualize the equivarience properties for StyleGAN3. Run these commands to get the results below. ```bash -python tools/utils/equivariance_viz.py configs/styleganv3/stylegan3_r_ffhqu_256_b4x8_official.py https://download.openmmlab.com/mmgen/stylegan3/stylegan3_r_ffhqu_256_b4x8_cvt_official.pkl --translate_max 0.5 --transform rotate --seed 5432 +python tools/utils/equivariance_viz.py configs/styleganv3/stylegan3_r_ffhqu_256_b4x8_official.py https://download.openmmlab.com/mmediting/stylegan3/stylegan3_r_ffhqu_256_b4x8_cvt_official.pkl --translate_max 0.5 --transform rotate --seed 5432 -python tools/utils/equivariance_viz.py configs/styleganv3/stylegan3_r_ffhqu_256_b4x8_official.py https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmgen/stylegan3/stylegan3_r_ffhqu_256_b4x8_cvt_official.pkl --translate_max 0.25 --transform x_t --seed 5432 +python tools/utils/equivariance_viz.py configs/styleganv3/stylegan3_r_ffhqu_256_b4x8_official.py https://download.openmmlab.com/mmediting/stylegan3/stylegan3_r_ffhqu_256_b4x8_cvt_official.pkl --translate_max 0.25 --transform x_t --seed 5432 -python tools/utils/equivariance_viz.py configs/styleganv3/stylegan3_r_ffhqu_256_b4x8_official.py https://openmmlab-share.oss-cn-hangzhou.aliyuncs.com/mmgen/stylegan3/stylegan3_r_ffhqu_256_b4x8_cvt_official.pkl --translate_max 0.25 --transform y_t --seed 5432 +python tools/utils/equivariance_viz.py configs/styleganv3/stylegan3_r_ffhqu_256_b4x8_official.py https://download.openmmlab.com/mmediting/stylegan3/stylegan3_r_ffhqu_256_b4x8_cvt_official.pkl --translate_max 0.25 --transform y_t --seed 5432 ``` https://user-images.githubusercontent.com/22982797/151504902-f3cbfef5-9014-4607-bbe1-deaf48ec6d55.mp4 @@ -102,7 +102,7 @@ metrics = dict( compute_eqt_int=True, compute_eqt_frac=True, compute_eqr=True))) ``` -And we highly recommend you to use [slurm_eval_multi_gpu](tools/slurm_eval_multi_gpu.sh) script to accelerate evaluation time. +And we highly recommend you to use [slurm_test.sh](../../tools/slurm_test.sh) script to accelerate evaluation time. ## Citation diff --git a/configs/styleganv3/metafile.yml b/configs/styleganv3/metafile.yml index e2a27ca177..97a2d263df 100644 --- a/configs/styleganv3/metafile.yml +++ b/configs/styleganv3/metafile.yml @@ -17,7 +17,7 @@ Models: Metrics: Iter: 490000.0 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_noaug_fp16_gamma32.8_ffhq_1024_b4x8_best_fid_iter_490000_20220401_120733-4ff83434.pth + Weights: https://download.openmmlab.com/mmediting/stylegan3/stylegan3_t_noaug_fp16_gamma32.8_ffhq_1024_b4x8_best_fid_iter_490000_20220401_120733-4ff83434.pth - Config: configs/styleganv3/stylegan3-t_ada-gamma6.6_8xb4-fp16_metfaces-1024x1024.py In Collection: StyleGANv3 Metadata: @@ -29,7 +29,7 @@ Models: FID50k: 15.09 Iter: 130000.0 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_ada_fp16_gamma6.6_metfaces_1024_b4x8_best_fid_iter_130000_20220401_115101-f2ef498e.pth + Weights: https://download.openmmlab.com/mmediting/stylegan3/stylegan3_t_ada_fp16_gamma6.6_metfaces_1024_b4x8_best_fid_iter_130000_20220401_115101-f2ef498e.pth - Config: configs/styleganv3/stylegan3-t_gamma2.0_8xb4-fp16-noaug_ffhq-256x256.py In Collection: StyleGANv3 Metadata: @@ -41,7 +41,7 @@ Models: FID50k: 4.51 Iter: 740000.0 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_noaug_fp16_gamma2.0_ffhq_256_b4x8_best_fid_iter_740000_20220401_122456-730e1fba.pth + Weights: https://download.openmmlab.com/mmediting/stylegan3/stylegan3_t_noaug_fp16_gamma2.0_ffhq_256_b4x8_best_fid_iter_740000_20220401_122456-730e1fba.pth - Config: configs/styleganv3/stylegan3-r_ada-gamma3.3_8xb4-fp16_metfaces-1024x1024.py In Collection: StyleGANv3 Metadata: @@ -64,7 +64,7 @@ Models: EQ-T: 63.01 FID50k: 4.62 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_ffhqu_256_b4x8_cvt_official_rgb_20220329_235046-153df4c8.pth + Weights: https://download.openmmlab.com/mmediting/stylegan3/stylegan3_t_ffhqu_256_b4x8_cvt_official_rgb_20220329_235046-153df4c8.pth - Config: configs/styleganv3/stylegan3-t_cvt-official-rgb_8xb4_afhqv2-512x512.py In Collection: StyleGANv3 Metadata: @@ -77,7 +77,7 @@ Models: EQ-T: 60.15 FID50k: 4.04 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_afhqv2_512_b4x8_cvt_official_rgb_20220329_235017-ee6b037a.pth + Weights: https://download.openmmlab.com/mmediting/stylegan3/stylegan3_t_afhqv2_512_b4x8_cvt_official_rgb_20220329_235017-ee6b037a.pth - Config: configs/styleganv3/stylegan3-t_cvt-official-rgb_8xb4_ffhq-1024x1024.py In Collection: StyleGANv3 Metadata: @@ -90,7 +90,7 @@ Models: EQ-T: 61.21 FID50k: 2.79 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_ffhq_1024_b4x8_cvt_official_rgb_20220329_235113-db6c6580.pth + Weights: https://download.openmmlab.com/mmediting/stylegan3/stylegan3_t_ffhq_1024_b4x8_cvt_official_rgb_20220329_235113-db6c6580.pth - Config: configs/styleganv3/stylegan3-r_cvt-official-rgb_8xb4_ffhqu-256x256.py In Collection: StyleGANv3 Metadata: @@ -103,7 +103,7 @@ Models: EQ-T: 66.65 FID50k: 4.5 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan3/stylegan3_r_ffhqu_256_b4x8_cvt_official_rgb_20220329_234909-4521d963.pth + Weights: https://download.openmmlab.com/mmediting/stylegan3/stylegan3_r_ffhqu_256_b4x8_cvt_official_rgb_20220329_234909-4521d963.pth - Config: configs/styleganv3/stylegan3-r_cvt-official-rgb_8xb4x8_afhqv2-512x512.py In Collection: StyleGANv3 Metadata: @@ -116,7 +116,7 @@ Models: EQ-T: 64.89 FID50k: 4.4 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan3/stylegan3_r_afhqv2_512_b4x8_cvt_official_rgb_20220329_234829-f2eaca72.pth + Weights: https://download.openmmlab.com/mmediting/stylegan3/stylegan3_r_afhqv2_512_b4x8_cvt_official_rgb_20220329_234829-f2eaca72.pth - Config: configs/styleganv3/stylegan3-r_cvt-official-rgb_8xb4_ffhq-1024x1024.py In Collection: StyleGANv3 Metadata: @@ -129,4 +129,4 @@ Models: EQ-T: 64.76 FID50k: 3.07 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/stylegan3/stylegan3_r_ffhq_1024_b4x8_cvt_official_rgb_20220329_234933-ac0500a1.pth + Weights: https://download.openmmlab.com/mmediting/stylegan3/stylegan3_r_ffhq_1024_b4x8_cvt_official_rgb_20220329_234933-ac0500a1.pth diff --git a/configs/styleganv3/stylegan3-r_ada-gamma3.3_8xb4-fp16_metfaces-1024x1024.py b/configs/styleganv3/stylegan3-r_ada-gamma3.3_8xb4-fp16_metfaces-1024x1024.py index cef1bab104..094fa6edae 100644 --- a/configs/styleganv3/stylegan3-r_ada-gamma3.3_8xb4-fp16_metfaces-1024x1024.py +++ b/configs/styleganv3/stylegan3-r_ada-gamma3.3_8xb4-fp16_metfaces-1024x1024.py @@ -19,7 +19,7 @@ g_reg_ratio = g_reg_interval / (g_reg_interval + 1) d_reg_ratio = d_reg_interval / (d_reg_interval + 1) -load_from = 'https://download.openmmlab.com/mmgen/stylegan3/stylegan3_r_ffhq_1024_b4x8_cvt_official_rgb_20220329_234933-ac0500a1.pth' # noqa +load_from = 'https://download.openmmlab.com/mmediting/stylegan3/stylegan3_r_ffhq_1024_b4x8_cvt_official_rgb_20220329_234933-ac0500a1.pth' # noqa # ada settings aug_kwargs = { diff --git a/configs/styleganv3/stylegan3-t_ada-gamma6.6_8xb4-fp16_metfaces-1024x1024.py b/configs/styleganv3/stylegan3-t_ada-gamma6.6_8xb4-fp16_metfaces-1024x1024.py index eb62691618..56ced90640 100644 --- a/configs/styleganv3/stylegan3-t_ada-gamma6.6_8xb4-fp16_metfaces-1024x1024.py +++ b/configs/styleganv3/stylegan3-t_ada-gamma6.6_8xb4-fp16_metfaces-1024x1024.py @@ -17,7 +17,7 @@ g_reg_ratio = g_reg_interval / (g_reg_interval + 1) d_reg_ratio = d_reg_interval / (d_reg_interval + 1) -load_from = 'https://download.openmmlab.com/mmgen/stylegan3/stylegan3_t_ffhq_1024_b4x8_cvt_official_rgb_20220329_235113-db6c6580.pth' # noqa +load_from = 'https://download.openmmlab.com/mmediting/stylegan3/stylegan3_t_ffhq_1024_b4x8_cvt_official_rgb_20220329_235113-db6c6580.pth' # noqa # ada settings aug_kwargs = { 'xflip': 1, diff --git a/configs/tdan/README.md b/configs/tdan/README.md index 9849acacee..21a846bfa3 100644 --- a/configs/tdan/README.md +++ b/configs/tdan/README.md @@ -25,17 +25,17 @@ The metrics are `PSNR / SSIM` . | Method | Vid4 (BIx4) PSNR (Y) | SPMCS-30 (BIx4) PSNR (Y) | Vid4 (BDx4) PSNR (Y) | SPMCS-30 (BDx4) PSNR (Y) | GPU Info | Download | | :-----------------------------------------: | :------------------: | :----------------------: | :------------------: | :----------------------: | :----------------------: | :-------------------------------------------: | -| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi](/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | -| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd](/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | -| [tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi](/configs/tdan/tdan_x4ft_8xb16-lr5e-5-400k_vimeo90k-bi.py) | **26.49** | **30.42** | 25.93 | 29.69 | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528-739979d9.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528_135616.log.json) | -| [tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd](/configs/tdan/tdan_x4ft_8xb16-lr5e-5-800k_vimeo90k-bd.py) | 25.80 | 29.56 | **26.87** | **30.77** | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528-c53ab844.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528_122401.log.json) | +| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi](./tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | +| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd](./tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | +| [tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi](./tdan_x4ft_8xb16-lr5e-5-400k_vimeo90k-bi.py) | **26.49** | **30.42** | 25.93 | 29.69 | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528-739979d9.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528_135616.log.json) | +| [tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd](./tdan_x4ft_8xb16-lr5e-5-800k_vimeo90k-bd.py) | 25.80 | 29.56 | **26.87** | **30.77** | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528-c53ab844.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528_122401.log.json) | | Method | Vid4 (BIx4) SSIM (Y) | SPMCS-30 (BIx4) SSIM (Y) | Vid4 (BDx4) SSIM (Y) | SPMCS-30 (BDx4) SSIM (Y) | GPU Info | Download | | :-----------------------------------------: | :------------------: | :----------------------: | :------------------: | :----------------------: | :----------------------: | :-------------------------------------------: | -| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi](/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | -| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd](/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | -| [tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi](/configs/tdan/tdan_x4ft_8xb16-lr5e-5-400k_vimeo90k-bi.py) | **0.792** | **0.856** | 0.772 | 0.842 | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528-739979d9.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528_135616.log.json) | -| [tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd](/configs/tdan/tdan_x4ft_8xb16-lr5e-5-800k_vimeo90k-bd.py) | 0.784 | 0.851 | **0.815** | **0.868** | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528-c53ab844.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528_122401.log.json) | +| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi](./tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | +| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd](./tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | +| [tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi](./tdan_x4ft_8xb16-lr5e-5-400k_vimeo90k-bi.py) | **0.792** | **0.856** | 0.772 | 0.842 | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528-739979d9.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528_135616.log.json) | +| [tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd](./tdan_x4ft_8xb16-lr5e-5-800k_vimeo90k-bd.py) | 0.784 | 0.851 | **0.815** | **0.868** | 8 (Tesla V100-SXM2-32GB) | [model](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528-c53ab844.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528_122401.log.json) | ## Quick Start diff --git a/configs/tdan/README_zh-CN.md b/configs/tdan/README_zh-CN.md index 8b144620fa..e960d82e15 100644 --- a/configs/tdan/README_zh-CN.md +++ b/configs/tdan/README_zh-CN.md @@ -25,10 +25,10 @@ | 算法 | Vid4 (BIx4) | SPMCS-30 (BIx4) | Vid4 (BDx4) | SPMCS-30 (BDx4) | GPU 信息 | 下载 | | :--------------------------------------------------------: | :-------------: | :-------------: | :-------------: | :-------------: | :----------------------: | :--------------------------------------------------------: | -| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi](/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | -| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd](/configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | -| [tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi](/configs/tdan/tdan_x4ft_8xb16-lr5e-5-400k_vimeo90k-bi.py) | **26.49/0.792** | **30.42/0.856** | 25.93/0.772 | 29.69/0.842 | 8 (Tesla V100-SXM2-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528-739979d9.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528_135616.log.json) | -| [tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd](/configs/tdan/tdan_x4ft_8xb16-lr5e-5-800k_vimeo90k-bd.py) | 25.80/0.784 | 29.56/0.851 | **26.87/0.815** | **30.77/0.868** | 8 (Tesla V100-SXM2-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528-c53ab844.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528_122401.log.json) | +| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bi](./tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | +| [tdan_x4_1xb16-lr1e-4-400k_vimeo90k-bd](./tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bd.py) | - | - | - | - | 8 (Tesla V100-SXM2-32GB) | - | +| [tdan_x4ft_1xb16-lr5e-5-400k_vimeo90k-bi](./tdan_x4ft_8xb16-lr5e-5-400k_vimeo90k-bi.py) | **26.49/0.792** | **30.42/0.856** | 25.93/0.772 | 29.69/0.842 | 8 (Tesla V100-SXM2-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528-739979d9.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bix4_20210528_135616.log.json) | +| [tdan_x4ft_1xb16-lr5e-5-800k_vimeo90k-bd](./tdan_x4ft_8xb16-lr5e-5-800k_vimeo90k-bd.py) | 25.80/0.784 | 29.56/0.851 | **26.87/0.815** | **30.77/0.868** | 8 (Tesla V100-SXM2-32GB) | [模型](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528-c53ab844.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/tdan/tdan_vimeo90k_bdx4_20210528_122401.log.json) | ## 快速开始 diff --git a/configs/tof/README.md b/configs/tof/README.md index f623808251..aecf07bae2 100644 --- a/configs/tof/README.md +++ b/configs/tof/README.md @@ -25,28 +25,28 @@ The metrics are `PSNR / SSIM` . | Method | Pretrained SPyNet | PSNR | GPU Info | Download | | :---------------------------------------------------: | :---------------------------------------------------------------: | :-----: | :-----------------: | :------------------------------------------------------: | -| [tof_vfi_spynet_chair_nobn_1xb1_vimeo90k](/configs/tof/tof_spynet-chair-wobn_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_chair_20220321-4d82e91b.pth) | 33.3294 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_chair_nobn_1xb1_vimeo90k_20220321-2fc9e258.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_chair_nobn_1xb1_vimeo90k_20220321-2fc9e258.log.json) | -| [tof_vfi_spynet_kitti_nobn_1xb1_vimeo90k](/configs/tof/tof_spynet-kitti-wobn_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_kitti_20220321-dbcc1cc1.pth) | 33.3339 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_kitti_nobn_1xb1_vimeo90k_20220321-3f7ca4cd.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_kitti_nobn_1xb1_vimeo90k_20220321-3f7ca4cd.log.json) | -| [tof_vfi_spynet_sintel_clean_nobn_1xb1_vimeo90k](/configs/tof/tof_spynet-sintel-wobn-clean_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_sintel_clean_20220321-0756630b.pth) | 33.3170 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_clean_nobn_1xb1_vimeo90k_20220321-6e52a6fd.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_clean_nobn_1xb1_vimeo90k_20220321-6e52a6fd.log.json) | -| [tof_vfi_spynet_sintel_final_nobn_1xb1_vimeo90k](/configs/tof/tof_spynet-sintel-wobn-final_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_sintel_final_20220321-5e89dcec.pth) | 33.3237 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_final_nobn_1xb1_vimeo90k_20220321-8ab70dbb.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_final_nobn_1xb1_vimeo90k_20220321-8ab70dbb.log.json) | -| [tof_vfi_spynet_pytoflow_nobn_1xb1_vimeo90k](/configs/tof/tof_spynet-pytoflow-wobn_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_pytoflow_20220321-5bab842d.pth) | 33.3426 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_pytoflow_nobn_1xb1_vimeo90k_20220321-5f4b243e.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_pytoflow_nobn_1xb1_vimeo90k_20220321-5f4b243e.log.json) | +| [tof_vfi_spynet_chair_nobn_1xb1_vimeo90k](./tof_spynet-chair-wobn_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_chair_20220321-4d82e91b.pth) | 33.3294 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_chair_nobn_1xb1_vimeo90k_20220321-2fc9e258.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_chair_nobn_1xb1_vimeo90k_20220321-2fc9e258.log.json) | +| [tof_vfi_spynet_kitti_nobn_1xb1_vimeo90k](./tof_spynet-kitti-wobn_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_kitti_20220321-dbcc1cc1.pth) | 33.3339 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_kitti_nobn_1xb1_vimeo90k_20220321-3f7ca4cd.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_kitti_nobn_1xb1_vimeo90k_20220321-3f7ca4cd.log.json) | +| [tof_vfi_spynet_sintel_clean_nobn_1xb1_vimeo90k](./tof_spynet-sintel-wobn-clean_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_sintel_clean_20220321-0756630b.pth) | 33.3170 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_clean_nobn_1xb1_vimeo90k_20220321-6e52a6fd.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_clean_nobn_1xb1_vimeo90k_20220321-6e52a6fd.log.json) | +| [tof_vfi_spynet_sintel_final_nobn_1xb1_vimeo90k](./tof_spynet-sintel-wobn-final_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_sintel_final_20220321-5e89dcec.pth) | 33.3237 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_final_nobn_1xb1_vimeo90k_20220321-8ab70dbb.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_final_nobn_1xb1_vimeo90k_20220321-8ab70dbb.log.json) | +| [tof_vfi_spynet_pytoflow_nobn_1xb1_vimeo90k](./tof_spynet-pytoflow-wobn_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_pytoflow_20220321-5bab842d.pth) | 33.3426 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_pytoflow_nobn_1xb1_vimeo90k_20220321-5f4b243e.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_pytoflow_nobn_1xb1_vimeo90k_20220321-5f4b243e.log.json) | | Method | Pretrained SPyNet | SSIM | GPU Info | Download | | :----------------------------------------------------: | :---------------------------------------------------------------: | :----: | :-----------------: | :------------------------------------------------------: | -| [tof_vfi_spynet_chair_nobn_1xb1_vimeo90k](/configs/tof/tof_spynet-chair-wobn_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_chair_20220321-4d82e91b.pth) | 0.9465 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_chair_nobn_1xb1_vimeo90k_20220321-2fc9e258.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_chair_nobn_1xb1_vimeo90k_20220321-2fc9e258.log.json) | -| [tof_vfi_spynet_kitti_nobn_1xb1_vimeo90k](/configs/tof/tof_spynet-kitti-wobn_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_kitti_20220321-dbcc1cc1.pth) | 0.9466 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_kitti_nobn_1xb1_vimeo90k_20220321-3f7ca4cd.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_kitti_nobn_1xb1_vimeo90k_20220321-3f7ca4cd.log.json) | -| [tof_vfi_spynet_sintel_clean_nobn_1xb1_vimeo90k](/configs/tof/tof_spynet-sintel-wobn-clean_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_sintel_clean_20220321-0756630b.pth) | 0.9464 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_clean_nobn_1xb1_vimeo90k_20220321-6e52a6fd.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_clean_nobn_1xb1_vimeo90k_20220321-6e52a6fd.log.json) | -| [tof_vfi_spynet_sintel_final_nobn_1xb1_vimeo90k](/configs/tof/tof_spynet-sintel-wobn-final_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_sintel_final_20220321-5e89dcec.pth) | 0.9465 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_final_nobn_1xb1_vimeo90k_20220321-8ab70dbb.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_final_nobn_1xb1_vimeo90k_20220321-8ab70dbb.log.json) | -| [tof_vfi_spynet_pytoflow_nobn_1xb1_vimeo90k](/configs/tof/tof_spynet-pytoflow-wobn_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_pytoflow_20220321-5bab842d.pth) | 0.9467 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_pytoflow_nobn_1xb1_vimeo90k_20220321-5f4b243e.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_pytoflow_nobn_1xb1_vimeo90k_20220321-5f4b243e.log.json) | +| [tof_vfi_spynet_chair_nobn_1xb1_vimeo90k](./tof_spynet-chair-wobn_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_chair_20220321-4d82e91b.pth) | 0.9465 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_chair_nobn_1xb1_vimeo90k_20220321-2fc9e258.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_chair_nobn_1xb1_vimeo90k_20220321-2fc9e258.log.json) | +| [tof_vfi_spynet_kitti_nobn_1xb1_vimeo90k](./tof_spynet-kitti-wobn_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_kitti_20220321-dbcc1cc1.pth) | 0.9466 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_kitti_nobn_1xb1_vimeo90k_20220321-3f7ca4cd.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_kitti_nobn_1xb1_vimeo90k_20220321-3f7ca4cd.log.json) | +| [tof_vfi_spynet_sintel_clean_nobn_1xb1_vimeo90k](./tof_spynet-sintel-wobn-clean_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_sintel_clean_20220321-0756630b.pth) | 0.9464 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_clean_nobn_1xb1_vimeo90k_20220321-6e52a6fd.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_clean_nobn_1xb1_vimeo90k_20220321-6e52a6fd.log.json) | +| [tof_vfi_spynet_sintel_final_nobn_1xb1_vimeo90k](./tof_spynet-sintel-wobn-final_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_sintel_final_20220321-5e89dcec.pth) | 0.9465 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_final_nobn_1xb1_vimeo90k_20220321-8ab70dbb.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_final_nobn_1xb1_vimeo90k_20220321-8ab70dbb.log.json) | +| [tof_vfi_spynet_pytoflow_nobn_1xb1_vimeo90k](./tof_spynet-pytoflow-wobn_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_pytoflow_20220321-5bab842d.pth) | 0.9467 | 1 (Tesla PG503-216) | [model](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_pytoflow_nobn_1xb1_vimeo90k_20220321-5f4b243e.pth) \| [log](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_pytoflow_nobn_1xb1_vimeo90k_20220321-5f4b243e.log.json) | Note: These pretrained SPyNets don't contain BN layer since `batch_size=1`, which is consistent with `https://github.com/Coldog2333/pytoflow`. Evaluated on RGB channels. The metrics are `PSNR / SSIM` . -| Method | Vid4 | GPU Info | Download | -| :------------------------------------------------------------------: | :--------------: | :------: | :---------------------------------------------------------------------------------------------------: | -| [tof_x4_vimeo90k_official](/configs/tof/tof_x4_official_vimeo90k.py) | 24.4377 / 0.7433 | - | [model](https://download.openmmlab.com/mmediting/restorers/tof/tof_x4_vimeo90k_official-a569ff50.pth) | +| Method | Vid4 | GPU Info | Download | +| :-------------------------------------------------------: | :--------------: | :------: | :---------------------------------------------------------------------------------------------------: | +| [tof_x4_vimeo90k_official](./tof_x4_official_vimeo90k.py) | 24.4377 / 0.7433 | - | [model](https://download.openmmlab.com/mmediting/restorers/tof/tof_x4_vimeo90k_official-a569ff50.pth) | ## Quick Start diff --git a/configs/tof/README_zh-CN.md b/configs/tof/README_zh-CN.md index 6901e9c8b3..86d04b0793 100644 --- a/configs/tof/README_zh-CN.md +++ b/configs/tof/README_zh-CN.md @@ -13,11 +13,11 @@ | 算法 | 预训练 SPyNet | Vimeo90k-triplet | GPU 信息 | 下载 | | :--------------------------------------------------: | :----------------------------------------------------------: | :--------------: | :-----------------: | :---------------------------------------------------: | -| [tof_vfi_spynet_chair_nobn_1xb1_vimeo90k](/configs/tof/tof_spynet-chair-wobn_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_chair_20220321-4d82e91b.pth) | 33.3294 / 0.9465 | 1 (Tesla PG503-216) | [模型](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_chair_nobn_1xb1_vimeo90k_20220321-2fc9e258.pth) \| [日志](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_chair_nobn_1xb1_vimeo90k_20220321-2fc9e258.log.json) | -| [tof_vfi_spynet_kitti_nobn_1xb1_vimeo90k](/configs/tof/tof_spynet-kitti-wobn_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_kitti_20220321-dbcc1cc1.pth) | 33.3339 / 0.9466 | 1 (Tesla PG503-216) | [模型](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_kitti_nobn_1xb1_vimeo90k_20220321-3f7ca4cd.pth) \| [日志](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_kitti_nobn_1xb1_vimeo90k_20220321-3f7ca4cd.log.json) | -| [tof_vfi_spynet_sintel_clean_nobn_1xb1_vimeo90k](/configs/tof/tof_spynet-sintel-wobn-clean_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_sintel_clean_20220321-0756630b.pth) | 33.3170 / 0.9464 | 1 (Tesla PG503-216) | [模型](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_clean_nobn_1xb1_vimeo90k_20220321-6e52a6fd.pth) \| [日志](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_clean_nobn_1xb1_vimeo90k_20220321-6e52a6fd.log.json) | -| [tof_vfi_spynet_sintel_final_nobn_1xb1_vimeo90k](/configs/tof/tof_spynet-sintel-wobn-final_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_sintel_final_20220321-5e89dcec.pth) | 33.3237 / 0.9465 | 1 (Tesla PG503-216) | [模型](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_final_nobn_1xb1_vimeo90k_20220321-8ab70dbb.pth) \| [日志](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_final_nobn_1xb1_vimeo90k_20220321-8ab70dbb.log.json) | -| [tof_vfi_spynet_pytoflow_nobn_1xb1_vimeo90k](/configs/tof/tof_spynet-pytoflow-wobn_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_pytoflow_20220321-5bab842d.pth) | 33.3426 / 0.9467 | 1 (Tesla PG503-216) | [模型](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_pytoflow_nobn_1xb1_vimeo90k_20220321-5f4b243e.pth) \| [日志](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_pytoflow_nobn_1xb1_vimeo90k_20220321-5f4b243e.log.json) | +| [tof_vfi_spynet_chair_nobn_1xb1_vimeo90k](./tof_spynet-chair-wobn_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_chair_20220321-4d82e91b.pth) | 33.3294 / 0.9465 | 1 (Tesla PG503-216) | [模型](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_chair_nobn_1xb1_vimeo90k_20220321-2fc9e258.pth) \| [日志](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_chair_nobn_1xb1_vimeo90k_20220321-2fc9e258.log.json) | +| [tof_vfi_spynet_kitti_nobn_1xb1_vimeo90k](./tof_spynet-kitti-wobn_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_kitti_20220321-dbcc1cc1.pth) | 33.3339 / 0.9466 | 1 (Tesla PG503-216) | [模型](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_kitti_nobn_1xb1_vimeo90k_20220321-3f7ca4cd.pth) \| [日志](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_kitti_nobn_1xb1_vimeo90k_20220321-3f7ca4cd.log.json) | +| [tof_vfi_spynet_sintel_clean_nobn_1xb1_vimeo90k](./tof_spynet-sintel-wobn-clean_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_sintel_clean_20220321-0756630b.pth) | 33.3170 / 0.9464 | 1 (Tesla PG503-216) | [模型](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_clean_nobn_1xb1_vimeo90k_20220321-6e52a6fd.pth) \| [日志](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_clean_nobn_1xb1_vimeo90k_20220321-6e52a6fd.log.json) | +| [tof_vfi_spynet_sintel_final_nobn_1xb1_vimeo90k](./tof_spynet-sintel-wobn-final_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_sintel_final_20220321-5e89dcec.pth) | 33.3237 / 0.9465 | 1 (Tesla PG503-216) | [模型](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_final_nobn_1xb1_vimeo90k_20220321-8ab70dbb.pth) \| [日志](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_sintel_final_nobn_1xb1_vimeo90k_20220321-8ab70dbb.log.json) | +| [tof_vfi_spynet_pytoflow_nobn_1xb1_vimeo90k](./tof_spynet-pytoflow-wobn_1xb1_vimeo90k-triplet.py) | [spynet_chairs_final](https://download.openmmlab.com/mmediting/video_interpolators/toflow/pretrained_spynet_pytoflow_20220321-5bab842d.pth) | 33.3426 / 0.9467 | 1 (Tesla PG503-216) | [模型](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_pytoflow_nobn_1xb1_vimeo90k_20220321-5f4b243e.pth) \| [日志](https://download.openmmlab.com/mmediting/video_interpolators/toflow/tof_vfi_spynet_pytoflow_nobn_1xb1_vimeo90k_20220321-5f4b243e.log.json) | 注: 由于 `batch_size=1` 预训练的 SPyNet 不包含 BN 层,这与 `https://github.com/Coldog2333/pytoflow` 一致. diff --git a/configs/ttsr/README.md b/configs/ttsr/README.md index bf9c63bd8f..bba437c4ef 100644 --- a/configs/ttsr/README.md +++ b/configs/ttsr/README.md @@ -23,10 +23,10 @@ We study on image super-resolution (SR), which aims to recover realistic texture Evaluated on CUFED dataset (RGB channels), `scale` pixels in each border are cropped before evaluation. The metrics are `PSNR and SSIM` . -| Method | scale | PSNR | SSIM | GPU Info | Download | -| :----------------------------------------------------------------------------------: | :---: | :-----: | :----: | :----------: | :------------------------------------------------------------------------------------: | -| [ttsr-rec_x4_c64b16_g1_200k_CUFED](/configs/ttsr/ttsr-rec_x4c64b16_1xb9-200k_CUFED.py) | x4 | 25.2433 | 0.7491 | 1 (TITAN Xp) | [model](https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-rec_x4_c64b16_g1_200k_CUFED_20210525-b0dba584.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-rec_x4_c64b16_g1_200k_CUFED_20210525-b0dba584.log.json) | -| [ttsr-gan_x4_c64b16_g1_500k_CUFED](/configs/ttsr/ttsr-gan_x4c64b16_1xb9-500k_CUFED.py) | x4 | 24.6075 | 0.7234 | 1 (TITAN Xp) | [model](https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-gan_x4_c64b16_g1_500k_CUFED_20210626-2ab28ca0.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-gan_x4_c64b16_g1_500k_CUFED_20210626-2ab28ca0.log.json) | +| Method | scale | PSNR | SSIM | GPU Info | Download | +| :------------------------------------------------------------------------: | :---: | :-----: | :----: | :----------: | :----------------------------------------------------------------------------------------------: | +| [ttsr-rec_x4_c64b16_g1_200k_CUFED](./ttsr-rec_x4c64b16_1xb9-200k_CUFED.py) | x4 | 25.2433 | 0.7491 | 1 (TITAN Xp) | [model](https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-rec_x4_c64b16_g1_200k_CUFED_20210525-b0dba584.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-rec_x4_c64b16_g1_200k_CUFED_20210525-b0dba584.log.json) | +| [ttsr-gan_x4_c64b16_g1_500k_CUFED](./ttsr-gan_x4c64b16_1xb9-500k_CUFED.py) | x4 | 24.6075 | 0.7234 | 1 (TITAN Xp) | [model](https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-gan_x4_c64b16_g1_500k_CUFED_20210626-2ab28ca0.pth) \| [log](https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-gan_x4_c64b16_g1_500k_CUFED_20210626-2ab28ca0.log.json) | ## Quick Start diff --git a/configs/ttsr/README_zh-CN.md b/configs/ttsr/README_zh-CN.md index 18007679c0..3f8de2dc35 100644 --- a/configs/ttsr/README_zh-CN.md +++ b/configs/ttsr/README_zh-CN.md @@ -24,10 +24,10 @@ 在 RGB 通道上进行评估,在评估之前裁剪每个边界中的 `scale` 像素。 我们使用 `PSNR` 和 `SSIM` 作为指标。 -| 算法 | scale | CUFED | GPU 信息 | 下载 | -| :---------------------------------------------------------------------------------: | :---: | :--------------: | :----------: | :----------------------------------------------------------------------------------: | -| [ttsr-rec_x4_c64b16_g1_200k_CUFED](/configs/ttsr/ttsr-rec_x4c64b16_1xb9-200k_CUFED.py) | x4 | 25.2433 / 0.7491 | 1 (TITAN Xp) | [模型](https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-rec_x4_c64b16_g1_200k_CUFED_20210525-b0dba584.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-rec_x4_c64b16_g1_200k_CUFED_20210525-b0dba584.log.json) | -| [ttsr-gan_x4_c64b16_g1_500k_CUFED](/configs/ttsr/ttsr-gan_x4c64b16_1xb9-500k_CUFED.py) | x4 | 24.6075 / 0.7234 | 1 (TITAN Xp) | [模型](https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-gan_x4_c64b16_g1_500k_CUFED_20210626-2ab28ca0.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-gan_x4_c64b16_g1_500k_CUFED_20210626-2ab28ca0.log.json) | +| 算法 | scale | CUFED | GPU 信息 | 下载 | +| :------------------------------------------------------------------------: | :---: | :--------------: | :----------: | :-------------------------------------------------------------------------------------------: | +| [ttsr-rec_x4_c64b16_g1_200k_CUFED](./ttsr-rec_x4c64b16_1xb9-200k_CUFED.py) | x4 | 25.2433 / 0.7491 | 1 (TITAN Xp) | [模型](https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-rec_x4_c64b16_g1_200k_CUFED_20210525-b0dba584.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-rec_x4_c64b16_g1_200k_CUFED_20210525-b0dba584.log.json) | +| [ttsr-gan_x4_c64b16_g1_500k_CUFED](./ttsr-gan_x4c64b16_1xb9-500k_CUFED.py) | x4 | 24.6075 / 0.7234 | 1 (TITAN Xp) | [模型](https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-gan_x4_c64b16_g1_500k_CUFED_20210626-2ab28ca0.pth) \| [日志](https://download.openmmlab.com/mmediting/restorers/ttsr/ttsr-gan_x4_c64b16_g1_500k_CUFED_20210626-2ab28ca0.log.json) | ## 快速开始 diff --git a/configs/wgan-gp/README.md b/configs/wgan-gp/README.md index b88d74875c..9d9ae9c436 100644 --- a/configs/wgan-gp/README.md +++ b/configs/wgan-gp/README.md @@ -28,8 +28,8 @@ Generative Adversarial Networks (GANs) are powerful generative models, but suffe | Models | Dataset | Details | SWD | MS-SSIM | Config | Download | | :---------: | :------------: | :----------------: | :---------------------------: | :-----: | :---------------------------------------------------------: | :------------------------------------------------------------: | -| WGAN-GP 128 | CelebA-Cropped | GN | 5.87, 9.76, 9.43, 18.84/10.97 | 0.2601 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/wgan-gp/wgangp_GN_1xb64-160kiters_celeba-cropped-128x128.py) | [model](https://download.openmmlab.com/mmgen/wgangp/wgangp_GN_celeba-cropped_128_b64x1_160k_20210408_170611-f8a99336.pth) | -| WGAN-GP 128 | LSUN-Bedroom | GN, GP-lambda = 50 | 11.7, 7.87, 9.82, 25.36/13.69 | 0.059 | [config](https://github.com/open-mmlab/mmediting/tree/master/configs/wgan-gp/wgangp_GN-GP-50_1xb64-160kiters_lsun-bedroom-128x128.py) | [model](https://download.openmmlab.com/mmgen/wgangp/wgangp_GN_GP-50_lsun-bedroom_128_b64x1_130k_20210408_170509-56f2a37c.pth) | +| WGAN-GP 128 | CelebA-Cropped | GN | 5.87, 9.76, 9.43, 18.84/10.97 | 0.2601 | [config](./wgangp_GN_1xb64-160kiters_celeba-cropped-128x128.py) | [model](https://download.openmmlab.com/mmediting/wgangp/wgangp_GN_celeba-cropped_128_b64x1_160k_20210408_170611-f8a99336.pth) | +| WGAN-GP 128 | LSUN-Bedroom | GN, GP-lambda = 50 | 11.7, 7.87, 9.82, 25.36/13.69 | 0.059 | [config](./wgangp_GN-GP-50_1xb64-160kiters_lsun-bedroom-128x128.py) | [model](https://download.openmmlab.com/mmediting/wgangp/wgangp_GN_GP-50_lsun-bedroom_128_b64x1_130k_20210408_170509-56f2a37c.pth) | ## Citation diff --git a/configs/wgan-gp/metafile.yml b/configs/wgan-gp/metafile.yml index 06bdc773f0..54979c2263 100644 --- a/configs/wgan-gp/metafile.yml +++ b/configs/wgan-gp/metafile.yml @@ -17,7 +17,7 @@ Models: Metrics: MS-SSIM: 0.2601 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/wgangp/wgangp_GN_celeba-cropped_128_b64x1_160k_20210408_170611-f8a99336.pth + Weights: https://download.openmmlab.com/mmediting/wgangp/wgangp_GN_celeba-cropped_128_b64x1_160k_20210408_170611-f8a99336.pth - Config: configs/wgan-gp/wgangp_GN-GP-50_1xb64-160kiters_lsun-bedroom-128x128.py In Collection: WGAN-GP Metadata: @@ -28,4 +28,4 @@ Models: Metrics: MS-SSIM: 0.059 Task: Unconditional GANs - Weights: https://download.openmmlab.com/mmgen/wgangp/wgangp_GN_GP-50_lsun-bedroom_128_b64x1_130k_20210408_170509-56f2a37c.pth + Weights: https://download.openmmlab.com/mmediting/wgangp/wgangp_GN_GP-50_lsun-bedroom_128_b64x1_130k_20210408_170509-56f2a37c.pth diff --git a/demo/mmediting_inference_tutorial.ipynb b/demo/mmediting_inference_tutorial.ipynb index 3fe752fcc2..96c2fdfee4 100644 --- a/demo/mmediting_inference_tutorial.ipynb +++ b/demo/mmediting_inference_tutorial.ipynb @@ -480,7 +480,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "http loads checkpoint from path: https://download.openmmlab.com/mmgen/pix2pix/refactor/pix2pix_vanilla_unet_bn_1x1_80k_facades_20210902_170442-c0958d50.pth\n" + "http loads checkpoint from path: https://download.openmmlab.com/mmediting/pix2pix/refactor/pix2pix_vanilla_unet_bn_1x1_80k_facades_20210902_170442-c0958d50.pth\n" ] } ], @@ -547,7 +547,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "http loads checkpoint from path: https://download.openmmlab.com/mmgen/biggan/biggan_imagenet1k_128x128_b32x8_best_fid_iter_1232000_20211111_122548-5315b13d.pth\n" + "http loads checkpoint from path: https://download.openmmlab.com/mmediting/biggan/biggan_imagenet1k_128x128_b32x8_best_fid_iter_1232000_20211111_122548-5315b13d.pth\n" ] }, { @@ -597,7 +597,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "http loads checkpoint from path: https://download.openmmlab.com/mmgen/biggan/biggan_imagenet1k_128x128_b32x8_best_fid_iter_1232000_20211111_122548-5315b13d.pth\n" + "http loads checkpoint from path: https://download.openmmlab.com/mmediting/biggan/biggan_imagenet1k_128x128_b32x8_best_fid_iter_1232000_20211111_122548-5315b13d.pth\n" ] }, { @@ -643,7 +643,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "http loads checkpoint from path: https://download.openmmlab.com/mmgen/biggan/biggan_imagenet1k_128x128_b32x8_best_fid_iter_1232000_20211111_122548-5315b13d.pth\n", + "http loads checkpoint from path: https://download.openmmlab.com/mmediting/biggan/biggan_imagenet1k_128x128_b32x8_best_fid_iter_1232000_20211111_122548-5315b13d.pth\n", "['num_batches', 'sample_model']\n" ] } @@ -691,7 +691,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "http loads checkpoint from path: https://download.openmmlab.com/mmgen/biggan/biggan_imagenet1k_128x128_b32x8_best_fid_iter_1232000_20211111_122548-5315b13d.pth\n" + "http loads checkpoint from path: https://download.openmmlab.com/mmediting/biggan/biggan_imagenet1k_128x128_b32x8_best_fid_iter_1232000_20211111_122548-5315b13d.pth\n" ] }, { @@ -968,7 +968,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "http loads checkpoint from path: https://download.openmmlab.com/mmgen/pix2pix/refactor/pix2pix_vanilla_unet_bn_1x1_80k_facades_20210902_170442-c0958d50.pth\n" + "http loads checkpoint from path: https://download.openmmlab.com/mmediting/pix2pix/refactor/pix2pix_vanilla_unet_bn_1x1_80k_facades_20210902_170442-c0958d50.pth\n" ] }, { @@ -1023,7 +1023,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "http loads checkpoint from path: https://download.openmmlab.com/mmgen/styleganv1/styleganv1_ffhq_256_g8_25Mimg_20210407_161748-0094da86.pth\n", + "http loads checkpoint from path: https://download.openmmlab.com/mmediting/styleganv1/styleganv1_ffhq_256_g8_25Mimg_20210407_161748-0094da86.pth\n", "Switch to evaluation style mode: single\n", "Switch to evaluation style mode: single\n" ] diff --git a/docs/en/get_started/quick_run.md b/docs/en/get_started/quick_run.md index cddaacbf4d..b243e5263a 100644 --- a/docs/en/get_started/quick_run.md +++ b/docs/en/get_started/quick_run.md @@ -9,7 +9,7 @@ from mmedit.apis import init_model, sample_unconditional_model config_file = 'configs/styleganv2/stylegan2_c2_8xb4-800kiters_lsun-church-256x256.py' # you can download this checkpoint in advance and use a local file path. -checkpoint_file = 'https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-church-config-f-official_20210327_172657-1d42b7d1.pth' +checkpoint_file = 'https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-church-config-f-official_20210327_172657-1d42b7d1.pth' device = 'cuda:0' # init a generative model model = init_model(config_file, checkpoint_file, device=device) @@ -22,7 +22,7 @@ Or you can just run the following command. ```bash python demo/unconditional_demo.py \ configs/styleganv2/stylegan2_c2_lsun-church_256_b4x8_800k.py \ -https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-church-config-f-official_20210327_172657-1d42b7d1.pth +https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-church-config-f-official_20210327_172657-1d42b7d1.pth ``` diff --git a/docs/en/howto/models.md b/docs/en/howto/models.md index a09fdf0288..d7e93eb4e5 100644 --- a/docs/en/howto/models.md +++ b/docs/en/howto/models.md @@ -425,7 +425,7 @@ model = dict( )) ``` -We also need to specify the training dataloader and testing dataloader according to [create your own dataloader](../dataset_zoo/overview.md). +We also need to specify the training dataloader and testing dataloader according to create your own dataloader. Finally we can start training our own model by: ```python diff --git a/docs/en/user_guides/dataset_prepare.md b/docs/en/user_guides/dataset_prepare.md index fe208aee9c..b26ae391cf 100644 --- a/docs/en/user_guides/dataset_prepare.md +++ b/docs/en/user_guides/dataset_prepare.md @@ -34,6 +34,6 @@ python tools/dataset_converters/super-resolution/div2k/preprocess_div2k_dataset. We support detailed tutorials and split them according to different tasks. -Please check our [dataset zoo](../dataset_zoo/overview.md) for data preparation of different tasks. +Please check our dataset zoo for data preparation of different tasks. If you're interested in more details of datasets in MMEditing, please check the [advanced guides](../howto/dataset.md). diff --git a/docs/en/user_guides/inference.md b/docs/en/user_guides/inference.md index dcb2e6efe3..cc71aaf608 100644 --- a/docs/en/user_guides/inference.md +++ b/docs/en/user_guides/inference.md @@ -30,7 +30,7 @@ from mmedit.apis import init_model, sample_unconditional_model # Specify the path to model config and checkpoint file config_file = 'configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py' # you can download this checkpoint in advance and use a local file path. -checkpoint_file = 'https://download.openmmlab.com/mmgen/stylegan2/stylegan2_c2_ffhq_1024_b4x8_20210407_150045-618c9024.pth' +checkpoint_file = 'https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_ffhq_1024_b4x8_20210407_150045-618c9024.pth' device = 'cuda:0' # init a generative model @@ -61,7 +61,7 @@ from mmedit.apis import init_model, sample_conditional_model # Specify the path to model config and checkpoint file config_file = 'configs/sagan/sagan_woReLUinplace-Glr1e-4_Dlr4e-4_noaug-ndisc1-8xb32-bigGAN-sch_imagenet1k-128x128.py' # you can download this checkpoint in advance and use a local file path. -checkpoint_file = 'https://download.openmmlab.com/mmgen/sagan/sagan_128_woReLUinplace_noaug_bigGAN_imagenet1k_b32x8_Glr1e-4_Dlr-4e-4_ndisc1_20210818_210232-3f5686af.pth' +checkpoint_file = 'https://download.openmmlab.com/mmediting/sagan/sagan_128_woReLUinplace_noaug_bigGAN_imagenet1k_b32x8_Glr1e-4_Dlr-4e-4_ndisc1_20210818_210232-3f5686af.pth' device = 'cuda:0' # init a generative model @@ -105,7 +105,7 @@ from mmedit.apis import init_model, sample_ddpm_model # Specify the path to model config and checkpoint file config_file = 'configs/improved_ddpm/ddpm_cosine-hybird-timestep-4k_16xb8-1500kiters_imagenet1k-64x64.py' # you can download this checkpoint in advance and use a local file path. -checkpoint_file = 'https://download.openmmlab.com/mmgen/improved_ddpm/ddpm_cosine_hybird_timestep-4k_imagenet1k_64x64_b8x16_1500k_20220103_223919-b8f1a310.pth' +checkpoint_file = 'https://download.openmmlab.com/mmediting/improved_ddpm/ddpm_cosine_hybird_timestep-4k_imagenet1k_64x64_b8x16_1500k_20220103_223919-b8f1a310.pth' device = 'cuda:0' # init a generative model model = init_model(config_file, checkpoint_file, device=device) @@ -332,7 +332,7 @@ from mmedit.apis import init_model, sample_img2img_model # Specify the path to model config and checkpoint file config_file = 'configs/pix2pix/pix2pix_vanilla-unet-bn_wo-jitter-flip-4xb1-190kiters_edges2shoes.py' # you can download this checkpoint in advance and use a local file path. -checkpoint_file = 'https://download.openmmlab.com/mmgen/pix2pix/refactor/pix2pix_vanilla_unet_bn_wo_jitter_flip_1x4_186840_edges2shoes_convert-bgr_20210902_170902-0c828552.pth' +checkpoint_file = 'https://download.openmmlab.com/mmediting/pix2pix/refactor/pix2pix_vanilla_unet_bn_wo_jitter_flip_1x4_186840_edges2shoes_convert-bgr_20210902_170902-0c828552.pth' # Specify the path to image you want to translate image_path = 'tests/data/paired/test/33_AB.jpg' device = 'cuda:0' diff --git a/docs/zh_cn/community/contributing.md b/docs/zh_cn/community/contributing.md index b446d27cc2..028e00a4a9 100644 --- a/docs/zh_cn/community/contributing.md +++ b/docs/zh_cn/community/contributing.md @@ -228,14 +228,14 @@ make html - [mdformat](https://github.com/executablebooks/mdformat): 检查 markdown 文件的工具 - [docformatter](https://github.com/myint/docformatter): 格式化 docstring 的工具 -yapf 和 isort 的配置可以在 [setup.cfg](../../setup.cfg) 找到 +yapf 和 isort 的配置可以在 [setup.cfg](../../../setup.cfg) 找到 通过配置 [pre-commit hook](https://pre-commit.com/) ,我们可以在提交代码时自动检查和格式化 `flake8`、`yapf`、`isort`、`trailing whitespaces`、`markdown files`,修复 `end-of-files`、`double-quoted-strings`、`python-encoding-pragma`、`mixed-line-ending`,调整 `requirments.txt` 的包顺序。 -pre-commit 钩子的配置可以在 [.pre-commit-config](../../.pre-commit-config.yaml) 找到。 +pre-commit 钩子的配置可以在 [.pre-commit-config](../../../.pre-commit-config.yaml) 找到。 pre-commit 具体的安装使用方式见[拉取请求](#2-配置-pre-commit)。 -更具体的规范请参考 [OpenMMLab 代码规范](#代码风格)。 +更具体的规范请参考 [OpenMMLab 代码规范](contributing.md#代码风格)。 #### C++ and CUDA @@ -336,7 +336,7 @@ from mmedit.cnn.bricks import Conv2d, build_norm_layer, DropPath, MaxPool2d, \ from ...utils import is_str # 最多向上回溯一层,过多的回溯容易导致结构混乱 ``` -OpenMMLab 项目使用 pre-commit 工具自动格式化代码,详情见[贡献代码](./contributing.md#代码风格)。 +OpenMMLab 项目使用 pre-commit 工具自动格式化代码,详情见[贡献代码](contributing.md#代码风格)。 ### 命名规范 diff --git a/mmedit/models/editors/glean/glean_styleganv2.py b/mmedit/models/editors/glean/glean_styleganv2.py index 4a806ceff8..54aa2cae0b 100644 --- a/mmedit/models/editors/glean/glean_styleganv2.py +++ b/mmedit/models/editors/glean/glean_styleganv2.py @@ -29,11 +29,11 @@ class GLEANStyleGANv2(BaseModule): ``pretrained`` argument. We have already offered official weights as follows: - - styelgan2-ffhq-config-f: http://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth # noqa - - stylegan2-horse-config-f: http://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-horse-config-f-official_20210327_173203-ef3e69ca.pth # noqa - - stylegan2-car-config-f: http://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-car-config-f-official_20210327_172340-8cfe053c.pth # noqa - - styelgan2-cat-config-f: http://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-cat-config-f-official_20210327_172444-15bc485b.pth # noqa - - stylegan2-church-config-f: http://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-church-config-f-official_20210327_172657-1d42b7d1.pth # noqa + - styelgan2-ffhq-config-f: http://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth # noqa + - stylegan2-horse-config-f: http://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-horse-config-f-official_20210327_173203-ef3e69ca.pth # noqa + - stylegan2-car-config-f: http://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-car-config-f-official_20210327_172340-8cfe053c.pth # noqa + - styelgan2-cat-config-f: http://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-cat-config-f-official_20210327_172444-15bc485b.pth # noqa + - stylegan2-church-config-f: http://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-church-config-f-official_20210327_172657-1d42b7d1.pth # noqa If you want to load the ema model, you can just use following codes: diff --git a/mmedit/models/editors/stylegan2/stylegan2_discriminator.py b/mmedit/models/editors/stylegan2/stylegan2_discriminator.py index 5c993b6540..f752fa4055 100644 --- a/mmedit/models/editors/stylegan2/stylegan2_discriminator.py +++ b/mmedit/models/editors/stylegan2/stylegan2_discriminator.py @@ -31,11 +31,11 @@ class StyleGAN2Discriminator(BaseModule): ``pretrained`` argument. We have already offered official weights as follows: - - stylegan2-ffhq-config-f: https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth # noqa - - stylegan2-horse-config-f: https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-horse-config-f-official_20210327_173203-ef3e69ca.pth # noqa - - stylegan2-car-config-f: https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-car-config-f-official_20210327_172340-8cfe053c.pth # noqa - - stylegan2-cat-config-f: https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-cat-config-f-official_20210327_172444-15bc485b.pth # noqa - - stylegan2-church-config-f: https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-church-config-f-official_20210327_172657-1d42b7d1.pth # noqa + - stylegan2-ffhq-config-f: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth # noqa + - stylegan2-horse-config-f: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-horse-config-f-official_20210327_173203-ef3e69ca.pth # noqa + - stylegan2-car-config-f: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-car-config-f-official_20210327_172340-8cfe053c.pth # noqa + - stylegan2-cat-config-f: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-cat-config-f-official_20210327_172444-15bc485b.pth # noqa + - stylegan2-church-config-f: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-church-config-f-official_20210327_172657-1d42b7d1.pth # noqa If you want to load the ema model, you can just use following codes: diff --git a/mmedit/models/editors/stylegan2/stylegan2_generator.py b/mmedit/models/editors/stylegan2/stylegan2_generator.py index aec58d91e8..fd83c08c11 100644 --- a/mmedit/models/editors/stylegan2/stylegan2_generator.py +++ b/mmedit/models/editors/stylegan2/stylegan2_generator.py @@ -29,11 +29,11 @@ class StyleGAN2Generator(nn.Module): ``pretrained`` argument. We have already offered official weights as follows: - - stylegan2-ffhq-config-f: https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth # noqa - - stylegan2-horse-config-f: https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-horse-config-f-official_20210327_173203-ef3e69ca.pth # noqa - - stylegan2-car-config-f: https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-car-config-f-official_20210327_172340-8cfe053c.pth # noqa - - stylegan2-cat-config-f: https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-cat-config-f-official_20210327_172444-15bc485b.pth # noqa - - stylegan2-church-config-f: https://download.openmmlab.com/mmgen/stylegan2/official_weights/stylegan2-church-config-f-official_20210327_172657-1d42b7d1.pth # noqa + - stylegan2-ffhq-config-f: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth # noqa + - stylegan2-horse-config-f: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-horse-config-f-official_20210327_173203-ef3e69ca.pth # noqa + - stylegan2-car-config-f: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-car-config-f-official_20210327_172340-8cfe053c.pth # noqa + - stylegan2-cat-config-f: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-cat-config-f-official_20210327_172444-15bc485b.pth # noqa + - stylegan2-church-config-f: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-church-config-f-official_20210327_172657-1d42b7d1.pth # noqa If you want to load the ema model, you can just use following codes: From 8746f8d57dc0f2b15846d8d02e163785bc2bfdee Mon Sep 17 00:00:00 2001 From: lvhan028 Date: Mon, 26 Dec 2022 09:42:59 +0800 Subject: [PATCH 34/44] update deployment guide (#1551) * update deployment guide * update * fix lint error * update * fix typo * Update docs/zh_cn/user_guides/deploy.md * Update docs/en/user_guides/deploy.md * Update docs/en/user_guides/deploy.md * Update docs/zh_cn/user_guides/deploy.md Co-authored-by: Yanhong Zeng --- docs/en/user_guides/deploy.md | 158 ++++++++++++++++++++++++++++++- docs/zh_cn/user_guides/deploy.md | 156 +++++++++++++++++++++++++++++- 2 files changed, 311 insertions(+), 3 deletions(-) diff --git a/docs/en/user_guides/deploy.md b/docs/en/user_guides/deploy.md index 8031cb171c..ce2ff00274 100644 --- a/docs/en/user_guides/deploy.md +++ b/docs/en/user_guides/deploy.md @@ -1,4 +1,158 @@ # Tutorial 8: Deploy models in MMEditing -[MMDeploy](https://github.com/open-mmlab/mmdeploy) is an open-source deep learning model deployment toolset. -MMDeploy supports deploying models in MMEditing. Please refer to [MMDeploy](https://github.com/open-mmlab/mmdeploy) for more information. +The deployment of OpenMMLab codebases, including MMClassification, MMDetection, MMEditing and so on are supported by [MMDeploy](https://github.com/open-mmlab/mmdeploy). +The latest deployment guide for MMEditing can be found from [here](https://mmdeploy.readthedocs.io/en/1.x/04-supported-codebases/mmedit.html). + +This tutorial is organized as follows: + +- [Installation](#installation) +- [Convert model](#convert-model) +- [Model specification](#model-specification) +- [Model inference](#model-inference) + - [Backend model inference](#backend-model-inference) + - [SDK model inference](#sdk-model-inference) +- [Supported models](#supported-models) + +## Installation + +Please follow the [guide](../get_started/install.md) to install mmedit. And then install mmdeploy from source by following [this](https://mmdeploy.readthedocs.io/en/1.x/get_started.html#installation) guide. + +```{note} +If you install mmdeploy prebuilt package, please also clone its repository by 'git clone https://github.com/open-mmlab/mmdeploy.git --depth=1' to get the deployment config files. +``` + +## Convert model + +Suppose mmediting and mmdeploy repositories are in the same directory, and the working directory is the root path of mmediting. + +Take [ESRGAN](../../../configs/esrgan/esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py) model as an example. +You can download its checkpoint from [here](https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_psnr_x4c64b23g32_1x16_1000k_div2k_20200420-bf5c993c.pth), and then convert it to onnx model as follows: + +```python +from mmdeploy.apis import torch2onnx +from mmdeploy.backend.sdk.export_info import export2SDK + +img = 'tests/data/image/face/000001.png' +work_dir = 'mmdeploy_models/mmedit/onnx' +save_file = 'end2end.onnx' +deploy_cfg = '../mmdeploy/configs/mmedit/super-resolution/super-resolution_onnxruntime_dynamic.py' +model_cfg = 'configs/esrgan/esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py' +model_checkpoint = 'esrgan_psnr_x4c64b23g32_1x16_1000k_div2k_20200420-bf5c993c.pth' +device = 'cpu' + +# 1. convert model to onnx +torch2onnx(img, work_dir, save_file, deploy_cfg, model_cfg, + model_checkpoint, device) + +# 2. extract pipeline info for inference by MMDeploy SDK +export2SDK(deploy_cfg, model_cfg, work_dir, pth=model_checkpoint, device=device) +``` + +It is crucial to specify the correct deployment config during model conversion.MMDeploy has already provided builtin deployment config [files](https://github.com/open-mmlab/mmdeploy/tree/1.x/configs/mmedit) of all supported backends for mmedit, under which the config file path follows the pattern: + +``` +{task}/{task}_{backend}-{precision}_{static | dynamic}_{shape}.py +``` + +- **{task}:** task in mmedit. + +- **{backend}:** inference backend, such as onnxruntime, tensorrt, pplnn, ncnn, openvino, coreml etc. + +- **{precision}:** fp16, int8. When it's empty, it means fp32 + +- **{static | dynamic}:** static shape or dynamic shape + +- **{shape}:** input shape or shape range of a model + +Therefore, in the above example, you can also convert `ESRGAN` to other backend models by changing the deployment config file, e.g., converting to tensorrt-fp16 model by `super-resolution_tensorrt-fp16_dynamic-32x32-512x512.py`. + +```{tip} +When converting mmedit models to tensorrt models, --device should be set to "cuda" +``` + +## Model specification + +Before moving on to model inference chapter, let's know more about the converted model structure which is very important for model inference. + +The converted model locates in the working directory like `mmdeploy_models/mmedit/onnx` in the previous example. It includes: + +``` +mmdeploy_models/mmedit/onnx +├── deploy.json +├── detail.json +├── end2end.onnx +└── pipeline.json +``` + +in which, + +- **end2end.onnx**: backend model which can be inferred by ONNX Runtime +- ***xxx*.json**: the necessary information for mmdeploy SDK + +The whole package **mmdeploy_models/mmedit/onnx** is defined as **mmdeploy SDK model**, i.e., **mmdeploy SDK model** includes both backend model and inference meta information. + +## Model inference + +### Backend model inference + +Take the previous converted `end2end.onnx` model as an example, you can use the following code to inference the model. + +```python +from mmdeploy.apis.utils import build_task_processor +from mmdeploy.utils import get_input_shape, load_config +import torch + +deploy_cfg = '../mmdeploy/configs/mmedit/super-resolution/super-resolution_onnxruntime_dynamic.py' +model_cfg = 'configs/esrgan/esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py' +device = 'cpu' +backend_model = ['mmdeploy_models/mmedit/onnx/end2end.onnx'] +image = 'tests/data/image/lq/baboon_x4.png' + +# read deploy_cfg and model_cfg +deploy_cfg, model_cfg = load_config(deploy_cfg, model_cfg) + +# build task and backend model +task_processor = build_task_processor(model_cfg, deploy_cfg, device) +model = task_processor.build_backend_model(backend_model) + +# process input image +input_shape = get_input_shape(deploy_cfg) +model_inputs, _ = task_processor.create_input(image, input_shape) + +# do model inference +with torch.no_grad(): + result = model.test_step(model_inputs) + +# visualize results +task_processor.visualize( + image=image, + model=model, + result=result[0], + window_name='visualize', + output_file='output_restorer.bmp') +``` + +### SDK model inference + +You can also perform SDK model inference like following, + +```python +from mmdeploy_python import Restorer +import cv2 + +img = cv2.imread('tests/data/image/lq/baboon_x4.png') + +# create a predictor +restorer = Restorer(model_path='mmdeploy_models/mmedit/onnx', device_name='cpu', device_id=0) +# perform inference +result = restorer(img) + +# visualize inference result +cv2.imwrite('output_restorer.bmp', result) +``` + +Besides python API, MMDeploy SDK also provides other FFI (Foreign Function Interface), such as C, C++, C#, Java and so on. You can learn their usage from [demos](https://github.com/open-mmlab/mmdeploy/tree/1.x/demo). + +## Supported models + +Please refer to [here](https://mmdeploy.readthedocs.io/en/1.x/04-supported-codebases/mmedit.html#supported-models) for the supported model list. diff --git a/docs/zh_cn/user_guides/deploy.md b/docs/zh_cn/user_guides/deploy.md index 7be7e15f42..d5ac375884 100644 --- a/docs/zh_cn/user_guides/deploy.md +++ b/docs/zh_cn/user_guides/deploy.md @@ -1 +1,155 @@ -# 教程 8:部署指南(待更新) +# 教程 8:模型部署指南 + +[MMDeploy](https://github.com/open-mmlab/mmdeploy) 是 OpenMMLab 的部署仓库,负责包括 MMClassification、MMDetection、MMEditing 等在内的各算法库的部署工作。 +你可以从[这里](https://mmdeploy.readthedocs.io/zh_CN/1.x/04-supported-codebases/mmedit.html)获取 MMDeploy 对 MMClassification 部署支持的最新文档。 + +本文的结构如下: + +- [安装](#安装) +- [模型转换](#模型转换) +- [模型规范](#模型规范) +- [模型推理](#模型推理) + - [后端模型推理](#后端模型推理) + - [SDK 模型推理](#sdk-模型推理) +- [模型支持列表](#模型支持列表) + +## 安装 + +请参考[此处](../get_started/install.md)安装 mmedit。然后,按照[说明](https://mmdeploy.readthedocs.io/zh_CN/1.x/get_started.html#mmdeploy)安装 mmdeploy。 + +```{note} +如果安装的是 mmdeploy 预编译包,那么也请通过 'git clone https://github.com/open-mmlab/mmdeploy.git --depth=1' 下载 mmdeploy 源码。因为它包含了部署时要用到的配置文件 +``` + +## 模型转换 + +假设在安装步骤中,mmediting 和 mmdeploy 代码库在同级目录下,并且当前的工作目录为 mmediting 的根目录,那么以 [ESRGAN](../../../configs/esrgan/esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py) 模型为例,你可以从[此处](https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_psnr_x4c64b23g32_1x16_1000k_div2k_20200420-bf5c993c.pth)下载对应的 checkpoint,并使用以下代码将之转换为 onnx 模型: + +```python +from mmdeploy.apis import torch2onnx +from mmdeploy.backend.sdk.export_info import export2SDK + +img = 'tests/data/image/face/000001.png' +work_dir = 'mmdeploy_models/mmedit/onnx' +save_file = 'end2end.onnx' +deploy_cfg = '../mmdeploy/configs/mmedit/super-resolution/super-resolution_onnxruntime_dynamic.py' +model_cfg = 'configs/esrgan/esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py' +model_checkpoint = 'esrgan_psnr_x4c64b23g32_1x16_1000k_div2k_20200420-bf5c993c.pth' +device = 'cpu' + +# 1. convert model to onnx +torch2onnx(img, work_dir, save_file, deploy_cfg, model_cfg, + model_checkpoint, device) + +# 2. extract pipeline info for inference by MMDeploy SDK +export2SDK(deploy_cfg, model_cfg, work_dir, pth=model_checkpoint, device=device) +``` + +转换的关键之一是使用正确的配置文件。项目中已内置了各后端部署[配置文件](https://github.com/open-mmlab/mmdeploy/tree/1.x/configs/mmedit)。 +文件的命名模式是: + +``` +{task}/{task}_{backend}-{precision}_{static | dynamic}_{shape}.py +``` + +其中: + +- **{task}:** mmedit 中的任务 +- **{backend}:** 推理后端名称。比如,onnxruntime、tensorrt、pplnn、ncnn、openvino、coreml 等等 +- **{precision}:** 推理精度。比如,fp16、int8。不填表示 fp32 +- **{static | dynamic}:** 动态、静态 shape +- **{shape}:** 模型输入的 shape 或者 shape 范围 + +在上例中,你也可以把 `ESRGAN` 转为其他后端模型。比如使用`super-resolution_tensorrt-fp16_dynamic-32x32-512x512.py`,把模型转为 tensorrt-fp16 模型。 + +```{tip} +当转 tensorrt 模型时, --device 需要被设置为 "cuda" +``` + +## 模型规范 + +在使用转换后的模型进行推理之前,有必要了解转换结果的结构。 它存放在 `--work-dir` 指定的路路径下。 + +上例中的`mmdeploy_models/mmedit/onnx`,结构如下: + +``` +mmdeploy_models/mmedit/onnx +├── deploy.json +├── detail.json +├── end2end.onnx +└── pipeline.json +``` + +重要的是: + +- **end2end.onnx**: 推理引擎文件。可用 ONNX Runtime 推理 +- ***xxx*.json**: mmdeploy SDK 推理所需的 meta 信息 + +整个文件夹被定义为**mmdeploy SDK model**。换言之,**mmdeploy SDK model**既包括推理引擎,也包括推理 meta 信息。 + +## 模型推理 + +### 后端模型推理 + +以上述模型转换后的 `end2end.onnx` 为例,你可以使用如下代码进行推理: + +```python +from mmdeploy.apis.utils import build_task_processor +from mmdeploy.utils import get_input_shape, load_config +import torch + +deploy_cfg = '../mmdeploy/configs/mmedit/super-resolution/super-resolution_onnxruntime_dynamic.py' +model_cfg = 'configs/esrgan/esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py' +device = 'cpu' +backend_model = ['mmdeploy_models/mmedit/onnx/end2end.onnx'] +image = 'tests/data/image/lq/baboon_x4.png' + +# read deploy_cfg and model_cfg +deploy_cfg, model_cfg = load_config(deploy_cfg, model_cfg) + +# build task and backend model +task_processor = build_task_processor(model_cfg, deploy_cfg, device) +model = task_processor.build_backend_model(backend_model) + +# process input image +input_shape = get_input_shape(deploy_cfg) +model_inputs, _ = task_processor.create_input(image, input_shape) + +# do model inference +with torch.no_grad(): + result = model.test_step(model_inputs) + +# visualize results +task_processor.visualize( + image=image, + model=model, + result=result[0], + window_name='visualize', + output_file='output_restorer.bmp') +``` + +### SDK 模型推理 + +你也可以参考如下代码,对 SDK model 进行推理: + +```python +from mmdeploy_python import Restorer +import cv2 + +img = cv2.imread('tests/data/image/lq/baboon_x4.png') + +# create a predictor +restorer = Restorer(model_path='mmdeploy_models/mmedit/onnx', device_name='cpu', device_id=0) +# perform inference +result = restorer(img) + +# visualize inference result +cv2.imwrite('output_restorer.bmp', result) +``` + +除了python API,mmdeploy SDK 还提供了诸如 C、C++、C#、Java等多语言接口。 +你可以参考[样例](https://github.com/open-mmlab/mmdeploy/tree/1.x/demo)学习其他语言接口的使用方法。 + +## 模型支持列表 + +请参考[这里](https://mmdeploy.readthedocs.io/zh_CN/1.x/04-supported-codebases/mmedit.html#id7) From ea006b1126875d633041b63929220d328b94340c Mon Sep 17 00:00:00 2001 From: Yanhong Zeng Date: Wed, 28 Dec 2022 11:59:01 +0800 Subject: [PATCH 35/44] [Fix] fix model index (#1559) * update model index * fix metafile * fix typo --- .dev_scripts/README.md | 11 ++- .dev_scripts/update_model_index.py | 10 ++- configs/basicvsr_pp/README.md | 29 ++------ configs/basicvsr_pp/README_zh-CN.md | 13 ++-- configs/basicvsr_pp/metafile.yml | 40 +++++++++++ ...-sn_8xb32-1500kiters_imagenet1k-128x128.py | 70 ------------------- configs/cyclegan/README.md | 4 ++ configs/dim/README.md | 15 ++-- configs/dim/README_zh-CN.md | 15 ++-- configs/dim/metafile.yml | 11 +++ configs/ggan/README.md | 2 + configs/guided_diffusion/README.md | 9 +-- configs/guided_diffusion/metafile.yml | 32 ++++++++- configs/pix2pix/README.md | 4 ++ configs/styleganv2/README.md | 20 ++---- configs/styleganv2/metafile.yml | 36 ++++++++++ ...x-fp16-800kiters_quicktest-ffhq-256x256.py | 39 ----------- ...4-fp16-800kiters_quicktest-ffhq-256x256.py | 41 ----------- ...global-800kiters_quicktest-ffhq-256x256.py | 41 ----------- docs/en/.dev_scripts/update_model_zoo.py | 28 +++++--- 20 files changed, 203 insertions(+), 267 deletions(-) delete mode 100644 configs/biggan/biggan_torch-sn_8xb32-1500kiters_imagenet1k-128x128.py delete mode 100644 configs/styleganv2/stylegan2_c2_8xb4-apex-fp16-800kiters_quicktest-ffhq-256x256.py delete mode 100644 configs/styleganv2/stylegan2_c2_8xb4-fp16-800kiters_quicktest-ffhq-256x256.py delete mode 100644 configs/styleganv2/stylegan2_c2_8xb4-fp16-global-800kiters_quicktest-ffhq-256x256.py diff --git a/.dev_scripts/README.md b/.dev_scripts/README.md index 44d1591e56..db0b9ac724 100644 --- a/.dev_scripts/README.md +++ b/.dev_scripts/README.md @@ -13,6 +13,7 @@ - [8. Deterministic training](#8-deterministic-training) - [9. Automatically check links](#9-automatically-check-links) - [10. Calculate flops](#10-calculate-flops) +- [11. Update model idnex](#11-update-model-index) ## 1. Check UT @@ -237,10 +238,18 @@ You can specify the `--target` by a file or a directory. **Notes:** DO NOT use it in CI, because requiring too many http requirements by CI will cause 503 and CI will propabaly fail. -10. Calculate flops +## 10. Calculate flops To summarize the flops of different models, you can run the following commands: ```bash python .dev_scripts/benchmark_valid_flop.py --flops --flops-str ``` + +## 11. Update model index + +To update model-index according to `README.md`, please run the following commands, + +```bash +python .dev_scripts/update_model_index.py +``` diff --git a/.dev_scripts/update_model_index.py b/.dev_scripts/update_model_index.py index 271d58e474..ecf655104e 100755 --- a/.dev_scripts/update_model_index.py +++ b/.dev_scripts/update_model_index.py @@ -41,7 +41,7 @@ def dump_yaml_and_check_difference(obj, file): if osp.isfile(file): file_exists = True - print(f' exist {file}') + # print(f' exist {file}') with open(file, 'r', encoding='utf-8') as f: str_orig = f.read() else: @@ -181,6 +181,7 @@ def parse_md(md_file): f'line {i+1} in {md_file}') i += 1 continue + if 'Method' in cols: config_idx = cols.index('Method') elif 'Config' in cols: @@ -188,6 +189,7 @@ def parse_md(md_file): else: print(cols) raise ValueError('Cannot find config Table.') + checkpoint_idx = cols.index('Download') try: flops_idx = cols.index('FLOPs') @@ -318,7 +320,7 @@ def parse_md(md_file): i += 1 if len(models) == 0: - warnings.warn('no model is found in this md file') + warnings.warn(f'no model is found in {md_file}') result = {'Collections': [collection], 'Models': models} yml_file = md_file.replace('README.md', 'metafile.yml') @@ -366,9 +368,11 @@ def update_model_index(): sys.exit(0) file_modified = False + # pbar = tqdm.tqdm(range(len(file_list)), initial=0, dynamic_ncols=True) for fn in file_list: - print(f'process {fn}') file_modified |= parse_md(fn) + # pbar.update(1) + # pbar.set_description(f'processing {fn}') file_modified |= update_model_index() diff --git a/configs/basicvsr_pp/README.md b/configs/basicvsr_pp/README.md index b81707f718..95b6894346 100644 --- a/configs/basicvsr_pp/README.md +++ b/configs/basicvsr_pp/README.md @@ -39,29 +39,12 @@ The pretrained weights of SPyNet can be found [here](https://download.openmmlab. Note that the following models are finetuned from smaller models. The training schemes of these models will be released when MMEditing reaches 5k stars. We provide the pre-trained models here. -**NTIRE 2021 Video Super-Resolution** - -[basicvsr-pp_c128n25_600k_ntire-vsr](./basicvsr-pp_c128n25_600k_ntire-vsr.py) - -[model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_vsr_20210311-1ff35292.pth) - -**NTIRE 2021 Quality Enhancement of Compressed Video - Track 1** - -[basicvsr-pp_c128n25_600k_ntire-decompress-track1](./basicvsr-pp_c128n25_600k_ntire-decompress-track1.py) - -[model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_decompress_track1_20210223-7b2eba02.pth) - -**NTIRE 2021 Quality Enhancement of Compressed Video - Track 2** - -[basicvsr-pp_c128n25_600k_ntire-decompress-track2](./basicvsr-pp_c128n25_600k_ntire-decompress-track2.py) - -[model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_decompress_track2_20210314-eeae05e6.pth) - -**NTIRE 2021 Quality Enhancement of Compressed Video - Track 3** - -[basicvsr-pp_c128n25_600k_ntire-decompress-track3](./basicvsr-pp_c128n25_600k_ntire-decompress-track3.py) - -[model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_decompress_track3_20210304-6daf4a40.pth) +| Method | Download | Track | +| :-------------------------------------------------------------------: | :---------------------------------------------------------------------: | :----------------------------------------------------------: | +| [basicvsr-pp_c128n25_600k_ntire-vsr](./basicvsr-pp_c128n25_600k_ntire-vsr.py) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_vsr_20210311-1ff35292.pth) | NTIRE 2021 Video Super-Resolution | +| [basicvsr-pp_c128n25_600k_ntire-decompress-track1](./basicvsr-pp_c128n25_600k_ntire-decompress-track1.py) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_decompress_track1_20210223-7b2eba02.pth) | NTIRE 2021 Quality Enhancement of Compressed Video - Track 1 | +| [basicvsr-pp_c128n25_600k_ntire-decompress-track2](./basicvsr-pp_c128n25_600k_ntire-decompress-track2.py) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_decompress_track2_20210314-eeae05e6.pth) | NTIRE 2021 Quality Enhancement of Compressed Video - Track 2 | +| [basicvsr-pp_c128n25_600k_ntire-decompress-track3](./basicvsr-pp_c128n25_600k_ntire-decompress-track3.py) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_decompress_track3_20210304-6daf4a40.pth) | NTIRE 2021 Quality Enhancement of Compressed Video - Track 3 | diff --git a/configs/basicvsr_pp/README_zh-CN.md b/configs/basicvsr_pp/README_zh-CN.md index 0c4810d3fd..3048631f78 100644 --- a/configs/basicvsr_pp/README_zh-CN.md +++ b/configs/basicvsr_pp/README_zh-CN.md @@ -31,13 +31,12 @@ SPyNet 的 预训练权重在[这里](https://download.openmmlab.com/mmediting/r 请注意,以下模型是从较小的模型中微调而来的。 这些模型的训练方案将在 MMEditing 达到 5k star 时发布。 我们在这里提供预训练的模型。 -[NTIRE 2021 Video Super-Resolution](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_vsr_20210311-1ff35292.pth) - -[NTIRE 2021 Quality Enhancement of Compressed Video - Track 1](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_decompress_track1_20210223-7b2eba02.pth) - -[NTIRE 2021 Quality Enhancement of Compressed Video - Track 2](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_decompress_track2_20210314-eeae05e6.pth) - -[NTIRE 2021 Quality Enhancement of Compressed Video - Track 3](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_decompress_track3_20210304-6daf4a40.pth) +| 算法 | 模型 | 赛道 | +| ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ------------------------------------------------------------ | +| [basicvsr-pp_c128n25_600k_ntire-vsr](./basicvsr-pp_c128n25_600k_ntire-vsr.py) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_vsr_20210311-1ff35292.pth) | NTIRE 2021 Video Super-Resolution | +| [basicvsr-pp_c128n25_600k_ntire-decompress-track1](./basicvsr-pp_c128n25_600k_ntire-decompress-track1.py) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_decompress_track1_20210223-7b2eba02.pth) | NTIRE 2021 Quality Enhancement of Compressed Video - Track 1 | +| [basicvsr-pp_c128n25_600k_ntire-decompress-track2](./basicvsr-pp_c128n25_600k_ntire-decompress-track2.py) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_decompress_track2_20210314-eeae05e6.pth) | NTIRE 2021 Quality Enhancement of Compressed Video - Track 2 | +| [basicvsr-pp_c128n25_600k_ntire-decompress-track3](./basicvsr-pp_c128n25_600k_ntire-decompress-track3.py) | [model](https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_decompress_track3_20210304-6daf4a40.pth) | NTIRE 2021 Quality Enhancement of Compressed Video - Track 3 | ``` diff --git a/configs/basicvsr_pp/metafile.yml b/configs/basicvsr_pp/metafile.yml index c974808abc..281df9e87a 100644 --- a/configs/basicvsr_pp/metafile.yml +++ b/configs/basicvsr_pp/metafile.yml @@ -109,3 +109,43 @@ Models: Vimeo-90K-T (BIx4) SSIM (Y): 0.9351 Task: Video Super-Resolution Weights: https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c64n7_8x1_300k_vimeo90k_bd_20210305-ab315ab1.pth +- Config: configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-vsr.py + In Collection: BasicVSR++ + Metadata: + Training Data: Others + Name: basicvsr-pp_c128n25_600k_ntire-vsr + Results: + - Dataset: Others + Metrics: {} + Task: Video Super-Resolution + Weights: https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_vsr_20210311-1ff35292.pth +- Config: configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-decompress-track1.py + In Collection: BasicVSR++ + Metadata: + Training Data: Others + Name: basicvsr-pp_c128n25_600k_ntire-decompress-track1 + Results: + - Dataset: Others + Metrics: {} + Task: Video Super-Resolution + Weights: https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_decompress_track1_20210223-7b2eba02.pth +- Config: configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-decompress-track2.py + In Collection: BasicVSR++ + Metadata: + Training Data: Others + Name: basicvsr-pp_c128n25_600k_ntire-decompress-track2 + Results: + - Dataset: Others + Metrics: {} + Task: Video Super-Resolution + Weights: https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_decompress_track2_20210314-eeae05e6.pth +- Config: configs/basicvsr_pp/basicvsr-pp_c128n25_600k_ntire-decompress-track3.py + In Collection: BasicVSR++ + Metadata: + Training Data: Others + Name: basicvsr-pp_c128n25_600k_ntire-decompress-track3 + Results: + - Dataset: Others + Metrics: {} + Task: Video Super-Resolution + Weights: https://download.openmmlab.com/mmediting/restorers/basicvsr_plusplus/basicvsr_plusplus_c128n25_ntire_decompress_track3_20210304-6daf4a40.pth diff --git a/configs/biggan/biggan_torch-sn_8xb32-1500kiters_imagenet1k-128x128.py b/configs/biggan/biggan_torch-sn_8xb32-1500kiters_imagenet1k-128x128.py deleted file mode 100644 index 3839c81a7d..0000000000 --- a/configs/biggan/biggan_torch-sn_8xb32-1500kiters_imagenet1k-128x128.py +++ /dev/null @@ -1,70 +0,0 @@ -_base_ = [ - '../_base_/models/biggan/base_biggan_128x128.py', - '../_base_/datasets/imagenet_noaug_128.py', - '../_base_/gen_default_runtime.py', -] - -# define model -ema_config = dict( - type='ExponentialMovingAverage', - interval=1, - momentum=0.9999, - update_buffers=True, - start_iter=20000) - -model = dict( - generator=dict(sn_style='torch'), - discriminator=dict(sn_style='torch'), - ema_config=ema_config) - -# define dataset -train_dataloader = dict( - batch_size=32, num_workers=8, dataset=dict(data_root='data/imagenet')) - -# define optimizer -optim_wrapper = dict( - generator=dict( - accumulative_counts=8, - optimizer=dict(type='Adam', lr=0.0001, betas=(0.0, 0.999), eps=1e-6)), - discriminator=dict( - accumulative_counts=8, - optimizer=dict(type='Adam', lr=0.0004, betas=(0.0, 0.999), eps=1e-6))) - -# VIS_HOOK -custom_hooks = [ - dict( - type='GenVisualizationHook', - interval=10000, - fixed_input=True, - # vis ema and orig at the same time - vis_kwargs_list=dict( - type='Noise', - name='fake_img', - sample_model='ema/orig', - target_keys=['ema', 'orig'])), -] - -# Traning sets' datasize 1,281,167 -train_cfg = dict(max_iters=1500000) - -metrics = [ - dict( - type='FrechetInceptionDistance', - prefix='FID-Full-50k', - fake_nums=50000, - inception_style='StyleGAN', - sample_model='ema'), - dict( - type='IS', - prefix='IS-50k', - fake_nums=50000, - inception_style='StyleGAN', - sample_model='ema') -] -# save multi best checkpoints -default_hooks = dict( - checkpoint=dict( - save_best=['FID-Full-50k/fid', 'IS-50k/is'], rule=['less', 'greater'])) - -val_evaluator = dict(metrics=metrics) -test_evaluator = dict(metrics=metrics) diff --git a/configs/cyclegan/README.md b/configs/cyclegan/README.md index dd408b0d1b..be402efad9 100644 --- a/configs/cyclegan/README.md +++ b/configs/cyclegan/README.md @@ -45,6 +45,8 @@ https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_in_1x1_80k_f `FID` comparison with official: + + | Dataset | facades | facades-id0 | summer2winter | summer2winter-id0 | winter2summer | winter2summer-id0 | horse2zebra | horse2zebra-id0 | zebra2horse | zebra2horse-id0 | average | | :------: | :---------: | :---------: | :-----------: | :---------------: | :-----------: | :---------------: | :---------: | :-------------: | :---------: | :-------------: | :--------: | | official | **123.626** | **119.726** | **77.342** | **76.773** | **72.631** | 74.239 | **62.111** | 77.202 | **138.646** | **137.050** | **95.935** | @@ -52,6 +54,8 @@ https://download.openmmlab.com/mmediting/cyclegan/refactor/cyclegan_in_1x1_80k_f `IS` comparison with evaluation: + + | Dataset | facades | facades-id0 | summer2winter | summer2winter-id0 | winter2summer | winter2summer-id0 | horse2zebra | horse2zebra-id0 | zebra2horse | zebra2horse-id0 | average | | :------: | :-------: | :---------: | :-----------: | :---------------: | :-----------: | :---------------: | :---------: | :-------------: | :---------: | :-------------: | :-------: | | official | 1.638 | 1.697 | 2.762 | **2.750** | **3.293** | **3.110** | 1.375 | **1.584** | **3.186** | 3.047 | 2.444 | diff --git a/configs/dim/README.md b/configs/dim/README.md index 283ceef496..9106ec9ac5 100644 --- a/configs/dim/README.md +++ b/configs/dim/README.md @@ -20,13 +20,14 @@ Image matting is a fundamental computer vision problem and has many applications ## Results and models -| Method | SAD | MSE | GRAD | CONN | GPU Info | Download | -| :-------------------------------------------------------: | :------: | :-------: | :------: | :------: | :------: | :----------------------------------------------------------------------------------------------------: | -| stage1 (paper) | 54.6 | 0.017 | 36.7 | 55.3 | - | - | -| stage3 (paper) | **50.4** | **0.014** | 31.0 | 50.8 | - | - | -| [stage1 (our)](./dim_stage1-v16_1xb1-1000k_comp1k.py) | 53.8 | 0.017 | 32.7 | 54.5 | 1 | [model](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage1_v16_1x1_1000k_comp1k_SAD-53.8_20200605_140257-979a420f.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage1_v16_1x1_1000k_comp1k_20200605_140257.log.json) | -| [stage2 (our)](./dim_stage2-v16-pln_1xb1-1000k_comp1k.py) | 52.3 | 0.016 | 29.4 | 52.4 | 1 | [model](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage2_v16_pln_1x1_1000k_comp1k_SAD-52.3_20200607_171909-d83c4775.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage2_v16_pln_1x1_1000k_comp1k_20200607_171909.log.json) | -| [stage3 (our)](./dim_stage3-v16-pln_1xb1-1000k_comp1k.py) | 50.6 | 0.015 | **29.0** | **50.7** | 1 | [model](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_SAD-50.6_20200609_111851-647f24b6.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_20200609_111851.log.json) | +| Method | SAD | MSE | GRAD | CONN | GPU Info | Download | +| :-------------------------------------------------------------------------: | :------: | :-------: | :------: | :------: | :------: | :----------------------------------------------------------------------------------: | +| stage1 (paper) | 54.6 | 0.017 | 36.7 | 55.3 | - | - | +| stage3 (paper) | **50.4** | **0.014** | 31.0 | 50.8 | - | - | +| [stage1 (our)](./dim_stage1-v16_1xb1-1000k_comp1k.py) | 53.8 | 0.017 | 32.7 | 54.5 | 1 | [model](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage1_v16_1x1_1000k_comp1k_SAD-53.8_20200605_140257-979a420f.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage1_v16_1x1_1000k_comp1k_20200605_140257.log.json) | +| [stage2 (our)](./dim_stage2-v16-pln_1xb1-1000k_comp1k.py) | 52.3 | 0.016 | 29.4 | 52.4 | 1 | [model](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage2_v16_pln_1x1_1000k_comp1k_SAD-52.3_20200607_171909-d83c4775.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage2_v16_pln_1x1_1000k_comp1k_20200607_171909.log.json) | +| [stage3 (our)](./dim_stage3-v16-pln_1xb1-1000k_comp1k.py) | 50.6 | 0.015 | **29.0** | **50.7** | 1 | [model](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_SAD-50.6_20200609_111851-647f24b6.pth) \| [log](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_20200609_111851.log.json) | +| [stage1 (online merge)](./dim_stage1-v16_1xb1-1000k_comp1k_online-merge.py) | - | - | - | - | - | - | **NOTE** diff --git a/configs/dim/README_zh-CN.md b/configs/dim/README_zh-CN.md index 681b592b66..518dd5f49b 100644 --- a/configs/dim/README_zh-CN.md +++ b/configs/dim/README_zh-CN.md @@ -21,13 +21,14 @@
-| 算法 | SAD | MSE | GRAD | CONN | GPU 信息 | 下载 | -| :----------------------------------------------------------: | :------: | :-------: | :------: | :------: | :------: | :-------------------------------------------------------------------------------------------------: | -| 第一阶段 (原文) | 54.6 | 0.017 | 36.7 | 55.3 | - | - | -| 第三阶段 (原文) | **50.4** | **0.014** | 31.0 | 50.8 | - | - | -| [第一阶段 (复现)](./dim_stage1-v16_1xb1-1000k_comp1k.py) | 53.8 | 0.017 | 32.7 | 54.5 | 1 | [模型](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage1_v16_1x1_1000k_comp1k_SAD-53.8_20200605_140257-979a420f.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage1_v16_1x1_1000k_comp1k_20200605_140257.log.json) | -| [第二阶段 (复现)](./dim_stage2-v16-pln_1xb1-1000k_comp1k.py) | 52.3 | 0.016 | 29.4 | 52.4 | 1 | [模型](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage2_v16_pln_1x1_1000k_comp1k_SAD-52.3_20200607_171909-d83c4775.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage2_v16_pln_1x1_1000k_comp1k_20200607_171909.log.json) | -| [第三阶段 (复现)](./dim_stage3-v16-pln_1xb1-1000k_comp1k.py) | 50.6 | 0.015 | **29.0** | **50.7** | 1 | [模型](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_SAD-50.6_20200609_111851-647f24b6.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_20200609_111851.log.json) | +| 算法 | SAD | MSE | GRAD | CONN | GPU 信息 | 下载 | +| :---------------------------------------------------------------------------: | :------: | :-------: | :------: | :------: | :------: | :--------------------------------------------------------------------------------: | +| 第一阶段 (原文) | 54.6 | 0.017 | 36.7 | 55.3 | - | - | +| 第三阶段 (原文) | **50.4** | **0.014** | 31.0 | 50.8 | - | - | +| [第一阶段 (复现)](./dim_stage1-v16_1xb1-1000k_comp1k.py) | 53.8 | 0.017 | 32.7 | 54.5 | 1 | [模型](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage1_v16_1x1_1000k_comp1k_SAD-53.8_20200605_140257-979a420f.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage1_v16_1x1_1000k_comp1k_20200605_140257.log.json) | +| [第二阶段 (复现)](./dim_stage2-v16-pln_1xb1-1000k_comp1k.py) | 52.3 | 0.016 | 29.4 | 52.4 | 1 | [模型](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage2_v16_pln_1x1_1000k_comp1k_SAD-52.3_20200607_171909-d83c4775.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage2_v16_pln_1x1_1000k_comp1k_20200607_171909.log.json) | +| [第三阶段 (复现)](./dim_stage3-v16-pln_1xb1-1000k_comp1k.py) | 50.6 | 0.015 | **29.0** | **50.7** | 1 | [模型](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_SAD-50.6_20200609_111851-647f24b6.pth) \| [日志](https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_20200609_111851.log.json) | +| [第一阶段 (online merge)](./dim_stage1-v16_1xb1-1000k_comp1k_online-merge.py) | - | - | - | - | - | - | **注** diff --git a/configs/dim/metafile.yml b/configs/dim/metafile.yml index 83293d2c9c..a158b7a1a9 100644 --- a/configs/dim/metafile.yml +++ b/configs/dim/metafile.yml @@ -52,3 +52,14 @@ Models: SAD: 50.6 Task: Matting Weights: https://download.openmmlab.com/mmediting/mattors/dim/dim_stage3_v16_pln_1x1_1000k_comp1k_SAD-50.6_20200609_111851-647f24b6.pth +- Config: configs/dim/dim_stage1-v16_1xb1-1000k_comp1k_online-merge.py + In Collection: DIM + Metadata: + GPUs: '-' + Training Data: COMP1K + Name: dim_stage1-v16_1xb1-1000k_comp1k_online-merge + Results: + - Dataset: COMP1K + Metrics: {} + Task: Matting + Weights: '' diff --git a/configs/ggan/README.md b/configs/ggan/README.md index f09f6062ab..f4dfda02c7 100644 --- a/configs/ggan/README.md +++ b/configs/ggan/README.md @@ -35,6 +35,8 @@ Generative Adversarial Nets (GANs) represent an important milestone for effectiv Note: In the original implementation of [GGAN](https://github.com/lim0606/pytorch-geometric-gan), they set `G_iters` to 10. However our framework does not support `G_iters` currently, so we dropped the settings in the original implementation and conducted several experiments with our own settings. We have shown above the experiment results with the lowest `fid` score. \ Original settings and our settings: + + | Models | Dataset | Architecture | optimizer | lr_G | lr_D | G_iters | D_iters | | :----------------: | :------------: | :----------: | :-------: | :----: | :----: | :-----: | :-----: | | GGAN(origin) 64x64 | CelebA-Cropped | dcgan-archi | RMSprop | 0.0002 | 0.0002 | 10 | 1 | diff --git a/configs/guided_diffusion/README.md b/configs/guided_diffusion/README.md index f21407d179..0f107cc1a7 100644 --- a/configs/guided_diffusion/README.md +++ b/configs/guided_diffusion/README.md @@ -22,10 +22,11 @@ We show that diffusion models can achieve image sample quality superior to the c **ImageNet** -| Method | Resolution | Config | Weights | -| ------ | ---------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | -| adm-u | 64x64 | [config](./adm-u_8xb32_imagenet-64x64.py) | [model](https://download.openmmlab.com/mmediting/guided_diffusion/adm-u-cvt-rgb_8xb32_imagenet-64x64-7ff0080b.pth) | -| adm-u | 512x512 | [config](./adm-u_8xb32_imagenet-512x512.py) | [model](https://download.openmmlab.com/mmediting/guided_diffusion/adm-u_8xb32_imagenet-512x512-60b381cb.pth) | +| Model | Resolution | Config | Download | +| :---: | :--------: | :-------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------: | +| adm-u | 64x64 | [config](./adm-u_8xb32_imagenet-64x64.py) | [model](https://download.openmmlab.com/mmediting/guided_diffusion/adm-u-cvt-rgb_8xb32_imagenet-64x64-7ff0080b.pth) | +| adm-u | 512x512 | [config](./adm-u_8xb32_imagenet-512x512.py) | [model](https://download.openmmlab.com/mmediting/guided_diffusion/adm-u_8xb32_imagenet-512x512-60b381cb.pth) | +| adm-u | 512x512 | [config](./adm-u_ddim250_8xb32_imagenet-512x512.py) | [model](<>) | **Note** To support disco diffusion, we support guided diffusion briefly. Complete support of guided diffusion with metrics and test/train logs will come soom! diff --git a/configs/guided_diffusion/metafile.yml b/configs/guided_diffusion/metafile.yml index 1eedef6e1a..8d8713eebb 100644 --- a/configs/guided_diffusion/metafile.yml +++ b/configs/guided_diffusion/metafile.yml @@ -6,4 +6,34 @@ Collections: Paper: - https://papers.nips.cc/paper/2021/file/49ad23d1ec9fa4bd8d77d02681df5cfa-Paper.pdf README: configs/guided_diffusion/README.md -Models: [] +Models: +- Config: configs/guided_diffusion/adm-u_8xb32_imagenet-64x64.py + In Collection: Guided Diffusion + Metadata: + Training Data: Others + Name: adm-u_8xb32_imagenet-64x64 + Results: + - Dataset: Others + Metrics: {} + Task: Image Generation + Weights: https://download.openmmlab.com/mmediting/guided_diffusion/adm-u-cvt-rgb_8xb32_imagenet-64x64-7ff0080b.pth +- Config: configs/guided_diffusion/adm-u_8xb32_imagenet-512x512.py + In Collection: Guided Diffusion + Metadata: + Training Data: Others + Name: adm-u_8xb32_imagenet-512x512 + Results: + - Dataset: Others + Metrics: {} + Task: Image Generation + Weights: https://download.openmmlab.com/mmediting/guided_diffusion/adm-u_8xb32_imagenet-512x512-60b381cb.pth +- Config: configs/guided_diffusion/adm-u_ddim250_8xb32_imagenet-512x512.py + In Collection: Guided Diffusion + Metadata: + Training Data: Others + Name: adm-u_ddim250_8xb32_imagenet-512x512 + Results: + - Dataset: Others + Metrics: {} + Task: Image Generation + Weights: <> diff --git a/configs/pix2pix/README.md b/configs/pix2pix/README.md index 3d0d7b4f5a..2ec6d0457a 100644 --- a/configs/pix2pix/README.md +++ b/configs/pix2pix/README.md @@ -36,6 +36,8 @@ We use `FID` and `IS` metrics to evaluate the generation performance of pix2pix. `FID` comparison with official: + + | Dataset | facades | aerial2maps | maps2aerial | edges2shoes | average | | :------: | :---------: | :----------: | :---------: | :---------: | :----------: | | official | **119.135** | 149.731 | 102.072 | **75.774** | 111.678 | @@ -43,6 +45,8 @@ We use `FID` and `IS` metrics to evaluate the generation performance of pix2pix. `IS` comparison with official: + + | Dataset | facades | aerial2maps | maps2aerial | edges2shoes | average | | :------: | :-------: | :---------: | :---------: | :---------: | :--------: | | official | **1.650** | 2.529 | **3.552** | 2.766 | 2.624 | diff --git a/configs/styleganv2/README.md b/configs/styleganv2/README.md index 37a45a7d8a..22edb54cb4 100644 --- a/configs/styleganv2/README.md +++ b/configs/styleganv2/README.md @@ -60,16 +60,6 @@ As shown in the figure, we provide **3** ways to do mixed-precision training for | stylegan2_c2_fp16-globalG-partialD_PL-R1-no-scaler_ffhq_256_b4x8_800k | the whole G in fp16 | FFHQ256 | 4.362 | [stylegan2_c2-PL-R1_8xb4-fp16-globalG-partialD-no-scaler-800kiters_ffhq-256x256](./stylegan2_c2-PL-R1_8xb4-fp16-globalG-partialD-no-scaler-800kiters_ffhq-256x256.py) | [ckpt](https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_fp16-globalG-partialD_PL-R1-no-scaler_ffhq_256_b4x8_800k_20210508_114930-ef8270d4.pth) | | stylegan2_c2_apex_fp16_PL-R1-no-scaler_ffhq_256_b4x8_800k | the whole G&D in fp16 + two loss scaler | FFHQ256 | 4.614 | [stylegan2_c2-PL-R1_8xb4-apex-fp16-no-scaler-800kiters_ffhq-256x256](./stylegan2_c2-PL-R1_8xb4-apex-fp16-no-scaler-800kiters_ffhq-256x256.py) | [ckpt](https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_apex_fp16_PL-R1-no-scaler_ffhq_256_b4x8_800k_20210508_114701-c2bb8afd.pth) | -In addition, we also provide `QuickTestImageDataset` to users for quickly checking whether the code can be run correctly. It's more important for FP16 experiments, because some cuda operations may no support mixed precision training. Esepcially for `APEX`, you can use [this config](./stylegan2_c2_8xb4-apex-fp16-800kiters_quicktest-ffhq-256x256.py) in your local machine by running: - -```bash -bash tools/dist_train.sh \ - configs/styleganv2/stylegan2_c2_8xb4-apex-fp16-800kiters_quicktest-ffhq-256x256.py 1 \ - --work-dir ./work_dirs/quick-test -``` - -With a similar way, users can switch to [config for partial-GD](./stylegan2_c2_8xb4-fp16-800kiters_quicktest-ffhq-256x256.py) and [config for globalG-partialD](./stylegan2_c2_8xb4-fp16-global-800kiters_quicktest-ffhq-256x256.py) to test the other two mixed precision training configuration. - *Note that to use the [APEX](https://github.com/NVIDIA/apex) toolkit, you have to installed it following the official guidance. (APEX is not included in our requirements.) If you are using GPUs without tensor core, you would better to switch to the newer PyTorch version (>= 1.7,0). Otherwise, the APEX installation or running may meet several bugs.* ## About Different Implementations of FID Metric @@ -90,11 +80,11 @@ More precalculated inception pickle files are listed here: ## About Different Implementation and Setting of PR Metric -| Model | P&R Details | Precision | Recall | -| :--------------------------------------------: | :------------------------------: | :-------: | :----: | -| stylegan2_config-f_ffhq_1024 (official weight) | use Tero's VGG16, P&R50k_full | 67.876 | 49.299 | -| stylegan2_config-f_ffhq_1024 (official weight) | use Tero's VGG16, P&R50k | 62.856 | 49.400 | -| stylegan2_config-f_ffhq_1024 (official weight) | use PyTorch's VGG16, P&R50k_full | 67.662 | 55.460 | +| Model | Config | Download | P&R Details | Precision | Recall | +| :--------------------------------------------: | :--------------------------------------------------: | :-----------------------------------------------------: | :------------------------------: | :-------: | :----: | +| stylegan2_config-f_ffhq_1024 (official weight) | [stylegan2_c2_8xb4_ffhq-1024x1024](./stylegan2_c2_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth) | use Tero's VGG16, P&R50k_full | 67.876 | 49.299 | +| stylegan2_config-f_ffhq_1024 (official weight) | [stylegan2_c2_8xb4_ffhq-1024x1024](./stylegan2_c2_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth) | use Tero's VGG16, P&R50k | 62.856 | 49.400 | +| stylegan2_config-f_ffhq_1024 (official weight) | [stylegan2_c2_8xb4_ffhq-1024x1024](./stylegan2_c2_8xb4_ffhq-1024x1024.py) | [model](https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth) | use PyTorch's VGG16, P&R50k_full | 67.662 | 55.460 | As shown in this table, `P&R50k_full` is the metric used in StyleGANv1 and StyleGANv2. `full` indicates that we use the whole dataset for extracting the real distribution, e.g., 70000 images in FFHQ dataset. However, adopting the VGG16 provided from [Tero](https://nvlabs-fi-cdn.nvidia.com/stylegan2-ada-pytorch/pretrained/metrics/vgg16.pt) requires that your PyTorch version must fulfill `>=1.6.0`. Be careful about using the PyTorch's VGG16 to extract features, which will cause higher precision and recall. diff --git a/configs/styleganv2/metafile.yml b/configs/styleganv2/metafile.yml index 88d6b0e23e..2badbaec55 100644 --- a/configs/styleganv2/metafile.yml +++ b/configs/styleganv2/metafile.yml @@ -190,3 +190,39 @@ Models: FID50k: 2.8185 Task: Unconditional GANs Weights: https://download.openmmlab.com/mmediting/stylegan2/stylegan2_c2_ffhq_1024_b4x8_20210407_150045-618c9024.pth +- Config: configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py + In Collection: StyleGANv2 + Metadata: + Training Data: FFHQ + Name: stylegan2_c2_8xb4_ffhq-1024x1024 + Results: + - Dataset: FFHQ + Metrics: + Precision: 67.876 + Recall: 49.299 + Task: Unconditional GANs + Weights: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth +- Config: configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py + In Collection: StyleGANv2 + Metadata: + Training Data: FFHQ + Name: stylegan2_c2_8xb4_ffhq-1024x1024 + Results: + - Dataset: FFHQ + Metrics: + Precision: 62.856 + Recall: 49.4 + Task: Unconditional GANs + Weights: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth +- Config: configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py + In Collection: StyleGANv2 + Metadata: + Training Data: FFHQ + Name: stylegan2_c2_8xb4_ffhq-1024x1024 + Results: + - Dataset: FFHQ + Metrics: + Precision: 67.662 + Recall: 55.46 + Task: Unconditional GANs + Weights: https://download.openmmlab.com/mmediting/stylegan2/official_weights/stylegan2-ffhq-config-f-official_20210327_171224-bce9310c.pth diff --git a/configs/styleganv2/stylegan2_c2_8xb4-apex-fp16-800kiters_quicktest-ffhq-256x256.py b/configs/styleganv2/stylegan2_c2_8xb4-apex-fp16-800kiters_quicktest-ffhq-256x256.py deleted file mode 100644 index 021613a3f8..0000000000 --- a/configs/styleganv2/stylegan2_c2_8xb4-apex-fp16-800kiters_quicktest-ffhq-256x256.py +++ /dev/null @@ -1,39 +0,0 @@ -"""Config for the `config-f` setting in StyleGAN2.""" - -_base_ = ['./stylegan2_c2_8xb4-800kiters_ffhq-256x256.py'] - -model = dict( - generator=dict(out_size=256), - discriminator=dict(in_size=256, convert_input_fp32=False), -) - -# remain to be refactored -apex_amp = dict( - mode='gan', init_args=dict(opt_level='O1', num_losses=2, loss_scale=512.)) - -train_cfg = dict(max_iters=800002) - -batch_size = 2 -dataset_type = 'QuickTestImageDataset' - -train_dataloader = dict(batch_size=batch_size, dataset=dict(type=dataset_type)) - -val_dataloader = dict(batch_size=batch_size, dataset=dict(type=dataset_type)) - -test_dataloader = dict( - batch_size=batch_size, dataset=dict(dataset_type=dataset_type)) - -default_hooks = dict(logger=dict(type='LoggerHook', interval=1)) - -# METRICS -metrics = [ - dict( - type='FrechetInceptionDistance', - prefix='FID-Full-50k', - fake_nums=50000, - inception_style='StyleGAN', - sample_model='ema') -] - -val_evaluator = dict(metrics=metrics) -test_evaluator = dict(metrics=metrics) diff --git a/configs/styleganv2/stylegan2_c2_8xb4-fp16-800kiters_quicktest-ffhq-256x256.py b/configs/styleganv2/stylegan2_c2_8xb4-fp16-800kiters_quicktest-ffhq-256x256.py deleted file mode 100644 index da117af082..0000000000 --- a/configs/styleganv2/stylegan2_c2_8xb4-fp16-800kiters_quicktest-ffhq-256x256.py +++ /dev/null @@ -1,41 +0,0 @@ -"""Config for the `config-f` setting in StyleGAN2.""" - -_base_ = ['./stylegan2_c2_8xb4-800kiters_ffhq-256x256.py'] - -model = dict( - generator=dict(out_size=256, num_fp16_scales=4), - discriminator=dict(in_size=256, num_fp16_scales=4), - disc_auxiliary_loss=dict(data_info=dict(loss_scaler='loss_scaler')), - # gen_auxiliary_loss=dict(data_info=dict(loss_scaler='loss_scaler')), -) - -batch_size = 2 -dataset_type = 'QuickTestImageDataset' - -train_dataloader = dict(batch_size=batch_size, dataset=dict(type=dataset_type)) - -val_dataloader = dict(batch_size=batch_size, dataset=dict(type=dataset_type)) - -test_dataloader = dict( - batch_size=batch_size, dataset=dict(dataset_type=dataset_type)) - -default_hooks = dict(logger=dict(type='LoggerHook', interval=1)) - -train_cfg = dict(max_iters=800002) - -optim_wrapper = dict( - generator=dict(type='AmpOptimWrapper', loss_scale=512), - discriminator=dict(type='AmpOptimWrapper', loss_scale=512)) - -# METRICS -metrics = [ - dict( - type='FrechetInceptionDistance', - prefix='FID-Full-50k', - fake_nums=50000, - inception_style='StyleGAN', - sample_model='ema') -] - -val_evaluator = dict(metrics=metrics) -test_evaluator = dict(metrics=metrics) diff --git a/configs/styleganv2/stylegan2_c2_8xb4-fp16-global-800kiters_quicktest-ffhq-256x256.py b/configs/styleganv2/stylegan2_c2_8xb4-fp16-global-800kiters_quicktest-ffhq-256x256.py deleted file mode 100644 index a053408f29..0000000000 --- a/configs/styleganv2/stylegan2_c2_8xb4-fp16-global-800kiters_quicktest-ffhq-256x256.py +++ /dev/null @@ -1,41 +0,0 @@ -"""Config for the `config-f` setting in StyleGAN2.""" - -_base_ = ['./stylegan2_c2_8xb4-800kiters_ffhq-256x256.py'] - -model = dict( - generator=dict(out_size=256, fp16_enabled=True), - discriminator=dict(in_size=256, fp16_enabled=True), - disc_auxiliary_loss=dict(data_info=dict(loss_scaler='loss_scaler')), - # gen_auxiliary_loss=dict(data_info=dict(loss_scaler='loss_scaler')), -) - -batch_size = 2 -dataset_type = 'QuickTestImageDataset' - -train_dataloader = dict(batch_size=batch_size, dataset=dict(type=dataset_type)) - -val_dataloader = dict(batch_size=batch_size, dataset=dict(type=dataset_type)) - -test_dataloader = dict( - batch_size=batch_size, dataset=dict(dataset_type=dataset_type)) - -default_hooks = dict(logger=dict(type='LoggerHook', interval=1)) - -train_cfg = dict(max_iters=800002) - -optim_wrapper = dict( - generator=dict(type='AmpOptimWrapper', loss_scale=512), - discriminator=dict(type='AmpOptimWrapper', loss_scale=512)) - -# METRICS -metrics = [ - dict( - type='FrechetInceptionDistance', - prefix='FID-Full-50k', - fake_nums=50000, - inception_style='StyleGAN', - sample_model='ema') -] - -val_evaluator = dict(metrics=metrics) -test_evaluator = dict(metrics=metrics) diff --git a/docs/en/.dev_scripts/update_model_zoo.py b/docs/en/.dev_scripts/update_model_zoo.py index 2025223cf3..2aa53298ee 100755 --- a/docs/en/.dev_scripts/update_model_zoo.py +++ b/docs/en/.dev_scripts/update_model_zoo.py @@ -6,13 +6,17 @@ import os import os.path as osp import re +from collections import OrderedDict from os.path import basename, dirname +from pathlib import Path -import numpy as np +# import numpy as np import titlecase +from modelindex.load_model_index import load from tqdm import tqdm github_link = 'https://github.com/open-mmlab/mmediting/blob/1.x/' +MMEDIT_ROOT = Path(__file__).absolute().parents[3] def anchor(name): @@ -28,6 +32,10 @@ def summarize(stats, name): [c for _, c, _, _, _, _, _ in stats]) allckpts = func.reduce(lambda a, b: a.union(b), [c for _, _, c, _, _, _, _ in stats]) + + for c in allpapers: + print('paper: ', c) + print(len(allpapers)) alltasks = func.reduce(lambda a, b: a.union(b), [t for _, _, _, t, _, _, _ in stats]) task_desc = '\n'.join([ @@ -36,10 +44,6 @@ def summarize(stats, name): ]) # Overview - papertypes, papercounts = np.unique([t for t, _ in allpapers], - return_counts=True) - countstr = '\n'.join( - [f' - {t}: {c}' for t, c in zip(papertypes, papercounts)]) countstr = '\n'.join([f' - ALGORITHM: {len(stats)}']) summary = f"""# {name} @@ -65,13 +69,19 @@ def summarize(stats, name): return summary -# Count algorithms def update_model_zoo(): + # target docs target_dir = 'model_zoo' - os.makedirs(target_dir, exist_ok=True) + # parse model-index.yml + model_index_file = MMEDIT_ROOT / 'model-index.yml' + model_index = load(str(model_index_file)) + model_index.build_models_with_collections() + models = OrderedDict({model.name: model for model in model_index.models}) + print(len(models.keys())) + root_dir = dirname(dirname(dirname(dirname(osp.abspath(__file__))))) files = sorted(glob.glob(osp.join(root_dir, 'configs/*/README.md'))) stats = [] @@ -110,7 +120,9 @@ def update_model_zoo(): # count configs configs = set(x.lower().strip() - for x in re.findall(r'/configs/.*?\.py', content)) + for x in re.findall(r'\(.*\.py\)', content)) + for c in list(configs): + print(c) # count ckpts ckpts = list( From b6815597258d7ec36fd16f7ee701686db7ffa18e Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Wed, 28 Dec 2022 14:15:32 +0800 Subject: [PATCH 36/44] [Enhancement] Cover more lines of cyclegan-module's unit test (#1536) cover more lines of cyclegan-module's unit test --- .../test_cyclegan/test_cyclegan_modules.py | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/test_models/test_editors/test_cyclegan/test_cyclegan_modules.py b/tests/test_models/test_editors/test_cyclegan/test_cyclegan_modules.py index 4f5d4cc16e..d92515d7e6 100644 --- a/tests/test_models/test_editors/test_cyclegan/test_cyclegan_modules.py +++ b/tests/test_models/test_editors/test_cyclegan/test_cyclegan_modules.py @@ -12,6 +12,9 @@ def test_residual_block_with_dropout(): output = block(input) assert output.detach().numpy().shape == (2, 16, 128, 128) + block = ResidualBlockWithDropout(16, 'zeros', use_dropout=False) + assert len(block.block) == 2 + def test_gan_image_buffer(): # test buffer size = 0 @@ -46,3 +49,28 @@ def test_gan_image_buffer(): and torch.equal(buffer.image_buffer[0], img_tensor_0)) or \ (torch.equal(img_tensor_return, img_tensor_00) and torch.equal(buffer.image_buffer[0], img_tensor_1)) + + # set buffer ratio as 1 and 0 to cover more lines + buffer = GANImageBuffer(buffer_size=1, buffer_ratio=1) + img_np = np.random.randn(2, 3, 256, 256) + img_tensor = torch.from_numpy(img_np) + img_tensor_0 = torch.unsqueeze(img_tensor[0], 0) + img_tensor_1 = torch.unsqueeze(img_tensor[1], 0) + img_tensor_00 = torch.cat([img_tensor_0, img_tensor_0], 0) + img_tensor_return = buffer.query(img_tensor) + assert (torch.equal(img_tensor_return, img_tensor) + and torch.equal(buffer.image_buffer[0], img_tensor_0)) or \ + (torch.equal(img_tensor_return, img_tensor_00) + and torch.equal(buffer.image_buffer[0], img_tensor_1)) + + buffer = GANImageBuffer(buffer_size=1, buffer_ratio=0) + img_np = np.random.randn(2, 3, 256, 256) + img_tensor = torch.from_numpy(img_np) + img_tensor_0 = torch.unsqueeze(img_tensor[0], 0) + img_tensor_1 = torch.unsqueeze(img_tensor[1], 0) + img_tensor_00 = torch.cat([img_tensor_0, img_tensor_0], 0) + img_tensor_return = buffer.query(img_tensor) + assert (torch.equal(img_tensor_return, img_tensor) + and torch.equal(buffer.image_buffer[0], img_tensor_0)) or \ + (torch.equal(img_tensor_return, img_tensor_00) + and torch.equal(buffer.image_buffer[0], img_tensor_1)) From 57d49ab2218ee18764b405868e2102d9432cf181 Mon Sep 17 00:00:00 2001 From: Yanhong Zeng Date: Thu, 29 Dec 2022 13:56:03 +0800 Subject: [PATCH 37/44] [Enhancement] Update model zoo (#1561) * add year and task in collections * update model zoo --- .dev_scripts/update_model_index.py | 8 +- configs/aot_gan/metafile.yml | 3 + configs/basicvsr/metafile.yml | 3 + configs/basicvsr_pp/metafile.yml | 3 + configs/biggan/metafile.yml | 3 + configs/cain/metafile.yml | 3 + configs/cyclegan/metafile.yml | 3 + configs/dcgan/metafile.yml | 3 + configs/deepfillv1/metafile.yml | 3 + configs/deepfillv2/metafile.yml | 3 + configs/dic/metafile.yml | 3 + configs/dim/metafile.yml | 3 + configs/disco_diffusion/metafile.yml | 5 + configs/edsr/metafile.yml | 3 + configs/edvr/metafile.yml | 3 + configs/eg3d/metafile.yml | 3 + configs/esrgan/metafile.yml | 3 + configs/flavr/metafile.yml | 3 + configs/gca/metafile.yml | 3 + configs/ggan/metafile.yml | 3 + configs/glean/metafile.yml | 3 + configs/global_local/metafile.yml | 3 + configs/guided_diffusion/metafile.yml | 3 + configs/iconvsr/metafile.yml | 3 + configs/indexnet/metafile.yml | 3 + configs/inst_colorization/metafile.yml | 3 + configs/liif/metafile.yml | 3 + configs/lsgan/metafile.yml | 3 + configs/nafnet/metafile.yml | 3 + configs/partial_conv/metafile.yml | 3 + configs/pggan/metafile.yml | 3 + configs/pix2pix/metafile.yml | 3 + configs/positional_encoding_in_gans/README.md | 2 +- .../positional_encoding_in_gans/metafile.yml | 3 + configs/rdn/metafile.yml | 3 + configs/real_basicvsr/metafile.yml | 3 + configs/real_esrgan/metafile.yml | 3 + configs/restormer/metafile.yml | 5 + configs/sagan/metafile.yml | 3 + configs/singan/metafile.yml | 3 + configs/sngan_proj/metafile.yml | 3 + configs/srcnn/metafile.yml | 3 + configs/srgan_resnet/metafile.yml | 3 + configs/styleganv1/metafile.yml | 3 + configs/styleganv2/metafile.yml | 3 + configs/styleganv3/metafile.yml | 3 + configs/tdan/metafile.yml | 3 + configs/tof/metafile.yml | 4 + configs/ttsr/metafile.yml | 3 + configs/wgan-gp/metafile.yml | 3 + docs/en/.dev_scripts/update_model_zoo.py | 277 ++++++------------ 51 files changed, 254 insertions(+), 182 deletions(-) diff --git a/.dev_scripts/update_model_index.py b/.dev_scripts/update_model_index.py index ecf655104e..672d3e18a8 100755 --- a/.dev_scripts/update_model_index.py +++ b/.dev_scripts/update_model_index.py @@ -144,13 +144,17 @@ def parse_md(md_file): Name=collection_name, Metadata={'Architecture': []}, README=readme, - Paper=[]) + Paper=[], + Task=[], + Year=0, + ) models = [] # force utf-8 instead of system defined with open(md_file, 'r', encoding='utf-8') as md: lines = md.readlines() i = 0 name = lines[0][2:] + year = re.sub('[^0-9]', '', name.split('(', 1)[-1]) name = name.split('(', 1)[0].strip() collection['Metadata']['Architecture'].append(name) collection['Name'] = name @@ -158,6 +162,8 @@ def parse_md(md_file): is_liif = collection_name.upper() == 'LIIF' task_line = lines[4] task = task_line.strip().split(':')[-1].strip() + collection['Task'] = task.lower().split(', ') + collection['Year'] = int(year) while i < len(lines): # parse reference if lines[i].startswith('> ['): diff --git a/configs/aot_gan/metafile.yml b/configs/aot_gan/metafile.yml index f4810ed5df..2db2984d57 100644 --- a/configs/aot_gan/metafile.yml +++ b/configs/aot_gan/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/pdf/2104.01431.pdf README: configs/aot_gan/README.md + Task: + - inpainting + Year: 2021 Models: - Config: configs/aot_gan/aot-gan_smpgan_4xb4_places-512x512.py In Collection: AOT-GAN diff --git a/configs/basicvsr/metafile.yml b/configs/basicvsr/metafile.yml index 5428476b32..697f825ec9 100644 --- a/configs/basicvsr/metafile.yml +++ b/configs/basicvsr/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/2012.02181 README: configs/basicvsr/README.md + Task: + - video super-resolution + Year: 2021 Models: - Config: configs/basicvsr/basicvsr_2xb4_reds4.py In Collection: BasicVSR diff --git a/configs/basicvsr_pp/metafile.yml b/configs/basicvsr_pp/metafile.yml index 281df9e87a..75e9017317 100644 --- a/configs/basicvsr_pp/metafile.yml +++ b/configs/basicvsr_pp/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/2104.13371 README: configs/basicvsr_pp/README.md + Task: + - video super-resolution + Year: 2022 Models: - Config: configs/basicvsr_pp/basicvsr-pp_c64n7_8xb1-600k_reds4.py In Collection: BasicVSR++ diff --git a/configs/biggan/metafile.yml b/configs/biggan/metafile.yml index ba91aad6c5..d346c1dd65 100644 --- a/configs/biggan/metafile.yml +++ b/configs/biggan/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://openreview.net/forum?id=B1xsqj09Fm README: configs/biggan/README.md + Task: + - conditional gans + Year: 2019 Models: - Config: configs/biggan/biggan_2xb25-500kiters_cifar10-32x32.py In Collection: BigGAN diff --git a/configs/cain/metafile.yml b/configs/cain/metafile.yml index 5a866fedbc..c2d94922ca 100644 --- a/configs/cain/metafile.yml +++ b/configs/cain/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://aaai.org/ojs/index.php/AAAI/article/view/6693/6547 README: configs/cain/README.md + Task: + - video interpolation + Year: 2020 Models: - Config: configs/cain/cain_g1b32_1xb5_vimeo90k-triplet.py In Collection: CAIN diff --git a/configs/cyclegan/metafile.yml b/configs/cyclegan/metafile.yml index 29e3eddfd5..d799b964a0 100644 --- a/configs/cyclegan/metafile.yml +++ b/configs/cyclegan/metafile.yml @@ -8,6 +8,9 @@ Collections: Paper: - https://openaccess.thecvf.com/content_iccv_2017/html/Zhu_Unpaired_Image-To-Image_Translation_ICCV_2017_paper.html README: configs/cyclegan/README.md + Task: + - image2image + Year: 2017 Models: - Config: configs/cyclegan/cyclegan_lsgan-resnet-in_1xb1-80kiters_facades.py In Collection: 'CycleGAN: Unpaired Image-to-Image Translation Using Cycle-Consistent diff --git a/configs/dcgan/metafile.yml b/configs/dcgan/metafile.yml index 5f549b9bce..2d201ff980 100644 --- a/configs/dcgan/metafile.yml +++ b/configs/dcgan/metafile.yml @@ -8,6 +8,9 @@ Collections: Paper: - https://arxiv.org/abs/1511.06434 README: configs/dcgan/README.md + Task: + - unconditional gans + Year: 2016 Models: - Config: configs/dcgan/dcgan_Glr4e-4_Dlr1e-4_1xb128-5kiters_mnist-64x64.py In Collection: Unsupervised Representation Learning with Deep Convolutional Generative diff --git a/configs/deepfillv1/metafile.yml b/configs/deepfillv1/metafile.yml index 968b448d38..c8a83d22a4 100644 --- a/configs/deepfillv1/metafile.yml +++ b/configs/deepfillv1/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/1801.07892 README: configs/deepfillv1/README.md + Task: + - inpainting + Year: 2018 Models: - Config: configs/deepfillv1/deepfillv1_8xb2_places-256x256.py In Collection: DeepFillv1 diff --git a/configs/deepfillv2/metafile.yml b/configs/deepfillv2/metafile.yml index d84dab7739..d0a57379e7 100644 --- a/configs/deepfillv2/metafile.yml +++ b/configs/deepfillv2/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/1806.03589 README: configs/deepfillv2/README.md + Task: + - inpainting + Year: 2019 Models: - Config: configs/deepfillv2/deepfillv2_8xb2_places-256x256.py In Collection: DeepFillv2 diff --git a/configs/dic/metafile.yml b/configs/dic/metafile.yml index 51d63d50d8..713931d1b1 100644 --- a/configs/dic/metafile.yml +++ b/configs/dic/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/2003.13063 README: configs/dic/README.md + Task: + - image super-resolution + Year: 2020 Models: - Config: configs/dic/dic_x8c48b6_4xb2-150k_celeba-hq.py In Collection: DIC diff --git a/configs/dim/metafile.yml b/configs/dim/metafile.yml index a158b7a1a9..bf4087954e 100644 --- a/configs/dim/metafile.yml +++ b/configs/dim/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/1703.03872 README: configs/dim/README.md + Task: + - matting + Year: 2017 Models: - Config: configs/dim/dim_stage1-v16_1xb1-1000k_comp1k.py In Collection: DIM diff --git a/configs/disco_diffusion/metafile.yml b/configs/disco_diffusion/metafile.yml index a53a0fb304..dd0163309c 100644 --- a/configs/disco_diffusion/metafile.yml +++ b/configs/disco_diffusion/metafile.yml @@ -6,6 +6,11 @@ Collections: Paper: - https://github.com/alembics/disco-diffusion README: configs/disco_diffusion/README.md + Task: + - text2image + - image2image + - diffusion + Year: 2022 Models: - Config: configs/disco_diffusion/disco-diffusion_adm-u-finetuned_imagenet-512x512.py In Collection: Disco Diffusion diff --git a/configs/edsr/metafile.yml b/configs/edsr/metafile.yml index 481e6ef5ac..9dba8bb33f 100644 --- a/configs/edsr/metafile.yml +++ b/configs/edsr/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/1707.02921 README: configs/edsr/README.md + Task: + - image super-resolution + Year: 2017 Models: - Config: configs/edsr/edsr_x2c64b16_1xb16-300k_div2k.py In Collection: EDSR diff --git a/configs/edvr/metafile.yml b/configs/edvr/metafile.yml index dd7ca2fd59..c5669c4fe1 100644 --- a/configs/edvr/metafile.yml +++ b/configs/edvr/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/1905.02716?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%253A+arxiv%252FQSXk+%2528ExcitingAds%2521+cs+updates+on+arXiv.org%2529 README: configs/edvr/README.md + Task: + - video super-resolution + Year: 2019 Models: - Config: configs/edvr/edvrm_wotsa_8xb4-600k_reds.py In Collection: EDVR diff --git a/configs/eg3d/metafile.yml b/configs/eg3d/metafile.yml index 6cabb8a37c..8efc14266d 100644 --- a/configs/eg3d/metafile.yml +++ b/configs/eg3d/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://openaccess.thecvf.com/content/CVPR2022/html/Chan_Efficient_Geometry-Aware_3D_Generative_Adversarial_Networks_CVPR_2022_paper.html README: configs/eg3d/README.md + Task: + - 3d-aware generation + Year: 2022 Models: - Config: configs/eg3d/eg3d_cvt-official-rgb_shapenet-128x128.py In Collection: EG3D diff --git a/configs/esrgan/metafile.yml b/configs/esrgan/metafile.yml index 184485f817..3b71708a83 100644 --- a/configs/esrgan/metafile.yml +++ b/configs/esrgan/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/1809.00219 README: configs/esrgan/README.md + Task: + - image super-resolution + Year: 2018 Models: - Config: configs/esrgan/esrgan_psnr-x4c64b23g32_1xb16-1000k_div2k.py In Collection: ESRGAN diff --git a/configs/flavr/metafile.yml b/configs/flavr/metafile.yml index 0b0d70b430..d57958d755 100644 --- a/configs/flavr/metafile.yml +++ b/configs/flavr/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/pdf/2012.08512.pdf README: configs/flavr/README.md + Task: + - video interpolation + Year: 2020 Models: - Config: configs/flavr/flavr_in4out1_8xb4_vimeo90k-septuplet.py In Collection: FLAVR diff --git a/configs/gca/metafile.yml b/configs/gca/metafile.yml index 01be20817f..b65883c04c 100644 --- a/configs/gca/metafile.yml +++ b/configs/gca/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/2001.04069 README: configs/gca/README.md + Task: + - matting + Year: 2020 Models: - Config: configs/gca/baseline_r34_4xb10-200k_comp1k.py In Collection: GCA diff --git a/configs/ggan/metafile.yml b/configs/ggan/metafile.yml index e545e21b65..b01e5bef52 100644 --- a/configs/ggan/metafile.yml +++ b/configs/ggan/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/1705.02894 README: configs/ggan/README.md + Task: + - unconditional gans + Year: 2017 Models: - Config: configs/ggan/ggan_dcgan-archi_lr1e-3-1xb128-12Mimgs_celeba-cropped-64x64.py In Collection: GGAN diff --git a/configs/glean/metafile.yml b/configs/glean/metafile.yml index cd62fca475..54a3d932d3 100644 --- a/configs/glean/metafile.yml +++ b/configs/glean/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/2012.00739 README: configs/glean/README.md + Task: + - image super-resolution + Year: 2021 Models: - Config: configs/glean/glean_x8_2xb8_cat.py In Collection: GLEAN diff --git a/configs/global_local/metafile.yml b/configs/global_local/metafile.yml index e123af05ff..af45dc1945 100644 --- a/configs/global_local/metafile.yml +++ b/configs/global_local/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - http://iizuka.cs.tsukuba.ac.jp/projects/completion/data/completion_sig2017.pdf README: configs/global_local/README.md + Task: + - inpainting + Year: 2017 Models: - Config: configs/global_local/gl_8xb12_places-256x256.py In Collection: Global&Local diff --git a/configs/guided_diffusion/metafile.yml b/configs/guided_diffusion/metafile.yml index 8d8713eebb..c77e2d9908 100644 --- a/configs/guided_diffusion/metafile.yml +++ b/configs/guided_diffusion/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://papers.nips.cc/paper/2021/file/49ad23d1ec9fa4bd8d77d02681df5cfa-Paper.pdf README: configs/guided_diffusion/README.md + Task: + - image generation + Year: 2021 Models: - Config: configs/guided_diffusion/adm-u_8xb32_imagenet-64x64.py In Collection: Guided Diffusion diff --git a/configs/iconvsr/metafile.yml b/configs/iconvsr/metafile.yml index 8b92f4ec08..f9e58680b5 100644 --- a/configs/iconvsr/metafile.yml +++ b/configs/iconvsr/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/2012.02181 README: configs/iconvsr/README.md + Task: + - video super-resolution + Year: 2021 Models: - Config: configs/iconvsr/iconvsr_2xb4_reds4.py In Collection: IconVSR diff --git a/configs/indexnet/metafile.yml b/configs/indexnet/metafile.yml index 7330abdc8f..d141bfece4 100644 --- a/configs/indexnet/metafile.yml +++ b/configs/indexnet/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/1908.00672 README: configs/indexnet/README.md + Task: + - matting + Year: 2019 Models: - Config: configs/indexnet/indexnet_mobv2_1xb16-78k_comp1k.py In Collection: IndexNet diff --git a/configs/inst_colorization/metafile.yml b/configs/inst_colorization/metafile.yml index eee2d2a606..aba5ed83e9 100644 --- a/configs/inst_colorization/metafile.yml +++ b/configs/inst_colorization/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://openaccess.thecvf.com/content_CVPR_2020/html/Su_Instance-Aware_Image_Colorization_CVPR_2020_paper.html README: configs/inst_colorization/README.md + Task: + - colorization + Year: 2020 Models: - Config: configs/inst_colorization/inst-colorizatioon_full_official_cocostuff-256x256.py In Collection: Instance-aware Image Colorization diff --git a/configs/liif/metafile.yml b/configs/liif/metafile.yml index 465ba6c525..933acee0fe 100644 --- a/configs/liif/metafile.yml +++ b/configs/liif/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/2012.09161 README: configs/liif/README.md + Task: + - image super-resolution + Year: 2021 Models: - Config: configs/liif/liif-edsr-norm_c64b16_1xb16-1000k_div2k.py In Collection: LIIF diff --git a/configs/lsgan/metafile.yml b/configs/lsgan/metafile.yml index d7ce0fc2f5..917c313449 100644 --- a/configs/lsgan/metafile.yml +++ b/configs/lsgan/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://openaccess.thecvf.com/content_iccv_2017/html/Mao_Least_Squares_Generative_ICCV_2017_paper.html README: configs/lsgan/README.md + Task: + - unconditional gans + Year: 2017 Models: - Config: configs/lsgan/lsgan_dcgan-archi_lr1e-3-1xb128-12Mimgs_celeba-cropped-64x64.py In Collection: LSGAN diff --git a/configs/nafnet/metafile.yml b/configs/nafnet/metafile.yml index 32f8520a3c..3a2b913d00 100644 --- a/configs/nafnet/metafile.yml +++ b/configs/nafnet/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/2204.04676 README: configs/nafnet/README.md + Task: + - image restoration + Year: 2022 Models: - Config: configs/nafnet/nafnet_c64eb2248mb12db2222_8xb8-lr1e-3-400k_sidd.py In Collection: NAFNet diff --git a/configs/partial_conv/metafile.yml b/configs/partial_conv/metafile.yml index 3fe5dcbda0..41d7ea013b 100644 --- a/configs/partial_conv/metafile.yml +++ b/configs/partial_conv/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/1804.07723 README: configs/partial_conv/README.md + Task: + - inpainting + Year: 2018 Models: - Config: configs/partial_conv/pconv_stage1_8xb12_places-256x256.py In Collection: PConv diff --git a/configs/pggan/metafile.yml b/configs/pggan/metafile.yml index c8b6f71ca4..52b2b08c4f 100644 --- a/configs/pggan/metafile.yml +++ b/configs/pggan/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/1710.10196 README: configs/pggan/README.md + Task: + - unconditional gans + Year: 2018 Models: - Config: configs/pggan/pggan_8xb4-12Mimgs_celeba-cropped-128x128.py In Collection: PGGAN diff --git a/configs/pix2pix/metafile.yml b/configs/pix2pix/metafile.yml index 1344b00198..b0a321d61c 100644 --- a/configs/pix2pix/metafile.yml +++ b/configs/pix2pix/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://openaccess.thecvf.com/content_cvpr_2017/html/Isola_Image-To-Image_Translation_With_CVPR_2017_paper.html README: configs/pix2pix/README.md + Task: + - image2image + Year: 2017 Models: - Config: configs/pix2pix/pix2pix_vanilla-unet-bn_1xb1-80kiters_facades.py In Collection: Pix2Pix diff --git a/configs/positional_encoding_in_gans/README.md b/configs/positional_encoding_in_gans/README.md index 54d7ed8412..f78e0ca7d2 100644 --- a/configs/positional_encoding_in_gans/README.md +++ b/configs/positional_encoding_in_gans/README.md @@ -1,4 +1,4 @@ -# Positional Encoding in GANs +# Positional Encoding in GANs (CVPR'2021) > [Positional Encoding as Spatial Inductive Bias in GANs](https://openaccess.thecvf.com/content/CVPR2021/html/Xu_Positional_Encoding_As_Spatial_Inductive_Bias_in_GANs_CVPR_2021_paper.html) diff --git a/configs/positional_encoding_in_gans/metafile.yml b/configs/positional_encoding_in_gans/metafile.yml index 8cbea69b6d..f46e4fdd62 100644 --- a/configs/positional_encoding_in_gans/metafile.yml +++ b/configs/positional_encoding_in_gans/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://openaccess.thecvf.com/content/CVPR2021/html/Xu_Positional_Encoding_As_Spatial_Inductive_Bias_in_GANs_CVPR_2021_paper.html README: configs/positional_encoding_in_gans/README.md + Task: + - unconditional gans + Year: 2021 Models: - Config: configs/positional_encoding_in_gans/stylegan2_c2_8xb3-1100kiters_ffhq-256x256.py In Collection: Positional Encoding in GANs diff --git a/configs/rdn/metafile.yml b/configs/rdn/metafile.yml index 0a6c9f2055..4abdd146aa 100644 --- a/configs/rdn/metafile.yml +++ b/configs/rdn/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/1802.08797 README: configs/rdn/README.md + Task: + - image super-resolution + Year: 2018 Models: - Config: configs/rdn/rdn_x4c64b16_1xb16-1000k_div2k.py In Collection: RDN diff --git a/configs/real_basicvsr/metafile.yml b/configs/real_basicvsr/metafile.yml index 2ff2d21612..825560fed6 100644 --- a/configs/real_basicvsr/metafile.yml +++ b/configs/real_basicvsr/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/2111.12704 README: configs/real_basicvsr/README.md + Task: + - video super-resolution + Year: 2022 Models: - Config: configs/real_basicvsr/realbasicvsr_c64b20-1x30x8_8xb1-lr5e-5-150k_reds.py In Collection: RealBasicVSR diff --git a/configs/real_esrgan/metafile.yml b/configs/real_esrgan/metafile.yml index f58b4ec7e9..ac94674d2f 100644 --- a/configs/real_esrgan/metafile.yml +++ b/configs/real_esrgan/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/2107.10833 README: configs/real_esrgan/README.md + Task: + - image super-resolution + Year: 2021 Models: - Config: configs/real_esrgan/realesrnet_c64b23g32_4xb12-lr2e-4-1000k_df2k-ost.py In Collection: Real-ESRGAN diff --git a/configs/restormer/metafile.yml b/configs/restormer/metafile.yml index dbb62c29f7..e6741f5e77 100644 --- a/configs/restormer/metafile.yml +++ b/configs/restormer/metafile.yml @@ -6,6 +6,11 @@ Collections: Paper: - https://arxiv.org/abs/2111.09881 README: configs/restormer/README.md + Task: + - denoising + - deblurring + - deraining + Year: 2022 Models: - Config: configs/restormer/restormer_official_rain13k.py In Collection: Restormer diff --git a/configs/sagan/metafile.yml b/configs/sagan/metafile.yml index be7836aaf5..43c95f81a0 100644 --- a/configs/sagan/metafile.yml +++ b/configs/sagan/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://proceedings.mlr.press/v97/zhang19d.html README: configs/sagan/README.md + Task: + - conditional gans + Year: 2019 Models: - Config: configs/sagan/sagan_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py In Collection: SAGAN diff --git a/configs/singan/metafile.yml b/configs/singan/metafile.yml index 82ba78f349..5cae1250b7 100644 --- a/configs/singan/metafile.yml +++ b/configs/singan/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://openaccess.thecvf.com/content_ICCV_2019/html/Shaham_SinGAN_Learning_a_Generative_Model_From_a_Single_Natural_Image_ICCV_2019_paper.html README: configs/singan/README.md + Task: + - internal learning + Year: 2019 Models: - Config: configs/singan/singan_balloons.py In Collection: SinGAN diff --git a/configs/sngan_proj/metafile.yml b/configs/sngan_proj/metafile.yml index 37efed84ea..b6f5067693 100644 --- a/configs/sngan_proj/metafile.yml +++ b/configs/sngan_proj/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://openreview.net/forum?id=B1QRgziT- README: configs/sngan_proj/README.md + Task: + - conditional gans + Year: 2018 Models: - Config: configs/sngan_proj/sngan-proj_woReLUinplace_lr2e-4-ndisc5-1xb64_cifar10-32x32.py In Collection: SNGAN diff --git a/configs/srcnn/metafile.yml b/configs/srcnn/metafile.yml index 39ffe96499..778d67b92a 100644 --- a/configs/srcnn/metafile.yml +++ b/configs/srcnn/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/1501.00092 README: configs/srcnn/README.md + Task: + - image super-resolution + Year: 2015 Models: - Config: configs/srcnn/srcnn_x4k915_1xb16-1000k_div2k.py In Collection: SRCNN diff --git a/configs/srgan_resnet/metafile.yml b/configs/srgan_resnet/metafile.yml index bace23e8a9..c80cb0aa74 100644 --- a/configs/srgan_resnet/metafile.yml +++ b/configs/srgan_resnet/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/1609.04802 README: configs/srgan_resnet/README.md + Task: + - image super-resolution + Year: 2016 Models: - Config: configs/srgan_resnet/msrresnet_x4c64b16_1xb16-1000k_div2k.py In Collection: SRGAN diff --git a/configs/styleganv1/metafile.yml b/configs/styleganv1/metafile.yml index 812f8aaf16..30611fdbe5 100644 --- a/configs/styleganv1/metafile.yml +++ b/configs/styleganv1/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://openaccess.thecvf.com/content_CVPR_2019/html/Karras_A_Style-Based_Generator_Architecture_for_Generative_Adversarial_Networks_CVPR_2019_paper.html README: configs/styleganv1/README.md + Task: + - unconditional gans + Year: 2019 Models: - Config: configs/styleganv1/styleganv1_ffhq-256x256_8xb4-25Mimgs.py In Collection: StyleGANv1 diff --git a/configs/styleganv2/metafile.yml b/configs/styleganv2/metafile.yml index 2badbaec55..ff6883d861 100644 --- a/configs/styleganv2/metafile.yml +++ b/configs/styleganv2/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://openaccess.thecvf.com/content_CVPR_2020/html/Karras_Analyzing_and_Improving_the_Image_Quality_of_StyleGAN_CVPR_2020_paper.html README: configs/styleganv2/README.md + Task: + - unconditional gans + Year: 2020 Models: - Config: configs/styleganv2/stylegan2_c2_8xb4_ffhq-1024x1024.py In Collection: StyleGANv2 diff --git a/configs/styleganv3/metafile.yml b/configs/styleganv3/metafile.yml index 97a2d263df..4224b0e174 100644 --- a/configs/styleganv3/metafile.yml +++ b/configs/styleganv3/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://nvlabs-fi-cdn.nvidia.com/stylegan3/stylegan3-paper.pdf README: configs/styleganv3/README.md + Task: + - unconditional gans + Year: 2021 Models: - Config: configs/styleganv3/stylegan3-t_gamma32.8_8xb4-fp16-noaug_ffhq-1024x1024.py In Collection: StyleGANv3 diff --git a/configs/tdan/metafile.yml b/configs/tdan/metafile.yml index c0f780b475..5bb95de354 100644 --- a/configs/tdan/metafile.yml +++ b/configs/tdan/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/1812.02898 README: configs/tdan/README.md + Task: + - video super-resolution + Year: 2020 Models: - Config: configs/tdan/tdan_x4_8xb16-lr1e-4-400k_vimeo90k-bi.py In Collection: TDAN diff --git a/configs/tof/metafile.yml b/configs/tof/metafile.yml index 4f4bfff379..517e60ae56 100644 --- a/configs/tof/metafile.yml +++ b/configs/tof/metafile.yml @@ -6,6 +6,10 @@ Collections: Paper: - https://arxiv.org/abs/1711.09078 README: configs/tof/README.md + Task: + - video interpolation + - video super-resolution + Year: 2019 Models: - Config: configs/tof/tof_spynet-chair-wobn_1xb1_vimeo90k-triplet.py In Collection: TOFlow diff --git a/configs/ttsr/metafile.yml b/configs/ttsr/metafile.yml index 559b4fe754..b48de2a895 100644 --- a/configs/ttsr/metafile.yml +++ b/configs/ttsr/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/2006.04139 README: configs/ttsr/README.md + Task: + - image super-resolution + Year: 2020 Models: - Config: configs/ttsr/ttsr-rec_x4c64b16_1xb9-200k_CUFED.py In Collection: TTSR diff --git a/configs/wgan-gp/metafile.yml b/configs/wgan-gp/metafile.yml index 54979c2263..c2cfc69cbb 100644 --- a/configs/wgan-gp/metafile.yml +++ b/configs/wgan-gp/metafile.yml @@ -6,6 +6,9 @@ Collections: Paper: - https://arxiv.org/abs/1704.00028 README: configs/wgan-gp/README.md + Task: + - unconditional gans + Year: 2017 Models: - Config: configs/wgan-gp/wgangp_GN_1xb64-160kiters_celeba-cropped-128x128.py In Collection: WGAN-GP diff --git a/docs/en/.dev_scripts/update_model_zoo.py b/docs/en/.dev_scripts/update_model_zoo.py index 2aa53298ee..ce8f16651e 100755 --- a/docs/en/.dev_scripts/update_model_zoo.py +++ b/docs/en/.dev_scripts/update_model_zoo.py @@ -1,199 +1,116 @@ -#!/usr/bin/env python -# Copyright (c) OpenMMLab. All rights reserved. - -import functools as func -import glob import os -import os.path as osp -import re -from collections import OrderedDict -from os.path import basename, dirname +from glob import glob +from os import path as osp from pathlib import Path -# import numpy as np -import titlecase from modelindex.load_model_index import load from tqdm import tqdm -github_link = 'https://github.com/open-mmlab/mmediting/blob/1.x/' MMEDIT_ROOT = Path(__file__).absolute().parents[3] +TARGET_ROOT = Path(__file__).absolute().parents[1] / 'model_zoo' -def anchor(name): - return re.sub(r'-+', '-', - re.sub(r'[^a-zA-Z0-9\+]', '-', - name.strip().lower())).strip('-') +def write_file(file, content): + os.makedirs(osp.dirname(file), exist_ok=True) + with open(file, 'w') as f: + f.write(content) -def summarize(stats, name): - allpapers = func.reduce(lambda a, b: a.union(b), - [p for p, _, _, _, _, _, _ in stats]) - allconfigs = func.reduce(lambda a, b: a.union(b), - [c for _, c, _, _, _, _, _ in stats]) - allckpts = func.reduce(lambda a, b: a.union(b), - [c for _, _, c, _, _, _, _ in stats]) +def update_model_zoo(): + """load collections and models from model index, return summary, + collections and models.""" + model_index_file = MMEDIT_ROOT / 'model-index.yml' + model_index = load(str(model_index_file)) + model_index.build_models_with_collections() - for c in allpapers: - print('paper: ', c) - print(len(allpapers)) - alltasks = func.reduce(lambda a, b: a.union(b), - [t for _, _, _, t, _, _, _ in stats]) + # parse model_index according to task + tasks = {} + full_models = set() + for model in model_index.models: + full_models.add(model.full_model) + for r in model.results: + _task = r.task.lower().split(', ') + for t in _task: + if t not in tasks: + tasks[t] = set() + tasks[t].add(model.full_model) + + # assert the number of configs with the number of files + collections = set([m.in_collection for m in full_models]) + assert len(collections) == len(os.listdir(MMEDIT_ROOT / 'configs')) - 1 + + configs = set([str(MMEDIT_ROOT / m.config) for m in full_models]) + base_configs = glob( + str(MMEDIT_ROOT / 'configs/_base_/**/*.py'), recursive=True) + all_configs = glob(str(MMEDIT_ROOT / 'configs/**/*.py'), recursive=True) + valid_configs = set(all_configs) - set(base_configs) + untrackable_configs = valid_configs - configs + assert len(untrackable_configs) == 0, '/n'.join( + list(untrackable_configs)) + ' are not trackable.' + + # write for overview.md + papers = set() + for m in full_models: + papers.update(m.paper) + checkpoints = set( + [m.weights for m in full_models if m.weights.startswith('https:')]) task_desc = '\n'.join([ - f" - [{task}]({task.replace('-', '_').replace(' ', '_').lower()}.md)" # noqa - for task in list(alltasks) + f" - [{t}]({t.replace('-', '_').replace(' ', '_')}.md)" + for t in list(tasks.keys()) ]) - # Overview - countstr = '\n'.join([f' - ALGORITHM: {len(stats)}']) - - summary = f"""# {name} -""" - - if name != 'Overview': - summary += '\n## Summary' - - summary += f""" -* Number of checkpoints: {len(allckpts)} -* Number of configs: {len(allconfigs)} -* Number of papers: {len(allpapers)} -{countstr} - """ - - if name == 'Overview': - summary += f""" -* Tasks: -{task_desc} - -""" + # write overview.md + overview = (f'# Overview\n\n' + f'* Number of checkpoints: {len(checkpoints)}\n' + f'* Number of configs: {len(configs)}\n' + f'* Number of papers: {len(papers)}\n' + f' - ALGORITHM: {len(collections)}\n\n' + f'* Tasks:\n{task_desc}') + write_file(TARGET_ROOT / 'overview.md', overview) - return summary - - -def update_model_zoo(): - - # target docs - target_dir = 'model_zoo' - os.makedirs(target_dir, exist_ok=True) - - # parse model-index.yml - model_index_file = MMEDIT_ROOT / 'model-index.yml' - model_index = load(str(model_index_file)) - model_index.build_models_with_collections() - models = OrderedDict({model.name: model for model in model_index.models}) - print(len(models.keys())) - - root_dir = dirname(dirname(dirname(dirname(osp.abspath(__file__))))) - files = sorted(glob.glob(osp.join(root_dir, 'configs/*/README.md'))) - stats = [] - - for f in tqdm(files, desc='update model zoo'): - with open(f, 'r') as content_file: - content = content_file.read() - - # title - title = content.split('\n')[0].replace('#', '') - year = title.split('\'')[-1].split(')')[0] - - # count papers - papers = set( - (papertype, - titlecase.titlecase(paper.lower().strip()).replace('+', r'\+')) - for (papertype, paper) in re.findall( - r'\s*\n.*?\btitle\s*=\s*{(.*?)}', - content, re.DOTALL)) - - # paper links - revcontent = '\n'.join(list(reversed(content.splitlines()))) - paperlinks = {} - for _, p in papers: - paper_link = osp.join(github_link, 'configs', basename(dirname(f)), - 'README.md') - # print(p, paper_link) - paperlinks[p] = ' '.join( - (f'[⇨]({paper_link}#{anchor(paperlink)})' - for paperlink in re.findall( - rf'\btitle\s*=\s*{{\s*{p}\s*}}.*?\n## (.*?)\s*[,;]?\s*\n', - revcontent, re.DOTALL | re.IGNORECASE))) - # print(' ', paperlinks[p]) - paperlist = '\n'.join( - sorted(f' - [{t}] {x} ({paperlinks[x]})' for t, x in papers)) - - # count configs - configs = set(x.lower().strip() - for x in re.findall(r'\(.*\.py\)', content)) - for c in list(configs): - print(c) - - # count ckpts - ckpts = list( - x.lower().strip() - for x in re.findall(r'\[model\]\(https\:\/\/.*\.pth', content)) - ckpts.extend( - x.lower().strip() - for x in re.findall(r'\[ckpt\]\(https\:\/\/.*\.pth', content)) - ckpts = set(ckpts) - - # count tasks - task_desc = list( - set(x.lower().strip() - for x in re.findall(r'\*\*Task\*\*: .*', content))) - tasks = set() - if len(task_desc) > 0: - tasks = set(task_desc[0].split('**task**: ')[1].split(', ')) - - statsmsg = f"""## {title}""" - if len(tasks) > 0: - statsmsg += f"\n* Tasks: {','.join(list(tasks))}" - statsmsg += f""" - -* Number of checkpoints: {len(ckpts)} -* Number of configs: {len(configs)} -* Number of papers: {len(papers)} -{paperlist} - -""" - # * We should have: {len(glob.glob(osp.join(dirname(f), '*.py')))} - content = content.replace('# ', '## ') - stats.append((papers, configs, ckpts, tasks, year, statsmsg, content)) - - # overview - overview = summarize(stats, 'Overview') - with open(osp.join(target_dir, 'overview.md'), 'w') as f: - f.write(overview) - - alltasks = func.reduce(lambda a, b: a.union(b), - [t for _, _, _, t, _, _, _ in stats]) - - # index.rst - indexmsg = """ -.. toctree:: - :maxdepth: 1 - :caption: Model Zoo - - overview.md -""" - - for task in alltasks: - task = task.replace(' ', '_').replace('-', '_').lower() - indexmsg += f' {task}.md\n' - - with open(osp.join(target_dir, 'index.rst'), 'w') as f: - f.write(indexmsg) - - # task-specific - for task in alltasks: - filtered_model = [ - (paper, config, ckpt, tasks, year, x, content) - for paper, config, ckpt, tasks, year, x, content in stats - if task in tasks - ] - filtered_model = sorted(filtered_model, key=lambda x: x[-3])[::-1] - overview = summarize(filtered_model, task) - - msglist = '\n'.join(x for _, _, _, _, _, _, x in filtered_model) - task = task.replace(' ', '_').replace('-', '_').lower() - with open(osp.join(target_dir, f'{task}.md'), 'w') as f: - f.write(overview + '\n' + msglist) + # write for index.rst + task_desc = '\n'.join([ + f" {t.replace('-', '_').replace(' ', '_')}.md" + for t in list(tasks.keys()) + ]) + overview = (f'.. toctree::\n' + f' :maxdepth: 1\n' + f' :caption: Model Zoo\n\n' + f' overview.md\n' + f'{task_desc}') + write_file(TARGET_ROOT / 'index.rst', overview) + + # write for all the tasks + for task, models in tqdm(tasks.items(), desc='create markdown files'): + target_md = f"{task.replace('-', '_').replace(' ', '_')}.md" + target_md = TARGET_ROOT / target_md + models = sorted(models, key=lambda x: -x.data['Year']) + + checkpoints = set( + [m.weights for m in models if m.weights.startswith('https:')]) + collections = set([m.in_collection for m in models]) + + papers = set() + for m in models: + papers.update(m.paper) + + content = '' + readme = set() + for m in models: + if m.readme not in readme: + readme.add(m.readme) + with open(MMEDIT_ROOT / m.readme, 'r') as f: + c = f.read() + content += c.replace('# ', '## ') + overview = (f'# {task}\n\n' + f'## Summary\n' + f'* Number of checkpoints: {len(checkpoints)}\n' + f'* Number of configs: {len(models)}\n' + f'* Number of papers: {len(papers)}\n' + f' - ALGORITHM: {len(collections)}\n\n' + f'{content}') + + write_file(target_md, overview) if __name__ == '__main__': From c9ef99bbb5b6c46fbebcd7d858a0239f9312f7b8 Mon Sep 17 00:00:00 2001 From: rangoliu Date: Fri, 30 Dec 2022 10:47:18 +0800 Subject: [PATCH 38/44] [feature] support stable diffusion inference (#1502) * [sd] add files and run good. * [sd] misc change. * [sd] remove unused files. * [sd] directly load 7 submodels. * [sd] make pipeline clear * [sd] remove unrelated scheduler * [sd] use our own scheduler * [sd] rm schedulers and outputs data structures * [sd] replace log with mmengine log * [sd] rm utils dir * [sd] remove configure utils and model utils * [sd] move transformer models to clip wrapper. * [sd] load resource from url. * [sd] remove utils and accelerate related * [sd] remove utils * [sd] seperate vae from unet. * [sd] move vae outside. * [sd] move conditional unet to ddpm * [sd] add stable unet to denoisenet. * [sd] use denoising unet in ddpm and run good. * [sd] unet forward with stable type * [sd] delete unused code. * [sd] remove default parameters * [sd] add copy right and format clip_wrapper.py * [sd] format vae.py * [sd] formate stable_diffuser.py * [sd] append to last commit * [sd] format unet_blocks.py * [sd] format files. * [sd] format init.py * [sd] format demo * [sd] format config * [sd] add docsting. * [sd] add transformers dependency. * [sd] rename to stablediffusion. * [sd] add docstr in stable_diffusion.py * [sd] fix linter complain * [sd] res_block.py add docstring. * [sd] add docstring for vae.py * [sd] fix linter. * [sd] add docstrings for unet_blocks.py * [sd] stable diffusin return torch tensor * [sd] run linter. * [sd] add docstr * [sd] add docstring * [sd] put load ckpt together. * [sd] misc change * [sd] add clip wrapper ut. * [sd] add stable_diffusion ut * [sd] sd ut skip windows cuda * [sd] add vae ut. * [sd] fix linter. * [sd] fix vae ut. * [sd] add ddpm ddim ut and remove unused block * [sd] remove ut untested code. * [sd] add resblock ut * [sd] add resblock ut. * [sd] add attention ut. * [sd] add unet clock ut. * [sd] add embeddings ut. * [sd] add unet block ut. * [sd] add denoising unet ut. * [sd] add vae ut. * [sd] ddim ut * [sd] add ddim ddpm ut * [sd] add ut. * [ad] add attention ut. * [sd] remove useless code. * [sd] add sd ut. * [sd] add ddpm ut. * [sd] rename config. * [sd] put function inside timestep class. * [sd] use basemodel for sd. * [sd] add check for silu * [sd] fix tpo. * [sd] add ut. * [sd] add ut for unet_blocks.py * [sd] add ut. * [sd] load pretrained weights as mm way. * [sd] rename device. * [sd] remove main function in test files. * [sd] add readme and remove demo. * [sd] add stable diffusion readme. * [sd] load pretrained ckpt by diffusers. * [sd] update readme. * [sd] fix clip_wrapper ut. * [sd] format sd config. * [sd] update metafile.yml * [sd] try import transformers. --- configs/stable_diffusion/README.md | 67 ++ configs/stable_diffusion/metafile.yml | 22 + .../stable-diffusion_ddim_denoisingunet.py | 58 + mmedit/models/editors/__init__.py | 4 +- mmedit/models/editors/ddim/ddim_scheduler.py | 13 +- mmedit/models/editors/ddpm/attention.py | 560 ++++++++++ mmedit/models/editors/ddpm/ddpm_scheduler.py | 17 +- mmedit/models/editors/ddpm/denoising_unet.py | 591 ++++++++--- mmedit/models/editors/ddpm/embeddings.py | 95 ++ mmedit/models/editors/ddpm/res_blocks.py | 247 +++++ mmedit/models/editors/ddpm/unet_blocks.py | 594 +++++++++++ .../editors/stable_diffusion/__init__.py | 4 + .../editors/stable_diffusion/clip_wrapper.py | 187 ++++ .../stable_diffusion/stable_diffusion.py | 505 +++++++++ mmedit/models/editors/stable_diffusion/vae.py | 998 ++++++++++++++++++ model-index.yml | 1 + requirements/optional.txt | 1 + requirements/tests.txt | 1 + .../test_ddim/test_ddim_scheduler.py | 52 + .../test_editors/test_ddpm/test_attention.py | 39 + .../test_ddpm/test_ddpm_scheduler.py | 42 + .../test_ddpm/test_denoising_unet.py | 20 + .../test_editors/test_ddpm/test_embeddings.py | 25 + .../test_editors/test_ddpm/test_res_blocks.py | 34 + .../test_ddpm/test_unet_blocks.py | 46 + .../test_clip_wrapper.py | 54 + .../test_stable_diffusion.py | 121 +++ .../test_stable_diffusion/test_vae.py | 66 ++ 28 files changed, 4311 insertions(+), 153 deletions(-) create mode 100644 configs/stable_diffusion/README.md create mode 100644 configs/stable_diffusion/metafile.yml create mode 100644 configs/stable_diffusion/stable-diffusion_ddim_denoisingunet.py create mode 100644 mmedit/models/editors/ddpm/attention.py create mode 100644 mmedit/models/editors/ddpm/embeddings.py create mode 100644 mmedit/models/editors/ddpm/res_blocks.py create mode 100644 mmedit/models/editors/ddpm/unet_blocks.py create mode 100644 mmedit/models/editors/stable_diffusion/__init__.py create mode 100644 mmedit/models/editors/stable_diffusion/clip_wrapper.py create mode 100644 mmedit/models/editors/stable_diffusion/stable_diffusion.py create mode 100644 mmedit/models/editors/stable_diffusion/vae.py create mode 100644 tests/test_models/test_editors/test_ddim/test_ddim_scheduler.py create mode 100644 tests/test_models/test_editors/test_ddpm/test_attention.py create mode 100644 tests/test_models/test_editors/test_ddpm/test_ddpm_scheduler.py create mode 100644 tests/test_models/test_editors/test_ddpm/test_denoising_unet.py create mode 100644 tests/test_models/test_editors/test_ddpm/test_embeddings.py create mode 100644 tests/test_models/test_editors/test_ddpm/test_res_blocks.py create mode 100644 tests/test_models/test_editors/test_ddpm/test_unet_blocks.py create mode 100644 tests/test_models/test_editors/test_stable_diffusion/test_clip_wrapper.py create mode 100644 tests/test_models/test_editors/test_stable_diffusion/test_stable_diffusion.py create mode 100644 tests/test_models/test_editors/test_stable_diffusion/test_vae.py diff --git a/configs/stable_diffusion/README.md b/configs/stable_diffusion/README.md new file mode 100644 index 0000000000..5f11460a2e --- /dev/null +++ b/configs/stable_diffusion/README.md @@ -0,0 +1,67 @@ +# Stable Diffusion (2022) + +> [Stable Diffusion](https://github.com/CompVis/stable-diffusion) + +> **Task**: Text2Image + + + +## Abstract + + + +Stable Diffusion is a latent diffusion model conditioned on the text embeddings of a CLIP text encoder, which allows you to create images from text inputs. + + + +
+ +
+ +## Pretrained models + +We use stable diffusion v1.5 weights. This model has several weights including vae, unet and clip. You should download the weights from [stable-diffusion-1.5](https://huggingface.co/runwayml/stable-diffusion-v1-5) and change the 'pretrained_model_path' in config to the weights dir. + +| Diffusion Model | Config | Download | +| :-------------------: | :------------------------------------------------: | :------------------------------------------------------------: | +| stable_diffusion_v1.5 | [config](./stable-diffusion_ddim_denoisingunet.py) | [model](https://huggingface.co/runwayml/stable-diffusion-v1-5) | + +## Quick Start + +Running the following codes, you can get a text-generated image. + +```python +from mmengine import MODELS, Config +from torchvision import utils + +from mmedit.utils import register_all_modules + +register_all_modules() + +config = 'configs/stable_diffusion/stable-diffusion_ddim_denoisingunet.py' +StableDiffuser = MODELS.build(Config.fromfile(config).model) +prompt = 'A mecha robot in a favela in expressionist style' +StableDiffuser = StableDiffuser.to('cuda') + +image = StableDiffuser.infer(prompt)['samples'] +utils.save_image(image, 'robot.png') +``` + +## Comments + +Our codebase for the stable diffusion models builds heavily on [diffusers codebase](https://github.com/huggingface/diffusers) and the model weights are from [stable-diffusion-1.5](https://huggingface.co/runwayml/stable-diffusion-v1-5). + +Thanks for the efforts of the community! + +## Citation + +```bibtex +@misc{rombach2021highresolution, + title={High-Resolution Image Synthesis with Latent Diffusion Models}, + author={Robin Rombach and Andreas Blattmann and Dominik Lorenz and Patrick Esser and Björn Ommer}, + year={2021}, + eprint={2112.10752}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` diff --git a/configs/stable_diffusion/metafile.yml b/configs/stable_diffusion/metafile.yml new file mode 100644 index 0000000000..3253a59f58 --- /dev/null +++ b/configs/stable_diffusion/metafile.yml @@ -0,0 +1,22 @@ +Collections: +- Metadata: + Architecture: + - Stable Diffusion + Name: Stable Diffusion + Paper: + - https://github.com/CompVis/stable-diffusion + README: configs/stable_diffusion/README.md + Task: + - text2image + Year: 2022 +Models: +- Config: configs/stable_diffusion/stable-diffusion_ddim_denoisingunet.py + In Collection: Stable Diffusion + Metadata: + Training Data: Others + Name: stable-diffusion_ddim_denoisingunet + Results: + - Dataset: Others + Metrics: {} + Task: Text2Image + Weights: https://huggingface.co/runwayml/stable-diffusion-v1-5 diff --git a/configs/stable_diffusion/stable-diffusion_ddim_denoisingunet.py b/configs/stable_diffusion/stable-diffusion_ddim_denoisingunet.py new file mode 100644 index 0000000000..e83921f4d7 --- /dev/null +++ b/configs/stable_diffusion/stable-diffusion_ddim_denoisingunet.py @@ -0,0 +1,58 @@ +unet = dict( + type='DenoisingUnet', + image_size=512, + base_channels=320, + channels_cfg=[1, 2, 4, 4], + unet_type='stable', + act_cfg=dict(type='silu'), + cross_attention_dim=768, + num_heads=8, + in_channels=4, + layers_per_block=2, + down_block_types=[ + 'CrossAttnDownBlock2D', 'CrossAttnDownBlock2D', 'CrossAttnDownBlock2D', + 'DownBlock2D' + ], + up_block_types=[ + 'UpBlock2D', 'CrossAttnUpBlock2D', 'CrossAttnUpBlock2D', + 'CrossAttnUpBlock2D' + ], + output_cfg=dict(var='fixed')) + +vae = dict( + act_fn='silu', + block_out_channels=[128, 256, 512, 512], + down_block_types=[ + 'DownEncoderBlock2D', 'DownEncoderBlock2D', 'DownEncoderBlock2D', + 'DownEncoderBlock2D' + ], + in_channels=3, + latent_channels=4, + layers_per_block=2, + norm_num_groups=32, + out_channels=3, + sample_size=512, + up_block_types=[ + 'UpDecoderBlock2D', 'UpDecoderBlock2D', 'UpDecoderBlock2D', + 'UpDecoderBlock2D' + ]) + +diffusion_scheduler = dict( + type='DDIMScheduler', + variance_type='learned_range', + beta_end=0.012, + beta_schedule='scaled_linear', + beta_start=0.00085, + num_train_timesteps=1000, + set_alpha_to_one=False, + clip_sample=False) + +init_cfg = dict(type='Pretrained', pretrained_model_path='') + +model = dict( + type='StableDiffusion', + diffusion_scheduler=diffusion_scheduler, + unet=unet, + vae=vae, + init_cfg=init_cfg, +) diff --git a/mmedit/models/editors/__init__.py b/mmedit/models/editors/__init__.py index 486a087653..a59ad82b0a 100644 --- a/mmedit/models/editors/__init__.py +++ b/mmedit/models/editors/__init__.py @@ -51,6 +51,7 @@ from .singan import SinGAN from .srcnn import SRCNNNet from .srgan import SRGAN, ModifiedVGG, MSRResNet +from .stable_diffusion import StableDiffusion from .stylegan1 import StyleGAN1 from .stylegan2 import StyleGAN2 from .stylegan3 import StyleGAN3, StyleGAN3Generator @@ -84,5 +85,6 @@ 'DiscoDiffusion', 'IDLossModel', 'PESinGAN', 'MSPIEStyleGAN2', 'StyleGAN3Generator', 'InstColorization', 'NAFBaseline', 'NAFBaselineLocal', 'NAFNet', 'NAFNetLocal', 'DDIMScheduler', - 'DDPMScheduler', 'DenoisingUnet', 'ClipWrapper', 'EG3D', 'Restormer' + 'DDPMScheduler', 'DenoisingUnet', 'ClipWrapper', 'EG3D', 'Restormer', + 'StableDiffusion' ] diff --git a/mmedit/models/editors/ddim/ddim_scheduler.py b/mmedit/models/editors/ddim/ddim_scheduler.py index 104501d9e5..607afd2e61 100644 --- a/mmedit/models/editors/ddim/ddim_scheduler.py +++ b/mmedit/models/editors/ddim/ddim_scheduler.py @@ -4,8 +4,8 @@ import numpy as np import torch +from mmedit.models.utils.diffusion_utils import betas_for_alpha_bar from mmedit.registry import DIFFUSION_SCHEDULERS -from ...utils.diffusion_utils import betas_for_alpha_bar @DIFFUSION_SCHEDULERS.register_module() @@ -82,6 +82,8 @@ def __init__( self.timesteps = np.arange(0, num_train_timesteps)[::-1].copy() def set_timesteps(self, num_inference_steps, offset=0): + """set time steps.""" + self.num_inference_steps = num_inference_steps self.timesteps = np.arange( 0, self.num_train_timesteps, @@ -89,6 +91,8 @@ def set_timesteps(self, num_inference_steps, offset=0): self.timesteps += offset def _get_variance(self, timestep, prev_timestep): + """get variance.""" + alpha_prod_t = self.alphas_cumprod[timestep] alpha_prod_t_prev = self.alphas_cumprod[ prev_timestep] if prev_timestep >= 0 else self.final_alpha_cumprod @@ -109,6 +113,8 @@ def step( use_clipped_model_output: bool = False, generator=None, ): + """step forward.""" + output = {} if self.num_inference_steps is None: raise ValueError("Number of inference steps is 'None', '\ @@ -123,7 +129,8 @@ def step( 1] * 2 and self.variance_type in ['learned', 'learned_range']: model_output, _ = torch.split(model_output, sample.shape[1], dim=1) else: - raise TypeError + if not model_output.shape == sample.shape: + raise TypeError # See formulas (12) and (16) of DDIM paper https://arxiv.org/pdf/2010.02502.pdf # noqa # Ideally, read DDIM paper in-detail understanding @@ -209,6 +216,8 @@ def step( return output def add_noise(self, original_samples, noise, timesteps): + """add noise.""" + sqrt_alpha_prod = self.alphas_cumprod[timesteps]**0.5 sqrt_one_minus_alpha_prod = (1 - self.alphas_cumprod[timesteps])**0.5 noisy_samples = ( diff --git a/mmedit/models/editors/ddpm/attention.py b/mmedit/models/editors/ddpm/attention.py new file mode 100644 index 0000000000..b941272844 --- /dev/null +++ b/mmedit/models/editors/ddpm/attention.py @@ -0,0 +1,560 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from typing import Optional + +import torch +import torch.nn.functional as F +from addict import Dict +from torch import nn + + +class Transformer2DModel(nn.Module): + """Transformer model for image-like data. Takes either discrete (classes of + vector embeddings) or continuous (actual embeddings) inputs. + + When input is continuous: First, project the input + (aka embedding) and reshape to b, t, d. Then apply standard + transformer action. Finally, reshape to image. + + When input is discrete: First, input (classes of latent pixels) + is converted to embeddings and has positional + embeddings applied, see `ImagePositionalEmbeddings`. + Then apply standard transformer action. Finally, predict + classes of unnoised image. + + Note that it is assumed one of the input classes is + the masked latent pixel. The predicted classes of the unnoised + image do not contain a prediction for the masked pixel as + the unnoised image cannot be masked. + + Args: + num_attention_heads (`int`, *optional*, defaults to 16): + The number of heads to use for multi-head attention. + attention_head_dim (`int`, *optional*, defaults to 88): + The number of channels in each head. + in_channels (`int`, *optional*): + Pass if the input is continuous. + The number of channels in the input and output. + num_layers (`int`, *optional*, defaults to 1): + The number of layers of Transformer blocks to use. + dropout (`float`, *optional*, defaults to 0.1): + The dropout probability to use. + norm_num_groups (int): + Norm group num, defaults to 32. + cross_attention_dim (`int`, *optional*): + The number of context dimensions to use. + attention_bias (`bool`, *optional*): + Configure if the TransformerBlocks' attention should contain + a bias parameter. + sample_size (`int`, *optional*): + Pass if the input is discrete. The width of the latent images. + Note that this is fixed at training time as it is used for + learning a number of position embeddings. See + `ImagePositionalEmbeddings`. + num_vector_embeds (`int`, *optional*): + Pass if the input is discrete. The number of classes of + the vector embeddings of the latent pixels. + Includes the class for the masked latent pixel. + activation_fn (`str`, *optional*, defaults to `"geglu"`): + Activation function to be used in feed-forward. + use_linear_projection (bool): + Whether to use linear projection, defaults to False. + only_cross_attention (bool): + whether only use cross attention, defaults to False. + """ + + def __init__( + self, + num_attention_heads: int = 16, + attention_head_dim: int = 88, + in_channels: Optional[int] = None, + num_layers: int = 1, + dropout: float = 0.0, + norm_num_groups: int = 32, + cross_attention_dim: Optional[int] = None, + attention_bias: bool = False, + sample_size: Optional[int] = None, + num_vector_embeds: Optional[int] = None, + activation_fn: str = 'geglu', + use_linear_projection: bool = False, + only_cross_attention: bool = False, + ): + super().__init__() + self.use_linear_projection = use_linear_projection + self.num_attention_heads = num_attention_heads + self.attention_head_dim = attention_head_dim + inner_dim = num_attention_heads * attention_head_dim + + # 1. Transformer2DModel can process both standard continuous + # images of shape `(batch_size, num_channels, width, height)` + # as well as quantized image embeddings of shape + # `(batch_size, num_image_vectors)` + # Define whether input is continuous or discrete + # depending on configuration + self.is_input_continuous = in_channels is not None + self.is_input_vectorized = num_vector_embeds is not None + + if self.is_input_continuous and self.is_input_vectorized: + raise ValueError( + f'Cannot define both `in_channels`: {in_channels} ' + f'and `num_vector_embeds`: {num_vector_embeds}. Make' + f' sure that either `in_channels` or `num_vector_embeds` ' + 'is None.') + elif not self.is_input_continuous and not self.is_input_vectorized: + raise ValueError( + f'Has to define either `in_channels`: {in_channels} or' + f' `num_vector_embeds`: {num_vector_embeds}. Make' + f' sure that either `in_channels` or ' + '`num_vector_embeds` is not None.') + + # 2. Define input layers + if self.is_input_continuous: + self.in_channels = in_channels + + self.norm = torch.nn.GroupNorm( + num_groups=norm_num_groups, + num_channels=in_channels, + eps=1e-6, + affine=True) + if use_linear_projection: + self.proj_in = nn.Linear(in_channels, inner_dim) + else: + self.proj_in = nn.Conv2d( + in_channels, inner_dim, kernel_size=1, stride=1, padding=0) + else: + raise ValueError('input_vectorized not supported now.') + + # 3. Define transformers blocks + self.transformer_blocks = nn.ModuleList([ + BasicTransformerBlock( + inner_dim, + num_attention_heads, + attention_head_dim, + dropout=dropout, + cross_attention_dim=cross_attention_dim, + activation_fn=activation_fn, + attention_bias=attention_bias, + only_cross_attention=only_cross_attention, + ) for d in range(num_layers) + ]) + + # 4. Define output layers + if use_linear_projection: + self.proj_out = nn.Linear(in_channels, inner_dim) + else: + self.proj_out = nn.Conv2d( + inner_dim, in_channels, kernel_size=1, stride=1, padding=0) + + def _set_attention_slice(self, slice_size): + """set attention slice.""" + + for block in self.transformer_blocks: + block._set_attention_slice(slice_size) + + def forward(self, + hidden_states, + encoder_hidden_states=None, + timestep=None, + return_dict: bool = True): + """forward function. + + Args: + hidden_states ( When discrete, `torch.LongTensor` + of shape `(batch size, num latent pixels)`. + When continuous, `torch.FloatTensor` of shape ` + (batch size, channel, height, width)`): Input + hidden_states + encoder_hidden_states ( `torch.LongTensor` of shape + `(batch size, context dim)`, *optional*): + Conditional embeddings for cross attention layer. + If not given, cross-attention defaults to + self-attention. + timestep ( `torch.long`, *optional*): + Optional timestep to be applied as an embedding + in AdaLayerNorm's. Used to indicate denoising step. + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a + [`models.unet_2d_condition.UNet2DConditionOutput`] + instead of a plain tuple. + + Returns: + Dict if `return_dict` is True, otherwise a `tuple`. + When returning a tuple, the first element is the sample + tensor. + """ + # 1. Input + if self.is_input_continuous: + batch, channel, height, weight = hidden_states.shape + residual = hidden_states + + hidden_states = self.norm(hidden_states) + if not self.use_linear_projection: + hidden_states = self.proj_in(hidden_states) + inner_dim = hidden_states.shape[1] + hidden_states = hidden_states.permute(0, 2, 3, 1).reshape( + batch, height * weight, inner_dim) + else: + inner_dim = hidden_states.shape[1] + hidden_states = hidden_states.permute(0, 2, 3, 1).reshape( + batch, height * weight, inner_dim) + hidden_states = self.proj_in(hidden_states) + else: + raise ValueError('input_vectorized not supported now.') + + # 2. Blocks + for block in self.transformer_blocks: + hidden_states = block( + hidden_states, + context=encoder_hidden_states, + timestep=timestep) + + # 3. Output + if not self.use_linear_projection: + hidden_states = ( + hidden_states.reshape(batch, height, weight, + inner_dim).permute(0, 3, 1, + 2).contiguous()) + hidden_states = self.proj_out(hidden_states) + else: + hidden_states = self.proj_out(hidden_states) + hidden_states = ( + hidden_states.reshape(batch, height, weight, + inner_dim).permute(0, 3, 1, + 2).contiguous()) + + output = hidden_states + residual + + if not return_dict: + return (output, ) + + return Dict(sample=output) + + +class BasicTransformerBlock(nn.Module): + """A basic Transformer block. + + Args: + dim (int): The number of channels in the input and output. + num_attention_heads (int): The number of heads to use for + multi-head attention. + attention_head_dim (int): The number of channels in each head. + dropout (float, *optional*, defaults to 0.0): + The dropout probability to use. + cross_attention_dim (int, *optional*): + The size of the context vector for cross attention. + activation_fn (`str`, *optional*, defaults to `"geglu"`): + Activation function to be used in feed-forward. + attention_bias (bool, *optional*, defaults to `False`): + Configure if the attentions should contain a bias parameter. + only_cross_attention (bool, defaults to False): + whether to use cross attention only. + """ + + def __init__( + self, + dim: int, + num_attention_heads: int, + attention_head_dim: int, + dropout=0.0, + cross_attention_dim: Optional[int] = None, + activation_fn: str = 'geglu', + attention_bias: bool = False, + only_cross_attention: bool = False, + ): + super().__init__() + self.only_cross_attention = only_cross_attention + self.attn1 = CrossAttention( + query_dim=dim, + heads=num_attention_heads, + dim_head=attention_head_dim, + dropout=dropout, + bias=attention_bias, + cross_attention_dim=cross_attention_dim + if only_cross_attention else None, + ) # is a self-attention + self.ff = FeedForward( + dim, dropout=dropout, activation_fn=activation_fn) + self.attn2 = CrossAttention( + query_dim=dim, + cross_attention_dim=cross_attention_dim, + heads=num_attention_heads, + dim_head=attention_head_dim, + dropout=dropout, + bias=attention_bias, + ) # is self-attn if context is none + + # layer norms + self.norm1 = nn.LayerNorm(dim) + self.norm2 = nn.LayerNorm(dim) + self.norm3 = nn.LayerNorm(dim) + + def _set_attention_slice(self, slice_size): + """set attention slice.""" + self.attn1._slice_size = slice_size + self.attn2._slice_size = slice_size + + def forward(self, hidden_states, context=None, timestep=None): + """forward with hidden states, context and timestep.""" + # 1. Self-Attention + norm_hidden_states = (self.norm1(hidden_states)) + + if self.only_cross_attention: + hidden_states = self.attn1(norm_hidden_states, + context) + hidden_states + else: + hidden_states = self.attn1(norm_hidden_states) + hidden_states + + # 2. Cross-Attention + norm_hidden_states = (self.norm2(hidden_states)) + hidden_states = self.attn2( + norm_hidden_states, context=context) + hidden_states + + # 3. Feed-forward + hidden_states = self.ff(self.norm3(hidden_states)) + hidden_states + + return hidden_states + + +class CrossAttention(nn.Module): + r""" + A cross attention layer. + + Args: + query_dim (`int`): The number of channels in the query. + cross_attention_dim (`int`, *optional*): + The number of channels in the context. + If not given, defaults to `query_dim`. + heads (`int`, *optional*, defaults to 8): + The number of heads to use for multi-head attention. + dim_head (`int`, *optional*, defaults to 64): + The number of channels in each head. + dropout (`float`, *optional*, defaults to 0.0): + The dropout probability to use. + bias (`bool`, *optional*, defaults to False): + Set to `True` for the query, key, + and value linear layers to contain a bias parameter. + """ + + def __init__( + self, + query_dim: int, + cross_attention_dim: Optional[int] = None, + heads: int = 8, + dim_head: int = 64, + dropout: float = 0.0, + bias=False, + ): + super().__init__() + inner_dim = dim_head * heads + cross_attention_dim = cross_attention_dim if cross_attention_dim is not None else query_dim # noqa + + self.scale = dim_head**-0.5 + self.heads = heads + # for slice_size > 0 the attention score computation + # is split across the batch axis to save memory + # You can set slice_size with `set_attention_slice` + self._slice_size = None + + self.to_q = nn.Linear(query_dim, inner_dim, bias=bias) + self.to_k = nn.Linear(cross_attention_dim, inner_dim, bias=bias) + self.to_v = nn.Linear(cross_attention_dim, inner_dim, bias=bias) + + self.to_out = nn.ModuleList([]) + self.to_out.append(nn.Linear(inner_dim, query_dim)) + self.to_out.append(nn.Dropout(dropout)) + + def reshape_heads_to_batch_dim(self, tensor): + """reshape heads num to batch dim.""" + batch_size, seq_len, dim = tensor.shape + head_size = self.heads + tensor = tensor.reshape(batch_size, seq_len, head_size, + dim // head_size) + tensor = tensor.permute(0, 2, 1, 3).reshape(batch_size * head_size, + seq_len, dim // head_size) + return tensor + + def reshape_batch_dim_to_heads(self, tensor): + """reshape batch dim to heads num.""" + batch_size, seq_len, dim = tensor.shape + head_size = self.heads + tensor = tensor.reshape(batch_size // head_size, head_size, seq_len, + dim) + tensor = tensor.permute(0, 2, 1, 3).reshape(batch_size // head_size, + seq_len, dim * head_size) + return tensor + + def forward(self, hidden_states, context=None, mask=None): + """forward with hidden states, context and mask.""" + batch_size, sequence_length, _ = hidden_states.shape + + query = self.to_q(hidden_states) + context = context if context is not None else hidden_states + key = self.to_k(context) + value = self.to_v(context) + + dim = query.shape[-1] + + query = self.reshape_heads_to_batch_dim(query) + key = self.reshape_heads_to_batch_dim(key) + value = self.reshape_heads_to_batch_dim(value) + + # TODO(PVP) - mask is currently never used. Remember + # to re-implement when used + + # attention, what we cannot get enough of + if self._slice_size is None or query.shape[0] // self._slice_size == 1: + hidden_states = self._attention(query, key, value) + else: + hidden_states = self._sliced_attention(query, key, value, + sequence_length, dim) + + # linear proj + hidden_states = self.to_out[0](hidden_states) + # dropout + hidden_states = self.to_out[1](hidden_states) + return hidden_states + + def _attention(self, query, key, value): + """attention calculation.""" + attention_scores = torch.baddbmm( + torch.empty( + query.shape[0], + query.shape[1], + key.shape[1], + dtype=query.dtype, + device=query.device), + query, + key.transpose(-1, -2), + beta=0, + alpha=self.scale, + ) + attention_probs = attention_scores.softmax(dim=-1) + # compute attention output + + hidden_states = torch.bmm(attention_probs, value) + + # reshape hidden_states + hidden_states = self.reshape_batch_dim_to_heads(hidden_states) + return hidden_states + + def _sliced_attention(self, query, key, value, sequence_length, dim): + """sliced attention calculation.""" + batch_size_attention = query.shape[0] + hidden_states = torch.zeros( + (batch_size_attention, sequence_length, dim // self.heads), + device=query.device, + dtype=query.dtype) + slice_size = self._slice_size if self._slice_size is not None \ + else hidden_states.shape[0] + for i in range(hidden_states.shape[0] // slice_size): + start_idx = i * slice_size + end_idx = (i + 1) * slice_size + attn_slice = torch.baddbmm( + torch.empty( + slice_size, + query.shape[1], + key.shape[1], + dtype=query.dtype, + device=query.device), + query[start_idx:end_idx], + key[start_idx:end_idx].transpose(-1, -2), + beta=0, + alpha=self.scale, + ) + attn_slice = attn_slice.softmax(dim=-1) + attn_slice = torch.bmm(attn_slice, value[start_idx:end_idx]) + + hidden_states[start_idx:end_idx] = attn_slice + + # reshape hidden_states + hidden_states = self.reshape_batch_dim_to_heads(hidden_states) + return hidden_states + + +class FeedForward(nn.Module): + r""" + A feed-forward layer. + + Args: + dim (int): The number of channels in the input. + dim_out (int, *optional*): + The number of channels in the output. + If not given, defaults to `dim`. + mult (int, *optional*, defaults to 4): + The multiplier to use for the hidden dimension. + dropout (`float`, *optional*, defaults to 0.0): + The dropout probability to use. + activation_fn (`str`, *optional*, defaults to `"geglu"`): + Activation function to be used in feed-forward. + """ + + def __init__( + self, + dim: int, + dim_out: Optional[int] = None, + mult: int = 4, + dropout: float = 0.0, + activation_fn: str = 'geglu', + ): + super().__init__() + inner_dim = int(dim * mult) + dim_out = dim_out if dim_out is not None else dim + + if activation_fn == 'geglu': + geglu = GEGLU(dim, inner_dim) + elif activation_fn == 'geglu-approximate': + geglu = ApproximateGELU(dim, inner_dim) + + self.net = nn.ModuleList([]) + # project in + self.net.append(geglu) + # project dropout + self.net.append(nn.Dropout(dropout)) + # project out + self.net.append(nn.Linear(inner_dim, dim_out)) + + def forward(self, hidden_states): + """forward with hidden states.""" + for module in self.net: + hidden_states = module(hidden_states) + return hidden_states + + +# feedforward +class GEGLU(nn.Module): + r""" + A variant of the gated linear unit activation function + from https://arxiv.org/abs/2002.05202. + + Args: + dim_in (`int`): The number of channels in the input. + dim_out (`int`): The number of channels in the output. + """ + + def __init__(self, dim_in: int, dim_out: int): + super().__init__() + self.proj = nn.Linear(dim_in, dim_out * 2) + + def gelu(self, gate): + """gelu activation.""" + return F.gelu(gate) + + def forward(self, hidden_states): + """forward with hidden states.""" + hidden_states, gate = self.proj(hidden_states).chunk(2, dim=-1) + return hidden_states * self.gelu(gate) + + +class ApproximateGELU(nn.Module): + """The approximate form of Gaussian Error Linear Unit (GELU) + + For more details, see section 2: https://arxiv.org/abs/1606.08415 + """ + + def __init__(self, dim_in: int, dim_out: int): + super().__init__() + self.proj = nn.Linear(dim_in, dim_out) + + def forward(self, x): + """forward function.""" + x = self.proj(x) + return x * torch.sigmoid(1.702 * x) diff --git a/mmedit/models/editors/ddpm/ddpm_scheduler.py b/mmedit/models/editors/ddpm/ddpm_scheduler.py index 4f7a376994..92b1000309 100644 --- a/mmedit/models/editors/ddpm/ddpm_scheduler.py +++ b/mmedit/models/editors/ddpm/ddpm_scheduler.py @@ -4,8 +4,8 @@ import numpy as np import torch +from mmedit.models.utils.diffusion_utils import betas_for_alpha_bar from mmedit.registry import DIFFUSION_SCHEDULERS -from ...utils.diffusion_utils import betas_for_alpha_bar @DIFFUSION_SCHEDULERS.register_module() @@ -78,6 +78,8 @@ def __init__(self, self.clip_sample = clip_sample def set_timesteps(self, num_inference_steps): + """set timesteps.""" + num_inference_steps = min(self.num_train_timesteps, num_inference_steps) self.num_inference_steps = num_inference_steps @@ -86,6 +88,8 @@ def set_timesteps(self, num_inference_steps): self.num_train_timesteps // self.num_inference_steps)[::-1].copy() def _get_variance(self, t, predicted_variance=None, variance_type=None): + """get variance.""" + alpha_prod_t = self.alphas_cumprod[t] alpha_prod_t_prev = self.alphas_cumprod[t - 1] if t > 0 else self.one @@ -105,10 +109,10 @@ def _get_variance(self, t, predicted_variance=None, variance_type=None): # hacks - were probs added for training stability if variance_type == 'fixed_small': - variance = np.clip(variance, min_value=1e-20) + variance = np.clip(variance, a_min=1e-20, a_max=10000) # for rl-diffusion_scheduler https://arxiv.org/abs/2205.09991 elif variance_type == 'fixed_small_log': - variance = np.log(np.clip(variance, min_value=1e-20)) + variance = np.log(np.clip(variance, a_min=1e-20, a_max=10000)) elif variance_type == 'fixed_large': variance = self.betas[t] elif variance_type == 'fixed_large_log': @@ -126,12 +130,13 @@ def _get_variance(self, t, predicted_variance=None, variance_type=None): return variance def step(self, - model_output: Union[torch.FloatTensor], + model_output: torch.FloatTensor, timestep: int, - sample: Union[torch.FloatTensor], + sample: torch.FloatTensor, predict_epsilon=True, generator=None): t = timestep + """step forward""" if model_output.shape[1] == sample.shape[ 1] * 2 and self.variance_type in ['learned', 'learned_range']: @@ -189,6 +194,8 @@ def step(self, } def add_noise(self, original_samples, noise, timesteps): + """add noise.""" + sqrt_alpha_prod = self.alphas_cumprod[timesteps]**0.5 sqrt_alpha_prod = self.match_shape(sqrt_alpha_prod, original_samples) sqrt_one_minus_alpha_prod = (1 - self.alphas_cumprod[timesteps])**0.5 diff --git a/mmedit/models/editors/ddpm/denoising_unet.py b/mmedit/models/editors/ddpm/denoising_unet.py index 1154825077..3993fc8f74 100644 --- a/mmedit/models/editors/ddpm/denoising_unet.py +++ b/mmedit/models/editors/ddpm/denoising_unet.py @@ -2,6 +2,7 @@ import math from copy import deepcopy from functools import partial +from typing import Tuple import mmengine import numpy as np @@ -17,6 +18,10 @@ from mmengine.utils.version_utils import digit_version from mmedit.registry import MODELS, MODULES +from .embeddings import TimestepEmbedding, Timesteps +from .unet_blocks import UNetMidBlock2DCrossAttn, get_down_block, get_up_block + +logger = MMLogger.get_current_instance() class EmbedSequential(nn.Sequential): @@ -579,6 +584,122 @@ def forward(self, x): return x +def build_down_block_resattn(resblocks_per_downsample, resblock_cfg, + in_channels_, out_channels_, attention_scale, + attention_cfg, in_channels_list, level, + channel_factor_list, embedding_channels, + use_scale_shift_norm, dropout, norm_cfg, + resblock_updown, downsample_cfg, scale): + """build unet down path blocks with resnet and attention.""" + + in_blocks = nn.ModuleList() + + for _ in range(resblocks_per_downsample): + layers = [ + MODULES.build( + resblock_cfg, + default_args={ + 'in_channels': in_channels_, + 'out_channels': out_channels_ + }) + ] + in_channels_ = out_channels_ + + if scale in attention_scale: + layers.append( + MODULES.build( + attention_cfg, default_args={'in_channels': in_channels_})) + + in_channels_list.append(in_channels_) + in_blocks.append(EmbedSequential(*layers)) + + if level != len(channel_factor_list) - 1: + in_blocks.append( + EmbedSequential( + DenoisingResBlock( + out_channels_, + embedding_channels, + use_scale_shift_norm, + dropout, + norm_cfg=norm_cfg, + out_channels=out_channels_, + down=True) if resblock_updown else MODULES.build( + downsample_cfg, + default_args={'in_channels': in_channels_}))) + in_channels_list.append(in_channels_) + scale *= 2 + return in_blocks, scale + + +def build_mid_blocks_resattn(resblock_cfg, attention_cfg, in_channels_): + """build unet mid blocks with resnet and attention.""" + + return EmbedSequential( + MODULES.build( + resblock_cfg, default_args={'in_channels': in_channels_}), + MODULES.build( + attention_cfg, default_args={'in_channels': in_channels_}), + MODULES.build( + resblock_cfg, default_args={'in_channels': in_channels_}), + ) + + +def build_up_blocks_resattn( + resblocks_per_downsample, + resblock_cfg, + in_channels_, + in_channels_list, + base_channels, + factor, + scale, + attention_scale, + attention_cfg, + channel_factor_list, + level, + embedding_channels, + use_scale_shift_norm, + dropout, + norm_cfg, + resblock_updown, + upsample_cfg, +): + """build up path blocks with resnet and attention.""" + + out_blocks = nn.ModuleList() + for idx in range(resblocks_per_downsample + 1): + layers = [ + MODULES.build( + resblock_cfg, + default_args={ + 'in_channels': in_channels_ + in_channels_list.pop(), + 'out_channels': int(base_channels * factor) + }) + ] + in_channels_ = int(base_channels * factor) + if scale in attention_scale: + layers.append( + MODULES.build( + attention_cfg, default_args={'in_channels': in_channels_})) + if (level != len(channel_factor_list) - 1 + and idx == resblocks_per_downsample): + out_channels_ = in_channels_ + layers.append( + DenoisingResBlock( + in_channels_, + embedding_channels, + use_scale_shift_norm, + dropout, + norm_cfg=norm_cfg, + out_channels=out_channels_, + up=True) if resblock_updown else MODULES. + build( + upsample_cfg, default_args={'in_channels': in_channels_})) + scale //= 2 + out_blocks.append(EmbedSequential(*layers)) + + return out_blocks, in_channels_, scale + + @MODULES.register_module() class DenoisingUnet(BaseModule): """Denoising Unet. This network receives a diffused image ``x_t`` and @@ -698,38 +819,46 @@ class DenoisingUnet(BaseModule): 32: [1, 2, 2, 2] } - def __init__(self, - image_size, - in_channels=3, - base_channels=128, - resblocks_per_downsample=3, - num_timesteps=1000, - use_rescale_timesteps=False, - dropout=0, - embedding_channels=-1, - num_classes=0, - use_fp16=False, - channels_cfg=None, - output_cfg=dict(mean='eps', var='learned_range'), - norm_cfg=dict(type='GN', num_groups=32), - act_cfg=dict(type='SiLU', inplace=False), - shortcut_kernel_size=1, - use_scale_shift_norm=False, - resblock_updown=False, - num_heads=4, - time_embedding_mode='sin', - time_embedding_cfg=None, - resblock_cfg=dict(type='DenoisingResBlock'), - attention_cfg=dict(type='MultiHeadAttention'), - downsample_conv=True, - upsample_conv=True, - downsample_cfg=dict(type='DenoisingDownsample'), - upsample_cfg=dict(type='DenoisingUpsample'), - attention_res=[16, 8], - pretrained=None): + def __init__( + self, + image_size, + in_channels=3, + base_channels=128, + resblocks_per_downsample=3, + num_timesteps=1000, + use_rescale_timesteps=False, + dropout=0, + embedding_channels=-1, + num_classes=0, + use_fp16=False, + channels_cfg=None, + output_cfg=dict(mean='eps', var='learned_range'), + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='SiLU', inplace=False), + shortcut_kernel_size=1, + use_scale_shift_norm=False, + resblock_updown=False, + num_heads=4, + time_embedding_mode='sin', + time_embedding_cfg=None, + resblock_cfg=dict(type='DenoisingResBlock'), + attention_cfg=dict(type='MultiHeadAttention'), + downsample_conv=True, + upsample_conv=True, + downsample_cfg=dict(type='DenoisingDownsample'), + upsample_cfg=dict(type='DenoisingUpsample'), + attention_res=[16, 8], + pretrained=None, + unet_type='', + down_block_types: Tuple[str] = (), + up_block_types: Tuple[str] = (), + cross_attention_dim=768, + layers_per_block: int = 2, + ): super().__init__() + self.unet_type = unet_type self.num_classes = num_classes self.num_timesteps = num_timesteps self.use_rescale_timesteps = use_rescale_timesteps @@ -774,12 +903,30 @@ def __init__(self, embedding_channels = base_channels * 4 \ if embedding_channels == -1 else embedding_channels - self.time_embedding = TimeEmbedding( - base_channels, - embedding_channels=embedding_channels, - embedding_mode=time_embedding_mode, - embedding_cfg=time_embedding_cfg, - act_cfg=act_cfg) + + # init the channel scale factor + scale = 1 + ch = int(base_channels * self.channel_factor_list[0]) + self.in_channels_list = [ch] + + if self.unet_type == 'stable': + # time + self.time_proj = Timesteps(ch) + self.time_embedding = TimestepEmbedding(base_channels, + embedding_channels) + + self.conv_in = nn.Conv2d( + in_channels, ch, kernel_size=3, padding=(1, 1)) + else: + self.time_embedding = TimeEmbedding( + base_channels, + embedding_channels=embedding_channels, + embedding_mode=time_embedding_mode, + embedding_cfg=time_embedding_cfg, + act_cfg=act_cfg) + + self.in_blocks = nn.ModuleList( + [EmbedSequential(nn.Conv2d(in_channels, ch, 3, 1, padding=1))]) if self.num_classes != 0: self.label_embedding = nn.Embedding(self.num_classes, @@ -806,115 +953,176 @@ def __init__(self, self.upsample_cfg = deepcopy(upsample_cfg) self.upsample_cfg.setdefault('with_conv', upsample_conv) - # init the channel scale factor - scale = 1 - ch = int(base_channels * self.channel_factor_list[0]) - self.in_blocks = nn.ModuleList( - [EmbedSequential(nn.Conv2d(in_channels, ch, 3, 1, padding=1))]) - self.in_channels_list = [ch] + self.down_blocks = nn.ModuleList([]) + self.mid_block = None + self.up_blocks = nn.ModuleList([]) + + attention_head_dim = (num_heads, ) * len(down_block_types) # construct the encoder part of Unet for level, factor in enumerate(self.channel_factor_list): in_channels_ = ch if level == 0 \ else int(base_channels * self.channel_factor_list[level - 1]) out_channels_ = int(base_channels * factor) - for _ in range(resblocks_per_downsample): - layers = [ - MODULES.build( - self.resblock_cfg, - default_args={ - 'in_channels': in_channels_, - 'out_channels': out_channels_ - }) - ] - in_channels_ = out_channels_ - - if scale in attention_scale: - layers.append( - MODULES.build( - self.attention_cfg, - default_args={'in_channels': in_channels_})) - - self.in_channels_list.append(in_channels_) - self.in_blocks.append(EmbedSequential(*layers)) - - if level != len(self.channel_factor_list) - 1: - self.in_blocks.append( - EmbedSequential( - DenoisingResBlock( - out_channels_, - embedding_channels, - use_scale_shift_norm, - dropout, - norm_cfg=norm_cfg, - out_channels=out_channels_, - down=True) if resblock_updown else MODULES.build( - self.downsample_cfg, - default_args={'in_channels': in_channels_}))) - self.in_channels_list.append(in_channels_) - scale *= 2 + + if self.unet_type == 'stable': + is_final_block = level == len(self.channel_factor_list) - 1 + down_block_type = down_block_types[level] + down_block = get_down_block( + down_block_type, + num_layers=layers_per_block, + in_channels=in_channels_, + out_channels=out_channels_, + temb_channels=embedding_channels, + cross_attention_dim=cross_attention_dim, + add_downsample=not is_final_block, + resnet_act_fn=act_cfg['type'], + resnet_groups=norm_cfg['num_groups'], + attn_num_head_channels=attention_head_dim[level], + ) + self.down_blocks.append(down_block) + + else: + in_blocks, scale = build_down_block_resattn( + resblocks_per_downsample=resblocks_per_downsample, + resblock_cfg=self.resblock_cfg, + in_channels_=in_channels_, + out_channels_=out_channels_, + attention_scale=attention_scale, + attention_cfg=self.attention_cfg, + in_channels_list=self.in_channels_list, + level=level, + channel_factor_list=self.channel_factor_list, + embedding_channels=embedding_channels, + use_scale_shift_norm=use_scale_shift_norm, + dropout=dropout, + norm_cfg=norm_cfg, + resblock_updown=resblock_updown, + downsample_cfg=self.downsample_cfg, + scale=scale) + self.in_blocks.extend(in_blocks) # construct the bottom part of Unet - self.mid_blocks = EmbedSequential( - MODULES.build( - self.resblock_cfg, default_args={'in_channels': in_channels_}), - MODULES.build( - self.attention_cfg, default_args={'in_channels': - in_channels_}), - MODULES.build( - self.resblock_cfg, default_args={'in_channels': in_channels_}), - ) + block_out_channels = [ + times * base_channels for times in self.channel_factor_list + ] + if self.unet_type == 'stable': + self.mid_block = UNetMidBlock2DCrossAttn( + in_channels=block_out_channels[-1], + temb_channels=embedding_channels, + cross_attention_dim=cross_attention_dim, + resnet_act_fn=act_cfg['type'], + resnet_time_scale_shift='default', + attn_num_head_channels=attention_head_dim[-1], + resnet_groups=norm_cfg['num_groups'], + ) + else: + self.mid_blocks = build_mid_blocks_resattn(self.resblock_cfg, + self.attention_cfg, + in_channels_) + + # stable up parameters + self.num_upsamplers = 0 + reversed_block_out_channels = list(reversed(block_out_channels)) + reversed_attention_head_dim = list(reversed(attention_head_dim)) + output_channel = reversed_block_out_channels[0] # construct the decoder part of Unet in_channels_list = deepcopy(self.in_channels_list) - self.out_blocks = nn.ModuleList() + if self.unet_type != 'stable': + self.out_blocks = nn.ModuleList() for level, factor in enumerate(self.channel_factor_list[::-1]): - for idx in range(resblocks_per_downsample + 1): - layers = [ - MODULES.build( - self.resblock_cfg, - default_args={ - 'in_channels': - in_channels_ + in_channels_list.pop(), - 'out_channels': int(base_channels * factor) - }) - ] - in_channels_ = int(base_channels * factor) - if scale in attention_scale: - layers.append( - MODULES.build( - self.attention_cfg, - default_args={'in_channels': in_channels_})) - if (level != len(self.channel_factor_list) - 1 - and idx == resblocks_per_downsample): - out_channels_ = in_channels_ - layers.append( - DenoisingResBlock( - in_channels_, - embedding_channels, - use_scale_shift_norm, - dropout, - norm_cfg=norm_cfg, - out_channels=out_channels_, - up=True) if resblock_updown else MODULES.build( - self.upsample_cfg, - default_args={'in_channels': in_channels_})) - scale //= 2 - self.out_blocks.append(EmbedSequential(*layers)) - - self.out = ConvModule( - in_channels=in_channels_, - out_channels=out_channels, - kernel_size=3, - padding=1, - act_cfg=act_cfg, - norm_cfg=norm_cfg, - bias=True, - order=('norm', 'act', 'conv')) + + if self.unet_type == 'stable': + is_final_block = level == len(block_out_channels) - 1 + + prev_output_channel = output_channel + output_channel = reversed_block_out_channels[level] + input_channel = reversed_block_out_channels[min( + level + 1, + len(block_out_channels) - 1)] + + # add upsample block for all BUT final layer + if not is_final_block: + add_upsample = True + self.num_upsamplers += 1 + else: + add_upsample = False + + up_block_type = up_block_types[level] + up_block = get_up_block( + up_block_type, + num_layers=layers_per_block + 1, + in_channels=input_channel, + out_channels=output_channel, + prev_output_channel=prev_output_channel, + temb_channels=embedding_channels, + cross_attention_dim=cross_attention_dim, + add_upsample=add_upsample, + resnet_act_fn=act_cfg['type'], + resnet_groups=norm_cfg['num_groups'], + attn_num_head_channels=reversed_attention_head_dim[level], + ) + self.up_blocks.append(up_block) + prev_output_channel = output_channel + else: + out_blocks, in_channels_, scale = build_up_blocks_resattn( + resblocks_per_downsample, + self.resblock_cfg, + in_channels_, + in_channels_list, + base_channels, + factor, + scale, + attention_scale, + self.attention_cfg, + self.channel_factor_list, + level, + embedding_channels, + use_scale_shift_norm, + dropout, + norm_cfg, + resblock_updown, + self.upsample_cfg, + ) + self.out_blocks.extend(out_blocks) + + if self.unet_type == 'stable': + # out + self.conv_norm_out = nn.GroupNorm( + num_channels=block_out_channels[0], + num_groups=norm_cfg['num_groups']) + if digit_version(TORCH_VERSION) > digit_version('1.6.0'): + self.conv_act = nn.SiLU() + else: + mmengine.print_log('\'SiLU\' is not supported for ' + f'torch < 1.6.0, found \'{torch.version}\'.' + 'Use ReLu instead but result maybe wrong') + self.conv_act == nn.ReLU() + self.conv_out = nn.Conv2d( + block_out_channels[0], + self.out_channels, + kernel_size=3, + padding=1) + else: + self.out = ConvModule( + in_channels=in_channels_, + out_channels=out_channels, + kernel_size=3, + padding=1, + act_cfg=act_cfg, + norm_cfg=norm_cfg, + bias=True, + order=('norm', 'act', 'conv')) self.init_weights(pretrained) - def forward(self, x_t, t, label=None, return_noise=False): + def forward(self, + x_t, + t, + encoder_hidden_states=None, + label=None, + return_noise=False): """Forward function. Args: x_t (torch.Tensor): Diffused image at timestep `t` to denoise. @@ -930,32 +1138,125 @@ def forward(self, x_t, t, label=None, return_noise=False): Returns: torch.Tensor | dict: If not ``return_noise`` """ + # By default samples have to be AT least a multiple of t + # he overall upsampling factor. + # The overall upsampling factor is equal + # to 2 ** (# num of upsampling layears). + # However, the upsampling interpolation output size + # can be forced to fit any upsampling size + # on the fly if necessary. + default_overall_up_factor = 2**self.num_upsamplers + + # upsample size should be forwarded when sample is not + # a multiple of `default_overall_up_factor` + forward_upsample_size = False + upsample_size = None + + if any(s % default_overall_up_factor != 0 for s in x_t.shape[-2:]): + logger.info( + 'Forward upsample size to force interpolation output size.') + forward_upsample_size = True + if not torch.is_tensor(t): t = torch.tensor([t], dtype=torch.long, device=x_t.device) elif torch.is_tensor(t) and len(t.shape) == 0: t = t[None].to(x_t.device) - embedding = self.time_embedding(t) + if self.unet_type == 'stable': + # broadcast to batch dimension in a way that's + # compatible with ONNX/Core ML + t = t.expand(x_t.shape[0]) + + t_emb = self.time_proj(t) + + # t does not contain any weights and will always return f32 tensors + # but time_embedding might actually be running in fp16. + # so we need to cast here. + # there might be better ways to encapsulate this. + t_emb = t_emb.to(dtype=self.dtype) + embedding = self.time_embedding(t_emb) + else: + embedding = self.time_embedding(t) if label is not None: assert hasattr(self, 'label_embedding') embedding = self.label_embedding(label) + embedding - h, hs = x_t, [] - h = h.type(self.dtype) - # forward downsample blocks - for block in self.in_blocks: - h = block(h, embedding) - hs.append(h) - - # forward middle blocks - h = self.mid_blocks(h, embedding) - - # forward upsample blocks - for block in self.out_blocks: - h = block(torch.cat([h, hs.pop()], dim=1), embedding) - h = h.type(x_t.dtype) - outputs = self.out(h) + if self.unet_type == 'stable': + # 2. pre-process + x_t = self.conv_in(x_t) + + # 3. down + down_block_res_samples = (x_t, ) + for downsample_block in self.down_blocks: + if hasattr(downsample_block, 'attentions' + ) and downsample_block.attentions is not None: + x_t, res_samples = downsample_block( + hidden_states=x_t, + temb=embedding, + encoder_hidden_states=encoder_hidden_states, + ) + else: + x_t, res_samples = downsample_block( + hidden_states=x_t, temb=embedding) + + down_block_res_samples += res_samples + + # 4. mid + x_t = self.mid_block( + x_t, embedding, encoder_hidden_states=encoder_hidden_states) + + # 5. up + for i, upsample_block in enumerate(self.up_blocks): + is_final_block = i == len(self.up_blocks) - 1 + + res_samples = down_block_res_samples[-len(upsample_block. + resnets):] + down_block_res_samples = down_block_res_samples[:-len( + upsample_block.resnets)] + + # if we have not reached the final block + # and need to forward the upsample size, we do it here + if not is_final_block and forward_upsample_size: + upsample_size = down_block_res_samples[-1].shape[2:] + + if hasattr(upsample_block, 'attentions' + ) and upsample_block.attentions is not None: + x_t = upsample_block( + hidden_states=x_t, + temb=embedding, + res_hidden_states_tuple=res_samples, + encoder_hidden_states=encoder_hidden_states, + upsample_size=upsample_size, + ) + else: + x_t = upsample_block( + hidden_states=x_t, + temb=embedding, + res_hidden_states_tuple=res_samples, + upsample_size=upsample_size) + # 6. post-process + x_t = self.conv_norm_out(x_t) + x_t = self.conv_act(x_t) + x_t = self.conv_out(x_t) + + outputs = x_t + else: + h, hs = x_t, [] + h = h.type(self.dtype) + # forward downsample blocks + for block in self.in_blocks: + h = block(h, embedding) + hs.append(h) + + # forward middle blocks + h = self.mid_blocks(h, embedding) + + # forward upsample blocks + for block in self.out_blocks: + h = block(torch.cat([h, hs.pop()], dim=1), embedding) + h = h.type(x_t.dtype) + outputs = self.out(h) return {'outputs': outputs} diff --git a/mmedit/models/editors/ddpm/embeddings.py b/mmedit/models/editors/ddpm/embeddings.py new file mode 100644 index 0000000000..68fa5fa976 --- /dev/null +++ b/mmedit/models/editors/ddpm/embeddings.py @@ -0,0 +1,95 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +import mmengine +import torch +from mmengine.utils.dl_utils import TORCH_VERSION +from mmengine.utils.version_utils import digit_version +from torch import nn + + +class TimestepEmbedding(nn.Module): + """Module which uses linear to embed timestep.""" + + def __init__(self, + in_channels: int, + time_embed_dim: int, + act_fn: str = 'silu', + out_dim: int = None): + super().__init__() + + self.linear_1 = nn.Linear(in_channels, time_embed_dim) + self.act = None + if act_fn == 'silu' and \ + digit_version(TORCH_VERSION) > digit_version('1.6.0'): + self.act = nn.SiLU() + else: + mmengine.print_log('\'SiLU\' is not supported for ' + f'torch < 1.6.0, found \'{torch.version}\'.' + 'Use ReLu instead but result maybe wrong') + self.act = nn.ReLU() + + if out_dim is not None: + time_embed_dim_out = out_dim + else: + time_embed_dim_out = time_embed_dim + self.linear_2 = nn.Linear(time_embed_dim, time_embed_dim_out) + + def forward(self, sample): + """forward with sample.""" + + sample = self.linear_1(sample) + + if self.act is not None: + sample = self.act(sample) + + sample = self.linear_2(sample) + return sample + + +class Timesteps(nn.Module): + """A module which transforms timesteps to embedding.""" + + def __init__(self, + num_channels: int, + flip_sin_to_cos: bool = True, + downscale_freq_shift: float = 0): + super().__init__() + self.num_channels = num_channels + self.flip_sin_to_cos = flip_sin_to_cos + self.downscale_freq_shift = downscale_freq_shift + self.max_period = 10000 + self.scale = 1 + + def forward(self, timesteps): + """forward with timesteps.""" + + assert len(timesteps.shape) == 1, 'Timesteps should be a 1d-array' + + embedding_dim = self.num_channels + half_dim = embedding_dim // 2 + exponent = -math.log(self.max_period) * \ + torch.arange( + start=0, + end=half_dim, + dtype=torch.float32, + device=timesteps.device) + exponent = exponent / (half_dim - self.downscale_freq_shift) + + emb = torch.exp(exponent) + emb = timesteps[:, None].float() * emb[None, :] + + # scale embeddings + emb = self.scale * emb + + # concat sine and cosine embeddings + emb = torch.cat([torch.sin(emb), torch.cos(emb)], dim=-1) + + # flip sine and cosine embeddings + if self.flip_sin_to_cos: + emb = torch.cat([emb[:, half_dim:], emb[:, :half_dim]], dim=-1) + + # zero pad + if embedding_dim % 2 == 1: + emb = torch.nn.functional.pad(emb, (0, 1, 0, 0)) + return emb diff --git a/mmedit/models/editors/ddpm/res_blocks.py b/mmedit/models/editors/ddpm/res_blocks.py new file mode 100644 index 0000000000..7ccf5afef2 --- /dev/null +++ b/mmedit/models/editors/ddpm/res_blocks.py @@ -0,0 +1,247 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmengine +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmengine.utils.dl_utils import TORCH_VERSION +from mmengine.utils.version_utils import digit_version + + +class ResnetBlock2D(nn.Module): + """resnet block support down sample and up sample. + + Args: + in_channels (int): input channels. + out_channels (int): output channels. + conv_shortcut (bool): whether to use conv shortcut. + dropout (float): dropout rate. + temb_channels (int): time embedding channels. + groups (int): conv groups. + groups_out (int): conv out groups. + pre_norm (bool): whether to norm before conv. Todo: remove. + eps (float): eps for groupnorm. + non_linearity (str): non linearity type. + time_embedding_norm (str): time embedding norm type. + output_scale_factor (float): factor to scale input and output. + use_in_shortcut (bool): whether to use conv in shortcut. + up (bool): whether to upsample. + down (bool): whether to downsample. + """ + + def __init__( + self, + in_channels, + out_channels=None, + conv_shortcut=False, + dropout=0.0, + temb_channels=512, + groups=32, + groups_out=None, + pre_norm=True, + eps=1e-6, + non_linearity='silu', + time_embedding_norm='default', + output_scale_factor=1.0, + use_in_shortcut=None, + up=False, + down=False, + ): + super().__init__() + self.pre_norm = pre_norm + self.pre_norm = True + self.in_channels = in_channels + out_channels = in_channels if out_channels is None else out_channels + self.out_channels = out_channels + self.use_conv_shortcut = conv_shortcut + self.time_embedding_norm = time_embedding_norm + self.up = up + self.down = down + self.output_scale_factor = output_scale_factor + + if groups_out is None: + groups_out = groups + + self.norm1 = torch.nn.GroupNorm( + num_groups=groups, num_channels=in_channels, eps=eps, affine=True) + + self.conv1 = torch.nn.Conv2d( + in_channels, out_channels, kernel_size=3, stride=1, padding=1) + + if temb_channels is not None: + self.time_emb_proj = torch.nn.Linear(temb_channels, out_channels) + else: + self.time_emb_proj = None + + self.norm2 = torch.nn.GroupNorm( + num_groups=groups_out, + num_channels=out_channels, + eps=eps, + affine=True) + self.dropout = torch.nn.Dropout(dropout) + self.conv2 = torch.nn.Conv2d( + out_channels, out_channels, kernel_size=3, stride=1, padding=1) + + if non_linearity == 'silu' and \ + digit_version(TORCH_VERSION) > digit_version('1.6.0'): + self.nonlinearity = nn.SiLU() + else: + mmengine.print_log('\'SiLU\' is not supported for ' + f'torch < 1.6.0, found \'{torch.version}\'.' + 'Use ReLu instead but result maybe wrong') + self.nonlinearity = nn.ReLU() + + self.upsample = self.downsample = None + if self.up: + self.upsample = Upsample2D(in_channels, use_conv=False) + elif self.down: + self.downsample = Downsample2D( + in_channels, use_conv=False, padding=1, name='op') + + self.use_in_shortcut = self.in_channels != self.out_channels if use_in_shortcut is None else use_in_shortcut # noqa + + self.conv_shortcut = None + if self.use_in_shortcut: + self.conv_shortcut = torch.nn.Conv2d( + in_channels, out_channels, kernel_size=1, stride=1, padding=0) + + def forward(self, input_tensor, temb): + """forward with hidden states and time embeddings.""" + hidden_states = input_tensor + + hidden_states = self.norm1(hidden_states) + hidden_states = self.nonlinearity(hidden_states) + + if self.upsample is not None: + # upsample_nearest_nhwc fails with large batch sizes. + # see https://github.com/huggingface/diffusers/issues/984 + if hidden_states.shape[0] >= 64: + input_tensor = input_tensor.contiguous() + hidden_states = hidden_states.contiguous() + input_tensor = self.upsample(input_tensor) + hidden_states = self.upsample(hidden_states) + elif self.downsample is not None: + input_tensor = self.downsample(input_tensor) + hidden_states = self.downsample(hidden_states) + + hidden_states = self.conv1(hidden_states) + + if temb is not None: + temb = self.time_emb_proj(self.nonlinearity(temb))[:, :, None, + None] + hidden_states = hidden_states + temb + + hidden_states = self.norm2(hidden_states) + hidden_states = self.nonlinearity(hidden_states) + + hidden_states = self.dropout(hidden_states) + hidden_states = self.conv2(hidden_states) + + if self.conv_shortcut is not None: + input_tensor = self.conv_shortcut(input_tensor) + + output_tensor = (input_tensor + + hidden_states) / self.output_scale_factor + + return output_tensor + + +class Upsample2D(nn.Module): + """An upsampling layer with an optional convolution. + + Args: + channels (int): channels in the inputs and outputs. + use_conv (bool): a bool determining if a convolution is applied. + use_conv_transpose (bool): whether to use conv transpose. + out_channels (int): output channels. + """ + + def __init__(self, + channels, + use_conv=False, + use_conv_transpose=False, + out_channels=None, + name='conv'): + super().__init__() + self.channels = channels + self.out_channels = out_channels or channels + self.use_conv = use_conv + self.use_conv_transpose = use_conv_transpose + self.name = name + + conv = None + if use_conv: + conv = nn.Conv2d(self.channels, self.out_channels, 3, padding=1) + else: + conv = nn.ConvTranspose2d(channels, self.out_channels, 4, 2, 1) + + self.conv = conv + + def forward(self, hidden_states, output_size=None): + """forward with hidden states.""" + assert hidden_states.shape[1] == self.channels + + if self.use_conv_transpose: + return self.conv(hidden_states) + + # if `output_size` is passed we force the interpolation output + # size and do not make use of `scale_factor=2` + if output_size is None: + hidden_states = F.interpolate( + hidden_states, scale_factor=2.0, mode='nearest') + else: + hidden_states = F.interpolate( + hidden_states, size=output_size, mode='nearest') + + hidden_states = self.conv(hidden_states) + + return hidden_states + + +class Downsample2D(nn.Module): + """A downsampling layer with an optional convolution. + + Args: + channels (int): channels in the inputs and outputs. + use_conv (bool): a bool determining if a convolution is applied. + out_channels (int): output channels + padding (int): padding num + """ + + def __init__(self, + channels, + use_conv=False, + out_channels=None, + padding=1, + name='conv'): + super().__init__() + self.channels = channels + self.out_channels = out_channels or channels + self.use_conv = use_conv + self.padding = padding + stride = 2 + self.name = name + + if use_conv: + conv = nn.Conv2d( + self.channels, + self.out_channels, + 3, + stride=stride, + padding=padding) + else: + assert self.channels == self.out_channels + conv = nn.AvgPool2d(kernel_size=stride, stride=stride) + + self.conv = conv + + def forward(self, hidden_states): + """forward with hidden states.""" + assert hidden_states.shape[1] == self.channels + if self.use_conv and self.padding == 0: + pad = (0, 1, 0, 1) + hidden_states = F.pad(hidden_states, pad, mode='constant', value=0) + + assert hidden_states.shape[1] == self.channels + hidden_states = self.conv(hidden_states) + + return hidden_states diff --git a/mmedit/models/editors/ddpm/unet_blocks.py b/mmedit/models/editors/ddpm/unet_blocks.py new file mode 100644 index 0000000000..159d2a7e10 --- /dev/null +++ b/mmedit/models/editors/ddpm/unet_blocks.py @@ -0,0 +1,594 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from torch import nn + +from .attention import Transformer2DModel +from .res_blocks import Downsample2D, ResnetBlock2D, Upsample2D + + +def get_down_block( + down_block_type, + num_layers, + in_channels, + out_channels, + temb_channels, + add_downsample, + resnet_act_fn, + attn_num_head_channels, + resnet_eps=1e-5, + resnet_groups=32, + cross_attention_dim=1280, + downsample_padding=1, + dual_cross_attention=False, + use_linear_projection=False, + only_cross_attention=False, +): + """get unet down path block.""" + + down_block_type = down_block_type[7:] if down_block_type.startswith( + 'UNetRes') else down_block_type + if down_block_type == 'DownBlock2D': + return DownBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + downsample_padding=downsample_padding, + ) + elif down_block_type == 'CrossAttnDownBlock2D': + return CrossAttnDownBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + downsample_padding=downsample_padding, + cross_attention_dim=cross_attention_dim, + attn_num_head_channels=attn_num_head_channels, + dual_cross_attention=dual_cross_attention, + use_linear_projection=use_linear_projection, + only_cross_attention=only_cross_attention, + ) + raise ValueError(f'{down_block_type} does not exist.') + + +def get_up_block( + up_block_type, + num_layers, + in_channels, + out_channels, + prev_output_channel, + temb_channels, + add_upsample, + resnet_act_fn, + attn_num_head_channels, + resnet_eps=1e-5, + resnet_groups=32, + cross_attention_dim=1280, + dual_cross_attention=False, + use_linear_projection=False, + only_cross_attention=False, +): + """get unet up path block.""" + + up_block_type = up_block_type[7:] if up_block_type.startswith( + 'UNetRes') else up_block_type + if up_block_type == 'UpBlock2D': + return UpBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + prev_output_channel=prev_output_channel, + temb_channels=temb_channels, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + ) + elif up_block_type == 'CrossAttnUpBlock2D': + return CrossAttnUpBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + prev_output_channel=prev_output_channel, + temb_channels=temb_channels, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + cross_attention_dim=cross_attention_dim, + attn_num_head_channels=attn_num_head_channels, + dual_cross_attention=dual_cross_attention, + use_linear_projection=use_linear_projection, + only_cross_attention=only_cross_attention, + ) + raise ValueError(f'{up_block_type} does not exist.') + + +class UNetMidBlock2DCrossAttn(nn.Module): + """unet mid block built by cross attention.""" + + def __init__( + self, + in_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-5, + resnet_time_scale_shift: str = 'default', + resnet_act_fn: str = 'swish', + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + attn_num_head_channels=1, + attention_type='default', + output_scale_factor=1.0, + cross_attention_dim=1280, + dual_cross_attention=False, + use_linear_projection=False, + ): + super().__init__() + + self.attention_type = attention_type + self.attn_num_head_channels = attn_num_head_channels + resnet_groups = resnet_groups if resnet_groups is not None else min( + in_channels // 4, 32) + + # there is always at least one resnet + resnets = [ + ResnetBlock2D( + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ] + attentions = [] + + for _ in range(num_layers): + attentions.append( + Transformer2DModel( + attn_num_head_channels, + in_channels // attn_num_head_channels, + in_channels=in_channels, + num_layers=1, + cross_attention_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + use_linear_projection=use_linear_projection, + )) + + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + )) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + def set_attention_slice(self, slice_size): + """set attention slice.""" + + head_dims = self.attn_num_head_channels + head_dims = [head_dims] if isinstance(head_dims, int) else head_dims + if slice_size is not None and any(dim % slice_size != 0 + for dim in head_dims): + raise ValueError( + f'Make sure slice_size {slice_size} is a common divisor of ' + f'the number of heads used in cross_attention: {head_dims}') + + for attn in self.attentions: + attn._set_attention_slice(slice_size) + + def forward(self, hidden_states, temb=None, encoder_hidden_states=None): + """forward with hidden states.""" + + hidden_states = self.resnets[0](hidden_states, temb) + for attn, resnet in zip(self.attentions, self.resnets[1:]): + hidden_states = attn(hidden_states, encoder_hidden_states).sample + hidden_states = resnet(hidden_states, temb) + + return hidden_states + + +class CrossAttnDownBlock2D(nn.Module): + """Down block built by cross attention.""" + + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-5, + resnet_time_scale_shift: str = 'default', + resnet_act_fn: str = 'swish', + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + attn_num_head_channels=1, + cross_attention_dim=1280, + attention_type='default', + output_scale_factor=1.0, + downsample_padding=1, + add_downsample=True, + dual_cross_attention=False, + use_linear_projection=False, + only_cross_attention=False, + ): + super().__init__() + resnets = [] + attentions = [] + + self.attention_type = attention_type + self.attn_num_head_channels = attn_num_head_channels + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + )) + attentions.append( + Transformer2DModel( + attn_num_head_channels, + out_channels // attn_num_head_channels, + in_channels=out_channels, + num_layers=1, + cross_attention_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + use_linear_projection=use_linear_projection, + only_cross_attention=only_cross_attention, + )) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + if add_downsample: + self.downsamplers = nn.ModuleList([ + Downsample2D( + out_channels, + use_conv=True, + out_channels=out_channels, + padding=downsample_padding, + name='op') + ]) + else: + self.downsamplers = None + + self.gradient_checkpointing = False + + def set_attention_slice(self, slice_size): + """set attention slice.""" + + head_dims = self.attn_num_head_channels + head_dims = [head_dims] if isinstance(head_dims, int) else head_dims + if slice_size is not None and any(dim % slice_size != 0 + for dim in head_dims): + raise ValueError( + f'Make sure slice_size {slice_size} is a common divisor of ' + f'the number of heads used in cross_attention: {head_dims}') + + for attn in self.attentions: + attn._set_attention_slice(slice_size) + + def forward(self, hidden_states, temb=None, encoder_hidden_states=None): + """forward with hidden states.""" + + output_states = () + + for resnet, attn in zip(self.resnets, self.attentions): + hidden_states = resnet(hidden_states, temb) + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states).sample + + output_states += (hidden_states, ) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states) + + output_states += (hidden_states, ) + + return hidden_states, output_states + + +class DownBlock2D(nn.Module): + """Down block built by resnet.""" + + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-5, + resnet_time_scale_shift: str = 'default', + resnet_act_fn: str = 'swish', + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + output_scale_factor=1.0, + add_downsample=True, + downsample_padding=1, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + )) + + self.resnets = nn.ModuleList(resnets) + + if add_downsample: + self.downsamplers = nn.ModuleList([ + Downsample2D( + out_channels, + use_conv=True, + out_channels=out_channels, + padding=downsample_padding, + name='op') + ]) + else: + self.downsamplers = None + + self.gradient_checkpointing = False + + def forward(self, hidden_states, temb=None): + """forward with hidden states.""" + + output_states = () + + for resnet in self.resnets: + hidden_states = resnet(hidden_states, temb) + + output_states += (hidden_states, ) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states) + + output_states += (hidden_states, ) + + return hidden_states, output_states + + +class CrossAttnUpBlock2D(nn.Module): + """Up block built by cross attention.""" + + def __init__( + self, + in_channels: int, + out_channels: int, + prev_output_channel: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-5, + resnet_time_scale_shift: str = 'default', + resnet_act_fn: str = 'swish', + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + attn_num_head_channels=1, + cross_attention_dim=1280, + attention_type='default', + output_scale_factor=1.0, + add_upsample=True, + dual_cross_attention=False, + use_linear_projection=False, + only_cross_attention=False, + ): + super().__init__() + resnets = [] + attentions = [] + + self.attention_type = attention_type + self.attn_num_head_channels = attn_num_head_channels + + for i in range(num_layers): + res_skip_channels = in_channels if (i == num_layers - + 1) else out_channels + resnet_in_channels = \ + prev_output_channel if i == 0 else out_channels + + resnets.append( + ResnetBlock2D( + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + )) + attentions.append( + Transformer2DModel( + attn_num_head_channels, + out_channels // attn_num_head_channels, + in_channels=out_channels, + num_layers=1, + cross_attention_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + use_linear_projection=use_linear_projection, + only_cross_attention=only_cross_attention, + )) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + if add_upsample: + self.upsamplers = nn.ModuleList([ + Upsample2D( + out_channels, use_conv=True, out_channels=out_channels) + ]) + else: + self.upsamplers = None + + self.gradient_checkpointing = False + + def set_attention_slice(self, slice_size): + """set attention slice.""" + + head_dims = self.attn_num_head_channels + head_dims = [head_dims] if isinstance(head_dims, int) else head_dims + if slice_size is not None and any(dim % slice_size != 0 + for dim in head_dims): + raise ValueError( + f'Make sure slice_size {slice_size} is a common divisor of ' + f'the number of heads used in cross_attention: {head_dims}') + + for attn in self.attentions: + attn._set_attention_slice(slice_size) + + self.gradient_checkpointing = False + + def forward( + self, + hidden_states, + res_hidden_states_tuple, + temb=None, + encoder_hidden_states=None, + upsample_size=None, + ): + """forward with hidden states and res hidden states.""" + + for resnet, attn in zip(self.resnets, self.attentions): + # pop res hidden states + res_hidden_states = res_hidden_states_tuple[-1] + res_hidden_states_tuple = res_hidden_states_tuple[:-1] + hidden_states = torch.cat([hidden_states, res_hidden_states], + dim=1) + + hidden_states = resnet(hidden_states, temb) + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states).sample + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states, upsample_size) + + return hidden_states + + +class UpBlock2D(nn.Module): + """Up block built by resnet.""" + + def __init__( + self, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-5, + resnet_time_scale_shift: str = 'default', + resnet_act_fn: str = 'swish', + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + output_scale_factor=1.0, + add_upsample=True, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + res_skip_channels = in_channels if (i == num_layers - + 1) else out_channels + resnet_in_channels = \ + prev_output_channel if i == 0 else out_channels + + resnets.append( + ResnetBlock2D( + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + )) + + self.resnets = nn.ModuleList(resnets) + + if add_upsample: + self.upsamplers = nn.ModuleList([ + Upsample2D( + out_channels, use_conv=True, out_channels=out_channels) + ]) + else: + self.upsamplers = None + + self.gradient_checkpointing = False + + def forward(self, + hidden_states, + res_hidden_states_tuple, + temb=None, + upsample_size=None): + """forward with hidden states and res hidden states.""" + + for resnet in self.resnets: + # pop res hidden states + res_hidden_states = res_hidden_states_tuple[-1] + res_hidden_states_tuple = res_hidden_states_tuple[:-1] + hidden_states = torch.cat([hidden_states, res_hidden_states], + dim=1) + + hidden_states = resnet(hidden_states, temb) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states, upsample_size) + + return hidden_states diff --git a/mmedit/models/editors/stable_diffusion/__init__.py b/mmedit/models/editors/stable_diffusion/__init__.py new file mode 100644 index 0000000000..93dac0131b --- /dev/null +++ b/mmedit/models/editors/stable_diffusion/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .stable_diffusion import StableDiffusion + +__all__ = ['StableDiffusion'] diff --git a/mmedit/models/editors/stable_diffusion/clip_wrapper.py b/mmedit/models/editors/stable_diffusion/clip_wrapper.py new file mode 100644 index 0000000000..dc867fe279 --- /dev/null +++ b/mmedit/models/editors/stable_diffusion/clip_wrapper.py @@ -0,0 +1,187 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os + +import torch +import torch.nn as nn +from mmengine.logging import MMLogger + +from mmedit.utils import try_import + +transformers = try_import('transformers') + +if transformers is not None: + from transformers import CLIPConfig, CLIPVisionModel, PreTrainedModel + from transformers.models.clip.feature_extraction_clip import \ + CLIPFeatureExtractor # noqa + from transformers.models.clip.modeling_clip import CLIPTextModel + from transformers.models.clip.tokenization_clip import CLIPTokenizer + + logger = MMLogger.get_current_instance() + + def cosine_distance(image_embeds, text_embeds): + """compute the cosine distance of image embeddings and text + embeddings.""" + normalized_image_embeds = nn.functional.normalize(image_embeds) + normalized_text_embeds = nn.functional.normalize(text_embeds) + return torch.mm(normalized_image_embeds, normalized_text_embeds.t()) + + class StableDiffusionSafetyChecker(PreTrainedModel): + config_class = CLIPConfig + _no_split_modules = ['CLIPEncoderLayer'] + + def __init__(self, config: CLIPConfig): + """check result image for stable diffsuion to prevent NSFW content + generated. + + Args: + config(CLIPConfig): config for transformers clip. + """ + + super().__init__(config) + + self.vision_model = CLIPVisionModel(config.vision_config) + self.visual_projection = nn.Linear( + config.vision_config.hidden_size, + config.projection_dim, + bias=False) + + self.concept_embeds = nn.Parameter( + torch.ones(17, config.projection_dim), requires_grad=False) + self.special_care_embeds = nn.Parameter( + torch.ones(3, config.projection_dim), requires_grad=False) + + self.concept_embeds_weights = nn.Parameter( + torch.ones(17), requires_grad=False) + self.special_care_embeds_weights = nn.Parameter( + torch.ones(3), requires_grad=False) + + @torch.no_grad() + def forward(self, clip_input, images): + """return black image if input image has nsfw content. + + Args: + clip_input(torch.Tensor): + image feature extracted by clip feature extractor. + images(torch.Tensor): + image generated by stable diffusion. + + Returns: + images(torch.Tensor): + black images if input images have nsfw content, + otherwise return input images. + has_nsfw_concepts(list[bool]): + flag list to indicate whether input images have + nsfw content. + """ + pooled_output = self.vision_model(clip_input)[1] + image_embeds = self.visual_projection(pooled_output) + + # we always cast to float32 as this does not cause + # significant overhead and is compatible with bfloa16 + special_cos_dist = cosine_distance( + image_embeds, self.special_care_embeds).cpu().float().numpy() + cos_dist = cosine_distance( + image_embeds, self.concept_embeds).cpu().float().numpy() + + result = [] + batch_size = image_embeds.shape[0] + for i in range(batch_size): + result_img = { + 'special_scores': {}, + 'special_care': [], + 'concept_scores': {}, + 'bad_concepts': [] + } + + # increase this value to create a stronger `nfsw` filter + # at the cost of increasing the possibility of + # filtering benign images + adjustment = 0.0 + + for concept_idx in range(len(special_cos_dist[0])): + concept_cos = special_cos_dist[i][concept_idx] + concept_threshold = self.special_care_embeds_weights[ + concept_idx].item() + result_img['special_scores'][concept_idx] = round( + concept_cos - concept_threshold + adjustment, 3) + if result_img['special_scores'][concept_idx] > 0: + result_img['special_care'].append({ + concept_idx, + result_img['special_scores'][concept_idx] + }) + adjustment = 0.01 + + for concept_idx in range(len(cos_dist[0])): + concept_cos = cos_dist[i][concept_idx] + concept_threshold = self.concept_embeds_weights[ + concept_idx].item() + result_img['concept_scores'][concept_idx] = round( + concept_cos - concept_threshold + adjustment, 3) + if result_img['concept_scores'][concept_idx] > 0: + result_img['bad_concepts'].append(concept_idx) + + result.append(result_img) + + has_nsfw_concepts = [ + len(res['bad_concepts']) > 0 for res in result + ] + + for idx, has_nsfw_concept in enumerate(has_nsfw_concepts): + if has_nsfw_concept: + images[idx] = torch.zeros(images[idx].shape) # black image + + if any(has_nsfw_concepts): + logger.warning( + 'NSFW content was detected in one or more images.' + ' A black image will be returned instead.' + ' Try again with a different prompt and/or seed.') + + return images, has_nsfw_concepts + + def load_clip_submodels(init_cfg, submodels, requires_safety_checker): + """ + Args: + init_cfg (dict): + ckpt path of clip models. + submodels (List): + list of stable diffusion submodels. + requires_safety_checker (bool): + whether to load safety checker + + Returns: + tokenizer(CLIPTokenizer): + tokenizer with ckpt loaded. + feature_extractor(CLIPFeatureExtractor): + feature_extractor with ckpt loaded. + text_encoder(CLIPTextModel): + text_encoder with ckpt loaded. + safety_checker(StableDiffusionSafetyChecker): + safety_checker with ckpt loaded. + + """ + pretrained_model_path = init_cfg.get('pretrained_model_path', None) + + tokenizer, feature_extractor, text_encoder, safety_checker = \ + None, None, None, None + if pretrained_model_path: + tokenizer = CLIPTokenizer.from_pretrained( + os.path.join(pretrained_model_path, 'tokenizer')) + + feature_extractor = CLIPFeatureExtractor.from_pretrained( + os.path.join(pretrained_model_path, 'feature_extractor')) + + text_encoder = CLIPTextModel.from_pretrained( + os.path.join(pretrained_model_path, 'text_encoder')) + + if requires_safety_checker: + submodels.append('safety_checker') + safety_checker = StableDiffusionSafetyChecker.from_pretrained( + os.path.join(pretrained_model_path, 'safety_checker')) + + return tokenizer, feature_extractor, text_encoder, safety_checker + +else: + + def load_clip_submodels(init_cfg, submodels, requires_safety_checker): + raise ImportError('Please install tranformers via ' + '\'pip install transformers\'') diff --git a/mmedit/models/editors/stable_diffusion/stable_diffusion.py b/mmedit/models/editors/stable_diffusion/stable_diffusion.py new file mode 100644 index 0000000000..1f70b0406e --- /dev/null +++ b/mmedit/models/editors/stable_diffusion/stable_diffusion.py @@ -0,0 +1,505 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import inspect +import os.path as osp +from typing import Dict, List, Optional, Union + +import torch +from mmengine.logging import MMLogger +from mmengine.model import BaseModel +from mmengine.runner import set_random_seed +from mmengine.runner.checkpoint import _load_checkpoint +from tqdm.auto import tqdm + +from mmedit.registry import DIFFUSION_SCHEDULERS, MODELS +from .clip_wrapper import load_clip_submodels +from .vae import AutoencoderKL + +logger = MMLogger.get_current_instance() + + +@MODELS.register_module('sd') +@MODELS.register_module() +class StableDiffusion(BaseModel): + """class to run stable diffsuion pipeline. + + Args: + diffusion_scheduler(dict): Diffusion scheduler config. + unet_cfg(dict): Unet config. + vae_cfg(dict): Vae config. + pretrained_ckpt_path(dict): + Pretrained ckpt path for submodels in stable diffusion. + requires_safety_checker(bool): + whether to run safety checker after image generated. + unet_sample_size(int): sampel size for unet. + """ + + def __init__(self, + diffusion_scheduler, + unet, + vae, + requires_safety_checker=True, + unet_sample_size=64, + init_cfg=None): + super().__init__() + + self.device = torch.device('cpu') + self.submodels = [ + 'tokenizer', 'vae', 'scheduler', 'unet', 'feature_extractor', + 'text_encoder' + ] + self.requires_safety_checker = requires_safety_checker + + self.scheduler = DIFFUSION_SCHEDULERS.build( + diffusion_scheduler) if isinstance(diffusion_scheduler, + dict) else diffusion_scheduler + self.scheduler.order = 1 + self.scheduler.init_noise_sigma = 1.0 + + self.unet_sample_size = unet_sample_size + self.unet = MODELS.build(unet) if isinstance(unet, dict) else unet + + self.vae = AutoencoderKL(**vae) if isinstance(vae, dict) else vae + self.vae_scale_factor = 2**(len(self.vae.block_out_channels) - 1) + + self.init_cfg = init_cfg + self.init_weights() + + def init_weights(self): + """load pretrained ckpt for each submodel.""" + if self.init_cfg is not None and self.init_cfg['type'] == 'Pretrained': + map_location = self.init_cfg.get('map_location', 'cpu') + pretrained_model_path = self.init_cfg.get('pretrained_model_path', + None) + if pretrained_model_path: + unet_ckpt_path = osp.join(pretrained_model_path, 'unet', + 'diffusion_pytorch_model.bin') + if unet_ckpt_path: + state_dict = _load_checkpoint(unet_ckpt_path, map_location) + self.unet.load_state_dict(state_dict, strict=True) + + vae_ckpt_path = osp.join(pretrained_model_path, 'vae', + 'diffusion_pytorch_model.bin') + if vae_ckpt_path: + state_dict = _load_checkpoint(vae_ckpt_path, map_location) + self.vae.load_state_dict(state_dict, strict=True) + + self.tokenizer, self.feature_extractor, self.text_encoder, self.safety_checker = load_clip_submodels( # noqa + self.init_cfg, self.submodels, self.requires_safety_checker) + + def to(self, torch_device: Optional[Union[str, torch.device]] = None): + """put submodels to torch device. + + Args: + torch_device(Optional[Union[str, torch.device]]): + device to put, default to None. + + Returns: + self(StableDiffusion): + class instance itsself. + """ + if torch_device is None: + return self + + for name in self.submodels: + module = getattr(self, name) + if isinstance(module, torch.nn.Module): + module.to(torch_device) + self.device = torch.device(torch_device) + return self + + @torch.no_grad() + def infer(self, + prompt: Union[str, List[str]], + height: Optional[int] = None, + width: Optional[int] = None, + num_inference_steps: int = 50, + guidance_scale: float = 7.5, + negative_prompt: Optional[Union[str, List[str]]] = None, + num_images_per_prompt: Optional[int] = 1, + eta: float = 0.0, + generator: Optional[torch.Generator] = None, + latents: Optional[torch.FloatTensor] = None, + show_progress=True, + seed=1): + """Function invoked when calling the pipeline for generation. + + Args: + prompt (`str` or `List[str]`): + The prompt or prompts to guide the image generation. + height (`int`, *optional*, + defaults to self.unet_sample_size * self.vae_scale_factor): + The height in pixels of the generated image. + width (`int`, *optional*, + defaults to self.unet_sample_size * self.vae_scale_factor): + The width in pixels of the generated image. + num_inference_steps (`int`, *optional*, defaults to 50): + The number of denoising steps. + More denoising steps usually lead to a higher + quality image at the expense of slower inference. + guidance_scale (`float`, *optional*, defaults to 7.5): + Guidance scale as defined in + [Classifier-Free Diffusion Guidance] + (https://arxiv.org/abs/2207.12598). + negative_prompt (`str` or `List[str]`, *optional*): + The prompt or prompts not to guide the image generation. + Ignored when not using guidance (i.e., ignored + if `guidance_scale` is less than `1`). + num_images_per_prompt (`int`, *optional*, defaults to 1): + The number of images to generate per prompt. + eta (`float`, *optional*, defaults to 0.0): + Corresponds to parameter eta (η) in the DDIM paper: + https://arxiv.org/abs/2010.02502. Only applies to + [`schedulers.DDIMScheduler`], will be ignored for others. + generator (`torch.Generator`, *optional*): + A [torch generator] to make generation deterministic. + latents (`torch.FloatTensor`, *optional*): + Pre-generated noisy latents, + sampled from a Gaussian distribution, + to be used as inputs for image generation. + Can be used to tweak the same generation + with different prompts. + If not provided, a latents tensor will be + generated by sampling using the supplied random `generator`. + + Returns: + dict:['samples', 'nsfw_content_detected']: + 'samples': image result samples + 'nsfw_content_detected': nsfw content flags for image samples. + """ + set_random_seed(seed=seed) + + # 0. Default height and width to unet + height = height or self.unet_sample_size * self.vae_scale_factor + width = width or self.unet_sample_size * self.vae_scale_factor + + # 1. Check inputs. Raise error if not correct + self.check_inputs(prompt, height, width) + + # 2. Define call parameters + batch_size = 1 if isinstance(prompt, str) else len(prompt) + device = self.device + # here `guidance_scale` is defined analog to the + # guidance weight `w` of equation (2) + # of the Imagen paper: https://arxiv.org/pdf/2205.11487.pdf . + # `guidance_scale = 1` + # corresponds to doing no classifier free guidance. + do_classifier_free_guidance = guidance_scale > 1.0 + + # 3. Encode input prompt + text_embeddings = self._encode_prompt(prompt, device, + num_images_per_prompt, + do_classifier_free_guidance, + negative_prompt) + + # 4. Prepare timesteps + # self.scheduler.set_timesteps(num_inference_steps, device=device) + self.scheduler.set_timesteps(num_inference_steps) + timesteps = self.scheduler.timesteps + + # 5. Prepare latent variables + num_channels_latents = self.unet.in_channels + latents = self.prepare_latents( + batch_size * num_images_per_prompt, + num_channels_latents, + height, + width, + text_embeddings.dtype, + device, + generator, + latents, + ) + + # 6. Prepare extra step kwargs. + # TODO: Logic should ideally just be moved out of the pipeline + extra_step_kwargs = self.prepare_extra_step_kwargs(generator, eta) + + # 7. Denoising loop + if show_progress: + timesteps = tqdm(timesteps) + for i, t in enumerate(timesteps): + # expand the latents if we are doing classifier free guidance + latent_model_input = torch.cat( + [latents] * 2) if do_classifier_free_guidance else latents + # latent_model_input = \ + # self.scheduler.scale_model_input(latent_model_input, t) + + # predict the noise residual + noise_pred = self.unet( + latent_model_input, t, + encoder_hidden_states=text_embeddings)['outputs'] + + # perform guidance + if do_classifier_free_guidance: + noise_pred_uncond, noise_pred_text = noise_pred.chunk(2) + noise_pred = noise_pred_uncond + guidance_scale * ( + noise_pred_text - noise_pred_uncond) + + # compute the previous noisy sample x_t -> x_t-1 + latents = self.scheduler.step( + noise_pred, t, latents, **extra_step_kwargs)['prev_sample'] + + # 8. Post-processing + image = self.decode_latents(latents) + + # 9. Run safety checker + image, has_nsfw_concept = self.run_safety_checker( + image, device, text_embeddings.dtype) + image = image[0].permute([2, 0, 1]) + + return {'samples': image, 'nsfw_content_detected': has_nsfw_concept} + + def _encode_prompt(self, prompt, device, num_images_per_prompt, + do_classifier_free_guidance, negative_prompt): + """Encodes the prompt into text encoder hidden states. + + Args: + prompt (str or list(int)): + prompt to be encoded. + device: (torch.device): + torch device. + num_images_per_prompt (int): + number of images that should be generated per prompt. + do_classifier_free_guidance (`bool`): + whether to use classifier free guidance or not. + negative_prompt (str or List[str]): + The prompt or prompts not to guide the image generation. + Ignored when not using guidance (i.e., ignored + if `guidance_scale` is less than `1`). + + Returns: + text_embeddings (torch.Tensor): + text embeddings generated by clip text encoder. + """ + batch_size = len(prompt) if isinstance(prompt, list) else 1 + + text_inputs = self.tokenizer( + prompt, + padding='max_length', + max_length=self.tokenizer.model_max_length, + truncation=True, + return_tensors='pt', + ) + text_input_ids = text_inputs.input_ids + untruncated_ids = self.tokenizer( + prompt, padding='max_length', return_tensors='pt').input_ids + + if not torch.equal(text_input_ids, untruncated_ids): + removed_text = self.tokenizer.batch_decode( + untruncated_ids[:, self.tokenizer.model_max_length - 1:-1]) + logger.warning( + 'The following part of your input was truncated because CLIP' + ' can only handle sequences up to' + f' {self.tokenizer.model_max_length} tokens: {removed_text}') + + if hasattr(self.text_encoder.config, 'use_attention_mask' + ) and self.text_encoder.config.use_attention_mask: + attention_mask = text_inputs.attention_mask.to(device) + else: + attention_mask = None + + text_embeddings = self.text_encoder( + text_input_ids.to(device), + attention_mask=attention_mask, + ) + text_embeddings = text_embeddings[0] + + # duplicate text embeddings for each generation per prompt, + bs_embed, seq_len, _ = text_embeddings.shape + text_embeddings = text_embeddings.repeat(1, num_images_per_prompt, 1) + text_embeddings = text_embeddings.view( + bs_embed * num_images_per_prompt, seq_len, -1) + + # get unconditional embeddings for classifier free guidance + if do_classifier_free_guidance: + uncond_tokens: List[str] + if negative_prompt is None: + uncond_tokens = [''] * batch_size + elif type(prompt) is not type(negative_prompt): + raise TypeError( + f'`negative_prompt` should be the same type to `prompt`,' + f'but got {type(negative_prompt)} !=' + f' {type(prompt)}.') + elif isinstance(negative_prompt, str): + uncond_tokens = [negative_prompt] + elif batch_size != len(negative_prompt): + raise ValueError( + f'`negative_prompt`: {negative_prompt} has ' + f'batch size {len(negative_prompt)}, but `prompt`:' + f' {prompt} has batch size {batch_size}.' + f' Please make sure that passed `negative_prompt` matches' + ' the batch size of `prompt`.') + else: + uncond_tokens = negative_prompt + + max_length = text_input_ids.shape[-1] + uncond_input = self.tokenizer( + uncond_tokens, + padding='max_length', + max_length=max_length, + truncation=True, + return_tensors='pt', + ) + + if hasattr(self.text_encoder.config, 'use_attention_mask' + ) and self.text_encoder.config.use_attention_mask: + attention_mask = uncond_input.attention_mask.to(device) + else: + attention_mask = None + + uncond_embeddings = self.text_encoder( + uncond_input.input_ids.to(device), + attention_mask=attention_mask, + ) + uncond_embeddings = uncond_embeddings[0] + + # duplicate unconditional embeddings for + # each generation per prompt, using mps friendly method + seq_len = uncond_embeddings.shape[1] + uncond_embeddings = uncond_embeddings.repeat( + 1, num_images_per_prompt, 1) + uncond_embeddings = uncond_embeddings.view( + batch_size * num_images_per_prompt, seq_len, -1) + + # For classifier free guidance, we need to do two forward passes. + # Here we concatenate the unconditional + # and text embeddings into a single batch + # to avoid doing two forward passes + text_embeddings = torch.cat([uncond_embeddings, text_embeddings]) + + return text_embeddings + + def run_safety_checker(self, image, device, dtype): + """run safety checker to check whether image has nsfw content. + + Args: + image (numpy.ndarray): + image generated by stable diffusion. + device (torch.device): + device to run safety checker. + dtype (torch.dtype): + float type to run. + + Returns: + image (numpy.ndarray): + black image if nsfw content detected else input image. + has_nsfw_concept (list[bool]): + flag list to indicate nsfw content detected. + """ + if self.safety_checker is not None: + safety_checker_input = self.feature_extractor( + image[0], return_tensors='pt').to(device) + image, has_nsfw_concept = self.safety_checker( + images=image, + clip_input=safety_checker_input.pixel_values.to(dtype)) + else: + has_nsfw_concept = None + return image, has_nsfw_concept + + def decode_latents(self, latents): + """use vae to decode latents. + + Args: + latents (torch.Tensor): latents to decode. + + Returns: + image (numpy.ndarray): image result. + """ + latents = 1 / 0.18215 * latents + image = self.vae.decode(latents).sample + image = (image / 2 + 0.5).clamp(0, 1) + # we always cast to float32 as this does not cause + # significant overhead and is compatible with bfloa16 + image = image.cpu().permute(0, 2, 3, 1).float() + return image + + def prepare_extra_step_kwargs(self, generator, eta): + """prepare extra kwargs for the scheduler step. + + Args: + generator (torch.Generator): + generator for random functions. + eta (float): + eta (η) is only used with the DDIMScheduler, + it will be ignored for other schedulers. + eta corresponds to η in DDIM paper: + https://arxiv.org/abs/2010.02502 + and should be between [0, 1] + + Return: + extra_step_kwargs (dict): + dict contains 'generator' and 'eta' + """ + accepts_eta = 'eta' in set( + inspect.signature(self.scheduler.step).parameters.keys()) + extra_step_kwargs = {} + if accepts_eta: + extra_step_kwargs['eta'] = eta + + # check if the scheduler accepts generator + accepts_generator = 'generator' in set( + inspect.signature(self.scheduler.step).parameters.keys()) + if accepts_generator: + extra_step_kwargs['generator'] = generator + return extra_step_kwargs + + def check_inputs(self, prompt, height, width): + """check whether inputs are in suitable format or not.""" + + if not isinstance(prompt, str) and not isinstance(prompt, list): + raise ValueError(f'`prompt` has to be of ' + f'type `str` or `list` but is {type(prompt)}') + + if height % 8 != 0 or width % 8 != 0: + raise ValueError(f'`height` and `width` have to be divisible ' + f'by 8 but are {height} and {width}.') + + def prepare_latents(self, + batch_size, + num_channels_latents, + height, + width, + dtype, + device, + generator, + latents=None): + """prepare latents for diffusion to run in latent space. + + Args: + batch_size (int): batch size. + num_channels_latents (int): latent channel nums. + height (int): image height. + width (int): image width. + dtype (torch.dtype): float type. + device (torch.device): torch device. + generator (torch.Generator): + generator for random functions, defaults to None. + latents (torch.Tensor): + Pre-generated noisy latents, defaults to None. + + Return: + latents (torch.Tensor): prepared latents. + """ + shape = (batch_size, num_channels_latents, + height // self.vae_scale_factor, + width // self.vae_scale_factor) + if latents is None: + latents = torch.randn( + shape, generator=generator, device=device, dtype=dtype) + else: + if latents.shape != shape: + raise ValueError(f'Unexpected latents shape, ' + f'got {latents.shape}, expected {shape}') + latents = latents.to(device) + + # scale the initial noise by the standard + # deviation required by the scheduler + latents = latents * self.scheduler.init_noise_sigma + return latents + + def forward(self, + inputs: torch.Tensor, + data_samples: Optional[list] = None, + mode: str = 'tensor') -> Union[Dict[str, torch.Tensor], list]: + """forward is not implemented now.""" + raise NotImplementedError( + 'Forward is not implemented now, please use infer.') diff --git a/mmedit/models/editors/stable_diffusion/vae.py b/mmedit/models/editors/stable_diffusion/vae.py new file mode 100644 index 0000000000..38444ba766 --- /dev/null +++ b/mmedit/models/editors/stable_diffusion/vae.py @@ -0,0 +1,998 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math +from typing import Optional, Tuple, Union + +import mmengine +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from addict import Dict +from mmengine.utils.dl_utils import TORCH_VERSION +from mmengine.utils.version_utils import digit_version + + +class Downsample2D(nn.Module): + """A downsampling layer with an optional convolution. + + Args: + channels (int): channels in the inputs and outputs. + use_conv (bool): a bool determining if a convolution is applied. + out_channels (int): output channels + padding (int): padding num + """ + + def __init__(self, + channels, + use_conv=False, + out_channels=None, + padding=1, + name='conv'): + super().__init__() + self.channels = channels + self.out_channels = out_channels or channels + self.use_conv = use_conv + self.padding = padding + stride = 2 + self.name = name + + if use_conv: + conv = nn.Conv2d( + self.channels, + self.out_channels, + 3, + stride=stride, + padding=padding) + else: + assert self.channels == self.out_channels + conv = nn.AvgPool2d(kernel_size=stride, stride=stride) + + self.conv = conv + + def forward(self, hidden_states): + """forward hidden states.""" + assert hidden_states.shape[1] == self.channels + if self.use_conv and self.padding == 0: + pad = (0, 1, 0, 1) + hidden_states = F.pad(hidden_states, pad, mode='constant', value=0) + + assert hidden_states.shape[1] == self.channels + hidden_states = self.conv(hidden_states) + + return hidden_states + + +class Upsample2D(nn.Module): + """An upsampling layer with an optional convolution. + + Args: + channels (int): channels in the inputs and outputs. + use_conv (bool): a bool determining if a convolution is applied. + use_conv_transpose (bool): whether to use conv transpose. + out_channels (int): output channels. + """ + + def __init__(self, + channels, + use_conv=False, + use_conv_transpose=False, + out_channels=None, + name='conv'): + super().__init__() + self.channels = channels + self.out_channels = out_channels or channels + self.use_conv = use_conv + self.use_conv_transpose = use_conv_transpose + self.name = name + + conv = None + if use_conv: + conv = nn.Conv2d(self.channels, self.out_channels, 3, padding=1) + else: + conv = nn.ConvTranspose2d(channels, self.out_channels, 4, 2, 1) + + self.conv = conv + + def forward(self, hidden_states, output_size=None): + """forward with hidden states.""" + assert hidden_states.shape[1] == self.channels + + if self.use_conv_transpose: + return self.conv(hidden_states) + + # if `output_size` is passed we force the interpolation output + # size and do not make use of `scale_factor=2` + if output_size is None: + hidden_states = F.interpolate( + hidden_states, scale_factor=2.0, mode='nearest') + else: + hidden_states = F.interpolate( + hidden_states, size=output_size, mode='nearest') + + # TODO(Suraj, Patrick) + # - clean up after weight dicts are correctly renamed + hidden_states = self.conv(hidden_states) + + return hidden_states + + +class ResnetBlock2D(nn.Module): + """resnet block support down sample and up sample. + + Args: + in_channels (int): input channels. + out_channels (int): output channels. + conv_shortcut (bool): whether to use conv shortcut. + dropout (float): dropout rate. + temb_channels (int): time embedding channels. + groups (int): conv groups. + groups_out (int): conv out groups. + pre_norm (bool): whether to norm before conv. Todo: remove. + eps (float): eps for groupnorm. + non_linearity (str): non linearity type. + time_embedding_norm (str): time embedding norm type. + output_scale_factor (float): factor to scale input and output. + use_in_shortcut (bool): whether to use conv in shortcut. + up (bool): whether to upsample. + down (bool): whether to downsample. + """ + + def __init__( + self, + in_channels, + out_channels=None, + conv_shortcut=False, + dropout=0.0, + temb_channels=512, + groups=32, + groups_out=None, + pre_norm=True, + eps=1e-6, + non_linearity='silu', + time_embedding_norm='default', + kernel=None, + output_scale_factor=1.0, + use_in_shortcut=None, + up=False, + down=False, + ): + super().__init__() + self.pre_norm = pre_norm + self.pre_norm = True + self.in_channels = in_channels + out_channels = in_channels if out_channels is None else out_channels + self.out_channels = out_channels + self.use_conv_shortcut = conv_shortcut + self.time_embedding_norm = time_embedding_norm + self.up = up + self.down = down + self.output_scale_factor = output_scale_factor + + if groups_out is None: + groups_out = groups + + self.norm1 = torch.nn.GroupNorm( + num_groups=groups, num_channels=in_channels, eps=eps, affine=True) + + self.conv1 = torch.nn.Conv2d( + in_channels, out_channels, kernel_size=3, stride=1, padding=1) + + if temb_channels is not None: + self.time_emb_proj = torch.nn.Linear(temb_channels, out_channels) + else: + self.time_emb_proj = None + + self.norm2 = torch.nn.GroupNorm( + num_groups=groups_out, + num_channels=out_channels, + eps=eps, + affine=True) + self.dropout = torch.nn.Dropout(dropout) + self.conv2 = torch.nn.Conv2d( + out_channels, out_channels, kernel_size=3, stride=1, padding=1) + + if non_linearity == 'silu' and \ + digit_version(TORCH_VERSION) > digit_version('1.6.0'): + self.nonlinearity = nn.SiLU() + else: + mmengine.print_log('\'SiLU\' is not supported for ' + f'torch < 1.6.0, found \'{torch.version}\'.' + 'Use ReLu instead but result maybe wrong') + self.nonlinearity = nn.ReLU() + + self.upsample = self.downsample = None + if self.up: + self.upsample = Upsample2D(in_channels, use_conv=False) + elif self.down: + self.downsample = \ + Downsample2D( + in_channels, use_conv=False, padding=1, name='op') + + self.use_in_shortcut = self.in_channels != self.out_channels if use_in_shortcut is None else use_in_shortcut # noqa + + self.conv_shortcut = None + if self.use_in_shortcut: + self.conv_shortcut = torch.nn.Conv2d( + in_channels, out_channels, kernel_size=1, stride=1, padding=0) + + def forward(self, input_tensor, temb): + """forward with hidden states and time embeddings.""" + hidden_states = input_tensor + + hidden_states = self.norm1(hidden_states) + hidden_states = self.nonlinearity(hidden_states) + + if self.upsample is not None: + # upsample_nearest_nhwc fails with large batch sizes. + # see https://github.com/huggingface/diffusers/issues/984 + if hidden_states.shape[0] >= 64: + input_tensor = input_tensor.contiguous() + hidden_states = hidden_states.contiguous() + input_tensor = self.upsample(input_tensor) + hidden_states = self.upsample(hidden_states) + elif self.downsample is not None: + input_tensor = self.downsample(input_tensor) + hidden_states = self.downsample(hidden_states) + + hidden_states = self.conv1(hidden_states) + + if temb is not None: + temb = \ + self.time_emb_proj(self.nonlinearity(temb))[:, :, None, None] + hidden_states = hidden_states + temb + + hidden_states = self.norm2(hidden_states) + hidden_states = self.nonlinearity(hidden_states) + + hidden_states = self.dropout(hidden_states) + hidden_states = self.conv2(hidden_states) + + if self.conv_shortcut is not None: + input_tensor = self.conv_shortcut(input_tensor) + + output_tensor = \ + (input_tensor + hidden_states) / self.output_scale_factor + + return output_tensor + + +class AttentionBlock(nn.Module): + """An attention block that allows spatial positions to attend to each + other. Originally ported from here, but adapted to the N-d case. + https://github.com/hojonathanho/diffusion/blob/ + 1e0dceb3b3495bbe19116a5e1b3596cd0706c543/diffusion_tf/models/unet.py#L66. + Uses three q, k, v linear layers to compute attention. + + Args: + channels (int): The number of channels in the input and output. + num_head_channels (int, *optional*): + The number of channels in each head. If None, then `num_heads` = 1. + norm_num_groups (int, *optional*, defaults to 32): + The number of groups to use for group norm. + rescale_output_factor (float, *optional*, defaults to 1.0): + The factor to rescale the output by. + eps (float, *optional*, defaults to 1e-5): + The epsilon value to use for group norm. + """ + + def __init__( + self, + channels: int, + num_head_channels: Optional[int] = None, + norm_num_groups: int = 32, + rescale_output_factor: float = 1.0, + eps: float = 1e-5, + ): + super().__init__() + self.channels = channels + + self.num_heads = channels // num_head_channels if num_head_channels is not None else 1 # noqa + self.num_head_size = num_head_channels + self.group_norm = nn.GroupNorm( + num_channels=channels, + num_groups=norm_num_groups, + eps=eps, + affine=True) + + # define q,k,v as linear layers + self.query = nn.Linear(channels, channels) + self.key = nn.Linear(channels, channels) + self.value = nn.Linear(channels, channels) + + self.rescale_output_factor = rescale_output_factor + self.proj_attn = nn.Linear(channels, channels, 1) + + def transpose_for_scores(self, projection: torch.Tensor) -> torch.Tensor: + """transpose projection.""" + new_projection_shape = projection.size()[:-1] + (self.num_heads, -1) + # move heads to 2nd position (B, T, H * D) + # -> (B, T, H, D) -> (B, H, T, D) + new_projection = \ + projection.view(new_projection_shape).permute(0, 2, 1, 3) + return new_projection + + def forward(self, hidden_states): + """forward hidden states.""" + residual = hidden_states + batch, channel, height, width = hidden_states.shape + + # norm + hidden_states = self.group_norm(hidden_states) + + hidden_states = hidden_states.view(batch, channel, + height * width).transpose(1, 2) + + # proj to q, k, v + query_proj = self.query(hidden_states) + key_proj = self.key(hidden_states) + value_proj = self.value(hidden_states) + + scale = 1 / math.sqrt(self.channels / self.num_heads) + + # get scores + if self.num_heads > 1: + query_states = self.transpose_for_scores(query_proj) + key_states = self.transpose_for_scores(key_proj) + value_states = self.transpose_for_scores(value_proj) + + attention_scores = torch.matmul( + query_states, key_states.transpose(-1, -2)) * scale + else: + query_states, key_states, value_states = \ + query_proj, key_proj, value_proj + + attention_scores = torch.baddbmm( + torch.empty( + query_states.shape[0], + query_states.shape[1], + key_states.shape[1], + dtype=query_states.dtype, + device=query_states.device, + ), + query_states, + key_states.transpose(-1, -2), + beta=0, + alpha=scale, + ) + + attention_probs = torch.softmax( + attention_scores.float(), dim=-1).type(attention_scores.dtype) + + # compute attention output + if self.num_heads > 1: + hidden_states = torch.matmul(attention_probs, value_states) + hidden_states = hidden_states.permute(0, 2, 1, 3).contiguous() + new_hidden_states_shape = \ + hidden_states.size()[:-2] + (self.channels,) + hidden_states = hidden_states.view(new_hidden_states_shape) + else: + hidden_states = torch.bmm(attention_probs, value_states) + + # compute next hidden_states + hidden_states = self.proj_attn(hidden_states) + hidden_states = hidden_states.transpose(-1, -2).reshape( + batch, channel, height, width) + + # res connect and rescale + hidden_states = \ + (hidden_states + residual) / self.rescale_output_factor + return hidden_states + + +class UNetMidBlock2D(nn.Module): + """middle block in unet. + + Args: + in_channels (int): input channels. + temb_channels (int): time embedding channels. + dropout (float): dropout rate, defaults to 0.0. + num_layers (int): layer num. + resnet_eps (float): resnet eps, defaults to 1e-6. + resnet_time_scale_shift (str): + time scale shift, defaults to 'default'. + resnet_act_fn (str): + act function in resnet, defaults to 'silu'. + resnet_groups (int): + conv groups in resnet, defaults to 32. + resnet_pre_norm (bool): + pre norm in resnet, defaults to True. + attn_num_head_channels (int): + attention head channels, defaults to 1. + attention_type (str): + attention type ,defaults to 'default'. + output_scale_factor (float): + output scale factor, defaults to 1.0. + """ + + def __init__( + self, + in_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = 'default', + resnet_act_fn: str = 'silu', + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + attn_num_head_channels=1, + attention_type='default', + output_scale_factor=1.0, + ): + super().__init__() + + self.attention_type = attention_type + resnet_groups = resnet_groups if resnet_groups is not None else min( + in_channels // 4, 32) # noqa + + # there is always at least one resnet + resnets = [ + ResnetBlock2D( + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ] + attentions = [] + + for _ in range(num_layers): + attentions.append( + AttentionBlock( + in_channels, + num_head_channels=attn_num_head_channels, + rescale_output_factor=output_scale_factor, + eps=resnet_eps, + norm_num_groups=resnet_groups, + )) + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + )) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + def forward(self, hidden_states, temb=None, encoder_states=None): + """forward with hidden states, time embedding and encoder states.""" + hidden_states = self.resnets[0](hidden_states, temb) + for attn, resnet in zip(self.attentions, self.resnets[1:]): + if self.attention_type == 'default': + hidden_states = attn(hidden_states) + else: + hidden_states = attn(hidden_states, encoder_states) + hidden_states = resnet(hidden_states, temb) + + return hidden_states + + +class DownEncoderBlock2D(nn.Module): + """Down encoder block in vae. + + Args: + in_channels (int): input channels. + out_channels (int): output channels. + dropout (float): dropout rate, defaults to 0.0. + num_layers (int): layer nums, defaults to 1. + resnet_eps (float): resnet eps, defaults to 1e-6. + resnet_time_scale_shift (str): + time scale shift in resnet, defaults to 'default'. + resnet_act_fn (str): + act function in resnet, defaults to 'silu'. + resnet_groups (int): + group num in resnet, defaults to 32. + resnet_pre_norm (bool): + whether to pre norm in resnet, defaults to True. + output_scale_factor (float): + output scale factor, defaults to 1.0. + add_downsample (bool): + whether to add downsample, defaults to True, + downsample_padding (int): + downsample padding num, defaults to 1. + """ + + def __init__( + self, + in_channels: int, + out_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = 'default', + resnet_act_fn: str = 'silu', + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + output_scale_factor=1.0, + add_downsample=True, + downsample_padding=1, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=None, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + )) + + self.resnets = nn.ModuleList(resnets) + + if add_downsample: + self.downsamplers = nn.ModuleList([ + Downsample2D( + out_channels, + use_conv=True, + out_channels=out_channels, + padding=downsample_padding, + name='op') + ]) + else: + self.downsamplers = None + + def forward(self, hidden_states): + """forward with hidden states.""" + for resnet in self.resnets: + hidden_states = resnet(hidden_states, temb=None) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states) + + return hidden_states + + +class Encoder(nn.Module): + """construct encoder in vae.""" + + def __init__( + self, + in_channels=3, + out_channels=3, + down_block_types=('DownEncoderBlock2D', ), + block_out_channels=(64, ), + layers_per_block=2, + norm_num_groups=32, + act_fn='silu', + double_z=True, + ): + super().__init__() + self.layers_per_block = layers_per_block + + self.conv_in = torch.nn.Conv2d( + in_channels, + block_out_channels[0], + kernel_size=3, + stride=1, + padding=1) + + self.mid_block = None + self.down_blocks = nn.ModuleList([]) + + # down + output_channel = block_out_channels[0] + for i, down_block_type in enumerate(down_block_types): + input_channel = output_channel + output_channel = block_out_channels[i] + is_final_block = i == len(block_out_channels) - 1 + + down_block = DownEncoderBlock2D( + num_layers=self.layers_per_block, + in_channels=input_channel, + out_channels=output_channel, + add_downsample=not is_final_block, + resnet_eps=1e-6, + resnet_act_fn=act_fn, + resnet_groups=norm_num_groups, + downsample_padding=0, + ) + self.down_blocks.append(down_block) + + # mid + self.mid_block = UNetMidBlock2D( + in_channels=block_out_channels[-1], + resnet_eps=1e-6, + resnet_act_fn=act_fn, + output_scale_factor=1, + resnet_time_scale_shift='default', + attn_num_head_channels=None, + resnet_groups=norm_num_groups, + temb_channels=None, + ) + + # out + self.conv_norm_out = nn.GroupNorm( + num_channels=block_out_channels[-1], + num_groups=norm_num_groups, + eps=1e-6) + if digit_version(TORCH_VERSION) > digit_version('1.6.0'): + self.conv_act = nn.SiLU() + else: + mmengine.print_log('\'SiLU\' is not supported for ' + f'torch < 1.6.0, found \'{torch.version}\'.' + 'Use ReLu instead but result maybe wrong') + self.conv_act = nn.ReLU() + + conv_out_channels = 2 * out_channels if double_z else out_channels + self.conv_out = nn.Conv2d( + block_out_channels[-1], conv_out_channels, 3, padding=1) + + def forward(self, x): + """encoder forward.""" + sample = x + sample = self.conv_in(sample) + + # down + for down_block in self.down_blocks: + sample = down_block(sample) + + # middle + sample = self.mid_block(sample) + + # post-process + sample = self.conv_norm_out(sample) + sample = self.conv_act(sample) + sample = self.conv_out(sample) + + return sample + + +class UpDecoderBlock2D(nn.Module): + """construct up decoder block.""" + + def __init__( + self, + in_channels: int, + out_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = 'default', + resnet_act_fn: str = 'swish', + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + output_scale_factor=1.0, + add_upsample=True, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + input_channels = in_channels if i == 0 else out_channels + + resnets.append( + ResnetBlock2D( + in_channels=input_channels, + out_channels=out_channels, + temb_channels=None, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + )) + + self.resnets = nn.ModuleList(resnets) + + if add_upsample: + self.upsamplers = nn.ModuleList([ + Upsample2D( + out_channels, use_conv=True, out_channels=out_channels) + ]) + else: + self.upsamplers = None + + def forward(self, hidden_states): + """forward hidden states.""" + for resnet in self.resnets: + hidden_states = resnet(hidden_states, temb=None) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states) + + return hidden_states + + +class Decoder(nn.Module): + """construct decoder in vae.""" + + def __init__( + self, + in_channels=3, + out_channels=3, + up_block_types=('UpDecoderBlock2D', ), + block_out_channels=(64, ), + layers_per_block=2, + norm_num_groups=32, + act_fn='silu', + ): + super().__init__() + self.layers_per_block = layers_per_block + + self.conv_in = nn.Conv2d( + in_channels, + block_out_channels[-1], + kernel_size=3, + stride=1, + padding=1) + + self.mid_block = None + self.up_blocks = nn.ModuleList([]) + + # mid + self.mid_block = UNetMidBlock2D( + in_channels=block_out_channels[-1], + resnet_eps=1e-6, + resnet_act_fn=act_fn, + output_scale_factor=1, + resnet_time_scale_shift='default', + attn_num_head_channels=None, + resnet_groups=norm_num_groups, + temb_channels=None, + ) + + # up + reversed_block_out_channels = list(reversed(block_out_channels)) + output_channel = reversed_block_out_channels[0] + for i, up_block_type in enumerate(up_block_types): + prev_output_channel = output_channel + output_channel = reversed_block_out_channels[i] + + is_final_block = i == len(block_out_channels) - 1 + + up_block = UpDecoderBlock2D( + num_layers=self.layers_per_block + 1, + in_channels=prev_output_channel, + out_channels=output_channel, + add_upsample=not is_final_block, + resnet_eps=1e-6, + resnet_act_fn=act_fn, + resnet_groups=norm_num_groups, + ) + self.up_blocks.append(up_block) + prev_output_channel = output_channel + + # out + self.conv_norm_out = nn.GroupNorm( + num_channels=block_out_channels[0], + num_groups=norm_num_groups, + eps=1e-6) + if digit_version(TORCH_VERSION) > digit_version('1.6.0'): + self.conv_act = nn.SiLU() + else: + mmengine.print_log('\'SiLU\' is not supported for ' + f'torch < 1.6.0, found \'{torch.version}\'.' + 'Use ReLu instead but result maybe wrong') + self.conv_act = nn.ReLU() + self.conv_out = nn.Conv2d( + block_out_channels[0], out_channels, 3, padding=1) + + def forward(self, z): + """decoder forward.""" + sample = z + sample = self.conv_in(sample) + + # middle + sample = self.mid_block(sample) + + # up + for up_block in self.up_blocks: + sample = up_block(sample) + + # post-process + sample = self.conv_norm_out(sample) + sample = self.conv_act(sample) + sample = self.conv_out(sample) + + return sample + + +class DiagonalGaussianDistribution(object): + """Calculate diagonal gaussian distribution.""" + + def __init__(self, parameters, deterministic=False): + self.parameters = parameters + self.mean, self.logvar = torch.chunk(parameters, 2, dim=1) + self.logvar = torch.clamp(self.logvar, -30.0, 20.0) + self.deterministic = deterministic + self.std = torch.exp(0.5 * self.logvar) + self.var = torch.exp(self.logvar) + if self.deterministic: + self.var = self.std = torch.zeros_like( + self.mean, + device=self.parameters.device, + dtype=self.parameters.dtype) + + def sample(self, generator: Optional[torch.Generator] = None) \ + -> torch.FloatTensor: + """sample function.""" + device = self.parameters.device + sample_device = device + sample = torch.randn( + self.mean.shape, generator=generator, device=sample_device) + # make sure sample is on the same device + # as the parameters and has same dtype + sample = sample.to(device=device, dtype=self.parameters.dtype) + x = self.mean + self.std * sample + return x + + def kl(self, other=None): + """calculate kl divergence.""" + if self.deterministic: + return torch.Tensor([0.0]) + else: + if other is None: + return 0.5 * torch.sum( + torch.pow(self.mean, 2) + self.var - 1.0 - self.logvar, + dim=[1, 2, 3]) + else: + return 0.5 * torch.sum( + torch.pow(self.mean - other.mean, 2) / other.var + + self.var / other.var - 1.0 - self.logvar + other.logvar, + dim=[1, 2, 3], + ) + + def nll(self, sample, dims=[1, 2, 3]): + """calculate negative log likelihood.""" + if self.deterministic: + return torch.Tensor([0.0]) + logtwopi = np.log(2.0 * np.pi) + return 0.5 * torch.sum( + logtwopi + self.logvar + + torch.pow(sample - self.mean, 2) / self.var, + dim=dims) # noqa + + def mode(self): + """return self.mean.""" + return self.mean + + +class AutoencoderKL(nn.Module): + r"""Variational Autoencoder (VAE) model with KL loss + from the paper Auto-Encoding Variational Bayes by Diederik P. Kingma + and Max Welling. + + Args: + in_channels (int, *optional*, defaults to 3): + Number of channels in the input image. + out_channels (int, *optional*, defaults to 3): + Number of channels in the output. + down_block_types (`Tuple[str]`, *optional*, defaults to : + obj:`("DownEncoderBlock2D",)`): + Tuple of downsample block types. + up_block_types (`Tuple[str]`, *optional*, defaults to : + obj:`("UpDecoderBlock2D",)`): Tuple of upsample block types. + block_out_channels (`Tuple[int]`, *optional*, defaults to : + obj:`(64,)`): Tuple of block output channels. + act_fn (`str`, *optional*, defaults to `"silu"`): + The activation function to use. + latent_channels (`int`, *optional*, defaults to `4`): + Number of channels in the latent space. + sample_size (`int`, *optional*, defaults to `32`): + sample size is now not supported. + """ + + def __init__( + self, + in_channels: int = 3, + out_channels: int = 3, + down_block_types: Tuple[str] = ('DownEncoderBlock2D', ), + up_block_types: Tuple[str] = ('UpDecoderBlock2D', ), + block_out_channels: Tuple[int] = (64, ), + layers_per_block: int = 1, + act_fn: str = 'silu', + latent_channels: int = 4, + norm_num_groups: int = 32, + sample_size: int = 32, + ): + super().__init__() + + self.block_out_channels = block_out_channels + + # pass init params to Encoder + self.encoder = Encoder( + in_channels=in_channels, + out_channels=latent_channels, + down_block_types=down_block_types, + block_out_channels=block_out_channels, + layers_per_block=layers_per_block, + act_fn=act_fn, + norm_num_groups=norm_num_groups, + double_z=True, + ) + + # pass init params to Decoder + self.decoder = Decoder( + in_channels=latent_channels, + out_channels=out_channels, + up_block_types=up_block_types, + block_out_channels=block_out_channels, + layers_per_block=layers_per_block, + norm_num_groups=norm_num_groups, + act_fn=act_fn, + ) + + self.quant_conv = torch.nn.Conv2d(2 * latent_channels, + 2 * latent_channels, 1) + self.post_quant_conv = torch.nn.Conv2d(latent_channels, + latent_channels, 1) + + def encode(self, x: torch.FloatTensor, return_dict: bool = True) -> Dict: + """encode input.""" + h = self.encoder(x) + moments = self.quant_conv(h) + posterior = DiagonalGaussianDistribution(moments) + + if not return_dict: + return (posterior, ) + + return Dict(latent_dist=posterior) + + def decode(self, z: torch.FloatTensor, return_dict: bool = True) \ + -> Union[Dict, torch.FloatTensor]: + """decode z.""" + z = self.post_quant_conv(z) + dec = self.decoder(z) + + if not return_dict: + return (dec, ) + + return Dict(sample=dec) + + def forward( + self, + sample: torch.FloatTensor, + sample_posterior: bool = False, + return_dict: bool = True, + generator: Optional[torch.Generator] = None, + ) -> Union[Dict, torch.FloatTensor]: + """ + Args: + sample (torch.FloatTensor): Input sample. + sample_posterior (bool): + Whether to sample from the posterior. + defaults to `False`. + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a [`Dict`] instead of a plain tuple. + Returns: + Dict(sample=dec): decode results. + """ + x = sample + posterior = self.encode(x).latent_dist + if sample_posterior: + z = posterior.sample(generator=generator) + else: + z = posterior.mode() + dec = self.decode(z).sample + + if not return_dict: + return (dec, ) + + return Dict(sample=dec) diff --git a/model-index.yml b/model-index.yml index a78dcb34b0..bedf04aac2 100644 --- a/model-index.yml +++ b/model-index.yml @@ -40,6 +40,7 @@ Import: - configs/sngan_proj/metafile.yml - configs/srcnn/metafile.yml - configs/srgan_resnet/metafile.yml +- configs/stable_diffusion/metafile.yml - configs/styleganv1/metafile.yml - configs/styleganv2/metafile.yml - configs/styleganv3/metafile.yml diff --git a/requirements/optional.txt b/requirements/optional.txt index d1d51047ce..dc41e8ab66 100644 --- a/requirements/optional.txt +++ b/requirements/optional.txt @@ -3,3 +3,4 @@ imageio-ffmpeg==0.4.4 mmdet >= 3.0.0rc2 open_clip_torch PyQt5 +transformers diff --git a/requirements/tests.txt b/requirements/tests.txt index 2a4ffe162d..419a6c9ffb 100644 --- a/requirements/tests.txt +++ b/requirements/tests.txt @@ -11,3 +11,4 @@ imageio-ffmpeg==0.4.4 interrogate mmdet >= 3.0.0rc2 pytest +transformers diff --git a/tests/test_models/test_editors/test_ddim/test_ddim_scheduler.py b/tests/test_models/test_editors/test_ddim/test_ddim_scheduler.py new file mode 100644 index 0000000000..ba8eb0663c --- /dev/null +++ b/tests/test_models/test_editors/test_ddim/test_ddim_scheduler.py @@ -0,0 +1,52 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch + +from mmedit.models.editors.ddim.ddim_scheduler import DDIMScheduler + + +def test_ddim(): + modelout = torch.rand((1, 8, 32, 32)) + sample = torch.rand((1, 4, 32, 32)) + ddim = DDIMScheduler( + num_train_timesteps=1000, variance_type='learned_range') + ddim.set_timesteps(10) + result = ddim.step(modelout, 980, sample) + assert result['prev_sample'].shape == (1, 4, 32, 32) + + noise = torch.rand((1, 4, 32, 32)) + result = ddim.add_noise(sample, noise, 10) + assert result.shape == (1, 4, 32, 32) + + assert len(ddim) == 1000 + + +def test_ddim_init(): + ddim = DDIMScheduler( + num_train_timesteps=1000, beta_schedule='scaled_linear') + + ddim = DDIMScheduler( + num_train_timesteps=1000, beta_schedule='squaredcos_cap_v2') + + assert isinstance(ddim, DDIMScheduler) + + with pytest.raises(Exception): + DDIMScheduler(num_train_timesteps=1000, beta_schedule='fake') + + +def test_ddim_step(): + modelout = torch.rand((1, 8, 32, 32)) + sample = torch.rand((1, 4, 32, 32)) + ddim = DDIMScheduler( + num_train_timesteps=1000, variance_type='learned_range') + with pytest.raises(Exception): + ddim.step(modelout, 980, sample) + + ddim.set_timesteps(10) + result = ddim.step( + modelout, 980, sample, eta=1, use_clipped_model_output=True) + assert result['prev_sample'].shape == (1, 4, 32, 32) + + +if __name__ == '__main__': + test_ddim_step() diff --git a/tests/test_models/test_editors/test_ddpm/test_attention.py b/tests/test_models/test_editors/test_ddpm/test_attention.py new file mode 100644 index 0000000000..c0b68d0d4f --- /dev/null +++ b/tests/test_models/test_editors/test_ddpm/test_attention.py @@ -0,0 +1,39 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch + +from mmedit.models.editors.ddpm.attention import (ApproximateGELU, + CrossAttention, FeedForward, + Transformer2DModel) + + +def test_ApproximateGELU(): + input = torch.rand((16, 16)) + gelu = ApproximateGELU(16, 24) + output = gelu.forward(input) + assert output.shape == (16, 24) + + +def test_crossattention(): + input = torch.rand((2, 64, 64)) + crossattention = CrossAttention(64) + crossattention._slice_size = 2 + output = crossattention.forward(input) + assert output.shape == (2, 64, 64) + + +def test_Transformer2DModel_init(): + with pytest.raises(Exception): + Transformer2DModel(in_channels=3, num_vector_embeds=3) + + with pytest.raises(Exception): + Transformer2DModel() + + Transformer2DModel(in_channels=3, use_linear_projection=True) + + +def test_FeedForward(): + input = torch.rand((2, 64, 64)) + feed_forward = FeedForward(64, 64, activation_fn='geglu-approximate') + output = feed_forward.forward(input) + assert output.shape == (2, 64, 64) diff --git a/tests/test_models/test_editors/test_ddpm/test_ddpm_scheduler.py b/tests/test_models/test_editors/test_ddpm/test_ddpm_scheduler.py new file mode 100644 index 0000000000..23df9718a5 --- /dev/null +++ b/tests/test_models/test_editors/test_ddpm/test_ddpm_scheduler.py @@ -0,0 +1,42 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch + +from mmedit.models.editors.ddpm.ddpm_scheduler import DDPMScheduler + + +def test_ddpm(): + modelout = torch.rand((1, 8, 32, 32)) + sample = torch.rand((1, 4, 32, 32)) + ddpm = DDPMScheduler( + num_train_timesteps=1000, variance_type='learned_range') + result = ddpm.step(modelout, 980, sample) + assert result['prev_sample'].shape == (1, 4, 32, 32) + + ddpm.set_timesteps(100) + + predicted_variance = torch.tensor(1) + ddpm._get_variance(t=0, predicted_variance=predicted_variance) + ddpm._get_variance(t=1, variance_type='fixed_large') + ddpm._get_variance(t=1, variance_type='fixed_large_log') + ddpm._get_variance(t=1, variance_type='learned') + + with pytest.raises(Exception): + ddpm.training_loss(1, 2, 3) + + with pytest.raises(Exception): + ddpm.sample_timestep() + + steps = len(ddpm) + assert steps == 1000 + + +def test_ddpm_init(): + DDPMScheduler(trained_betas=1) + + DDPMScheduler(beta_schedule='scaled_linear') + + DDPMScheduler(beta_schedule='squaredcos_cap_v2') + + with pytest.raises(Exception): + DDPMScheduler(beta_schedule='tem') diff --git a/tests/test_models/test_editors/test_ddpm/test_denoising_unet.py b/tests/test_models/test_editors/test_ddpm/test_denoising_unet.py new file mode 100644 index 0000000000..02be8c5cb3 --- /dev/null +++ b/tests/test_models/test_editors/test_ddpm/test_denoising_unet.py @@ -0,0 +1,20 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmedit.models.editors.ddpm.denoising_unet import (DenoisingUnet, + NormWithEmbedding) + + +def test_DenoisingUnet(): + input = torch.rand((1, 3, 32, 32)) + unet = DenoisingUnet(32) + output = unet.forward(input, 10) + assert output['outputs'].shape == (1, 6, 32, 32) + + +def test_NormWithEmbedding(): + input = torch.rand((4, 32)) + emb = torch.rand((4, 32)) + ins = NormWithEmbedding(32, 32) + output = ins.forward(input, emb) + assert output.shape == (4, 32, 4, 32) diff --git a/tests/test_models/test_editors/test_ddpm/test_embeddings.py b/tests/test_models/test_editors/test_ddpm/test_embeddings.py new file mode 100644 index 0000000000..811ebb8962 --- /dev/null +++ b/tests/test_models/test_editors/test_ddpm/test_embeddings.py @@ -0,0 +1,25 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmedit.models.editors.ddpm.embeddings import TimestepEmbedding, Timesteps + + +def test_TimestepEmbedding(): + input = torch.rand((1, 64, 16)) + timestep_emb = TimestepEmbedding( + in_channels=16, time_embed_dim=16, act_fn='mish') + output = timestep_emb.forward(input) + assert output.shape == (1, 64, 16) + + timestep_emb = TimestepEmbedding( + in_channels=16, time_embed_dim=16, out_dim=96) + timestep_emb.act = None + output = timestep_emb.forward(input) + assert output.shape == (1, 64, 96) + + +def test_Timesteps(): + input = torch.tensor([4]) + timesteps = Timesteps(num_channels=9) + emb = timesteps.forward(input) + assert emb.shape == (1, 9) diff --git a/tests/test_models/test_editors/test_ddpm/test_res_blocks.py b/tests/test_models/test_editors/test_ddpm/test_res_blocks.py new file mode 100644 index 0000000000..808af63b2c --- /dev/null +++ b/tests/test_models/test_editors/test_ddpm/test_res_blocks.py @@ -0,0 +1,34 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmedit.models.editors.ddpm.res_blocks import (Downsample2D, ResnetBlock2D, + Upsample2D) + + +def test_resnetblock2d(): + input = torch.rand((1, 64, 16, 16)) + resblock = ResnetBlock2D(in_channels=64, up=True) + output = resblock.forward(input, None) + assert output.shape == (1, 64, 64, 64) + + resblock = ResnetBlock2D(in_channels=64, down=True) + output = resblock.forward(input, None) + assert output.shape == (1, 64, 8, 8) + + +def test_Downsample2D(): + input = torch.rand((1, 64, 16, 16)) + downsample = Downsample2D(channels=64, use_conv=True, padding=0) + output = downsample.forward(input) + assert output.shape == (1, 64, 8, 8) + + +def test_Upsample2D(): + input = torch.rand((1, 64, 16, 16)) + upsample = Upsample2D(channels=64, use_conv_transpose=True) + output = upsample.forward(input) + assert output.shape == (1, 64, 32, 32) + + upsample = Upsample2D(channels=64) + output = upsample.forward(input, output_size=(32, 32)) + assert output.shape == (1, 64, 64, 64) diff --git a/tests/test_models/test_editors/test_ddpm/test_unet_blocks.py b/tests/test_models/test_editors/test_ddpm/test_unet_blocks.py new file mode 100644 index 0000000000..e7ea584e5f --- /dev/null +++ b/tests/test_models/test_editors/test_ddpm/test_unet_blocks.py @@ -0,0 +1,46 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch + +from mmedit.models.editors.ddpm.unet_blocks import (CrossAttnDownBlock2D, + CrossAttnUpBlock2D, + UNetMidBlock2DCrossAttn, + get_down_block, + get_up_block) + + +def test_UNetMidBlock2DCrossAttn(): + input = torch.rand((1, 64, 64, 64)) + midblock = UNetMidBlock2DCrossAttn(64, 64, cross_attention_dim=64) + midblock.set_attention_slice(1) + output = midblock.forward(input) + assert output.shape == (1, 64, 64, 64) + + with pytest.raises(Exception): + midblock.set_attention_slice(8) + + +def test_CrossAttnDownBlock2D(): + input = torch.rand((1, 64, 64, 64)) + downblock = CrossAttnDownBlock2D(64, 64, 64, cross_attention_dim=64) + downblock.set_attention_slice(1) + output, _ = downblock.forward(input) + assert output.shape == (1, 64, 32, 32) + + with pytest.raises(Exception): + downblock.set_attention_slice(8) + + +def test_CrossAttnUpBlock2D(): + downblock = CrossAttnUpBlock2D(64, 64, 64, 64, cross_attention_dim=64) + downblock.set_attention_slice(1) + + +def test_get_down_block(): + with pytest.raises(Exception): + get_down_block('tem', 1, 1, 1, 1, True, 'silu', 1) + + +def get_get_up_block(): + with pytest.raises(Exception): + get_up_block('tem', 1, 1, 1, 1, 1, True, 'silu', 1) diff --git a/tests/test_models/test_editors/test_stable_diffusion/test_clip_wrapper.py b/tests/test_models/test_editors/test_stable_diffusion/test_clip_wrapper.py new file mode 100644 index 0000000000..35076616dd --- /dev/null +++ b/tests/test_models/test_editors/test_stable_diffusion/test_clip_wrapper.py @@ -0,0 +1,54 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import importlib +import sys + +import pytest +import torch + + +def test_clip_wrapper(): + from transformers import CLIPConfig + + from mmedit.models.editors.stable_diffusion.clip_wrapper import \ + StableDiffusionSafetyChecker + clipconfig = CLIPConfig() + safety_checker = StableDiffusionSafetyChecker(clipconfig) + + clip_input = torch.rand((1, 3, 224, 224)) + images_input = torch.rand((1, 512, 512, 3)) + + result = safety_checker.forward(clip_input, images_input) + assert result[0].shape == (1, 512, 512, 3) + + +def test_load_clip_submodels(): + from mmedit.models.editors.stable_diffusion.clip_wrapper import \ + load_clip_submodels + init_cfg = dict( + type='Pretrained', + pretrained_model_path='tem', + ) + + submodels = [] + with pytest.raises(Exception): + load_clip_submodels(init_cfg, submodels, True) + + +def test_load_clip_submodels_transformers_none(): + transformer_location = sys.modules['transformers'] + sys.modules['transformers'] = None + importlib.reload( + sys.modules['mmedit.models.editors.stable_diffusion.clip_wrapper']) + from mmedit.models.editors.stable_diffusion.clip_wrapper import \ + load_clip_submodels + + init_cfg = dict( + type='Pretrained', + pretrained_model_path='tem', + ) + submodels = [] + with pytest.raises(ImportError): + # import pdb;pdb.set_trace(); + load_clip_submodels(init_cfg, submodels, True) + + sys.modules['transformers'] = transformer_location diff --git a/tests/test_models/test_editors/test_stable_diffusion/test_stable_diffusion.py b/tests/test_models/test_editors/test_stable_diffusion/test_stable_diffusion.py new file mode 100644 index 0000000000..f84f58a7ee --- /dev/null +++ b/tests/test_models/test_editors/test_stable_diffusion/test_stable_diffusion.py @@ -0,0 +1,121 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import platform + +import pytest +import torch +from addict import Dict +from mmengine import MODELS, Config + +from mmedit.utils import register_all_modules + +register_all_modules() + +unet = dict( + type='DenoisingUnet', + image_size=512, + base_channels=320, + channels_cfg=[1, 2, 4, 4], + unet_type='stable', + act_cfg=dict(type='silu', inplace=False), + cross_attention_dim=768, + num_heads=8, + in_channels=4, + layers_per_block=2, + down_block_types=[ + 'CrossAttnDownBlock2D', 'CrossAttnDownBlock2D', 'CrossAttnDownBlock2D', + 'DownBlock2D' + ], + up_block_types=[ + 'UpBlock2D', 'CrossAttnUpBlock2D', 'CrossAttnUpBlock2D', + 'CrossAttnUpBlock2D' + ], + output_cfg=dict(var='fixed')) + +vae = dict( + act_fn='silu', + block_out_channels=[128, 256, 512, 512], + down_block_types=[ + 'DownEncoderBlock2D', 'DownEncoderBlock2D', 'DownEncoderBlock2D', + 'DownEncoderBlock2D' + ], + in_channels=3, + latent_channels=4, + layers_per_block=2, + norm_num_groups=32, + out_channels=3, + sample_size=512, + up_block_types=[ + 'UpDecoderBlock2D', 'UpDecoderBlock2D', 'UpDecoderBlock2D', + 'UpDecoderBlock2D' + ]) + +diffusion_scheduler = dict( + type='DDIMScheduler', + variance_type='learned_range', + beta_end=0.012, + beta_schedule='scaled_linear', + beta_start=0.00085, + num_train_timesteps=1000, + set_alpha_to_one=False, + clip_sample=False) + +init_cfg = dict(type='Pretrained', pretrained_model_path=None) + +model = dict( + type='StableDiffusion', + diffusion_scheduler=diffusion_scheduler, + unet=unet, + vae=vae, + init_cfg=init_cfg, + requires_safety_checker=False, +) + + +class dummy_tokenizer: + + def __init__(self): + self.model_max_length = 0 + + def __call__(self, + prompt, + padding='max_length', + max_length=0, + truncation=False, + return_tensors='pt'): + text_inputs = Dict() + text_inputs['input_ids'] = torch.ones([1, 77]) + text_inputs['attention_mask'] = torch.ones([1, 77]) + return text_inputs + + +class dummy_text_encoder: + + def __init__(self): + self.config = None + + def __call__(self, x, attention_mask): + result = torch.rand([1, 77, 768]) + return [result] + + +@pytest.mark.skipif( + 'win' in platform.system().lower(), + reason='skip on windows due to limited RAM.') +def test_stable_diffusion(): + StableDiffuser = MODELS.build(Config(model)) + StableDiffuser.tokenizer = dummy_tokenizer() + StableDiffuser.text_encoder = dummy_text_encoder() + + with pytest.raises(Exception): + StableDiffuser.infer(1, height=64, width=64) + + with pytest.raises(Exception): + StableDiffuser.infer('temp', height=31, width=31) + + result = StableDiffuser.infer( + 'an insect robot preparing a delicious meal', + height=64, + width=64, + num_inference_steps=1) + + assert result['samples'].shape == (3, 64, 64) diff --git a/tests/test_models/test_editors/test_stable_diffusion/test_vae.py b/tests/test_models/test_editors/test_stable_diffusion/test_vae.py new file mode 100644 index 0000000000..0c8898a1e6 --- /dev/null +++ b/tests/test_models/test_editors/test_stable_diffusion/test_vae.py @@ -0,0 +1,66 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmedit.models.editors.stable_diffusion.vae import ( + AttentionBlock, AutoencoderKL, DiagonalGaussianDistribution, Downsample2D, + ResnetBlock2D, Upsample2D) + + +def test_vae(): + input = torch.rand((1, 3, 32, 32)) + vae = AutoencoderKL() + output = vae.forward(input) + assert output['sample'].shape == (1, 3, 32, 32) + + +def test_resnetblock2d(): + input = torch.rand((1, 64, 16, 16)) + resblock = ResnetBlock2D(in_channels=64, up=True) + output = resblock.forward(input, None) + assert output.shape == (1, 64, 64, 64) + + resblock = ResnetBlock2D(in_channels=64, down=True) + output = resblock.forward(input, None) + assert output.shape == (1, 64, 8, 8) + + +def test_DiagonalGaussianDistribution(): + param = torch.rand((1, 2, 16, 16)) + sample = torch.rand((1, 1, 16, 16)) + + gauss_dist = DiagonalGaussianDistribution(param, deterministic=False) + gauss_dist.sample() + gauss_dist.kl() + output = gauss_dist.nll(sample) + assert output.shape == (1, ) + + gauss_dist = DiagonalGaussianDistribution(param, deterministic=True) + gauss_dist.sample() + gauss_dist.kl() + output = gauss_dist.nll(sample) + assert output.shape == (1, ) + + +def test_AttentionBlock(): + input = torch.rand((1, 64, 32, 32)) + attention = AttentionBlock(64, num_head_channels=8) + output = attention.forward(input) + assert output.shape == (1, 64, 32, 32) + + +def test_Downsample2D(): + input = torch.rand((1, 64, 16, 16)) + downsample = Downsample2D(channels=64, use_conv=True, padding=0) + output = downsample.forward(input) + assert output.shape == (1, 64, 8, 8) + + +def test_Upsample2D(): + input = torch.rand((1, 64, 16, 16)) + upsample = Upsample2D(channels=64, use_conv_transpose=True) + output = upsample.forward(input) + assert output.shape == (1, 64, 32, 32) + + upsample = Upsample2D(channels=64) + output = upsample.forward(input, output_size=(32, 32)) + assert output.shape == (1, 64, 64, 64) From 0a584565e24fd2d0b38a276d918ecc5d770ca541 Mon Sep 17 00:00:00 2001 From: Zdafeng <40970489+Zdafeng@users.noreply.github.com> Date: Fri, 30 Dec 2022 14:05:41 +0800 Subject: [PATCH 39/44] [CodeCamp #84] Support SwinIR model (#1476) * [Feature] Support SwinIR model * [Feature] Support SwinIR model * [Feature] Support SwinIR model * [Feature] Support SwinIR model * [Feature] Support SwinIR model * [Feature] Support SwinIR model * fix configs * rename * remove testdata * refactor decompression test config * update the readme * [Feature] Support SwinIR model * update random JPEG and noise * update random JPEG and noise * update real sr large config * fix sr configs * fix car and denoising configs * fix random_degradations * fix readme * refactor swinirnet * fix ut * remove files * fix init * fix jpeg comp * fix readme * fix lint * fix ut * fix ut * fix ut Co-authored-by: Z-Fran <1396925302@qq.com> Co-authored-by: Z-Fran <49083766+Z-Fran@users.noreply.github.com> --- .../datasets/decompression_test_config.py | 66 ++ .../denoising-gaussian_color_test_config.py | 2 +- .../denoising-gaussian_gray_test_config.py | 2 +- configs/swinir/README.md | 512 +++++++++++++++ configs/swinir/README_zh-CN.md | 503 +++++++++++++++ configs/swinir/metafile.yml | 446 ++++++++++++++ ...x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py | 5 + ...x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py | 5 + ...x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py | 5 + ...x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py | 61 ++ ...x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py | 10 + ...x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py | 13 + ...6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py | 134 ++++ ...6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py | 20 + ...6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py | 20 + ...6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py | 20 + ...d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py | 139 +++++ ...d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py | 20 + ...d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py | 20 + ...d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py | 20 + ...d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py | 147 +++++ ...d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py | 20 + ...d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py | 20 + ...8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py | 141 +++++ ...8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py | 20 + ...8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py | 20 + ...ir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py | 133 ++++ ...nir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py | 22 + ...nir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py | 35 ++ ...ir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py | 133 ++++ ...nir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py | 22 + ...nir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py | 35 ++ ...ir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py | 133 ++++ ...nir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py | 22 + ...nir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py | 35 ++ .../transforms/random_degradations.py | 27 +- mmedit/models/editors/__init__.py | 3 +- mmedit/models/editors/swinir/__init__.py | 4 + .../models/editors/swinir/swinir_modules.py | 148 +++++ mmedit/models/editors/swinir/swinir_net.py | 307 +++++++++ mmedit/models/editors/swinir/swinir_rstb.py | 583 ++++++++++++++++++ mmedit/models/editors/swinir/swinir_utils.py | 84 +++ model-index.yml | 1 + .../test_random_degradations.py | 26 +- .../test_swinir/test_swinir_modules.py | 84 +++ .../test_swinir/test_swinir_net.py | 108 ++++ .../test_swinir/test_swinir_rstb.py | 25 + .../test_swinir/test_swinir_utils.py | 26 + 48 files changed, 4367 insertions(+), 20 deletions(-) create mode 100644 configs/_base_/datasets/decompression_test_config.py create mode 100644 configs/swinir/README.md create mode 100644 configs/swinir/README_zh-CN.md create mode 100644 configs/swinir/metafile.yml create mode 100644 configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py create mode 100644 configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py create mode 100644 configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py create mode 100644 configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py create mode 100644 configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py create mode 100644 configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py create mode 100644 configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py create mode 100644 configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py create mode 100644 configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py create mode 100644 configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py create mode 100644 configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py create mode 100644 configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py create mode 100644 configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py create mode 100644 configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py create mode 100644 configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py create mode 100644 configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py create mode 100644 configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py create mode 100644 configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py create mode 100644 configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py create mode 100644 configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py create mode 100644 configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py create mode 100644 configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py create mode 100644 configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py create mode 100644 configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py create mode 100644 configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py create mode 100644 configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py create mode 100644 configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py create mode 100644 configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py create mode 100644 configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py create mode 100644 mmedit/models/editors/swinir/__init__.py create mode 100644 mmedit/models/editors/swinir/swinir_modules.py create mode 100644 mmedit/models/editors/swinir/swinir_net.py create mode 100644 mmedit/models/editors/swinir/swinir_rstb.py create mode 100644 mmedit/models/editors/swinir/swinir_utils.py create mode 100644 tests/test_models/test_editors/test_swinir/test_swinir_modules.py create mode 100644 tests/test_models/test_editors/test_swinir/test_swinir_net.py create mode 100644 tests/test_models/test_editors/test_swinir/test_swinir_rstb.py create mode 100644 tests/test_models/test_editors/test_swinir/test_swinir_utils.py diff --git a/configs/_base_/datasets/decompression_test_config.py b/configs/_base_/datasets/decompression_test_config.py new file mode 100644 index 0000000000..0a52247a2e --- /dev/null +++ b/configs/_base_/datasets/decompression_test_config.py @@ -0,0 +1,66 @@ +quality = 10 +test_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='RandomJPEGCompression', + params=dict(quality=[quality, quality], color_type='color'), + bgr2rgb=True, + keys=['img']), + dict(type='PackEditInputs') +] + +classic5_data_root = 'data/Classic5' +classic5_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='classic5', task_name='CAR'), + data_root=classic5_data_root, + data_prefix=dict(img='', gt=''), + pipeline=test_pipeline)) +classic5_evaluator = [ + dict(type='PSNR', prefix='Classic5'), + dict(type='SSIM', prefix='Classic5'), +] + +live1_data_root = 'data/LIVE1' +live1_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='live1', task_name='CAR'), + data_root=live1_data_root, + data_prefix=dict(img='', gt=''), + pipeline=test_pipeline)) +live1_evaluator = [ + dict(type='PSNR', prefix='LIVE1'), + dict(type='SSIM', prefix='LIVE1'), +] + +# test config +test_cfg = dict(type='MultiTestLoop') +test_dataloader = [ + classic5_dataloader, + live1_dataloader, +] +test_evaluator = [ + classic5_evaluator, + live1_evaluator, +] diff --git a/configs/_base_/datasets/denoising-gaussian_color_test_config.py b/configs/_base_/datasets/denoising-gaussian_color_test_config.py index c06f0a4c3d..7950bebf35 100644 --- a/configs/_base_/datasets/denoising-gaussian_color_test_config.py +++ b/configs/_base_/datasets/denoising-gaussian_color_test_config.py @@ -17,7 +17,7 @@ params=dict( noise_type=['gaussian'], noise_prob=[1], - gaussian_sigma=[sigma * 255, sigma * 255], + gaussian_sigma=[sigma, sigma], gaussian_gray_noise_prob=0), keys=['img']), dict(type='PackEditInputs') diff --git a/configs/_base_/datasets/denoising-gaussian_gray_test_config.py b/configs/_base_/datasets/denoising-gaussian_gray_test_config.py index 326aed8a3b..774869fd07 100644 --- a/configs/_base_/datasets/denoising-gaussian_gray_test_config.py +++ b/configs/_base_/datasets/denoising-gaussian_gray_test_config.py @@ -19,7 +19,7 @@ params=dict( noise_type=['gaussian'], noise_prob=[1], - gaussian_sigma=[sigma * 255, sigma * 255], + gaussian_sigma=[sigma, sigma], gaussian_gray_noise_prob=1), keys=['img']), dict(type='PackEditInputs') diff --git a/configs/swinir/README.md b/configs/swinir/README.md new file mode 100644 index 0000000000..2ada8e12e6 --- /dev/null +++ b/configs/swinir/README.md @@ -0,0 +1,512 @@ +# SwinIR (ICCVW'2021) + +> [SwinIR: Image Restoration Using Swin Transformer](https://arxiv.org/abs/2108.10257) + +> **Task**: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + + + +## Abstract + + + +Image restoration is a long-standing low-level vision problem that aims to restore high-quality images from low-quality images (e.g., downscaled, noisy and compressed images). While state-of-the-art image restoration methods are based on convolutional neural networks, few attempts have been made with Transformers which show impressive performance on high-level vision tasks. In this paper, we propose a strong baseline model SwinIR for image restoration based on the Swin Transformer. SwinIR consists of three parts: shallow feature extraction, deep feature extraction and high-quality image reconstruction. In particular, the deep feature extraction module is composed of several residual Swin Transformer blocks (RSTB), each of which has several Swin Transformer layers together with a residual connection. We conduct experiments on three representative tasks: image super-resolution (including classical, lightweight and real-world image super-resolution), image denoising (including grayscale and color image denoising) and JPEG compression artifact reduction. Experimental results demonstrate that SwinIR outperforms state-of-the-art methods on different tasks by up to 0.14~0.45dB, while the total number of parameters can be reduced by up to 67%. + + + +
+ +
+ +## Results and models + +### **Classical Image Super-Resolution** + +Evaluated on Y channels, `scale` pixels in each border are cropped before evaluation. +The metrics are `PSNR / SSIM` . + +| Method | Set5 PSNR | Set14 PSNR | DIV2K PSNR | Set5 SSIM | Set14 SSIM | DIV2K SSIM | GPU Info | Download | +| :----------------------------------------------------------------: | :-------: | :--------: | :--------: | :-------: | :--------: | :--------: | :------: | :------------------------------------------------------------------: | +| [swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k](/configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py) | 38.3240 | 34.1174 | 37.8921 | 0.9626 | 0.9230 | 0.9481 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k-ed2d419e.pth) \| log | +| [swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k](/configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py) | 34.8640 | 30.7669 | 34.1397 | 0.9317 | 0.8508 | 0.8917 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k-926950f1.pth) \| log | +| [swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k](/configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py) | 32.7315 | 28.9065 | 32.0953 | 0.9029 | 0.7915 | 0.8418 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k-88e4903d.pth) \| log | +| [swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k](/configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py) | 38.3971 | 34.4149 | 37.9473 | 0.9629 | 0.9252 | 0.9488 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k-69e15fb6.pth) \| log | +| [swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k](/configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py) | 34.9335 | 30.9258 | 34.2830 | 0.9323 | 0.8540 | 0.8939 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k-d6982f7b.pth) \| log | +| [swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k](/configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py) | 32.9214 | 29.0792 | 32.3021 | 0.9053 | 0.7953 | 0.8451 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k-0502d775.pth) \| log | + +### **Lightweight Image Super-Resolution** + +Evaluated on Y channels, `scale` pixels in each border are cropped before evaluation. +The metrics are `PSNR / SSIM` . + +| Method | Set5 PSNR | Set14 PSNR | DIV2K PSNR | Set5 SSIM | Set14 SSIM | DIV2K SSIM | GPU Info | Download | +| :----------------------------------------------------------------: | :-------: | :--------: | :--------: | :-------: | :--------: | :--------: | :------: | :------------------------------------------------------------------: | +| [swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k](/configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py) | 38.1289 | 33.8404 | 37.5844 | 0.9617 | 0.9207 | 0.9459 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k-131d3f64.pth) \| log | +| [swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k](/configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py) | 34.6037 | 30.5340 | 33.8394 | 0.9293 | 0.8468 | 0.8867 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k-309cb239.pth) \| log | +| [swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k](/configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py) | 32.4343 | 28.7441 | 31.8636 | 0.8984 | 0.7861 | 0.8353 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k-d6622d03.pth) \| log | + +### **Real-World Image Super-Resolution** + +Evaluated on Y channels. +The metrics are `NIQE` . + +| Method | RealSRSet+5images NIQE | GPU Info | Download | +| :----------------------------------------------------------------------------------: | :--------------------: | :------: | :------------------------------------------------------------------------------------: | +| [swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost](/configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py) | 5.7975 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-c6425057.pth) \| log | +| [swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost](/configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py) | 7.2738 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-6f0c425f.pth) \| log | +| [swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost](/configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py) | 5.2329 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-36960d18.pth) \| log | +| [swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost](/configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py) | 7.7460 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-a016a72f.pth) \| log | +| [swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost](/configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py) | 5.1464 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/) \| log | +| [swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost](/configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py) | 7.6378 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-os-9f1599b5.pth) \| log | + +### **Grayscale Image Deoising** + +Evaluated on grayscale images. +The metrics are `PSNR` . + +| Method | Set12 PSNR | BSD68 PSNR | Urban100 PSNR | GPU Info | Download | +| :----------------------------------------------------------------------------: | :--------: | :--------: | :-----------: | :------: | :-------------------------------------------------------------------------------: | +| [swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15](/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py) | 33.9731 | 32.5203 | 34.3424 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15-6782691b.pth) \| log | +| [swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25](/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py) | 31.6434 | 30.1377 | 31.9493 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25-d0d8d4da.pth) \| log | +| [swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50](/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py) | 28.5651 | 27.3157 | 28.6626 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50-54c9968a.pth) \| log | + +### **Color Image Deoising** + +Evaluated on RGB channels. +The metrics are `PSNR` . + +| Method | CBSD68 PSNR | Kodak24 PSNR | McMaster PSNR | Urban100 PSNR | GPU Info | Download | +| :--------------------------------------------------------------------: | :---------: | :----------: | :-----------: | :-----------: | :------: | :-----------------------------------------------------------------------: | +| [swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15](/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py) | 34.4136 | 35.3555 | 35.6205 | 35.1836 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15-c74a2cee.pth) \| log | +| [swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25](/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py) | 31.7626 | 32.9003 | 33.3198 | 32.9458 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25-df2b1c0c.pth) \| log | +| [swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50](/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py) | 28.5346 | 29.8058 | 30.2027 | 29.8832 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50-e369874c.pth) \| log | + +### **JPEG Compression Artifact Reduction (grayscale)** + +Evaluated on grayscale images. +The metrics are `PSNR / SSIM` . + +| Method | Classic5 PSNR | Classic5 SSIM | LIVE1 PSNR | LIVE1 SSIM | GPU Info | Download | +| :----------------------------------------------------------------------: | :-----------: | :-----------: | :--------: | :--------: | :------: | :------------------------------------------------------------------------: | +| [swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10](/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py) | 30.2746 | 0.8254 | 29.8611 | 0.8292 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10-da93c8e9.pth) \| log | +| [swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20](/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py) | 32.5331 | 0.8753 | 32.2667 | 0.8914 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20-d47367b1.pth) \| log | +| [swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30](/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py) | 33.7504 | 0.8966 | 33.7001 | 0.9179 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30-52c083cf.pth) \| log | +| [swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40](/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py) | 34.5377 | 0.9087 | 34.6846 | 0.9322 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40-803e8d9b.pth) \| log | + +### **JPEG Compression Artifact Reduction (color)** + +Evaluated on RGB channels. +The metrics are `PSNR / SSIM` . + +| Method | Classic5 PSNR | Classic5 SSIM | LIVE1 PSNR | LIVE1 SSIM | GPU Info | Download | +| :----------------------------------------------------------------------: | :-----------: | :-----------: | :--------: | :--------: | :------: | :------------------------------------------------------------------------: | +| [swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10](/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py) | 30.1019 | 0.8217 | 28.0676 | 0.8094 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10-09aafadc.pth) \| log | +| [swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20](/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py) | 32.3489 | 0.8727 | 30.4514 | 0.8745 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20-b8a42b5e.pth) \| log | +| [swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30](/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py) | 33.6028 | 0.8949 | 31.8235 | 0.9023 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30-e9fe6859.pth) \| log | +| [swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40](/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py) | 34.4344 | 0.9076 | 32.7610 | 0.9179 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40-5b77a6e6.pth) \| log | + +## Quick Start + +**Train** + +
+Train Instructions + +You can use the following commands to train a model with cpu or single/multiple GPUs. + +```shell +# cpu train +# 001 Classical Image Super-Resolution (middle size) +# (setting1: when model is trained on DIV2K and with training_patch_size=48) +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py + +# (setting2: when model is trained on DIV2K+Flickr2K and with training_patch_size=64) +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py + +# 002 Lightweight Image Super-Resolution (small size) +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py + +# 003 Real-World Image Super-Resolution +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py + +# 004 Grayscale Image Deoising (middle size) +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py + +# 005 Color Image Deoising (middle size) +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py + +# 006 JPEG Compression Artifact Reduction (middle size, using window_size=7 because JPEG encoding uses 8x8 blocks) +# grayscale +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py + +# color +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py + + +# single-gpu train +# 001 Classical Image Super-Resolution (middle size) +# (setting1: when model is trained on DIV2K and with training_patch_size=48) +python tools/train.py configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py +python tools/train.py configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py +python tools/train.py configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py + +# (setting2: when model is trained on DIV2K+Flickr2K and with training_patch_size=64) +python tools/train.py configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py +python tools/train.py configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py +python tools/train.py configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py + +# 002 Lightweight Image Super-Resolution (small size) +python tools/train.py configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py +python tools/train.py configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py +python tools/train.py configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py + +# 003 Real-World Image Super-Resolution +python tools/train.py configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py +python tools/train.py configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py +python tools/train.py configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py +python tools/train.py configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py +python tools/train.py configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py +python tools/train.py configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py + +# 004 Grayscale Image Deoising (middle size) +python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py +python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py +python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py + +# 005 Color Image Deoising (middle size) +python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py +python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py +python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py + +# 006 JPEG Compression Artifact Reduction (middle size, using window_size=7 because JPEG encoding uses 8x8 blocks) +# grayscale +python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py +python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py +python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py +python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py + +# color +python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py +python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py +python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py +python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py + + +# multi-gpu train +# 001 Classical Image Super-Resolution (middle size) +# (setting1: when model is trained on DIV2K and with training_patch_size=48) +./tools/dist_train.sh configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py 8 +./tools/dist_train.sh configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py 8 +./tools/dist_train.sh configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py 8 + +# (setting2: when model is trained on DIV2K+Flickr2K and with training_patch_size=64) +./tools/dist_train.sh configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py 8 +./tools/dist_train.sh configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py 8 +./tools/dist_train.sh configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py 8 + +# 002 Lightweight Image Super-Resolution (small size) +./tools/dist_train.sh configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py 8 +./tools/dist_train.sh configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py 8 +./tools/dist_train.sh configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py 8 + +# 003 Real-World Image Super-Resolution +./tools/dist_train.sh configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py 8 +./tools/dist_train.sh configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py 8 +./tools/dist_train.sh configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py 8 +./tools/dist_train.sh configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py 8 +./tools/dist_train.sh configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py 8 +./tools/dist_train.sh configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py 8 + +# 004 Grayscale Image Deoising (middle size) +./tools/dist_train.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py 8 +./tools/dist_train.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py 8 +./tools/dist_train.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py 8 + +# 005 Color Image Deoising (middle size) +./tools/dist_train.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py 8 +./tools/dist_train.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py 8 +./tools/dist_train.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py 8 + +# 006 JPEG Compression Artifact Reduction (middle size, using window_size=7 because JPEG encoding uses 8x8 blocks) +# grayscale +./tools/dist_train.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py 8 +./tools/dist_train.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py 8 +./tools/dist_train.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py 8 +./tools/dist_train.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py 8 + +# color +./tools/dist_train.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py 8 +./tools/dist_train.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py 8 +./tools/dist_train.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py 8 +./tools/dist_train.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py 8 +``` + +For more details, you can refer to **Train a model** part in [train_test.md](/docs/en/user_guides/train_test.md#Train-a-model-in-MMEditing). + +
+ +**Test** + +
+Test Instructions + +You can use the following commands to test a model with cpu or single/multiple GPUs. + +```shell +# cpu test +# 001 Classical Image Super-Resolution (middle size) +# (setting1: when model is trained on DIV2K and with training_patch_size=48) +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k-ed2d419e.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k-926950f1.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k-88e4903d.pth + +# (setting2: when model is trained on DIV2K+Flickr2K and with training_patch_size=64) +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k-69e15fb6.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k-d6982f7b.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k-0502d775.pth + + +# 002 Lightweight Image Super-Resolution (small size) +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k-131d3f64.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k-309cb239.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k-d6622d03.pth + +# 003 Real-World Image Super-Resolution +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-c6425057.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-6f0c425f.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-36960d18.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-a016a72f.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-os-9f1599b5.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-os-25f1722a.pth + +# 004 Grayscale Image Deoising (middle size) +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15-6782691b.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25-d0d8d4da.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50-54c9968a.pth + +# 005 Color Image Deoising (middle size) +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15-c74a2cee.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25-df2b1c0c.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50-e369874c.pth + +# 006 JPEG Compression Artifact Reduction (middle size, using window_size=7 because JPEG encoding usesx8 blocks) +# grayscale +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10-da93c8e9.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20-d47367b1.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30-52c083cf.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40-803e8d9b.pth + + +# color +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10-09aafadc.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20-b8a42b5e.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30-e9fe6859.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40-5b77a6e6.pth + + + +# single-gpu test +# 001 Classical Image Super-Resolution (middle size) +# (setting1: when model is trained on DIV2K and with training_patch_size=48) +python tools/test.py configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k-ed2d419e.pth + +python tools/test.py configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k-926950f1.pth + +python tools/test.py configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k-88e4903d.pth + +# (setting2: when model is trained on DIV2K+Flickr2K and with training_patch_size=64) +python tools/test.py configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k-69e15fb6.pth + +python tools/test.py configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k-d6982f7b.pth + +python tools/test.py configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k-0502d775.pth + + +# 002 Lightweight Image Super-Resolution (small size) +python tools/test.py configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k-131d3f64.pth + +python tools/test.py configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k-309cb239.pth + +python tools/test.py configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k-d6622d03.pth + + +# 003 Real-World Image Super-Resolution +python tools/test.py configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-c6425057.pth + +python tools/test.py configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-6f0c425f.pth + +python tools/test.py configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-36960d18.pth + +python tools/test.py configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-a016a72f.pth + +python tools/test.py configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-os-9f1599b5.pth + +python tools/test.py configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-os-25f1722a.pth + + +# 004 Grayscale Image Deoising (middle size) +python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15-6782691b.pth + +python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25-d0d8d4da.pth + +python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50-54c9968a.pth + + +# 005 Color Image Deoising (middle size) +python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15-c74a2cee.pth + +python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25-df2b1c0c.pth + +python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50-e369874c.pth + + +# 006 JPEG Compression Artifact Reduction (middle size, using window_size=7 because JPEG encoding usesx8 blocks) +# grayscale +python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10-da93c8e9.pth + +python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20-d47367b1.pth + +python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30-52c083cf.pth + +python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40-803e8d9b.pth + + +# color +python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10-09aafadc.pth + +python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20-b8a42b5e.pth + +python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30-e9fe6859.pth + +python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40-5b77a6e6.pth + + + +# multi-gpu test +# 001 Classical Image Super-Resolution (middle size) +# (setting1: when model is trained on DIV2K and with training_patch_size=48) +./tools/dist_test.sh configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k-ed2d419e.pth + +./tools/dist_test.sh configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k-926950f1.pth + +./tools/dist_test.sh configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k-88e4903d.pth + +# (setting2: when model is trained on DIV2K+Flickr2K and with training_patch_size=64) +./tools/dist_test.sh configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k-69e15fb6.pth + +./tools/dist_test.sh configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k-d6982f7b.pth + +./tools/dist_test.sh configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k-0502d775.pth + +# 002 Lightweight Image Super-Resolution (small size) +./tools/dist_test.sh configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k-131d3f64.pth + +./tools/dist_test.sh configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k-309cb239.pth + +./tools/dist_test.sh configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k-d6622d03.pth + +# 003 Real-World Image Super-Resolution +./tools/dist_test.sh configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-c6425057.pth + +./tools/dist_test.sh configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-6f0c425f.pth + +./tools/dist_test.sh configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-36960d18.pth + +./tools/dist_test.sh configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-a016a72f.pth + +./tools/dist_test.sh configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-os-9f1599b5.pth + +./tools/dist_test.sh configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-os-25f1722a.pth + +# 004 Grayscale Image Deoising (middle size) +./tools/dist_test.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15-6782691b.pth + +./tools/dist_test.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25-d0d8d4da.pth + +./tools/dist_test.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50-54c9968a.pth + +# 005 Color Image Deoising (middle size) +./tools/dist_test.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15-c74a2cee.pth + +./tools/dist_test.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25-df2b1c0c.pth + +./tools/dist_test.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50-e369874c.pth + +# 006 JPEG Compression Artifact Reduction (middle size, using window_size=7 because JPEG encoding uses 8x8 blocks) +# grayscale +./tools/dist_test.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10-da93c8e9.pth + +./tools/dist_test.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20-d47367b1.pth + +./tools/dist_test.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30-52c083cf.pth + +./tools/dist_test.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40-803e8d9b.pth + +# color +./tools/dist_test.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10-09aafadc.pth + +./tools/dist_test.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20-b8a42b5e.pth + +./tools/dist_test.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30-e9fe6859.pth + +./tools/dist_test.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py https://download.openmmlab.com/mmediting/swinir/ + +``` + +For more details, you can refer to **Test a pre-trained model** part in [train_test.md](/docs/en/user_guides/train_test.md#Test-a-pre-trained-model-in-MMEditing). + +
+ +## Citation + +```bibtex +@inproceedings{liang2021swinir, + title={Swinir: Image restoration using swin transformer}, + author={Liang, Jingyun and Cao, Jiezhang and Sun, Guolei and Zhang, Kai and Van Gool, Luc and Timofte, Radu}, + booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision}, + pages={1833--1844}, + year={2021} +} +``` diff --git a/configs/swinir/README_zh-CN.md b/configs/swinir/README_zh-CN.md new file mode 100644 index 0000000000..4fccfcbaac --- /dev/null +++ b/configs/swinir/README_zh-CN.md @@ -0,0 +1,503 @@ +# SwinIR (ICCVW'2021) + +> **任务**: 图像超分辨率, 图像去噪, JPEG压缩伪影移除 + + + +
+SwinIR (ICCVW'2021) + +```bibtex +@inproceedings{liang2021swinir, + title={Swinir: Image restoration using swin transformer}, + author={Liang, Jingyun and Cao, Jiezhang and Sun, Guolei and Zhang, Kai and Van Gool, Luc and Timofte, Radu}, + booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision}, + pages={1833--1844}, + year={2021} +} +``` + +
+ +
+ +### **Classical Image Super-Resolution** + +在 Y 通道上进行评估,在评估之前裁剪每个边界中的 `scale` 像素。 +我们使用 `PSNR` 和 `SSIM` 作为指标。 + +| 算法 | Set5 PSNR | Set14 PSNR | DIV2K PSNR | Set5 SSIM | Set14 SSIM | DIV2K SSIM | GPU 信息 | 下载 | +| :-----------------------------------------------------------------: | :-------: | :--------: | :--------: | :-------: | :--------: | :--------: | :------: | :-----------------------------------------------------------------: | +| [swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k](/configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py) | 38.3240 | 34.1174 | 37.8921 | 0.9626 | 0.9230 | 0.9481 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k-ed2d419e.pth) \| log | +| [swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k](/configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py) | 34.8640 | 30.7669 | 34.1397 | 0.9317 | 0.8508 | 0.8917 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k-926950f1.pth) \| log | +| [swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k](/configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py) | 32.7315 | 28.9065 | 32.0953 | 0.9029 | 0.7915 | 0.8418 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k-88e4903d.pth) \| log | +| [swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k](/configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py) | 38.3971 | 34.4149 | 37.9473 | 0.9629 | 0.9252 | 0.9488 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k-69e15fb6.pth) \| log | +| [swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k](/configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py) | 34.9335 | 30.9258 | 34.2830 | 0.9323 | 0.8540 | 0.8939 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k-d6982f7b.pth) \| log | +| [swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k](/configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py) | 32.9214 | 29.0792 | 32.3021 | 0.9053 | 0.7953 | 0.8451 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k-0502d775.pth) \| log | + +### **Lightweight Image Super-Resolution** + +在 Y 通道上进行评估,在评估之前裁剪每个边界中的 `scale` 像素。 +我们使用 `PSNR` 和 `SSIM` 作为指标。 + +| 算法 | Set5 PSNR | Set14 PSNR | DIV2K PSNR | Set5 SSIM | Set14 SSIM | DIV2K SSIM | GPU 信息 | 下载 | +| :-----------------------------------------------------------------: | :-------: | :--------: | :--------: | :-------: | :--------: | :--------: | :------: | :-----------------------------------------------------------------: | +| [swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k](/configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py) | 38.1289 | 33.8404 | 37.5844 | 0.9617 | 0.9207 | 0.9459 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k-131d3f64.pth) \| log | +| [swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k](/configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py) | 34.6037 | 30.5340 | 33.8394 | 0.9293 | 0.8468 | 0.8867 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k-309cb239.pth) \| log | +| [swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k](/configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py) | 32.4343 | 28.7441 | 31.8636 | 0.8984 | 0.7861 | 0.8353 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k-d6622d03.pth) \| log | + +### **Real-World Image Super-Resolution** + +在 Y 通道上进行评估。 +我们使用 NIQE 作为指标。 + +| 算法 | RealSRSet+5images NIQE | GPU 信息 | 下载 | +| :-----------------------------------------------------------------------------------: | :--------------------: | :------: | :-----------------------------------------------------------------------------------: | +| [swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost](/configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py) | 5.7975 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-c6425057.pth) \| log | +| [swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost](/configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py) | 7.2738 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-6f0c425f.pth) \| log | +| [swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost](/configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py) | 5.2329 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-36960d18.pth) \| log | +| [swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost](/configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py) | 7.7460 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-a016a72f.pth) \| log | +| [swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost](/configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py) | 5.1464 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/) \| log | +| [swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost](/configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py) | 7.6378 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-os-25f1722a.pth) \| log | + +### **Grayscale Image Deoising** + +在灰度图上进行评估。 +我们使用 PSNR 作为指标。 + +| 算法 | Set12 PSNR | BSD68 PSNR | Urban100 PSNR | GPU 信息 | 下载 | +| :-----------------------------------------------------------------------------: | :--------: | :--------: | :-----------: | :------: | :------------------------------------------------------------------------------: | +| [swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15](/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py) | 33.9731 | 32.5203 | 34.3424 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15-6782691b.pth) \| log | +| [swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25](/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py) | 31.6434 | 30.1377 | 31.9493 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25-d0d8d4da.pth) \| log | +| [swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50](/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py) | 28.5651 | 27.3157 | 28.6626 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50-54c9968a.pth) \| log | + +### **Color Image Deoising** + +在 RGB 通道上进行评估。 +我们使用 PSNR 作为指标。 + +| 算法 | CBSD68 PSNR | Kodak24 PSNR | McMaster PSNR | Urban100 PSNR | GPU 信息 | 下载 | +| :---------------------------------------------------------------------: | :---------: | :----------: | :-----------: | :-----------: | :------: | :----------------------------------------------------------------------: | +| [swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15](/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py) | 34.4136 | 35.3555 | 35.6205 | 35.1836 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15-c74a2cee.pth) \| log | +| [swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25](/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py) | 31.7626 | 32.9003 | 33.3198 | 32.9458 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25-df2b1c0c.pth) \| log | +| [swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50](/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py) | 28.5346 | 29.8058 | 30.2027 | 29.8832 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50-e369874c.pth) \| log | + +### **JPEG Compression Artifact Reduction (grayscale)** + +在灰度图上进行评估。 +我们使用 PSNR 和 SSIM 作为指标。 + +| 算法 | Classic5 PSNR | Classic5 SSIM | LIVE1 PSNR | LIVE1 SSIM | GPU 信息 | 下载 | +| :-----------------------------------------------------------------------: | :-----------: | :-----------: | :--------: | :--------: | :------: | :-----------------------------------------------------------------------: | +| [swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10](/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py) | 30.2746 | 0.8254 | 29.8611 | 0.8292 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10-da93c8e9.pth) \| log | +| [swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20](/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py) | 32.5331 | 0.8753 | 32.2667 | 0.8914 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20-d47367b1.pth) \| log | +| [swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30](/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py) | 33.7504 | 0.8966 | 33.7001 | 0.9179 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30-52c083cf.pth) \| log | +| [swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40](/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py) | 34.5377 | 0.9087 | 34.6846 | 0.9322 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40-803e8d9b.pth) \| log | + +### **JPEG Compression Artifact Reduction (color)** + +在 RGB 通道上进行评估。 +我们使用 PSNR 和 SSIM 作为指标。 + +| 算法 | Classic5 PSNR | Classic5 SSIM | LIVE1 PSNR | LIVE1 SSIM | GPU 信息 | 下载 | +| :-----------------------------------------------------------------------: | :-----------: | :-----------: | :--------: | :--------: | :------: | :-----------------------------------------------------------------------: | +| [swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10](/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py) | 30.1019 | 0.8217 | 28.0676 | 0.8094 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10-09aafadc.pth) \| log | +| [swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20](/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py) | 32.3489 | 0.8727 | 30.3489 | 0.8745 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20-b8a42b5e.pth) \| log | +| [swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30](/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py) | 33.6028 | 0.8949 | 31.8235 | 0.9023 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30-e9fe6859.pth) \| log | +| [swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40](/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py) | 34.4344 | 0.9076 | 32.7610 | 0.9179 | 8 | [model](https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40-5b77a6e6.pth) \| log | + +## 快速开始 + +**训练** + +
+训练说明 + +您可以使用以下命令来训练模型。 + +```shell +# CPU上训练 +# 001 Classical Image Super-Resolution (middle size) +# (setting1: when model is trained on DIV2K and with training_patch_size=48) +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py + +# (setting2: when model is trained on DIV2K+Flickr2K and with training_patch_size=64) +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py + +# 002 Lightweight Image Super-Resolution (small size) +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py + +# 003 Real-World Image Super-Resolution +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py + +# 004 Grayscale Image Deoising (middle size) +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py + +# 005 Color Image Deoising (middle size) +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py + +# 006 JPEG Compression Artifact Reduction (middle size, using window_size=7 because JPEG encoding uses 8x8 blocks) +# grayscale +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py + +# color +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py +CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py + + + +# 单个GPU上训练 +# 001 Classical Image Super-Resolution (middle size) +# (setting1: when model is trained on DIV2K and with training_patch_size=48) +python tools/train.py configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py +python tools/train.py configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py +python tools/train.py configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py + +# (setting2: when model is trained on DIV2K+Flickr2K and with training_patch_size=64) +python tools/train.py configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py +python tools/train.py configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py +python tools/train.py configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py + +# 002 Lightweight Image Super-Resolution (small size) +python tools/train.py configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py +python tools/train.py configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py +python tools/train.py configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py + +# 003 Real-World Image Super-Resolution +python tools/train.py configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py +python tools/train.py configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py +python tools/train.py configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py +python tools/train.py configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py +python tools/train.py configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py +python tools/train.py configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py + +# 004 Grayscale Image Deoising (middle size) +python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py +python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py +python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py + +# 005 Color Image Deoising (middle size) +python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py +python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py +python tools/train.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py + +# 006 JPEG Compression Artifact Reduction (middle size, using window_size=7 because JPEG encoding uses 8x8 blocks) +# grayscale +python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py +python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py +python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py +python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py + +# color +python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py +python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py +python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py +python tools/train.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py + + + +# 多个GPU上训练 +# 001 Classical Image Super-Resolution (middle size) +# (setting1: when model is trained on DIV2K and with training_patch_size=48) +./tools/dist_train.sh configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py 8 +./tools/dist_train.sh configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py 8 +./tools/dist_train.sh configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py 8 + +# (setting2: when model is trained on DIV2K+Flickr2K and with training_patch_size=64) +./tools/dist_train.sh configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py 8 +./tools/dist_train.sh configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py 8 +./tools/dist_train.sh configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py 8 + +# 002 Lightweight Image Super-Resolution (small size) +./tools/dist_train.sh configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py 8 +./tools/dist_train.sh configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py 8 +./tools/dist_train.sh configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py 8 + +# 003 Real-World Image Super-Resolution +./tools/dist_train.sh configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py 8 +./tools/dist_train.sh configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py 8 +./tools/dist_train.sh configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py 8 +./tools/dist_train.sh configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py 8 +./tools/dist_train.sh configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py 8 +./tools/dist_train.sh configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py 8 + +# 004 Grayscale Image Deoising (middle size) +./tools/dist_train.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py 8 +./tools/dist_train.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py 8 +./tools/dist_train.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py 8 + +# 005 Color Image Deoising (middle size) +./tools/dist_train.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py 8 +./tools/dist_train.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py 8 +./tools/dist_train.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py 8 + +# 006 JPEG Compression Artifact Reduction (middle size, using window_size=7 because JPEG encoding uses 8x8 blocks) +# grayscale +./tools/dist_train.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py 8 +./tools/dist_train.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py 8 +./tools/dist_train.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py 8 +./tools/dist_train.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py 8 + +# color +./tools/dist_train.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py 8 +./tools/dist_train.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py 8 +./tools/dist_train.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py 8 +./tools/dist_train.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py 8 +``` + +更多细节可以参考 [train_test.md](/docs/zh_cn/user_guides/train_test.md) 中的 **Train a model** 部分。 + +
+ +**测试** + +
+测试说明 + +您可以使用以下命令来测试模型。 + +```shell +# CPU上测试 +# 001 Classical Image Super-Resolution (middle size) +# (setting1: when model is trained on DIV2K and with training_patch_size=48) +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k-ed2d419e.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k-926950f1.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k-88e4903d.pth + +# (setting2: when model is trained on DIV2K+Flickr2K and with training_patch_size=64) +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k-69e15fb6.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k-d6982f7b.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k-0502d775.pth + + +# 002 Lightweight Image Super-Resolution (small size) +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k-131d3f64.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k-309cb239.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k-d6622d03.pth + +# 003 Real-World Image Super-Resolution +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-c6425057.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-6f0c425f.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-36960d18.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-a016a72f.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-os-9f1599b5.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-os-25f1722a.pth + +# 004 Grayscale Image Deoising (middle size) +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15-6782691b.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25-d0d8d4da.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50-54c9968a.pth + +# 005 Color Image Deoising (middle size) +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15-c74a2cee.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25-df2b1c0c.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50-e369874c.pth + +# 006 JPEG Compression Artifact Reduction (middle size, using window_size=7 because JPEG encoding usesx8 blocks) +# grayscale +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10-da93c8e9.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20-d47367b1.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30-52c083cf.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40-803e8d9b.pth + + +# color +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10-09aafadc.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20-b8a42b5e.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30-e9fe6859.pth + +CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40-5b77a6e6.pth + + + +# 单个GPU上测试 +# 001 Classical Image Super-Resolution (middle size) +# (setting1: when model is trained on DIV2K and with training_patch_size=48) +python tools/test.py configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k-ed2d419e.pth + +python tools/test.py configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k-926950f1.pth + +python tools/test.py configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k-88e4903d.pth + +# (setting2: when model is trained on DIV2K+Flickr2K and with training_patch_size=64) +python tools/test.py configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k-69e15fb6.pth + +python tools/test.py configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k-d6982f7b.pth + +python tools/test.py configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k-0502d775.pth + + +# 002 Lightweight Image Super-Resolution (small size) +python tools/test.py configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k-131d3f64.pth + +python tools/test.py configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k-309cb239.pth + +python tools/test.py configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k-d6622d03.pth + + +# 003 Real-World Image Super-Resolution +python tools/test.py configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-c6425057.pth + +python tools/test.py configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-6f0c425f.pth + +python tools/test.py configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-36960d18.pth + +python tools/test.py configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-a016a72f.pth + +python tools/test.py configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-os-9f1599b5.pth + +python tools/test.py configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-os-25f1722a.pth + + +# 004 Grayscale Image Deoising (middle size) +python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15-6782691b.pth + +python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25-d0d8d4da.pth + +python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50-54c9968a.pth + + +# 005 Color Image Deoising (middle size) +python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15-c74a2cee.pth + +python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25-df2b1c0c.pth + +python tools/test.py configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50-e369874c.pth + + +# 006 JPEG Compression Artifact Reduction (middle size, using window_size=7 because JPEG encoding usesx8 blocks) +# grayscale +python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10-da93c8e9.pth + +python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20-d47367b1.pth + +python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30-52c083cf.pth + +python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40-803e8d9b.pth + + +# color +python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10-09aafadc.pth + +python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20-b8a42b5e.pth + +python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30-e9fe6859.pth + +python tools/test.py configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40-5b77a6e6.pth + + + +# 多GPU测试 +# 001 Classical Image Super-Resolution (middle size) +# (setting1: when model is trained on DIV2K and with training_patch_size=48) +./tools/dist_test.sh configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k-ed2d419e.pth + +./tools/dist_test.sh configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k-926950f1.pth + +./tools/dist_test.sh configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k-88e4903d.pth + +# (setting2: when model is trained on DIV2K+Flickr2K and with training_patch_size=64) +./tools/dist_test.sh configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k-69e15fb6.pth + +./tools/dist_test.sh configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k-d6982f7b.pth + +./tools/dist_test.sh configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k-0502d775.pth + +# 002 Lightweight Image Super-Resolution (small size) +./tools/dist_test.sh configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k-131d3f64.pth + +./tools/dist_test.sh configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k-309cb239.pth + +./tools/dist_test.sh configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py https://download.openmmlab.com/mmediting/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k-d6622d03.pth + +# 003 Real-World Image Super-Resolution +./tools/dist_test.sh configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-c6425057.pth + +./tools/dist_test.sh configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-6f0c425f.pth + +./tools/dist_test.sh configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-36960d18.pth + +./tools/dist_test.sh configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-a016a72f.pth + +./tools/dist_test.sh configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-os-9f1599b5.pth + +./tools/dist_test.sh configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-os-25f1722a.pth + +# 004 Grayscale Image Deoising (middle size) +./tools/dist_test.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15-6782691b.pth + +./tools/dist_test.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25-d0d8d4da.pth + +./tools/dist_test.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50-54c9968a.pth + +# 005 Color Image Deoising (middle size) +./tools/dist_test.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15-c74a2cee.pth + +./tools/dist_test.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25-df2b1c0c.pth + +./tools/dist_test.sh configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50-e369874c.pth + +# 006 JPEG Compression Artifact Reduction (middle size, using window_size=7 because JPEG encoding uses 8x8 blocks) +# grayscale +./tools/dist_test.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10-da93c8e9.pth + +./tools/dist_test.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20-d47367b1.pth + +./tools/dist_test.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30-52c083cf.pth + +./tools/dist_test.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40-803e8d9b.pth + +# color +./tools/dist_test.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10-09aafadc.pth + +./tools/dist_test.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20-b8a42b5e.pth + +./tools/dist_test.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30-e9fe6859.pth + +./tools/dist_test.sh configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py https://download.openmmlab.com/mmediting/swinir/ + +``` + +更多细节可以参考 [train_test.md](/docs/zh_cn/user_guides/train_test.md) 中的 **Test a pre-trained model** 部分。 + +
diff --git a/configs/swinir/metafile.yml b/configs/swinir/metafile.yml new file mode 100644 index 0000000000..f6a4a58617 --- /dev/null +++ b/configs/swinir/metafile.yml @@ -0,0 +1,446 @@ +Collections: +- Metadata: + Architecture: + - SwinIR + Name: SwinIR + Paper: + - https://arxiv.org/abs/2108.10257 + README: configs/swinir/README.md + Task: + - image super-resolution + - image denoising + - jpeg compression artifact reduction + Year: 2021 +Models: +- Config: configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: DIV2K + Name: swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k + Results: + - Dataset: DIV2K + Metrics: + DIV2K PSNR: 37.8921 + DIV2K SSIM: 0.9481 + Set14 PSNR: 34.1174 + Set14 SSIM: 0.923 + Set5 PSNR: 38.324 + Set5 SSIM: 0.9626 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k-ed2d419e.pth +- Config: configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: DIV2K + Name: swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k + Results: + - Dataset: DIV2K + Metrics: + DIV2K PSNR: 34.1397 + DIV2K SSIM: 0.8917 + Set14 PSNR: 30.7669 + Set14 SSIM: 0.8508 + Set5 PSNR: 34.864 + Set5 SSIM: 0.9317 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k-926950f1.pth +- Config: configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: DIV2K + Name: swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k + Results: + - Dataset: DIV2K + Metrics: + DIV2K PSNR: 32.0953 + DIV2K SSIM: 0.8418 + Set14 PSNR: 28.9065 + Set14 SSIM: 0.7915 + Set5 PSNR: 32.7315 + Set5 SSIM: 0.9029 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k-88e4903d.pth +- Config: configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k + Results: + - Dataset: Others + Metrics: + DIV2K PSNR: 37.9473 + DIV2K SSIM: 0.9488 + Set14 PSNR: 34.4149 + Set14 SSIM: 0.9252 + Set5 PSNR: 38.3971 + Set5 SSIM: 0.9629 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k-69e15fb6.pth +- Config: configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k + Results: + - Dataset: Others + Metrics: + DIV2K PSNR: 34.283 + DIV2K SSIM: 0.8939 + Set14 PSNR: 30.9258 + Set14 SSIM: 0.854 + Set5 PSNR: 34.9335 + Set5 SSIM: 0.9323 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k-d6982f7b.pth +- Config: configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k + Results: + - Dataset: Others + Metrics: + DIV2K PSNR: 32.3021 + DIV2K SSIM: 0.8451 + Set14 PSNR: 29.0792 + Set14 SSIM: 0.7953 + Set5 PSNR: 32.9214 + Set5 SSIM: 0.9053 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k-0502d775.pth +- Config: configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: DIV2K + Name: swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k + Results: + - Dataset: DIV2K + Metrics: + DIV2K PSNR: 37.5844 + DIV2K SSIM: 0.9459 + Set14 PSNR: 33.8404 + Set14 SSIM: 0.9207 + Set5 PSNR: 38.1289 + Set5 SSIM: 0.9617 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k-131d3f64.pth +- Config: configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: DIV2K + Name: swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k + Results: + - Dataset: DIV2K + Metrics: + DIV2K PSNR: 33.8394 + DIV2K SSIM: 0.8867 + Set14 PSNR: 30.534 + Set14 SSIM: 0.8468 + Set5 PSNR: 34.6037 + Set5 SSIM: 0.9293 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k-309cb239.pth +- Config: configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: DIV2K + Name: swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k + Results: + - Dataset: DIV2K + Metrics: + DIV2K PSNR: 31.8636 + DIV2K SSIM: 0.8353 + Set14 PSNR: 28.7441 + Set14 SSIM: 0.7861 + Set5 PSNR: 32.4343 + Set5 SSIM: 0.8984 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k-d6622d03.pth +- Config: configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost + Results: + - Dataset: Others + Metrics: + RealSRSet+5images NIQE: 5.7975 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-c6425057.pth +- Config: configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost + Results: + - Dataset: Others + Metrics: + RealSRSet+5images NIQE: 7.2738 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-6f0c425f.pth +- Config: configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost + Results: + - Dataset: Others + Metrics: + RealSRSet+5images NIQE: 5.2329 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-36960d18.pth +- Config: configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost + Results: + - Dataset: Others + Metrics: + RealSRSet+5images NIQE: 7.746 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-os-a016a72f.pth +- Config: configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost + Results: + - Dataset: Others + Metrics: + RealSRSet+5images NIQE: 5.1464 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/ +- Config: configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost + Results: + - Dataset: Others + Metrics: + RealSRSet+5images NIQE: 7.6378 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-os-9f1599b5.pth +- Config: configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15 + Results: + - Dataset: Others + Metrics: + BSD68 PSNR: 32.5203 + Set12 PSNR: 33.9731 + Urban100 PSNR: 34.3424 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15-6782691b.pth +- Config: configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25 + Results: + - Dataset: Others + Metrics: + BSD68 PSNR: 30.1377 + Set12 PSNR: 31.6434 + Urban100 PSNR: 31.9493 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25-d0d8d4da.pth +- Config: configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50 + Results: + - Dataset: Others + Metrics: + BSD68 PSNR: 27.3157 + Set12 PSNR: 28.5651 + Urban100 PSNR: 28.6626 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50-54c9968a.pth +- Config: configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15 + Results: + - Dataset: Others + Metrics: + CBSD68 PSNR: 34.4136 + Kodak24 PSNR: 35.3555 + McMaster PSNR: 35.6205 + Urban100 PSNR: 35.1836 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15-c74a2cee.pth +- Config: configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25 + Results: + - Dataset: Others + Metrics: + CBSD68 PSNR: 31.7626 + Kodak24 PSNR: 32.9003 + McMaster PSNR: 33.3198 + Urban100 PSNR: 32.9458 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25-df2b1c0c.pth +- Config: configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50 + Results: + - Dataset: Others + Metrics: + CBSD68 PSNR: 28.5346 + Kodak24 PSNR: 29.8058 + McMaster PSNR: 30.2027 + Urban100 PSNR: 29.8832 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50-e369874c.pth +- Config: configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10 + Results: + - Dataset: Others + Metrics: + Classic5 PSNR: 30.2746 + Classic5 SSIM: 0.8254 + LIVE1 PSNR: 29.8611 + LIVE1 SSIM: 0.8292 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10-da93c8e9.pth +- Config: configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20 + Results: + - Dataset: Others + Metrics: + Classic5 PSNR: 32.5331 + Classic5 SSIM: 0.8753 + LIVE1 PSNR: 32.2667 + LIVE1 SSIM: 0.8914 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20-d47367b1.pth +- Config: configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30 + Results: + - Dataset: Others + Metrics: + Classic5 PSNR: 33.7504 + Classic5 SSIM: 0.8966 + LIVE1 PSNR: 33.7001 + LIVE1 SSIM: 0.9179 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30-52c083cf.pth +- Config: configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40 + Results: + - Dataset: Others + Metrics: + Classic5 PSNR: 34.5377 + Classic5 SSIM: 0.9087 + LIVE1 PSNR: 34.6846 + LIVE1 SSIM: 0.9322 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40-803e8d9b.pth +- Config: configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10 + Results: + - Dataset: Others + Metrics: + Classic5 PSNR: 30.1019 + Classic5 SSIM: 0.8217 + LIVE1 PSNR: 28.0676 + LIVE1 SSIM: 0.8094 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10-09aafadc.pth +- Config: configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20 + Results: + - Dataset: Others + Metrics: + Classic5 PSNR: 32.3489 + Classic5 SSIM: 0.8727 + LIVE1 PSNR: 30.4514 + LIVE1 SSIM: 0.8745 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20-b8a42b5e.pth +- Config: configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30 + Results: + - Dataset: Others + Metrics: + Classic5 PSNR: 33.6028 + Classic5 SSIM: 0.8949 + LIVE1 PSNR: 31.8235 + LIVE1 SSIM: 0.9023 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30-e9fe6859.pth +- Config: configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py + In Collection: SwinIR + Metadata: + GPUs: '8' + Training Data: Others + Name: swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40 + Results: + - Dataset: Others + Metrics: + Classic5 PSNR: 34.4344 + Classic5 SSIM: 0.9076 + LIVE1 PSNR: 32.761 + LIVE1 SSIM: 0.9179 + Task: Image Super-Resolution, Image denoising, JPEG compression artifact reduction + Weights: https://download.openmmlab.com/mmediting/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40-5b77a6e6.pth diff --git a/configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py b/configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py new file mode 100644 index 0000000000..b527c7b70a --- /dev/null +++ b/configs/swinir/swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py @@ -0,0 +1,5 @@ +_base_ = ['swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py'] + +experiment_name = 'swinir_gan-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' diff --git a/configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py b/configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py new file mode 100644 index 0000000000..fff5e6b4a5 --- /dev/null +++ b/configs/swinir/swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py @@ -0,0 +1,5 @@ +_base_ = ['swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py'] + +experiment_name = 'swinir_gan-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' diff --git a/configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py b/configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py new file mode 100644 index 0000000000..86bd2a9175 --- /dev/null +++ b/configs/swinir/swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py @@ -0,0 +1,5 @@ +_base_ = ['swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py'] + +experiment_name = 'swinir_gan-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' diff --git a/configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py b/configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py new file mode 100644 index 0000000000..ee1dc77bfb --- /dev/null +++ b/configs/swinir/swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py @@ -0,0 +1,61 @@ +_base_ = ['../_base_/default_runtime.py'] + +experiment_name = 'swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +scale = 2 +img_size = 64 + +# model settings +model = dict( + type='BaseEditModel', + generator=dict( + type='SwinIRNet', + upscale=scale, + in_chans=3, + img_size=img_size, + window_size=8, + img_range=1.0, + depths=[6, 6, 6, 6, 6, 6], + embed_dim=180, + num_heads=[6, 6, 6, 6, 6, 6], + mlp_ratio=2, + upsampler='nearest+conv', + resi_connection='1conv'), + pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), + data_preprocessor=dict( + type='EditDataPreprocessor', mean=[0., 0., 0.], std=[255., 255., + 255.])) + +test_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict(type='PackEditInputs') +] + +test_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type='BasicImageDataset', + metainfo=dict(dataset_type='realsrset', task_name='realsr'), + data_root='data/RealSRSet+5images', + data_prefix=dict(img='', gt=''), + pipeline=test_pipeline)) + +test_evaluator = [dict(type='NIQE', input_order='CHW', convert_to='Y')] + +test_cfg = dict(type='TestLoop') diff --git a/configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py b/configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py new file mode 100644 index 0000000000..2f8e0451ec --- /dev/null +++ b/configs/swinir/swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py @@ -0,0 +1,10 @@ +_base_ = ['swinir_psnr-x2s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py'] + +experiment_name = 'swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +scale = 4 + +# model settings +model = dict(generator=dict(upscale=scale)) diff --git a/configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py b/configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py new file mode 100644 index 0000000000..d84a851aa3 --- /dev/null +++ b/configs/swinir/swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost.py @@ -0,0 +1,13 @@ +_base_ = ['swinir_psnr-x4s64w8d6e180_8xb4-lr1e-4-600k_df2k-ost.py'] + +experiment_name = 'swinir_psnr-x4s64w8d9e240_8xb4-lr1e-4-600k_df2k-ost' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# model settings +model = dict( + generator=dict( + depths=[6, 6, 6, 6, 6, 6, 6, 6, 6], + embed_dim=240, + num_heads=[8, 8, 8, 8, 8, 8, 8, 8, 8], + resi_connection='3conv')) diff --git a/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py new file mode 100644 index 0000000000..7eea2d978c --- /dev/null +++ b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py @@ -0,0 +1,134 @@ +_base_ = [ + '../_base_/default_runtime.py', + '../_base_/datasets/decompression_test_config.py' +] + +experiment_name = 'swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +quality = 10 + +# model settings +model = dict( + type='BaseEditModel', + generator=dict( + type='SwinIRNet', + upscale=1, + in_chans=3, + img_size=126, + window_size=7, + img_range=255.0, + depths=[6, 6, 6, 6, 6, 6], + embed_dim=180, + num_heads=[6, 6, 6, 6, 6, 6], + mlp_ratio=2, + upsampler='', + resi_connection='1conv'), + pixel_loss=dict(type='CharbonnierLoss', eps=1e-9), + data_preprocessor=dict( + type='EditDataPreprocessor', mean=[0., 0., 0.], std=[255., 255., + 255.])) + +train_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict(type='SetValues', dictionary=dict(scale=1)), + dict(type='PairedRandomCrop', gt_patch_size=126), + dict( + type='Flip', + keys=['img', 'gt'], + flip_ratio=0.5, + direction='horizontal'), + dict( + type='Flip', keys=['img', 'gt'], flip_ratio=0.5, direction='vertical'), + dict(type='RandomTransposeHW', keys=['img', 'gt'], transpose_ratio=0.5), + dict( + type='RandomJPEGCompression', + params=dict(quality=[quality, quality], color_type='color'), + keys=['img']), + dict(type='PackEditInputs') +] + +val_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='RandomJPEGCompression', + params=dict(quality=[quality, quality], color_type='color'), + keys=['img']), + dict(type='PackEditInputs') +] + +# dataset settings +dataset_type = 'BasicImageDataset' +data_root = 'data' + +train_dataloader = dict( + num_workers=2, + batch_size=1, + drop_last=True, + persistent_workers=False, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + ann_file='meta_info_DFWB8550sub_GT.txt', + metainfo=dict(dataset_type='dfwb', task_name='CAR'), + data_root=data_root + '/DFWB', + data_prefix=dict(img='', gt=''), + filename_tmpl=dict(img='{}', gt='{}'), + pipeline=train_pipeline)) + +val_dataloader = dict( + num_workers=2, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + metainfo=dict(dataset_type='live1', task_name='CAR'), + data_root=data_root + '/LIVE1', + data_prefix=dict(img='', gt=''), + pipeline=val_pipeline)) + +val_evaluator = [ + dict(type='PSNR', prefix='LIVE1'), + dict(type='SSIM', prefix='LIVE1'), +] + +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=1_600_000, val_interval=5000) +val_cfg = dict(type='ValLoop') + +# optimizer +optim_wrapper = dict( + constructor='DefaultOptimWrapperConstructor', + type='OptimWrapper', + optimizer=dict(type='Adam', lr=2e-4, betas=(0.9, 0.999))) + +# learning policy +param_scheduler = dict( + type='MultiStepLR', + by_epoch=False, + milestones=[800000, 1200000, 1400000, 1500000, 1600000], + gamma=0.5) diff --git a/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py new file mode 100644 index 0000000000..f83071f0d0 --- /dev/null +++ b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20.py @@ -0,0 +1,20 @@ +_base_ = ['swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py'] + +experiment_name = 'swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR20' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify JPEG quality factor of RandomJPEGCompression +quality = 20 +train_dataloader = _base_.train_dataloader +train_pipeline = train_dataloader['dataset']['pipeline'] +train_pipeline[-2]['params']['quality'] = [quality, quality] + +val_dataloader = _base_.val_dataloader +val_pipeline = val_dataloader['dataset']['pipeline'] +val_pipeline[2]['params']['quality'] = [quality, quality] + +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[2]['params']['quality'] = [quality, quality] diff --git a/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py new file mode 100644 index 0000000000..44872b9de8 --- /dev/null +++ b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30.py @@ -0,0 +1,20 @@ +_base_ = ['swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py'] + +experiment_name = 'swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR30' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify JPEG quality factor of RandomJPEGCompression +quality = 30 +train_dataloader = _base_.train_dataloader +train_pipeline = train_dataloader['dataset']['pipeline'] +train_pipeline[-2]['params']['quality'] = [quality, quality] + +val_dataloader = _base_.val_dataloader +val_pipeline = val_dataloader['dataset']['pipeline'] +val_pipeline[2]['params']['quality'] = [quality, quality] + +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[2]['params']['quality'] = [quality, quality] diff --git a/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py new file mode 100644 index 0000000000..69ae48385a --- /dev/null +++ b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40.py @@ -0,0 +1,20 @@ +_base_ = ['swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR10.py'] + +experiment_name = 'swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-colorCAR40' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify JPEG quality factor of RandomJPEGCompression +quality = 40 +train_dataloader = _base_.train_dataloader +train_pipeline = train_dataloader['dataset']['pipeline'] +train_pipeline[-2]['params']['quality'] = [quality, quality] + +val_dataloader = _base_.val_dataloader +val_pipeline = val_dataloader['dataset']['pipeline'] +val_pipeline[2]['params']['quality'] = [quality, quality] + +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[2]['params']['quality'] = [quality, quality] diff --git a/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py new file mode 100644 index 0000000000..d4206be1c5 --- /dev/null +++ b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py @@ -0,0 +1,139 @@ +_base_ = [ + '../_base_/default_runtime.py', + '../_base_/datasets/decompression_test_config.py' +] + +experiment_name = 'swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +quality = 10 + +# model settings +model = dict( + type='BaseEditModel', + generator=dict( + type='SwinIRNet', + upscale=1, + in_chans=1, + img_size=126, + window_size=7, + img_range=255.0, + depths=[6, 6, 6, 6, 6, 6], + embed_dim=180, + num_heads=[6, 6, 6, 6, 6, 6], + mlp_ratio=2, + upsampler='', + resi_connection='1conv'), + pixel_loss=dict(type='CharbonnierLoss', eps=1e-9), + data_preprocessor=dict(type='EditDataPreprocessor', mean=[0.], std=[255.])) + +train_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='grayscale', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='grayscale', + imdecode_backend='cv2'), + dict(type='SetValues', dictionary=dict(scale=1)), + dict(type='PairedRandomCrop', gt_patch_size=126), + dict( + type='Flip', + keys=['img', 'gt'], + flip_ratio=0.5, + direction='horizontal'), + dict( + type='Flip', keys=['img', 'gt'], flip_ratio=0.5, direction='vertical'), + dict(type='RandomTransposeHW', keys=['img', 'gt'], transpose_ratio=0.5), + dict( + type='RandomJPEGCompression', + params=dict(quality=[quality, quality], color_type='grayscale'), + keys=['img']), + dict(type='PackEditInputs') +] + +val_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='grayscale', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='grayscale', + imdecode_backend='cv2'), + dict( + type='RandomJPEGCompression', + params=dict(quality=[quality, quality], color_type='grayscale'), + keys=['img']), + dict(type='PackEditInputs') +] + +# dataset settings +dataset_type = 'BasicImageDataset' +data_root = 'data' + +train_dataloader = dict( + num_workers=4, + batch_size=1, + drop_last=True, + persistent_workers=False, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + ann_file='meta_info_DFWB8550sub_GT.txt', + metainfo=dict(dataset_type='dfwb', task_name='CAR'), + data_root=data_root + '/DFWB', + data_prefix=dict(img='', gt=''), + filename_tmpl=dict(img='{}', gt='{}'), + pipeline=train_pipeline)) + +val_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + metainfo=dict(dataset_type='classic5', task_name='CAR'), + data_root=data_root + '/classic5', + data_prefix=dict(img='', gt=''), + pipeline=val_pipeline)) + +val_evaluator = [ + dict(type='PSNR', prefix='classic5'), + dict(type='SSIM', prefix='classic5'), +] + +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=1_600_000, val_interval=5000) +val_cfg = dict(type='ValLoop') + +test_dataloader = _base_.test_dataloader +for idx in range(len(test_dataloader)): + test_pipeline = test_dataloader[idx]['dataset']['pipeline'] + if idx > 0: + test_pipeline[0]['to_y_channel'] = True + test_pipeline[1]['to_y_channel'] = True + else: + test_pipeline[0]['color_type'] = 'grayscale' + test_pipeline[1]['color_type'] = 'grayscale' + test_pipeline[2]['params']['color_type'] = 'grayscale' + +# optimizer +optim_wrapper = dict( + constructor='DefaultOptimWrapperConstructor', + type='OptimWrapper', + optimizer=dict(type='Adam', lr=2e-4, betas=(0.9, 0.999))) + +# learning policy +param_scheduler = dict( + type='MultiStepLR', + by_epoch=False, + milestones=[800000, 1200000, 1400000, 1500000, 1600000], + gamma=0.5) diff --git a/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py new file mode 100644 index 0000000000..f3ea47b95f --- /dev/null +++ b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20.py @@ -0,0 +1,20 @@ +_base_ = ['swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py'] + +experiment_name = 'swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR20' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify JPEG quality factor of RandomJPEGCompression +quality = 20 +train_dataloader = _base_.train_dataloader +train_pipeline = train_dataloader['dataset']['pipeline'] +train_pipeline[-2]['params']['quality'] = [quality, quality] + +val_dataloader = _base_.val_dataloader +val_pipeline = val_dataloader['dataset']['pipeline'] +val_pipeline[2]['params']['quality'] = [quality, quality] + +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[2]['params']['quality'] = [quality, quality] diff --git a/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py new file mode 100644 index 0000000000..6054939a18 --- /dev/null +++ b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30.py @@ -0,0 +1,20 @@ +_base_ = ['swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py'] + +experiment_name = 'swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR30' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify JPEG quality factor of RandomJPEGCompression +quality = 30 +train_dataloader = _base_.train_dataloader +train_pipeline = train_dataloader['dataset']['pipeline'] +train_pipeline[-2]['params']['quality'] = [quality, quality] + +val_dataloader = _base_.val_dataloader +val_pipeline = val_dataloader['dataset']['pipeline'] +val_pipeline[2]['params']['quality'] = [quality, quality] + +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[2]['params']['quality'] = [quality, quality] diff --git a/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py new file mode 100644 index 0000000000..4b0d6d6f02 --- /dev/null +++ b/configs/swinir/swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40.py @@ -0,0 +1,20 @@ +_base_ = ['swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR10.py'] + +experiment_name = 'swinir_s126w7d6e180_8xb1-lr2e-4-1600k_dfwb-grayCAR40' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify JPEG quality factor of RandomJPEGCompression +quality = 40 +train_dataloader = _base_.train_dataloader +train_pipeline = train_dataloader['dataset']['pipeline'] +train_pipeline[-2]['params']['quality'] = [quality, quality] + +val_dataloader = _base_.val_dataloader +val_pipeline = val_dataloader['dataset']['pipeline'] +val_pipeline[2]['params']['quality'] = [quality, quality] + +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[2]['params']['quality'] = [quality, quality] diff --git a/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py b/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py new file mode 100644 index 0000000000..469e4c6e8b --- /dev/null +++ b/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py @@ -0,0 +1,147 @@ +_base_ = [ + '../_base_/default_runtime.py', + '../_base_/datasets/denoising-gaussian_color_test_config.py' +] + +experiment_name = 'swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify sigma of RandomNoise +sigma = 15 +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[2]['params']['gaussian_sigma'] = [sigma, sigma] + +# model settings +model = dict( + type='BaseEditModel', + generator=dict( + type='SwinIRNet', + upscale=1, + in_chans=3, + img_size=128, + window_size=8, + img_range=1.0, + depths=[6, 6, 6, 6, 6, 6], + embed_dim=180, + num_heads=[6, 6, 6, 6, 6, 6], + mlp_ratio=2, + upsampler='', + resi_connection='1conv'), + pixel_loss=dict(type='CharbonnierLoss', eps=1e-9), + data_preprocessor=dict( + type='EditDataPreprocessor', mean=[0., 0., 0.], std=[255., 255., + 255.])) + +train_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict(type='SetValues', dictionary=dict(scale=1)), + dict(type='PairedRandomCrop', gt_patch_size=128), + dict( + type='Flip', + keys=['img', 'gt'], + flip_ratio=0.5, + direction='horizontal'), + dict( + type='Flip', keys=['img', 'gt'], flip_ratio=0.5, direction='vertical'), + dict(type='RandomTransposeHW', keys=['img', 'gt'], transpose_ratio=0.5), + dict( + type='RandomNoise', + params=dict( + noise_type=['gaussian'], + noise_prob=[1], + gaussian_sigma=[sigma * 255, sigma * 255], + gaussian_gray_noise_prob=0), + keys=['img']), + dict(type='PackEditInputs') +] + +val_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='RandomNoise', + params=dict( + noise_type=['gaussian'], + noise_prob=[1], + gaussian_sigma=[sigma * 255, sigma * 255], + gaussian_gray_noise_prob=0), + keys=['img']), + dict(type='PackEditInputs') +] + +# dataset settings +dataset_type = 'BasicImageDataset' +data_root = 'data' + +train_dataloader = dict( + num_workers=4, + batch_size=1, + drop_last=True, + persistent_workers=False, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + ann_file='meta_info_DFWB8550sub_GT.txt', + metainfo=dict(dataset_type='dfwb', task_name='denoising'), + data_root=data_root + '/DFWB', + data_prefix=dict(img='', gt=''), + filename_tmpl=dict(img='{}', gt='{}'), + pipeline=train_pipeline)) + +val_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + metainfo=dict(dataset_type='mcmaster', task_name='denoising'), + data_root=data_root + '/McMaster', + data_prefix=dict(img='', gt=''), + pipeline=val_pipeline)) + +val_evaluator = [ + dict(type='PSNR', prefix='McMaster'), + dict(type='SSIM', prefix='McMaster'), +] + +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=1_600_000, val_interval=5000) +val_cfg = dict(type='ValLoop') + +# optimizer +optim_wrapper = dict( + constructor='DefaultOptimWrapperConstructor', + type='OptimWrapper', + optimizer=dict(type='Adam', lr=2e-4, betas=(0.9, 0.999))) + +# learning policy +param_scheduler = dict( + type='MultiStepLR', + by_epoch=False, + milestones=[800000, 1200000, 1400000, 1500000, 1600000], + gamma=0.5) diff --git a/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py b/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py new file mode 100644 index 0000000000..1b11cb3c80 --- /dev/null +++ b/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25.py @@ -0,0 +1,20 @@ +_base_ = ['swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py'] + +experiment_name = 'swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN25' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify sigma of RandomNoise +sigma = 25 +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[2]['params']['gaussian_sigma'] = [sigma, sigma] + +train_dataloader = _base_.train_dataloader +train_pipeline = train_dataloader['dataset']['pipeline'] +train_pipeline[-2]['params']['gaussian_sigma'] = [sigma, sigma] + +val_dataloader = _base_.val_dataloader +val_pipeline = val_dataloader['dataset']['pipeline'] +val_pipeline[2]['params']['gaussian_sigma'] = [sigma, sigma] diff --git a/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py b/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py new file mode 100644 index 0000000000..c57d636a71 --- /dev/null +++ b/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50.py @@ -0,0 +1,20 @@ +_base_ = ['swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN15.py'] + +experiment_name = 'swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-colorDN50' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify sigma of RandomNoise +sigma = 50 +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[2]['params']['gaussian_sigma'] = [sigma, sigma] + +train_dataloader = _base_.train_dataloader +train_pipeline = train_dataloader['dataset']['pipeline'] +train_pipeline[-2]['params']['gaussian_sigma'] = [sigma, sigma] + +val_dataloader = _base_.val_dataloader +val_pipeline = val_dataloader['dataset']['pipeline'] +val_pipeline[2]['params']['gaussian_sigma'] = [sigma, sigma] diff --git a/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py b/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py new file mode 100644 index 0000000000..2f765c3c3a --- /dev/null +++ b/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py @@ -0,0 +1,141 @@ +_base_ = [ + '../_base_/default_runtime.py', + '../_base_/datasets/denoising-gaussian_gray_test_config.py' +] + +experiment_name = 'swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify sigma of RandomNoise +sigma = 15 +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[2]['params']['gaussian_sigma'] = [sigma, sigma] + +# model settings +model = dict( + type='BaseEditModel', + generator=dict( + type='SwinIRNet', + upscale=1, + in_chans=1, + img_size=128, + window_size=8, + img_range=1.0, + depths=[6, 6, 6, 6, 6, 6], + embed_dim=180, + num_heads=[6, 6, 6, 6, 6, 6], + mlp_ratio=2, + upsampler='', + resi_connection='1conv'), + pixel_loss=dict(type='CharbonnierLoss', eps=1e-9), + data_preprocessor=dict(type='EditDataPreprocessor', mean=[0.], std=[255.])) + +train_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='grayscale', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='grayscale', + imdecode_backend='cv2'), + dict(type='SetValues', dictionary=dict(scale=1)), + dict(type='PairedRandomCrop', gt_patch_size=128), + dict( + type='Flip', + keys=['img', 'gt'], + flip_ratio=0.5, + direction='horizontal'), + dict( + type='Flip', keys=['img', 'gt'], flip_ratio=0.5, direction='vertical'), + dict(type='RandomTransposeHW', keys=['img', 'gt'], transpose_ratio=0.5), + dict( + type='RandomNoise', + params=dict( + noise_type=['gaussian'], + noise_prob=[1], + gaussian_sigma=[sigma, sigma], + gaussian_gray_noise_prob=0), + keys=['img']), + dict(type='PackEditInputs') +] + +val_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='grayscale', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='grayscale', + imdecode_backend='cv2'), + dict( + type='RandomNoise', + params=dict( + noise_type=['gaussian'], + noise_prob=[1], + gaussian_sigma=[sigma, sigma], + gaussian_gray_noise_prob=0), + keys=['img']), + dict(type='PackEditInputs') +] + +# dataset settings +dataset_type = 'BasicImageDataset' +data_root = 'data' + +train_dataloader = dict( + num_workers=4, + batch_size=1, + drop_last=True, + persistent_workers=False, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + ann_file='meta_info_DFWB8550sub_GT.txt', + metainfo=dict(dataset_type='dfwb', task_name='denoising'), + data_root=data_root + '/DFWB', + data_prefix=dict(img='', gt=''), + filename_tmpl=dict(img='{}', gt='{}'), + pipeline=train_pipeline)) + +val_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + metainfo=dict(dataset_type='set12', task_name='denoising'), + data_root=data_root + '/Set12', + data_prefix=dict(img='', gt=''), + pipeline=val_pipeline)) + +val_evaluator = [ + dict(type='PSNR', prefix='Set12'), + dict(type='SSIM', prefix='Set12'), +] + +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=1_600_000, val_interval=5000) +val_cfg = dict(type='ValLoop') + +# optimizer +optim_wrapper = dict( + constructor='DefaultOptimWrapperConstructor', + type='OptimWrapper', + optimizer=dict(type='Adam', lr=2e-4, betas=(0.9, 0.999))) + +# learning policy +param_scheduler = dict( + type='MultiStepLR', + by_epoch=False, + milestones=[800000, 1200000, 1400000, 1500000, 1600000], + gamma=0.5) diff --git a/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py b/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py new file mode 100644 index 0000000000..34f364400b --- /dev/null +++ b/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25.py @@ -0,0 +1,20 @@ +_base_ = ['swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py'] + +experiment_name = 'swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN25' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify sigma of RandomNoise +sigma = 25 +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[2]['params']['gaussian_sigma'] = [sigma, sigma] + +train_dataloader = _base_.train_dataloader +train_pipeline = train_dataloader['dataset']['pipeline'] +train_pipeline[-2]['params']['gaussian_sigma'] = [sigma, sigma] + +val_dataloader = _base_.val_dataloader +val_pipeline = val_dataloader['dataset']['pipeline'] +val_pipeline[2]['params']['gaussian_sigma'] = [sigma, sigma] diff --git a/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py b/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py new file mode 100644 index 0000000000..5f96a5ae6d --- /dev/null +++ b/configs/swinir/swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50.py @@ -0,0 +1,20 @@ +_base_ = ['swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN15.py'] + +experiment_name = 'swinir_s128w8d6e180_8xb1-lr2e-4-1600k_dfwb-grayDN50' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +# modify sigma of RandomNoise +sigma = 50 +test_dataloader = _base_.test_dataloader +for dataloader in test_dataloader: + test_pipeline = dataloader['dataset']['pipeline'] + test_pipeline[2]['params']['gaussian_sigma'] = [sigma, sigma] + +train_dataloader = _base_.train_dataloader +train_pipeline = train_dataloader['dataset']['pipeline'] +train_pipeline[-2]['params']['gaussian_sigma'] = [sigma, sigma] + +val_dataloader = _base_.val_dataloader +val_pipeline = val_dataloader['dataset']['pipeline'] +val_pipeline[2]['params']['gaussian_sigma'] = [sigma, sigma] diff --git a/configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py b/configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py new file mode 100644 index 0000000000..7abface52f --- /dev/null +++ b/configs/swinir/swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py @@ -0,0 +1,133 @@ +_base_ = [ + '../_base_/default_runtime.py', '../_base_/datasets/sisr_x2_test_config.py' +] + +experiment_name = 'swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +scale = 2 +img_size = 48 + +# evaluated on Y channels +test_evaluator = _base_.test_evaluator +for evaluator in test_evaluator: + for metric in evaluator: + metric['convert_to'] = 'Y' + +# model settings +model = dict( + type='BaseEditModel', + generator=dict( + type='SwinIRNet', + upscale=scale, + in_chans=3, + img_size=img_size, + window_size=8, + img_range=1.0, + depths=[6, 6, 6, 6, 6, 6], + embed_dim=180, + num_heads=[6, 6, 6, 6, 6, 6], + mlp_ratio=2, + upsampler='pixelshuffle', + resi_connection='1conv'), + pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), + data_preprocessor=dict( + type='EditDataPreprocessor', mean=[0., 0., 0.], std=[255., 255., + 255.])) + +train_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict(type='SetValues', dictionary=dict(scale=scale)), + dict(type='PairedRandomCrop', gt_patch_size=img_size * scale), + dict( + type='Flip', + keys=['img', 'gt'], + flip_ratio=0.5, + direction='horizontal'), + dict( + type='Flip', keys=['img', 'gt'], flip_ratio=0.5, direction='vertical'), + dict(type='RandomTransposeHW', keys=['img', 'gt'], transpose_ratio=0.5), + dict(type='PackEditInputs') +] + +val_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict(type='PackEditInputs') +] + +# dataset settings +dataset_type = 'BasicImageDataset' +data_root = 'data' + +train_dataloader = dict( + num_workers=4, + batch_size=4, + drop_last=True, + persistent_workers=False, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + ann_file='meta_info_DIV2K800sub_GT.txt', + metainfo=dict(dataset_type='div2k', task_name='sisr'), + data_root=data_root + '/DIV2K', + data_prefix=dict( + img='DIV2K_train_LR_bicubic/X2_sub', gt='DIV2K_train_HR_sub'), + filename_tmpl=dict(img='{}', gt='{}'), + pipeline=train_pipeline)) + +val_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + metainfo=dict(dataset_type='set5', task_name='sisr'), + data_root=data_root + '/Set5', + data_prefix=dict(img='LRbicx2', gt='GTmod12'), + pipeline=val_pipeline)) + +val_evaluator = [ + dict(type='PSNR', crop_border=scale), + dict(type='SSIM', crop_border=scale), +] + +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=500_000, val_interval=5000) +val_cfg = dict(type='ValLoop') + +# optimizer +optim_wrapper = dict( + constructor='DefaultOptimWrapperConstructor', + type='OptimWrapper', + optimizer=dict(type='Adam', lr=2e-4, betas=(0.9, 0.999))) + +# learning policy +param_scheduler = dict( + type='MultiStepLR', + by_epoch=False, + milestones=[250000, 400000, 450000, 475000], + gamma=0.5) diff --git a/configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py b/configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py new file mode 100644 index 0000000000..88f5d001bf --- /dev/null +++ b/configs/swinir/swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k.py @@ -0,0 +1,22 @@ +_base_ = ['swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py'] + +experiment_name = 'swinir_x2s64w8d4e60_8xb4-lr2e-4-500k_div2k' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +scale = 2 +img_size = 64 + +# model settings +model = dict( + generator=dict( + img_size=img_size, + depths=[6, 6, 6, 6], + embed_dim=60, + num_heads=[6, 6, 6, 6], + upsampler='pixelshuffledirect')) + +# modify patch size of train_dataloader +train_dataloader = _base_.train_dataloader +train_pipeline = train_dataloader['dataset']['pipeline'] +train_pipeline[3]['gt_patch_size'] = img_size * scale diff --git a/configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py b/configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py new file mode 100644 index 0000000000..475e42eef5 --- /dev/null +++ b/configs/swinir/swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k.py @@ -0,0 +1,35 @@ +_base_ = ['swinir_x2s48w8d6e180_8xb4-lr2e-4-500k_div2k.py'] + +experiment_name = 'swinir_x2s64w8d6e180_8xb4-lr2e-4-500k_df2k' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +scale = 2 +img_size = 64 + +# model settings +model = dict(generator=dict(img_size=img_size)) + +# modify patch size of train_pipeline +train_pipeline = _base_.train_pipeline +train_pipeline[3]['gt_patch_size'] = img_size * scale + +# dataset settings +dataset_type = 'BasicImageDataset' +data_root = 'data' + +train_dataloader = dict( + num_workers=4, + batch_size=4, + drop_last=True, + persistent_workers=False, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + ann_file='meta_info_DF2K3450sub_GT.txt', + metainfo=dict(dataset_type='div2k', task_name='sisr'), + data_root=data_root + '/DF2K', + data_prefix=dict( + img='DF2K_train_LR_bicubic/X2_sub', gt='DF2K_train_HR_sub'), + filename_tmpl=dict(img='{}', gt='{}'), + pipeline=train_pipeline)) diff --git a/configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py b/configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py new file mode 100644 index 0000000000..20f8e1c533 --- /dev/null +++ b/configs/swinir/swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py @@ -0,0 +1,133 @@ +_base_ = [ + '../_base_/default_runtime.py', '../_base_/datasets/sisr_x3_test_config.py' +] + +experiment_name = 'swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +scale = 3 +img_size = 48 + +# evaluated on Y channels +test_evaluator = _base_.test_evaluator +for evaluator in test_evaluator: + for metric in evaluator: + metric['convert_to'] = 'Y' + +# model settings +model = dict( + type='BaseEditModel', + generator=dict( + type='SwinIRNet', + upscale=scale, + in_chans=3, + img_size=img_size, + window_size=8, + img_range=1.0, + depths=[6, 6, 6, 6, 6, 6], + embed_dim=180, + num_heads=[6, 6, 6, 6, 6, 6], + mlp_ratio=2, + upsampler='pixelshuffle', + resi_connection='1conv'), + pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), + data_preprocessor=dict( + type='EditDataPreprocessor', mean=[0., 0., 0.], std=[255., 255., + 255.])) + +train_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict(type='SetValues', dictionary=dict(scale=scale)), + dict(type='PairedRandomCrop', gt_patch_size=img_size * scale), + dict( + type='Flip', + keys=['img', 'gt'], + flip_ratio=0.5, + direction='horizontal'), + dict( + type='Flip', keys=['img', 'gt'], flip_ratio=0.5, direction='vertical'), + dict(type='RandomTransposeHW', keys=['img', 'gt'], transpose_ratio=0.5), + dict(type='PackEditInputs') +] + +val_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict(type='PackEditInputs') +] + +# dataset settings +dataset_type = 'BasicImageDataset' +data_root = 'data' + +train_dataloader = dict( + num_workers=4, + batch_size=4, + drop_last=True, + persistent_workers=False, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + ann_file='meta_info_DIV2K800sub_GT.txt', + metainfo=dict(dataset_type='div2k', task_name='sisr'), + data_root=data_root + '/DIV2K', + data_prefix=dict( + img='DIV2K_train_LR_bicubic/X3_sub', gt='DIV2K_train_HR_sub'), + filename_tmpl=dict(img='{}', gt='{}'), + pipeline=train_pipeline)) + +val_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + metainfo=dict(dataset_type='set5', task_name='sisr'), + data_root=data_root + '/Set5', + data_prefix=dict(img='LRbicx3', gt='GTmod12'), + pipeline=val_pipeline)) + +val_evaluator = [ + dict(type='PSNR', crop_border=scale), + dict(type='SSIM', crop_border=scale), +] + +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=500_000, val_interval=5000) +val_cfg = dict(type='ValLoop') + +# optimizer +optim_wrapper = dict( + constructor='DefaultOptimWrapperConstructor', + type='OptimWrapper', + optimizer=dict(type='Adam', lr=2e-4, betas=(0.9, 0.999))) + +# learning policy +param_scheduler = dict( + type='MultiStepLR', + by_epoch=False, + milestones=[250000, 400000, 450000, 475000], + gamma=0.5) diff --git a/configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py b/configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py new file mode 100644 index 0000000000..6f929ec8d7 --- /dev/null +++ b/configs/swinir/swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k.py @@ -0,0 +1,22 @@ +_base_ = ['swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py'] + +experiment_name = 'swinir_x3s64w8d4e60_8xb4-lr2e-4-500k_div2k' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +scale = 3 +img_size = 64 + +# model settings +model = dict( + generator=dict( + img_size=img_size, + depths=[6, 6, 6, 6], + embed_dim=60, + num_heads=[6, 6, 6, 6], + upsampler='pixelshuffledirect')) + +# modify patch size of train_dataloader +train_dataloader = _base_.train_dataloader +train_pipeline = train_dataloader['dataset']['pipeline'] +train_pipeline[3]['gt_patch_size'] = img_size * scale diff --git a/configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py b/configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py new file mode 100644 index 0000000000..656046e9d1 --- /dev/null +++ b/configs/swinir/swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k.py @@ -0,0 +1,35 @@ +_base_ = ['swinir_x3s48w8d6e180_8xb4-lr2e-4-500k_div2k.py'] + +experiment_name = 'swinir_x3s64w8d6e180_8xb4-lr2e-4-500k_df2k' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +scale = 3 +img_size = 64 + +# model settings +model = dict(generator=dict(img_size=img_size)) + +# modify patch size of train_pipeline +train_pipeline = _base_.train_pipeline +train_pipeline[3]['gt_patch_size'] = img_size * scale + +# dataset settings +dataset_type = 'BasicImageDataset' +data_root = 'data' + +train_dataloader = dict( + num_workers=4, + batch_size=4, + drop_last=True, + persistent_workers=False, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + ann_file='meta_info_DF2K3450sub_GT.txt', + metainfo=dict(dataset_type='div2k', task_name='sisr'), + data_root=data_root + '/DF2K', + data_prefix=dict( + img='DF2K_train_LR_bicubic/X3_sub', gt='DF2K_train_HR_sub'), + filename_tmpl=dict(img='{}', gt='{}'), + pipeline=train_pipeline)) diff --git a/configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py b/configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py new file mode 100644 index 0000000000..7409802acd --- /dev/null +++ b/configs/swinir/swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py @@ -0,0 +1,133 @@ +_base_ = [ + '../_base_/default_runtime.py', '../_base_/datasets/sisr_x4_test_config.py' +] + +experiment_name = 'swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +scale = 4 +img_size = 48 + +# evaluated on Y channels +test_evaluator = _base_.test_evaluator +for evaluator in test_evaluator: + for metric in evaluator: + metric['convert_to'] = 'Y' + +# model settings +model = dict( + type='BaseEditModel', + generator=dict( + type='SwinIRNet', + upscale=scale, + in_chans=3, + img_size=img_size, + window_size=8, + img_range=1.0, + depths=[6, 6, 6, 6, 6, 6], + embed_dim=180, + num_heads=[6, 6, 6, 6, 6, 6], + mlp_ratio=2, + upsampler='pixelshuffle', + resi_connection='1conv'), + pixel_loss=dict(type='L1Loss', loss_weight=1.0, reduction='mean'), + data_preprocessor=dict( + type='EditDataPreprocessor', mean=[0., 0., 0.], std=[255., 255., + 255.])) + +train_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict(type='SetValues', dictionary=dict(scale=scale)), + dict(type='PairedRandomCrop', gt_patch_size=img_size * scale), + dict( + type='Flip', + keys=['img', 'gt'], + flip_ratio=0.5, + direction='horizontal'), + dict( + type='Flip', keys=['img', 'gt'], flip_ratio=0.5, direction='vertical'), + dict(type='RandomTransposeHW', keys=['img', 'gt'], transpose_ratio=0.5), + dict(type='PackEditInputs') +] + +val_pipeline = [ + dict( + type='LoadImageFromFile', + key='img', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict( + type='LoadImageFromFile', + key='gt', + color_type='color', + channel_order='rgb', + imdecode_backend='cv2'), + dict(type='PackEditInputs') +] + +# dataset settings +dataset_type = 'BasicImageDataset' +data_root = 'data' + +train_dataloader = dict( + num_workers=4, + batch_size=4, + drop_last=True, + persistent_workers=False, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + ann_file='meta_info_DIV2K800sub_GT.txt', + metainfo=dict(dataset_type='div2k', task_name='sisr'), + data_root=data_root + '/DIV2K', + data_prefix=dict( + img='DIV2K_train_LR_bicubic/X4_sub', gt='DIV2K_train_HR_sub'), + filename_tmpl=dict(img='{}', gt='{}'), + pipeline=train_pipeline)) + +val_dataloader = dict( + num_workers=4, + persistent_workers=False, + drop_last=False, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + metainfo=dict(dataset_type='set5', task_name='sisr'), + data_root=data_root + '/Set5', + data_prefix=dict(img='LRbicx4', gt='GTmod12'), + pipeline=val_pipeline)) + +val_evaluator = [ + dict(type='PSNR', crop_border=scale), + dict(type='SSIM', crop_border=scale), +] + +train_cfg = dict( + type='IterBasedTrainLoop', max_iters=500_000, val_interval=5000) +val_cfg = dict(type='ValLoop') + +# optimizer +optim_wrapper = dict( + constructor='DefaultOptimWrapperConstructor', + type='OptimWrapper', + optimizer=dict(type='Adam', lr=2e-4, betas=(0.9, 0.999))) + +# learning policy +param_scheduler = dict( + type='MultiStepLR', + by_epoch=False, + milestones=[250000, 400000, 450000, 475000], + gamma=0.5) diff --git a/configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py b/configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py new file mode 100644 index 0000000000..09a08ed95a --- /dev/null +++ b/configs/swinir/swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k.py @@ -0,0 +1,22 @@ +_base_ = ['swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py'] + +experiment_name = 'swinir_x4s64w8d4e60_8xb4-lr2e-4-500k_div2k' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +scale = 4 +img_size = 64 + +# model settings +model = dict( + generator=dict( + img_size=img_size, + depths=[6, 6, 6, 6], + embed_dim=60, + num_heads=[6, 6, 6, 6], + upsampler='pixelshuffledirect')) + +# modify patch size of train_dataloader +train_dataloader = _base_.train_dataloader +train_pipeline = train_dataloader['dataset']['pipeline'] +train_pipeline[3]['gt_patch_size'] = img_size * scale diff --git a/configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py b/configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py new file mode 100644 index 0000000000..87cdf5e609 --- /dev/null +++ b/configs/swinir/swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k.py @@ -0,0 +1,35 @@ +_base_ = ['swinir_x4s48w8d6e180_8xb4-lr2e-4-500k_div2k.py'] + +experiment_name = 'swinir_x4s64w8d6e180_8xb4-lr2e-4-500k_df2k' +work_dir = f'./work_dirs/{experiment_name}' +save_dir = './work_dirs/' + +scale = 4 +img_size = 64 + +# model settings +model = dict(generator=dict(img_size=img_size)) + +# modify patch size of train_pipeline +train_pipeline = _base_.train_pipeline +train_pipeline[3]['gt_patch_size'] = img_size * scale + +# dataset settings +dataset_type = 'BasicImageDataset' +data_root = 'data' + +train_dataloader = dict( + num_workers=4, + batch_size=4, + drop_last=True, + persistent_workers=False, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + ann_file='meta_info_DF2K3450sub_GT.txt', + metainfo=dict(dataset_type='div2k', task_name='sisr'), + data_root=data_root + '/DF2K', + data_prefix=dict( + img='DF2K_train_LR_bicubic/X4_sub', gt='DF2K_train_HR_sub'), + filename_tmpl=dict(img='{}', gt='{}'), + pipeline=train_pipeline)) diff --git a/mmedit/datasets/transforms/random_degradations.py b/mmedit/datasets/transforms/random_degradations.py index 65e7fb7849..1c202125aa 100644 --- a/mmedit/datasets/transforms/random_degradations.py +++ b/mmedit/datasets/transforms/random_degradations.py @@ -162,11 +162,13 @@ class RandomJPEGCompression: params (dict): A dictionary specifying the degradation settings. keys (list[str]): A list specifying the keys whose values are modified. + bgr2rgb (str): Whether change channel order. Default: False. """ - def __init__(self, params, keys): + def __init__(self, params, keys, bgr2rgb=False): self.keys = keys self.params = params + self.bgr2rgb = bgr2rgb def _apply_random_compression(self, imgs): is_single_image = False @@ -176,6 +178,7 @@ def _apply_random_compression(self, imgs): # determine initial compression level and the step size quality = self.params['quality'] + color_type = self.params['color_type'] quality_step = self.params.get('quality_step', 0) jpeg_param = round(np.random.uniform(quality[0], quality[1])) @@ -183,8 +186,17 @@ def _apply_random_compression(self, imgs): outputs = [] for img in imgs: encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), jpeg_param] - _, img_encoded = cv2.imencode('.jpg', img * 255., encode_param) - outputs.append(np.float32(cv2.imdecode(img_encoded, 1)) / 255.) + if self.bgr2rgb and color_type == 'color': + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + _, img_encoded = cv2.imencode('.jpg', img, encode_param) + + if color_type == 'color': + img_encoded = cv2.imdecode(img_encoded, 1) + if self.bgr2rgb: + img_encoded = cv2.cvtColor(img_encoded, cv2.COLOR_BGR2RGB) + outputs.append(img_encoded) + else: + outputs.append(cv2.imdecode(img_encoded, 0)) # update compression level jpeg_param += np.random.uniform(-quality_step, quality_step) @@ -238,7 +250,7 @@ def _apply_gaussian_noise(self, imgs): Tensor: images applied gaussian noise """ sigma_range = self.params['gaussian_sigma'] - sigma = np.random.uniform(sigma_range[0], sigma_range[1]) / 255. + sigma = np.random.uniform(sigma_range[0], sigma_range[1]) sigma_step = self.params.get('gaussian_sigma_step', 0) @@ -253,9 +265,8 @@ def _apply_gaussian_noise(self, imgs): outputs.append(img + noise) # update noise level - sigma += np.random.uniform(-sigma_step, sigma_step) / 255. - sigma = np.clip(sigma, sigma_range[0] / 255., - sigma_range[1] / 255.) + sigma += np.random.uniform(-sigma_step, sigma_step) + sigma = np.clip(sigma, sigma_range[0], sigma_range[1]) return outputs @@ -274,7 +285,7 @@ def _apply_poisson_noise(self, imgs): if is_gray_noise: noise = cv2.cvtColor(noise[..., [2, 1, 0]], cv2.COLOR_BGR2GRAY) noise = noise[..., np.newaxis] - noise = np.clip((noise * 255.0).round(), 0, 255) / 255. + noise = np.clip((noise).round(), 0, 255) unique_val = 2**np.ceil(np.log2(len(np.unique(noise)))) noise = np.random.poisson(noise * unique_val) / unique_val - noise diff --git a/mmedit/models/editors/__init__.py b/mmedit/models/editors/__init__.py index a59ad82b0a..b1add6f756 100644 --- a/mmedit/models/editors/__init__.py +++ b/mmedit/models/editors/__init__.py @@ -55,6 +55,7 @@ from .stylegan1 import StyleGAN1 from .stylegan2 import StyleGAN2 from .stylegan3 import StyleGAN3, StyleGAN3Generator +from .swinir import SwinIRNet from .tdan import TDAN, TDANNet from .tof import TOFlowVFINet, TOFlowVSRNet, ToFResBlock from .ttsr import LTE, TTSR, SearchTransformer, TTSRDiscriminator, TTSRNet @@ -86,5 +87,5 @@ 'StyleGAN3Generator', 'InstColorization', 'NAFBaseline', 'NAFBaselineLocal', 'NAFNet', 'NAFNetLocal', 'DDIMScheduler', 'DDPMScheduler', 'DenoisingUnet', 'ClipWrapper', 'EG3D', 'Restormer', - 'StableDiffusion' + 'SwinIRNet', 'StableDiffusion' ] diff --git a/mmedit/models/editors/swinir/__init__.py b/mmedit/models/editors/swinir/__init__.py new file mode 100644 index 0000000000..18c102944a --- /dev/null +++ b/mmedit/models/editors/swinir/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .swinir_net import SwinIRNet + +__all__ = ['SwinIRNet'] diff --git a/mmedit/models/editors/swinir/swinir_modules.py b/mmedit/models/editors/swinir/swinir_modules.py new file mode 100644 index 0000000000..42d6a9c6fc --- /dev/null +++ b/mmedit/models/editors/swinir/swinir_modules.py @@ -0,0 +1,148 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +import torch.nn as nn + +from .swinir_utils import to_2tuple + + +class PatchEmbed(nn.Module): + r""" Image to Patch Embedding + Args: + img_size (int): Image size. Default: 224. + patch_size (int): Patch token size. Default: 4. + in_chans (int): Number of input image channels. Default: 3. + embed_dim (int): Number of linear projection output channels. + Default: 96. + norm_layer (nn.Module, optional): Normalization layer. Default: None + """ + + def __init__(self, + img_size=224, + patch_size=4, + in_chans=3, + embed_dim=96, + norm_layer=None): + super().__init__() + img_size = to_2tuple(img_size) + patch_size = to_2tuple(patch_size) + patches_resolution = [ + img_size[0] // patch_size[0], img_size[1] // patch_size[1] + ] + self.img_size = img_size + self.patch_size = patch_size + self.patches_resolution = patches_resolution + self.num_patches = patches_resolution[0] * patches_resolution[1] + + self.in_chans = in_chans + self.embed_dim = embed_dim + + if norm_layer is not None: + self.norm = norm_layer(embed_dim) + else: + self.norm = None + + def forward(self, x): + """Forward function. + + Args: + x (Tensor): Input tensor with shape (B, C, Ph, Pw). + + Returns: + Tensor: Forward results. + """ + x = x.flatten(2).transpose(1, 2) # B Ph*Pw C + if self.norm is not None: + x = self.norm(x) + return x + + +class PatchUnEmbed(nn.Module): + r""" Image to Patch Unembedding + Args: + img_size (int): Image size. Default: 224. + patch_size (int): Patch token size. Default: 4. + in_chans (int): Number of input image channels. Default: 3. + embed_dim (int): Number of linear projection output channels. + Default: 96. + norm_layer (nn.Module, optional): Normalization layer. Default: None + """ + + def __init__(self, + img_size=224, + patch_size=4, + in_chans=3, + embed_dim=96, + norm_layer=None): + super().__init__() + img_size = to_2tuple(img_size) + patch_size = to_2tuple(patch_size) + patches_resolution = [ + img_size[0] // patch_size[0], img_size[1] // patch_size[1] + ] + self.img_size = img_size + self.patch_size = patch_size + self.patches_resolution = patches_resolution + self.num_patches = patches_resolution[0] * patches_resolution[1] + + self.in_chans = in_chans + self.embed_dim = embed_dim + + def forward(self, x, x_size): + """Forward function. + + Args: + x (Tensor): Input tensor with shape (B, L, C). + x_size (tuple[int]): Resolution of input feature. + + Returns: + Tensor: Forward results. + """ + B, HW, C = x.shape + x = x.transpose(1, 2).view(B, self.embed_dim, x_size[0], + x_size[1]) # B Ph*Pw C + return x + + +class Upsample(nn.Sequential): + """Upsample module. + + Args: + scale (int): Scale factor. Supported scales: 2^n and 3. + num_feat (int): Channel number of intermediate features. + """ + + def __init__(self, scale, num_feat): + m = [] + if (scale & (scale - 1)) == 0: # scale = 2^n + for _ in range(int(math.log(scale, 2))): + m.append(nn.Conv2d(num_feat, 4 * num_feat, 3, 1, 1)) + m.append(nn.PixelShuffle(2)) + elif scale == 3: + m.append(nn.Conv2d(num_feat, 9 * num_feat, 3, 1, 1)) + m.append(nn.PixelShuffle(3)) + else: + raise ValueError(f'scale {scale} is not supported. ' + 'Supported scales: 2^n and 3.') + super(Upsample, self).__init__(*m) + + +class UpsampleOneStep(nn.Sequential): + """UpsampleOneStep module (the difference with Upsample is that it always + only has 1conv + 1pixelshuffle) Used in lightweight SR to save parameters. + + Args: + scale (int): Scale factor. Supported scales: 2^n and 3. + num_feat (int): Channel number of intermediate features. + num_out_ch (int): Channel number for PixelShuffle. + input_resolution (tuple[int], optional): Input resolution. + Default: None + """ + + def __init__(self, scale, num_feat, num_out_ch, input_resolution=None): + self.num_feat = num_feat + self.input_resolution = input_resolution + m = [] + m.append(nn.Conv2d(num_feat, (scale**2) * num_out_ch, 3, 1, 1)) + m.append(nn.PixelShuffle(scale)) + super(UpsampleOneStep, self).__init__(*m) diff --git a/mmedit/models/editors/swinir/swinir_net.py b/mmedit/models/editors/swinir/swinir_net.py new file mode 100644 index 0000000000..859cfa634b --- /dev/null +++ b/mmedit/models/editors/swinir/swinir_net.py @@ -0,0 +1,307 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmengine.model import BaseModule +from mmengine.model.weight_init import trunc_normal_ + +from mmedit.registry import MODELS +from .swinir_modules import PatchEmbed, PatchUnEmbed, Upsample, UpsampleOneStep +from .swinir_rstb import RSTB + + +@MODELS.register_module() +class SwinIRNet(BaseModule): + r""" SwinIR + A PyTorch impl of: `SwinIR: Image Restoration Using Swin Transformer`, + based on Swin Transformer. + Ref repo: https://github.com/JingyunLiang/SwinIR + + Args: + img_size (int | tuple(int)): Input image size. Default 64 + patch_size (int | tuple(int)): Patch size. Default: 1 + in_chans (int): Number of input image channels. Default: 3 + embed_dim (int): Patch embedding dimension. Default: 96 + depths (tuple(int)): Depth of each Swin Transformer layer. + Default: [6, 6, 6, 6] + num_heads (tuple(int)): Number of attention heads in different layers. + Default: [6, 6, 6, 6] + window_size (int): Window size. Default: 7 + mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. Default: 4 + qkv_bias (bool): If True, add a learnable bias to query, key, value. + Default: True + qk_scale (float): Override default qk scale of head_dim ** -0.5 if set. + Default: None + drop_rate (float): Dropout rate. Default: 0 + attn_drop_rate (float): Attention dropout rate. Default: 0 + drop_path_rate (float): Stochastic depth rate. Default: 0.1 + norm_layer (nn.Module): Normalization layer. Default: nn.LayerNorm. + ape (bool): If True, add absolute position embedding to the + patch embedding. Default: False + patch_norm (bool): If True, add normalization after patch embedding. + Default: True + use_checkpoint (bool): Whether to use checkpointing to save memory. + Default: False + upscale (int): Upscale factor. 2/3/4/8 for image SR, 1 for denoising + and compress artifact reduction. Default: 2 + img_range (float): Image range. 1. or 255. Default: 1.0 + upsampler (string, optional): The reconstruction module. + 'pixelshuffle' / 'pixelshuffledirect' /'nearest+conv'/None. + Default: '' + resi_connection (string): The convolutional block before residual + connection. '1conv'/'3conv'. Default: '1conv' + """ + + def __init__(self, + img_size=64, + patch_size=1, + in_chans=3, + embed_dim=96, + depths=[6, 6, 6, 6], + num_heads=[6, 6, 6, 6], + window_size=7, + mlp_ratio=4., + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.1, + norm_layer=nn.LayerNorm, + ape=False, + patch_norm=True, + use_checkpoint=False, + upscale=2, + img_range=1., + upsampler='', + resi_connection='1conv', + **kwargs): + super(SwinIRNet, self).__init__() + num_in_ch = in_chans + num_out_ch = in_chans + num_feat = 64 + self.img_range = img_range + if in_chans == 3: + rgb_mean = (0.4488, 0.4371, 0.4040) + self.mean = torch.Tensor(rgb_mean).view(1, 3, 1, 1) + else: + self.mean = torch.zeros(1, 1, 1, 1) + self.upscale = upscale + self.upsampler = upsampler + self.window_size = window_size + + # 1, shallow feature extraction + self.conv_first = nn.Conv2d(num_in_ch, embed_dim, 3, 1, 1) + + # 2, deep feature extraction + self.num_layers = len(depths) + self.embed_dim = embed_dim + self.ape = ape + self.patch_norm = patch_norm + self.num_features = embed_dim + self.mlp_ratio = mlp_ratio + + # split image into non-overlapping patches + self.patch_embed = PatchEmbed( + img_size=img_size, + patch_size=patch_size, + in_chans=embed_dim, + embed_dim=embed_dim, + norm_layer=norm_layer if self.patch_norm else None) + num_patches = self.patch_embed.num_patches + patches_resolution = self.patch_embed.patches_resolution + self.patches_resolution = patches_resolution + + # merge non-overlapping patches into image + self.patch_unembed = PatchUnEmbed( + img_size=img_size, + patch_size=patch_size, + in_chans=embed_dim, + embed_dim=embed_dim, + norm_layer=norm_layer if self.patch_norm else None) + + # absolute position embedding + if self.ape: + self.absolute_pos_embed = nn.Parameter( + torch.zeros(1, num_patches, embed_dim)) + trunc_normal_(self.absolute_pos_embed, std=.02) + + self.pos_drop = nn.Dropout(p=drop_rate) + + # stochastic depth decay rule + dpr = [ + x.item() for x in torch.linspace(0, drop_path_rate, sum(depths)) + ] + + # build Residual Swin Transformer blocks (RSTB) + self.layers = nn.ModuleList() + for i_layer in range(self.num_layers): + layer = RSTB( + dim=embed_dim, + input_resolution=(patches_resolution[0], + patches_resolution[1]), + depth=depths[i_layer], + num_heads=num_heads[i_layer], + window_size=window_size, + mlp_ratio=self.mlp_ratio, + qkv_bias=qkv_bias, + qk_scale=qk_scale, + drop=drop_rate, + attn_drop=attn_drop_rate, + drop_path=dpr[sum(depths[:i_layer]):sum(depths[:i_layer + 1])], + norm_layer=norm_layer, + downsample=None, + use_checkpoint=use_checkpoint, + img_size=img_size, + patch_size=patch_size, + resi_connection=resi_connection) + self.layers.append(layer) + self.norm = norm_layer(self.num_features) + + # build the last conv layer in deep feature extraction + if resi_connection == '1conv': + self.conv_after_body = nn.Conv2d(embed_dim, embed_dim, 3, 1, 1) + elif resi_connection == '3conv': + # to save parameters and memory + self.conv_after_body = nn.Sequential( + nn.Conv2d(embed_dim, embed_dim // 4, 3, 1, 1), + nn.LeakyReLU(negative_slope=0.2, inplace=True), + nn.Conv2d(embed_dim // 4, embed_dim // 4, 1, 1, 0), + nn.LeakyReLU(negative_slope=0.2, inplace=True), + nn.Conv2d(embed_dim // 4, embed_dim, 3, 1, 1)) + + # 3, high quality image reconstruction + if self.upsampler == 'pixelshuffle': + # for classical SR + self.conv_before_upsample = nn.Sequential( + nn.Conv2d(embed_dim, num_feat, 3, 1, 1), + nn.LeakyReLU(inplace=True)) + self.upsample = Upsample(upscale, num_feat) + self.conv_last = nn.Conv2d(num_feat, num_out_ch, 3, 1, 1) + elif self.upsampler == 'pixelshuffledirect': + # for lightweight SR (to save parameters) + self.upsample = UpsampleOneStep(upscale, embed_dim, num_out_ch, + (patches_resolution[0], + patches_resolution[1])) + elif self.upsampler == 'nearest+conv': + # for real-world SR (less artifacts) + self.conv_before_upsample = nn.Sequential( + nn.Conv2d(embed_dim, num_feat, 3, 1, 1), + nn.LeakyReLU(inplace=True)) + self.conv_up1 = nn.Conv2d(num_feat, num_feat, 3, 1, 1) + if self.upscale == 4: + self.conv_up2 = nn.Conv2d(num_feat, num_feat, 3, 1, 1) + self.conv_hr = nn.Conv2d(num_feat, num_feat, 3, 1, 1) + self.conv_last = nn.Conv2d(num_feat, num_out_ch, 3, 1, 1) + self.lrelu = nn.LeakyReLU(negative_slope=0.2, inplace=True) + else: + # for image denoising and JPEG compression artifact reduction + self.conv_last = nn.Conv2d(embed_dim, num_out_ch, 3, 1, 1) + + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + trunc_normal_(m.weight, std=.02) + if isinstance(m, nn.Linear) and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.LayerNorm): + nn.init.constant_(m.bias, 0) + nn.init.constant_(m.weight, 1.0) + + @torch.jit.ignore + def no_weight_decay(self): + return {'absolute_pos_embed'} + + @torch.jit.ignore + def no_weight_decay_keywords(self): + return {'relative_position_bias_table'} + + def check_image_size(self, x): + """Check image size and pad images so that it has enough dimension do + window size. + + args: + x: input tensor image with (B, C, H, W) shape. + """ + _, _, h, w = x.size() + mod_pad_h = (self.window_size - + h % self.window_size) % self.window_size + mod_pad_w = (self.window_size - + w % self.window_size) % self.window_size + x = F.pad(x, (0, mod_pad_w, 0, mod_pad_h), 'reflect') + return x + + def forward_features(self, x): + """Forward function of Deep Feature Extraction. + + Args: + x (Tensor): Input tensor with shape (B, C, H, W). + + Returns: + Tensor: Forward results. + """ + x_size = (x.shape[2], x.shape[3]) + x = self.patch_embed(x) + if self.ape: + x = x + self.absolute_pos_embed + x = self.pos_drop(x) + + for layer in self.layers: + x = layer(x, x_size) + + x = self.norm(x) # B L C + x = self.patch_unembed(x, x_size) + + return x + + def forward(self, x): + """Forward function. + + Args: + x (Tensor): Input tensor with shape (B, C, H, W). + + Returns: + Tensor: Forward results. + """ + H, W = x.shape[2:] + x = self.check_image_size(x) + + self.mean = self.mean.type_as(x) + x = (x - self.mean) * self.img_range + + if self.upsampler == 'pixelshuffle': + # for classical SR + x = self.conv_first(x) + x = self.conv_after_body(self.forward_features(x)) + x + x = self.conv_before_upsample(x) + x = self.conv_last(self.upsample(x)) + elif self.upsampler == 'pixelshuffledirect': + # for lightweight SR + x = self.conv_first(x) + x = self.conv_after_body(self.forward_features(x)) + x + x = self.upsample(x) + elif self.upsampler == 'nearest+conv': + # for real-world SR + x = self.conv_first(x) + x = self.conv_after_body(self.forward_features(x)) + x + x = self.conv_before_upsample(x) + x = self.lrelu( + self.conv_up1( + torch.nn.functional.interpolate( + x, scale_factor=2, mode='nearest'))) + if self.upscale == 4: + x = self.lrelu( + self.conv_up2( + torch.nn.functional.interpolate( + x, scale_factor=2, mode='nearest'))) + x = self.conv_last(self.lrelu(self.conv_hr(x))) + else: + # for image denoising and JPEG compression artifact reduction + x_first = self.conv_first(x) + res = self.conv_after_body( + self.forward_features(x_first)) + x_first + x = x + self.conv_last(res) + + x = x / self.img_range + self.mean + + return x[:, :, :H * self.upscale, :W * self.upscale] diff --git a/mmedit/models/editors/swinir/swinir_rstb.py b/mmedit/models/editors/swinir/swinir_rstb.py new file mode 100644 index 0000000000..48b0b56d3b --- /dev/null +++ b/mmedit/models/editors/swinir/swinir_rstb.py @@ -0,0 +1,583 @@ +# Copyright (c) OpenMMLab. All rights reserved. + +import torch +import torch.nn as nn +import torch.utils.checkpoint as checkpoint +from mmengine.model.weight_init import trunc_normal_ + +from .swinir_modules import PatchEmbed, PatchUnEmbed +from .swinir_utils import (drop_path, to_2tuple, window_partition, + window_reverse) + + +class DropPath(nn.Module): + """Drop paths (Stochastic Depth) per sample (when applied in main path of + residual blocks).""" + + def __init__(self, drop_prob: float = 0., scale_by_keep: bool = True): + super(DropPath, self).__init__() + self.drop_prob = drop_prob + self.scale_by_keep = scale_by_keep + + def forward(self, x): + """Forward function. + + Args: + x (Tensor): Input tensor with shape (B, L, C). + + Returns: + Tensor: Forward results. + """ + return drop_path(x, self.drop_prob, self.training, self.scale_by_keep) + + def extra_repr(self): + return f'drop_prob={round(self.drop_prob, 3):0.3f}' + + +class Mlp(nn.Module): + """Multilayer Perceptron layer. + + Args: + in_features (int): Number of input channels. + hidden_features (int | None, optional): Number of hidden layer + channels. Default: None + out_features (int | None, optional): Number of output channels. + Default: None + act_layer (nn.Module, optional): Activation layer. Default: nn.GELU + drop (float, optional): Dropout ratio of attention weight. Default: 0.0 + """ + + def __init__(self, + in_features, + hidden_features=None, + out_features=None, + act_layer=nn.GELU, + drop=0.): + super().__init__() + out_features = out_features or in_features + hidden_features = hidden_features or in_features + self.fc1 = nn.Linear(in_features, hidden_features) + self.act = act_layer() + self.fc2 = nn.Linear(hidden_features, out_features) + self.drop = nn.Dropout(drop) + + def forward(self, x): + """Forward function. + + Args: + x (Tensor): Input tensor with shape (B, L, C). + + Returns: + Tensor: Forward results. + """ + x = self.fc1(x) + x = self.act(x) + x = self.drop(x) + x = self.fc2(x) + x = self.drop(x) + return x + + +class WindowAttention(nn.Module): + r""" Window based multi-head self attention (W-MSA) + module with relative position bias. + It supports both of shifted and non-shifted window. + Args: + dim (int): Number of input channels. + window_size (tuple[int]): The height and width of the window. + num_heads (int): Number of attention heads. + qkv_bias (bool, optional): If True, add a learnable bias to + query, key, value. Default: True + qk_scale (float | None, optional): Override default qk scale + of head_dim ** -0.5 if set + attn_drop (float, optional): Dropout ratio of attention weight. + Default: 0.0 + proj_drop (float, optional): Dropout ratio of output. Default: 0.0 + """ + + def __init__(self, + dim, + window_size, + num_heads, + qkv_bias=True, + qk_scale=None, + attn_drop=0., + proj_drop=0.): + + super().__init__() + self.dim = dim + self.window_size = window_size # Wh, Ww + self.num_heads = num_heads + head_dim = dim // num_heads + self.scale = qk_scale or head_dim**-0.5 + + # define a parameter table of relative position bias + # 2*Wh-1 * 2*Ww-1, nH + self.relative_position_bias_table = nn.Parameter( + torch.zeros((2 * window_size[0] - 1) * (2 * window_size[1] - 1), + num_heads)) + + # get pair-wise relative position index + # for each token inside the window + coords_h = torch.arange(self.window_size[0]) + coords_w = torch.arange(self.window_size[1]) + coords = torch.stack(torch.meshgrid([coords_h, coords_w])) # 2, Wh, Ww + coords_flatten = torch.flatten(coords, 1) # 2, Wh*Ww + relative_coords = \ + coords_flatten[:, :, None] - coords_flatten[:, None, :] + # Wh*Ww, Wh*Ww, 2 + relative_coords = relative_coords.permute(1, 2, 0).contiguous() + # shift to start from 0 + relative_coords[:, :, 0] += self.window_size[0] - 1 + relative_coords[:, :, 1] += self.window_size[1] - 1 + relative_coords[:, :, 0] *= 2 * self.window_size[1] - 1 + relative_position_index = relative_coords.sum(-1) # Wh*Ww, Wh*Ww + self.register_buffer('relative_position_index', + relative_position_index) + + self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop) + self.proj = nn.Linear(dim, dim) + + self.proj_drop = nn.Dropout(proj_drop) + + trunc_normal_(self.relative_position_bias_table, std=.02) + self.softmax = nn.Softmax(dim=-1) + + def forward(self, x, mask=None): + """ + Args: + x: input features with shape of (num_windows*B, N, C) + mask: (0/-inf) mask with shape of + (num_windows, Wh*Ww, Wh*Ww) or None + """ + B_, N, C = x.shape + qkv = self.qkv(x).reshape(B_, N, 3, self.num_heads, + C // self.num_heads).permute(2, 0, 3, 1, 4) + # make torchscript happy (cannot use tensor as tuple) + q, k, v = qkv[0], qkv[1], qkv[2] + + q = q * self.scale + attn = (q @ k.transpose(-2, -1)) + + relative_position_bias = self.relative_position_bias_table[ + self.relative_position_index.view(-1)].view( + self.window_size[0] * self.window_size[1], + self.window_size[0] * self.window_size[1], + -1) # Wh*Ww,Wh*Ww,nH + relative_position_bias = relative_position_bias.permute( + 2, 0, 1).contiguous() # nH, Wh*Ww, Wh*Ww + attn = attn + relative_position_bias.unsqueeze(0) + + if mask is not None: + nW = mask.shape[0] + attn = attn.view(B_ // nW, nW, self.num_heads, N, + N) + mask.unsqueeze(1).unsqueeze(0) + attn = attn.view(-1, self.num_heads, N, N) + attn = self.softmax(attn) + else: + attn = self.softmax(attn) + + attn = self.attn_drop(attn) + + x = (attn @ v).transpose(1, 2).reshape(B_, N, C) + x = self.proj(x) + x = self.proj_drop(x) + return x + + def extra_repr(self) -> str: + return f'dim={self.dim}, window_size={self.window_size}, ' \ + f'num_heads={self.num_heads}' + + +class SwinTransformerBlock(nn.Module): + r""" Swin Transformer Block. + Args: + dim (int): Number of input channels. + input_resolution (tuple[int]): Input resolution. + num_heads (int): Number of attention heads. + window_size (int): Window size. + shift_size (int): Shift size for SW-MSA. + mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. + qkv_bias (bool, optional): If True, add a learnable bias + to query, key, value. Default: True + qk_scale (float | None, optional): Override default qk + scale of head_dim ** -0.5 if set. + drop (float, optional): Dropout rate. Default: 0.0 + attn_drop (float, optional): Attention dropout rate. Default: 0.0 + drop_path (float, optional): Stochastic depth rate. Default: 0.0 + act_layer (nn.Module, optional): Activation layer. Default: nn.GELU + norm_layer (nn.Module, optional): Normalization layer. + Default: nn.LayerNorm + """ + + def __init__(self, + dim, + input_resolution, + num_heads, + window_size=7, + shift_size=0, + mlp_ratio=4., + qkv_bias=True, + qk_scale=None, + drop=0., + attn_drop=0., + drop_path=0., + act_layer=nn.GELU, + norm_layer=nn.LayerNorm): + super().__init__() + self.dim = dim + self.input_resolution = input_resolution + self.num_heads = num_heads + self.window_size = window_size + self.shift_size = shift_size + self.mlp_ratio = mlp_ratio + if min(self.input_resolution) <= self.window_size: + # if window size is larger than input resolution, + # we don't partition windows + self.shift_size = 0 + self.window_size = min(self.input_resolution) + assert 0 <= self.shift_size < self.window_size, \ + 'shift_size must in 0-window_size' + + self.norm1 = norm_layer(dim) + self.attn = WindowAttention( + dim, + window_size=to_2tuple(self.window_size), + num_heads=num_heads, + qkv_bias=qkv_bias, + qk_scale=qk_scale, + attn_drop=attn_drop, + proj_drop=drop) + + self.drop_path = DropPath( + drop_path) if drop_path > 0. else nn.Identity() + self.norm2 = norm_layer(dim) + mlp_hidden_dim = int(dim * mlp_ratio) + self.mlp = Mlp( + in_features=dim, + hidden_features=mlp_hidden_dim, + act_layer=act_layer, + drop=drop) + + if self.shift_size > 0: + attn_mask = self.calculate_mask(self.input_resolution) + else: + attn_mask = None + + self.register_buffer('attn_mask', attn_mask) + + def calculate_mask(self, x_size): + # calculate attention mask for SW-MSA + """Calculate attention mask for SW-MSA. + + Args: + x_size (tuple[int]): Resolution of input feature. + + Returns: + Tensor: Attention mask + """ + H, W = x_size + img_mask = torch.zeros((1, H, W, 1)) # 1 H W 1 + h_slices = (slice(0, -self.window_size), + slice(-self.window_size, + -self.shift_size), slice(-self.shift_size, None)) + w_slices = (slice(0, -self.window_size), + slice(-self.window_size, + -self.shift_size), slice(-self.shift_size, None)) + cnt = 0 + for h in h_slices: + for w in w_slices: + img_mask[:, h, w, :] = cnt + cnt += 1 + + mask_windows = window_partition( + img_mask, self.window_size) # nW, window_size, window_size, 1 + mask_windows = mask_windows.view(-1, + self.window_size * self.window_size) + attn_mask = mask_windows.unsqueeze(1) - mask_windows.unsqueeze(2) + attn_mask = attn_mask.masked_fill(attn_mask != 0, + float(-100.0)).masked_fill( + attn_mask == 0, float(0.0)) + + return attn_mask + + def forward(self, x, x_size): + """Forward function. + + Args: + x (Tensor): Input tensor with shape (B, L, C). + x_size (tuple[int]): Resolution of input feature. + + Returns: + Tensor: Forward results. + """ + H, W = x_size + B, L, C = x.shape + # assert L == H * W, "input feature has wrong size" + + shortcut = x + x = self.norm1(x) + x = x.view(B, H, W, C) + + # cyclic shift + if self.shift_size > 0: + shifted_x = torch.roll( + x, shifts=(-self.shift_size, -self.shift_size), dims=(1, 2)) + else: + shifted_x = x + + # partition windows + x_windows = window_partition( + shifted_x, self.window_size) # nW*B, window_size, window_size, C + x_windows = x_windows.view(-1, self.window_size * self.window_size, + C) # nW*B, window_size*window_size, C + + # W-MSA/SW-MSA (to be compatible for testing on images + # whose shapes are the multiple of window size + if self.input_resolution == x_size: + attn_windows = self.attn( + x_windows, + mask=self.attn_mask) # nW*B, window_size*window_size, C + else: + attn_windows = self.attn( + x_windows, mask=self.calculate_mask(x_size).to(x.device)) + + # merge windows + attn_windows = attn_windows.view(-1, self.window_size, + self.window_size, C) + shifted_x = window_reverse(attn_windows, self.window_size, H, + W) # B H' W' C + + # reverse cyclic shift + if self.shift_size > 0: + x = torch.roll( + shifted_x, + shifts=(self.shift_size, self.shift_size), + dims=(1, 2)) + else: + x = shifted_x + x = x.view(B, H * W, C) + + # FFN + x = shortcut + self.drop_path(x) + x = x + self.drop_path(self.mlp(self.norm2(x))) + + return x + + def extra_repr(self) -> str: + return f'dim={self.dim}, ' \ + f'input_resolution={self.input_resolution}, ' \ + f'num_heads={self.num_heads}, ' \ + f'window_size={self.window_size}, ' \ + f'shift_size={self.shift_size}, ' \ + f'mlp_ratio={self.mlp_ratio}' + + +class BasicLayer(nn.Module): + """A basic Swin Transformer layer for one stage. + + Args: + dim (int): Number of input channels. + input_resolution (tuple[int]): Input resolution. + depth (int): Number of blocks. + num_heads (int): Number of attention heads. + window_size (int): Local window size. + mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. + qkv_bias (bool, optional): If True, add a learnable bias + to query, key, value. Default: True + qk_scale (float | None, optional): Override default qk + scale of head_dim ** -0.5 if set. + drop (float, optional): Dropout rate. Default: 0.0 + attn_drop (float, optional): Attention dropout rate. Default: 0.0 + drop_path (float | tuple[float], optional): Stochastic depth rate. + Default: 0.0 + norm_layer (nn.Module, optional): Normalization layer. + Default: nn.LayerNorm + downsample (nn.Module | None, optional): Downsample layer at the + end of the layer. Default: None + use_checkpoint (bool): Whether to use checkpointing to save memory. + Default: False. + """ + + def __init__(self, + dim, + input_resolution, + depth, + num_heads, + window_size, + mlp_ratio=4., + qkv_bias=True, + qk_scale=None, + drop=0., + attn_drop=0., + drop_path=0., + norm_layer=nn.LayerNorm, + downsample=None, + use_checkpoint=False): + + super().__init__() + self.dim = dim + self.input_resolution = input_resolution + self.depth = depth + self.use_checkpoint = use_checkpoint + + # build blocks + self.blocks = nn.ModuleList([ + SwinTransformerBlock( + dim=dim, + input_resolution=input_resolution, + num_heads=num_heads, + window_size=window_size, + shift_size=0 if (i % 2 == 0) else window_size // 2, + mlp_ratio=mlp_ratio, + qkv_bias=qkv_bias, + qk_scale=qk_scale, + drop=drop, + attn_drop=attn_drop, + drop_path=drop_path[i] + if isinstance(drop_path, list) else drop_path, + norm_layer=norm_layer) for i in range(depth) + ]) + + # patch merging layer + if downsample is not None: + self.downsample = downsample( + input_resolution, dim=dim, norm_layer=norm_layer) + else: + self.downsample = None + + def forward(self, x, x_size): + """Forward function. + + Args: + x (Tensor): Input tensor with shape (B, L, C). + x_size (tuple[int]): Resolution of input feature. + + Returns: + Tensor: Forward results. + """ + for blk in self.blocks: + if self.use_checkpoint: + x = checkpoint.checkpoint(blk, x, x_size) + else: + x = blk(x, x_size) + if self.downsample is not None: + x = self.downsample(x) + return x + + def extra_repr(self) -> str: + return f'dim={self.dim}, ' \ + f'input_resolution={self.input_resolution}, ' \ + f'depth={self.depth}' + + +class RSTB(nn.Module): + """Residual Swin Transformer Block (RSTB). + + Args: + dim (int): Number of input channels. + input_resolution (tuple[int]): Input resolution. + depth (int): Number of blocks. + num_heads (int): Number of attention heads. + window_size (int): Local window size. + mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. + Default: 4.0 + qkv_bias (bool, optional): If True, add a learnable bias to + query, key, value. Default: True + qk_scale (float | None, optional): Override default qk scale + of head_dim ** -0.5 if set. + drop (float, optional): Dropout rate. Default: 0.0 + attn_drop (float, optional): Attention dropout rate. Default: 0.0 + drop_path (float | tuple[float], optional): Stochastic depth rate. + Default: 0.0 + norm_layer (nn.Module, optional): Normalization layer. + Default: nn.LayerNorm + downsample (nn.Module | None, optional): Downsample layer at the + end of the layer. Default: None + use_checkpoint (bool): Whether to use checkpointing to save memory. + Default: False. + img_size (int): Input image size. Default: 224 + patch_size (int): Patch size. Default: 4 + resi_connection (string): The convolutional block before + residual connection. Default: '1conv' + """ + + def __init__(self, + dim, + input_resolution, + depth, + num_heads, + window_size, + mlp_ratio=4., + qkv_bias=True, + qk_scale=None, + drop=0., + attn_drop=0., + drop_path=0., + norm_layer=nn.LayerNorm, + downsample=None, + use_checkpoint=False, + img_size=224, + patch_size=4, + resi_connection='1conv'): + super(RSTB, self).__init__() + + self.dim = dim + self.input_resolution = input_resolution + + self.residual_group = BasicLayer( + dim=dim, + input_resolution=input_resolution, + depth=depth, + num_heads=num_heads, + window_size=window_size, + mlp_ratio=mlp_ratio, + qkv_bias=qkv_bias, + qk_scale=qk_scale, + drop=drop, + attn_drop=attn_drop, + drop_path=drop_path, + norm_layer=norm_layer, + downsample=downsample, + use_checkpoint=use_checkpoint) + + if resi_connection == '1conv': + self.conv = nn.Conv2d(dim, dim, 3, 1, 1) + elif resi_connection == '3conv': + # to save parameters and memory + self.conv = nn.Sequential( + nn.Conv2d(dim, dim // 4, 3, 1, 1), + nn.LeakyReLU(negative_slope=0.2, inplace=True), + nn.Conv2d(dim // 4, dim // 4, 1, 1, 0), + nn.LeakyReLU(negative_slope=0.2, inplace=True), + nn.Conv2d(dim // 4, dim, 3, 1, 1)) + + self.patch_embed = PatchEmbed( + img_size=img_size, + patch_size=patch_size, + in_chans=0, + embed_dim=dim, + norm_layer=None) + + self.patch_unembed = PatchUnEmbed( + img_size=img_size, + patch_size=patch_size, + in_chans=0, + embed_dim=dim, + norm_layer=None) + + def forward(self, x, x_size): + """Forward function. + + Args: + x (Tensor): Input tensor with shape (B, L, C). + x_size (tuple[int]): Resolution of input feature. + + Returns: + Tensor: Forward results. + """ + return self.patch_embed( + self.conv( + self.patch_unembed(self.residual_group(x, x_size), + x_size))) + x diff --git a/mmedit/models/editors/swinir/swinir_utils.py b/mmedit/models/editors/swinir/swinir_utils.py new file mode 100644 index 0000000000..d0f6e69051 --- /dev/null +++ b/mmedit/models/editors/swinir/swinir_utils.py @@ -0,0 +1,84 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import collections.abc +from itertools import repeat + + +# From PyTorch internals +def _ntuple(n): + """A `to_tuple` function generator. It returns a function, this function + will repeat the input to a tuple of length ``n`` if the input is not an + Iterable object, otherwise, return the input directly. + + Args: + n (int): The number of the target length. + """ + + def parse(x): + if isinstance(x, collections.abc.Iterable) and not isinstance(x, str): + return x + return tuple(repeat(x, n)) + + return parse + + +to_2tuple = _ntuple(2) + + +def drop_path(x, + drop_prob: float = 0., + training: bool = False, + scale_by_keep: bool = True): + """Drop paths (Stochastic Depth) per sample (when applied in main path of + residual blocks). + + This is the same as the DropConnect impl I created for + EfficientNet, etc networks, however, the original name is misleading + as 'Drop Connect' is a different form of dropout in a separate paper... + See discussion: + https://github.com/tensorflow/tpu/issues/494#issuecomment-532968956 + I've opted for changing the layer and argument names to 'drop path' + rather than mix DropConnect as a layer name and use + 'survival rate' as the argument. + """ + if drop_prob == 0. or not training: + return x + keep_prob = 1 - drop_prob + # work with diff dim tensors, not just 2D ConvNets + shape = (x.shape[0], ) + (1, ) * (x.ndim - 1) + random_tensor = x.new_empty(shape).bernoulli_(keep_prob) + if keep_prob > 0.0 and scale_by_keep: + random_tensor.div_(keep_prob) + return x * random_tensor + + +def window_partition(x, window_size): + """ + Args: + x: (B, H, W, C) + window_size (int): window size + Returns: + windows: (num_windows*B, window_size, window_size, C) + """ + B, H, W, C = x.shape + x = x.view(B, H // window_size, window_size, W // window_size, window_size, + C) + windows = x.permute(0, 1, 3, 2, 4, + 5).contiguous().view(-1, window_size, window_size, C) + return windows + + +def window_reverse(windows, window_size, H, W): + """ + Args: + windows: (num_windows*B, window_size, window_size, C) + window_size (int): Window size + H (int): Height of image + W (int): Width of image + Returns: + x: (B, H, W, C) + """ + B = int(windows.shape[0] / (H * W / window_size / window_size)) + x = windows.view(B, H // window_size, W // window_size, window_size, + window_size, -1) + x = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(B, H, W, -1) + return x diff --git a/model-index.yml b/model-index.yml index bedf04aac2..f1de04f77e 100644 --- a/model-index.yml +++ b/model-index.yml @@ -44,6 +44,7 @@ Import: - configs/styleganv1/metafile.yml - configs/styleganv2/metafile.yml - configs/styleganv3/metafile.yml +- configs/swinir/metafile.yml - configs/tdan/metafile.yml - configs/tof/metafile.yml - configs/ttsr/metafile.yml diff --git a/tests/test_datasets/test_transforms/test_random_degradations.py b/tests/test_datasets/test_transforms/test_random_degradations.py index 2008033322..12546ac5eb 100644 --- a/tests/test_datasets/test_transforms/test_random_degradations.py +++ b/tests/test_datasets/test_transforms/test_random_degradations.py @@ -9,7 +9,7 @@ def test_random_noise(): results = {} - results['lq'] = np.ones((8, 8, 3)).astype(np.float32) + results['lq'] = np.ones((8, 8, 3)).astype(np.uint8) # Gaussian noise model = RandomNoise( @@ -49,17 +49,21 @@ def test_random_noise(): def test_random_jpeg_compression(): results = {} - results['lq'] = np.ones((8, 8, 3)).astype(np.float32) + results['lq'] = np.ones((8, 8, 3)).astype(np.uint8) - model = RandomJPEGCompression(params=dict(quality=[5, 50]), keys=['lq']) + model = RandomJPEGCompression( + params=dict(quality=[5, 50], color_type='color'), keys=['lq']) results = model(results) assert results['lq'].shape == (8, 8, 3) # skip degradations with prob < 1 - params = dict(quality=[5, 50], prob=0) + params = dict(quality=[5, 50], color_type='color', prob=0) model = RandomJPEGCompression(params=params, keys=['lq']) assert model(results) == results + model = RandomJPEGCompression(params=params, keys=['lq'], bgr2rgb=True) + assert model(results)['lq'].shape == results['lq'].shape + assert repr(model) == model.__class__.__name__ + f'(params={params}, ' \ + "keys=['lq'])" @@ -334,7 +338,7 @@ def test_random_blur(): def test_degradations_with_shuffle(): results = {} - results['lq'] = np.ones((8, 8, 3)).astype(np.float32) + results['lq'] = np.ones((8, 8, 3)).astype(np.uint8) # shuffle all model = DegradationsWithShuffle( @@ -360,10 +364,10 @@ def test_degradations_with_shuffle(): [ dict( type='RandomJPEGCompression', - params=dict(quality=[5, 10])), + params=dict(quality=[5, 10], color_type='color')), dict( type='RandomJPEGCompression', - params=dict(quality=[15, 20])) + params=dict(quality=[15, 20], color_type='color')) ] ], keys=['lq'], @@ -391,8 +395,12 @@ def test_degradations_with_shuffle(): resize_prob=[1 / 3., 1 / 3., 1 / 3.], target_size=(16, 16))), [ - dict(type='RandomJPEGCompression', params=dict(quality=[5, 10])), - dict(type='RandomJPEGCompression', params=dict(quality=[15, 20])) + dict( + type='RandomJPEGCompression', + params=dict(quality=[5, 10], color_type='color')), + dict( + type='RandomJPEGCompression', + params=dict(quality=[15, 20], color_type='color')) ] ] model = DegradationsWithShuffle( diff --git a/tests/test_models/test_editors/test_swinir/test_swinir_modules.py b/tests/test_models/test_editors/test_swinir/test_swinir_modules.py new file mode 100644 index 0000000000..3f02556236 --- /dev/null +++ b/tests/test_models/test_editors/test_swinir/test_swinir_modules.py @@ -0,0 +1,84 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import platform + +import pytest +import torch + +from mmedit.models.editors.swinir.swinir_modules import (PatchEmbed, + PatchUnEmbed, + Upsample, + UpsampleOneStep) + + +@pytest.mark.skipif( + 'win' in platform.system().lower() and 'cu' in torch.__version__, + reason='skip on windows-cuda due to limited RAM.') +def test_patchEmbed(): + + net = PatchEmbed( + img_size=224, patch_size=4, in_chans=3, embed_dim=96, norm_layer=None) + + img = torch.randn(1, 3, 4, 4) + output = net(img) + assert output.shape == (1, 16, 3) + + if torch.cuda.is_available(): + net = net.cuda() + output = net(img.cuda()) + assert output.shape == (1, 16, 3) + + +@pytest.mark.skipif( + 'win' in platform.system().lower() and 'cu' in torch.__version__, + reason='skip on windows-cuda due to limited RAM.') +def test_patchUnEmbed(): + + net = PatchUnEmbed( + img_size=16, patch_size=4, in_chans=3, embed_dim=3, norm_layer=None) + + img = torch.randn(1, 64, 3) + output = net(img, (8, 8)) + assert output.shape == (1, 3, 8, 8) + + if torch.cuda.is_available(): + net = net.cuda() + output = net(img.cuda(), (8, 8)) + assert output.shape == (1, 3, 8, 8) + + +@pytest.mark.skipif( + 'win' in platform.system().lower() and 'cu' in torch.__version__, + reason='skip on windows-cuda due to limited RAM.') +def test_upsample(): + + net = Upsample(scale=2, num_feat=3) + + img = torch.randn(1, 3, 8, 8) + output = net(img) + assert output.shape == (1, 3, 16, 16) + + if torch.cuda.is_available(): + net = net.cuda() + output = net(img.cuda()) + assert output.shape == (1, 3, 16, 16) + + +@pytest.mark.skipif( + 'win' in platform.system().lower() and 'cu' in torch.__version__, + reason='skip on windows-cuda due to limited RAM.') +def test_upsampleOneStep(): + + net = UpsampleOneStep( + scale=2, + num_feat=3, + num_out_ch=4, + ) + + img = torch.randn(1, 3, 8, 8) + output = net(img) + assert output.shape == (1, 4, 16, 16) + + if torch.cuda.is_available(): + net = net.cuda() + output = net(img.cuda()) + assert output.shape == (1, 4, 16, 16) diff --git a/tests/test_models/test_editors/test_swinir/test_swinir_net.py b/tests/test_models/test_editors/test_swinir/test_swinir_net.py new file mode 100644 index 0000000000..b2944baa89 --- /dev/null +++ b/tests/test_models/test_editors/test_swinir/test_swinir_net.py @@ -0,0 +1,108 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import platform + +import pytest +import torch + +from mmedit.models.editors import SwinIRNet + + +def test_swinir_cpu(): + """Test SwinIRNet.""" + + # x2 model classical SR + net = SwinIRNet( + upscale=2, + in_channels=3, + img_size=48, + window_size=8, + img_range=1.0, + depths=[6], + embed_dim=60, + num_heads=[6], + mlp_ratio=2, + upsampler='pixelshuffledirect', + resi_connection='3conv') + img = torch.rand(1, 3, 16, 16) + output = net(img) + assert isinstance(output, torch.Tensor) + assert output.shape == (1, 3, 32, 32) + + net = SwinIRNet( + upscale=1, + in_channels=3, + img_size=48, + window_size=8, + img_range=1.0, + depths=[6], + embed_dim=60, + num_heads=[6], + mlp_ratio=2, + upsampler='', + resi_connection='1conv') + img = torch.rand(1, 3, 16, 16) + output = net(img) + assert isinstance(output, torch.Tensor) + assert output.shape == (1, 3, 16, 16) + + # x3 model classical SR, initialization and forward (cpu) + net = SwinIRNet( + upscale=3, + in_channels=3, + img_size=16, + window_size=8, + img_range=1.0, + depths=[2], + embed_dim=8, + num_heads=[2], + mlp_ratio=2, + upsampler='pixelshuffle', + resi_connection='1conv') + img = torch.rand(1, 3, 16, 16) + output = net(img) + assert isinstance(output, torch.Tensor) + assert output.shape == (1, 3, 48, 48) + + # x4 model lightweight SR, initialization and forward (cpu) + net = SwinIRNet( + upscale=4, + in_channels=3, + img_size=16, + window_size=8, + img_range=1.0, + depths=[2], + embed_dim=8, + num_heads=[2], + mlp_ratio=2, + ape=True, + upsampler='nearest+conv', + resi_connection='1conv') + output = net(img) + assert isinstance(output, torch.Tensor) + assert output.shape == (1, 3, 64, 64) + + +@pytest.mark.skipif( + 'win' in platform.system().lower() and 'cu' in torch.__version__, + reason='skip on windows-cuda due to limited RAM.') +def test_swinir_cuda(): + net = SwinIRNet( + upscale=4, + in_channels=3, + img_size=16, + window_size=8, + img_range=1.0, + depths=[2], + embed_dim=8, + num_heads=[2], + mlp_ratio=2, + upsampler='pixelshuffledirect', + resi_connection='1conv') + img = torch.rand(1, 3, 16, 16) + + # x4 model lightweight SR forward (gpu) + if torch.cuda.is_available(): + net = net.cuda() + output = net(img.cuda()) + assert isinstance(output, torch.Tensor) + assert output.shape == (1, 3, 64, 64) diff --git a/tests/test_models/test_editors/test_swinir/test_swinir_rstb.py b/tests/test_models/test_editors/test_swinir/test_swinir_rstb.py new file mode 100644 index 0000000000..b5f9c1db1d --- /dev/null +++ b/tests/test_models/test_editors/test_swinir/test_swinir_rstb.py @@ -0,0 +1,25 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import platform + +import pytest +import torch + +from mmedit.models.editors.swinir.swinir_rstb import RSTB + + +@pytest.mark.skipif( + 'win' in platform.system().lower() and 'cu' in torch.__version__, + reason='skip on windows-cuda due to limited RAM.') +def test_rstb(): + + net = RSTB( + dim=6, input_resolution=(8, 8), depth=6, num_heads=6, window_size=8) + + img = torch.randn(1, 64, 6) + output = net(img, (8, 8)) + assert output.shape == (1, 64, 6) + + if torch.cuda.is_available(): + net = net.cuda() + output = net(img.cuda(), (8, 8)) + assert output.shape == (1, 64, 6) diff --git a/tests/test_models/test_editors/test_swinir/test_swinir_utils.py b/tests/test_models/test_editors/test_swinir/test_swinir_utils.py new file mode 100644 index 0000000000..0971960401 --- /dev/null +++ b/tests/test_models/test_editors/test_swinir/test_swinir_utils.py @@ -0,0 +1,26 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmedit.models.editors.swinir.swinir_utils import (drop_path, to_2tuple, + window_partition, + window_reverse) + + +def test_drop_path(): + x = torch.randn(1, 3, 8, 8) + x = drop_path(x) + assert x.shape == (1, 3, 8, 8) + + +def test_to_2tuple(): + x = 8 + x = to_2tuple(x) + assert x == (8, 8) + + +def test_window(): + x = torch.randn(1, 8, 8, 3) + x = window_partition(x, 4) + assert x.shape == (4, 4, 4, 3) + x = window_reverse(x, 4, 8, 8) + assert x.shape == (1, 8, 8, 3) From 320b9a2ee4013eaad14a3332c8238412d24e0f9a Mon Sep 17 00:00:00 2001 From: LeoXing1996 Date: Fri, 30 Dec 2022 17:10:49 +0800 Subject: [PATCH 40/44] [Enhancement] Revise SWD metric and DCGAN's configs (#1528) * add number checking for base gen metric * support -1 for fake imgs in SWD metric * revise dcgan's config * update unit test of base gen metric * update unit test of swd * ignore some windows unit test --- ...cgan_1xb128-300kiters_celeba-cropped-64.py | 2 + ...cgan_1xb128-5epoches_lsun-bedroom-64x64.py | 2 + ...4e-4_Dlr1e-4_1xb128-5kiters_mnist-64x64.py | 40 +++++++++--------- mmedit/evaluation/metrics/base_gen_metric.py | 10 +++-- mmedit/evaluation/metrics/swd.py | 7 +++- .../test_metrics/test_base_gen_metric.py | 7 ++++ .../test_evaluation/test_metrics/test_swd.py | 41 ++++++++++++++++++- .../test_editors/test_wgan_gp/test_wgan_gp.py | 5 +++ .../test_losses/test_feature_loss.py | 5 +++ .../test_gen_auxiliary_loss_comps.py | 5 +++ .../test_losses/test_perceptual_loss.py | 4 ++ 11 files changed, 102 insertions(+), 26 deletions(-) diff --git a/configs/dcgan/dcgan_1xb128-300kiters_celeba-cropped-64.py b/configs/dcgan/dcgan_1xb128-300kiters_celeba-cropped-64.py index 95324ff8e4..2f1ab816e6 100644 --- a/configs/dcgan/dcgan_1xb128-300kiters_celeba-cropped-64.py +++ b/configs/dcgan/dcgan_1xb128-300kiters_celeba-cropped-64.py @@ -45,6 +45,8 @@ sample_model='orig', image_shape=(3, 64, 64)) ] +# save best checkpoints +default_hooks = dict(checkpoint=dict(save_best='swd/avg', rule='less')) val_evaluator = dict(metrics=metrics) test_evaluator = dict(metrics=metrics) diff --git a/configs/dcgan/dcgan_1xb128-5epoches_lsun-bedroom-64x64.py b/configs/dcgan/dcgan_1xb128-5epoches_lsun-bedroom-64x64.py index 79f4e56f5f..e4396a3462 100644 --- a/configs/dcgan/dcgan_1xb128-5epoches_lsun-bedroom-64x64.py +++ b/configs/dcgan/dcgan_1xb128-5epoches_lsun-bedroom-64x64.py @@ -44,6 +44,8 @@ sample_model='orig', image_shape=(3, 64, 64)) ] +# save best checkpoints +default_hooks = dict(checkpoint=dict(save_best='swd/avg', rule='less')) val_evaluator = dict(metrics=metrics) test_evaluator = dict(metrics=metrics) diff --git a/configs/dcgan/dcgan_Glr4e-4_Dlr1e-4_1xb128-5kiters_mnist-64x64.py b/configs/dcgan/dcgan_Glr4e-4_Dlr1e-4_1xb128-5kiters_mnist-64x64.py index 3eb1b4ad99..3625022ccf 100644 --- a/configs/dcgan/dcgan_Glr4e-4_Dlr1e-4_1xb128-5kiters_mnist-64x64.py +++ b/configs/dcgan/dcgan_Glr4e-4_Dlr1e-4_1xb128-5kiters_mnist-64x64.py @@ -5,47 +5,44 @@ ] # output single channel -model = dict(generator=dict(out_channels=1), discriminator=dict(in_channels=1)) +model = dict( + data_preprocessor=dict(mean=[127.5], std=[127.5]), + generator=dict(out_channels=1), + discriminator=dict(in_channels=1)) # define dataset # modify train_pipeline to load gray scale images train_pipeline = [ - dict( - type='LoadImageFromFile', - key='img', - io_backend='disk', - color_type='grayscale'), + dict(type='LoadImageFromFile', key='img', color_type='grayscale'), dict(type='Resize', scale=(64, 64)), - dict(type='PackEditInputs', meta_keys=[]) + dict(type='PackEditInputs') ] # set ``batch_size``` and ``data_root``` batch_size = 128 data_root = 'data/mnist_64/train' train_dataloader = dict( - batch_size=batch_size, dataset=dict(data_root=data_root)) + batch_size=batch_size, + dataset=dict(data_root=data_root, pipeline=train_pipeline)) -val_dataloader = dict(batch_size=batch_size, dataset=dict(data_root=data_root)) +val_dataloader = dict( + batch_size=batch_size, + dataset=dict(data_root=data_root, pipeline=train_pipeline)) test_dataloader = dict( - batch_size=batch_size, dataset=dict(data_root=data_root)) - -default_hooks = dict( - checkpoint=dict( - interval=500, - save_best=['swd/avg', 'ms-ssim/avg'], - rule=['less', 'greater'])) + batch_size=batch_size, + dataset=dict(data_root=data_root, pipeline=train_pipeline)) # VIS_HOOK custom_hooks = [ dict( type='GenVisualizationHook', - interval=10000, + interval=500, fixed_input=True, vis_kwargs_list=dict(type='GAN', name='fake_img')) ] -train_cfg = dict(max_iters=5000) +train_cfg = dict(max_iters=5000, val_interval=500) # METRICS metrics = [ @@ -55,10 +52,13 @@ dict( type='SWD', prefix='swd', - fake_nums=16384, + fake_nums=-1, sample_model='orig', - image_shape=(3, 64, 64)) + image_shape=(1, 64, 64)) ] +# save best checkpoints +default_hooks = dict( + checkpoint=dict(interval=500, save_best='swd/avg', rule='less')) val_evaluator = dict(metrics=metrics) test_evaluator = dict(metrics=metrics) diff --git a/mmedit/evaluation/metrics/base_gen_metric.py b/mmedit/evaluation/metrics/base_gen_metric.py index c5916cdc4c..eb8424b9ca 100644 --- a/mmedit/evaluation/metrics/base_gen_metric.py +++ b/mmedit/evaluation/metrics/base_gen_metric.py @@ -155,10 +155,14 @@ def get_metric_sampler(self, model: nn.Module, dataloader: DataLoader, DataLoader: Default sampler for normal metrics. """ batch_size = dataloader.batch_size - + dataset_length = len(dataloader.dataset) rank, num_gpus = get_dist_info() - item_subset = [(i * num_gpus + rank) % self.real_nums - for i in range((self.real_nums - 1) // num_gpus + 1)] + assert self.real_nums <= dataset_length, ( + f'\'real_nums\'({self.real_nums}) can not larger than length of ' + f'dataset ({dataset_length}).') + nums = dataset_length if self.real_nums == -1 else self.real_nums + item_subset = [(i * num_gpus + rank) % nums + for i in range((nums - 1) // num_gpus + 1)] metric_dataloader = DataLoader( dataloader.dataset, diff --git a/mmedit/evaluation/metrics/swd.py b/mmedit/evaluation/metrics/swd.py index ecbb9a282c..ba8a46bc18 100644 --- a/mmedit/evaluation/metrics/swd.py +++ b/mmedit/evaluation/metrics/swd.py @@ -255,7 +255,8 @@ def process(self, data_batch: dict, data_samples: Sequence[dict]) -> None: data_batch (dict): A batch of data from the dataloader. data_samples (Sequence[dict]): A batch of outputs from the model. """ - if self._num_processed >= self.fake_nums_per_device: + if self.fake_nums != -1 and (self._num_processed >= + self.fake_nums_per_device): return real_imgs, fake_imgs = [], [] @@ -279,6 +280,8 @@ def process(self, data_batch: dict, data_samples: Sequence[dict]) -> None: # real images assert real_imgs.shape[1:] == self.image_shape + if real_imgs.shape[1] == 1: + real_imgs = real_imgs.repeat(1, 3, 1, 1) real_pyramid = laplacian_pyramid(real_imgs, self.n_pyramids - 1, self.gaussian_k) # lod: layer_of_descriptors @@ -291,6 +294,8 @@ def process(self, data_batch: dict, data_samples: Sequence[dict]) -> None: # fake images assert fake_imgs.shape[1:] == self.image_shape + if fake_imgs.shape[1] == 1: + fake_imgs = fake_imgs.repeat(1, 3, 1, 1) fake_pyramid = laplacian_pyramid(fake_imgs, self.n_pyramids - 1, self.gaussian_k) # lod: layer_of_descriptors diff --git a/tests/test_evaluation/test_metrics/test_base_gen_metric.py b/tests/test_evaluation/test_metrics/test_base_gen_metric.py index da0602fe60..699f188ac2 100644 --- a/tests/test_evaluation/test_metrics/test_base_gen_metric.py +++ b/tests/test_evaluation/test_metrics/test_base_gen_metric.py @@ -1,6 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. from unittest.mock import MagicMock, patch +import pytest import torch from mmengine.model import MMDistributedDataParallel @@ -43,6 +44,7 @@ def test_GenMetric(): # test get_metric_sampler model = MagicMock() dataset = MagicMock() + dataset.__len__.return_value = 10 dataloader = MagicMock() dataloader.batch_size = 4 dataloader.dataset = dataset @@ -57,6 +59,11 @@ def test_GenMetric(): metric.prepare(model, dataloader) assert metric.data_preprocessor == preprocessor + # test raise error with dataset is length than real_nums + dataset.__len__.return_value = 5 + with pytest.raises(AssertionError): + metric.get_metric_sampler(model, dataloader, [metric]) + def test_GenerativeMetric(): metric = ToyGenerativeMetric(11, need_cond_input=True) diff --git a/tests/test_evaluation/test_metrics/test_swd.py b/tests/test_evaluation/test_metrics/test_swd.py index 9e85310198..201772670f 100644 --- a/tests/test_evaluation/test_metrics/test_swd.py +++ b/tests/test_evaluation/test_metrics/test_swd.py @@ -13,8 +13,7 @@ class TestSWD(TestCase): def test_init(self): - swd = SlicedWassersteinDistance( - fake_nums=10, image_shape=(3, 32, 32)) # noqa + swd = SlicedWassersteinDistance(fake_nums=10, image_shape=(3, 32, 32)) self.assertEqual(len(swd.real_results), 2) def test_prosess(self): @@ -35,6 +34,13 @@ def test_prosess(self): ] swd.process(real_samples, fake_samples) + # 100 samples are passed in 1 batch, _num_processed should be 100 + self.assertEqual(swd._num_processed, 100) + # _num_processed(100) > fake_nums(4), _num_processed should be + # unchanged + swd.process(real_samples, fake_samples) + self.assertEqual(swd._num_processed, 100) + output = swd.evaluate() result = [16.495922580361366, 24.15413036942482, 20.325026474893093] output = [item / 100 for item in output.values()] @@ -48,3 +54,34 @@ def test_prosess(self): sample_model='orig', image_shape=(3, 32, 32)) swd.prepare(model, None) + + # test gray scale input + swd.image_shape = (1, 32, 32) + real_samples = [ + dict(inputs=torch.rand(1, 32, 32) * 255.) for _ in range(100) + ] + fake_samples = [ + EditDataSample( + fake_img=PixelData(data=torch.rand(1, 32, 32) * 2 - 1), + gt_img=PixelData(data=torch.rand(1, 32, 32) * 2 - + 1)).to_dict() for _ in range(100) + ] + swd.process(real_samples, fake_samples) + + # test fake_nums is -1 + swd = SlicedWassersteinDistance( + fake_nums=-1, + fake_key='fake', + real_key='img', + sample_model='orig', + image_shape=(3, 32, 32)) + fake_samples = [ + EditDataSample( + fake_img=PixelData(data=torch.rand(3, 32, 32) * 2 - 1), + gt_img=PixelData(data=torch.rand(3, 32, 32) * 2 - + 1)).to_dict() for _ in range(10) + ] + for _ in range(3): + swd.process(None, fake_samples) + # fake_nums is -1, all samples (10 * 3 = 30) is processed + self.assertEqual(swd._num_processed, 30) diff --git a/tests/test_models/test_editors/test_wgan_gp/test_wgan_gp.py b/tests/test_models/test_editors/test_wgan_gp/test_wgan_gp.py index 99b82cb468..fde0125b54 100644 --- a/tests/test_models/test_editors/test_wgan_gp/test_wgan_gp.py +++ b/tests/test_models/test_editors/test_wgan_gp/test_wgan_gp.py @@ -1,7 +1,9 @@ # Copyright (c) OpenMMLab. All rights reserved. +import platform from copy import deepcopy from unittest import TestCase +import pytest import torch from mmengine import MessageHub from mmengine.optim import OptimWrapper, OptimWrapperDict @@ -54,6 +56,9 @@ def test_init(self): gan = WGANGP(generator=gen, data_preprocessor=GenDataPreprocessor()) self.assertEqual(gan.discriminator, None) + @pytest.mark.skipif( + 'win' in platform.system().lower() and 'cu' in torch.__version__, + reason='skip on windows-cuda due to limited RAM.') def test_train_step(self): # prepare model accu_iter = 1 diff --git a/tests/test_models/test_losses/test_feature_loss.py b/tests/test_models/test_losses/test_feature_loss.py index b0ef06b92a..1b71a99627 100644 --- a/tests/test_models/test_losses/test_feature_loss.py +++ b/tests/test_models/test_losses/test_feature_loss.py @@ -1,10 +1,15 @@ # Copyright (c) OpenMMLab. All rights reserved. +import platform + import pytest import torch from mmedit.models.losses import LightCNNFeatureLoss +@pytest.mark.skipif( + 'win' in platform.system().lower() and 'cu' in torch.__version__, + reason='skip on windows-cuda due to limited RAM.') def test_light_cnn_feature_loss(): pretrained = 'https://download.openmmlab.com/mmediting/' + \ diff --git a/tests/test_models/test_losses/test_loss_comps/test_gen_auxiliary_loss_comps.py b/tests/test_models/test_losses/test_loss_comps/test_gen_auxiliary_loss_comps.py index 8753f77380..160170d609 100644 --- a/tests/test_models/test_losses/test_loss_comps/test_gen_auxiliary_loss_comps.py +++ b/tests/test_models/test_losses/test_loss_comps/test_gen_auxiliary_loss_comps.py @@ -1,4 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. +import platform + import pytest import torch from mmengine.utils.dl_utils import TORCH_VERSION @@ -8,6 +10,9 @@ from mmedit.models.losses import GeneratorPathRegularizerComps +@pytest.mark.skipif( + 'win' in platform.system().lower() and 'cu' in torch.__version__, + reason='skip on windows-cuda due to limited RAM.') class TestPathRegularizer: @classmethod diff --git a/tests/test_models/test_losses/test_perceptual_loss.py b/tests/test_models/test_losses/test_perceptual_loss.py index 3c2ebc12ff..d928600049 100644 --- a/tests/test_models/test_losses/test_perceptual_loss.py +++ b/tests/test_models/test_losses/test_perceptual_loss.py @@ -1,4 +1,5 @@ # Copyright (c) OpenMMLab. All rights reserved. +import platform from unittest.mock import patch import pytest @@ -8,6 +9,9 @@ TransferalPerceptualLoss) +@pytest.mark.skipif( + 'win' in platform.system().lower() and 'cu' in torch.__version__, + reason='skip on windows-cuda due to limited RAM.') @patch.object(PerceptualVGG, 'init_weights') def test_perceptual_loss(init_weights): if torch.cuda.is_available(): From e7152e51cac05df466aae0f9a97b606670f30689 Mon Sep 17 00:00:00 2001 From: Zhengwentai SUN <31286290+Taited@users.noreply.github.com> Date: Fri, 30 Dec 2022 19:27:45 +0800 Subject: [PATCH 41/44] [Community] Support GLIDE (#1534) * commit glide * fixed attention bugs in diffusion unet, enabled text attention * update config files for glide attention * fix small bug * fix scheduler * fix lint * complete glide readme * fix attention * fix in_channels * fix lint * rm dirty comment Co-authored-by: plyfager <2744335995@qq.com> --- mmedit/models/editors/ddpm/denoising_unet.py | 101 +++--- projects/glide/configs/README.md | 77 ++++ .../glide_ddim-classifier-free_laion-64x64.py | 35 ++ projects/glide/models/__init__.py | 4 + projects/glide/models/glide.py | 330 ++++++++++++++++++ projects/glide/models/glide_modules.py | 111 ++++++ .../glide/models/glide_tokenizer/__init__.py | 3 + projects/glide/models/glide_tokenizer/bpe.py | 163 +++++++++ .../bpe_simple_vocab_16e6.txt.gz | Bin 0 -> 1356917 bytes .../models/glide_tokenizer/encoder.json.gz | Bin 0 -> 348346 bytes .../glide_tokenizer/simple_tokenizer.py | 177 ++++++++++ .../glide/models/glide_tokenizer/vocab.bpe.gz | Bin 0 -> 213544 bytes projects/glide/models/text2im_unet.py | 157 +++++++++ 13 files changed, 1117 insertions(+), 41 deletions(-) create mode 100644 projects/glide/configs/README.md create mode 100644 projects/glide/configs/glide_ddim-classifier-free_laion-64x64.py create mode 100644 projects/glide/models/__init__.py create mode 100644 projects/glide/models/glide.py create mode 100644 projects/glide/models/glide_modules.py create mode 100644 projects/glide/models/glide_tokenizer/__init__.py create mode 100644 projects/glide/models/glide_tokenizer/bpe.py create mode 100644 projects/glide/models/glide_tokenizer/bpe_simple_vocab_16e6.txt.gz create mode 100644 projects/glide/models/glide_tokenizer/encoder.json.gz create mode 100644 projects/glide/models/glide_tokenizer/simple_tokenizer.py create mode 100644 projects/glide/models/glide_tokenizer/vocab.bpe.gz create mode 100644 projects/glide/models/text2im_unet.py diff --git a/mmedit/models/editors/ddpm/denoising_unet.py b/mmedit/models/editors/ddpm/denoising_unet.py index 3993fc8f74..3aad605392 100644 --- a/mmedit/models/editors/ddpm/denoising_unet.py +++ b/mmedit/models/editors/ddpm/denoising_unet.py @@ -32,10 +32,14 @@ class EmbedSequential(nn.Sequential): https://github.com/openai/improved-diffusion/blob/main/improved_diffusion/unet.py#L35 """ - def forward(self, x, y): + def forward(self, x, y, encoder_out=None): for layer in self: if isinstance(layer, DenoisingResBlock): x = layer(x, y) + elif isinstance( + layer, + MultiHeadAttentionBlock) and encoder_out is not None: + x = layer(x, encoder_out) else: x = layer(x) return x @@ -170,7 +174,8 @@ def __init__(self, num_heads=1, num_head_channels=-1, use_new_attention_order=False, - norm_cfg=dict(type='GN32', num_groups=32)): + norm_cfg=dict(type='GN32', num_groups=32), + encoder_channels=None): super().__init__() self.in_channels = in_channels if num_head_channels == -1: @@ -191,12 +196,18 @@ def __init__(self, self.attention = QKVAttentionLegacy(self.num_heads) self.proj_out = nn.Conv1d(in_channels, in_channels, 1) + if encoder_channels is not None: + self.encoder_kv = nn.Conv1d(encoder_channels, in_channels * 2, 1) - def forward(self, x): + def forward(self, x, encoder_out): b, c, *spatial = x.shape x = x.reshape(b, c, -1) qkv = self.qkv(self.norm(x)) - h = self.attention(qkv) + if encoder_out is not None: + encoder_out = self.encoder_kv(encoder_out) + h = self.attention(qkv, encoder_out) + else: + h = self.attention(qkv) h = self.proj_out(h) return (x + h).reshape(b, c, *spatial) @@ -212,7 +223,7 @@ def __init__(self, n_heads): super().__init__() self.n_heads = n_heads - def forward(self, qkv): + def forward(self, qkv, encoder_kv=None): """Apply QKV attention. :param qkv: an [N x (H * 3 * C) x T] tensor of Qs, Ks, and Vs. @@ -223,6 +234,12 @@ def forward(self, qkv): ch = width // (3 * self.n_heads) q, k, v = qkv.reshape(bs * self.n_heads, ch * 3, length).split( ch, dim=1) + if encoder_kv is not None: + assert encoder_kv.shape[1] == self.n_heads * ch * 2 + ek, ev = encoder_kv.reshape(bs * self.n_heads, ch * 2, -1).split( + ch, dim=1) + k = torch.cat([ek, k], dim=-1) + v = torch.cat([ev, v], dim=-1) scale = 1 / math.sqrt(math.sqrt(ch)) weight = torch.einsum( 'bct,bcs->bts', q * scale, @@ -819,48 +836,49 @@ class DenoisingUnet(BaseModule): 32: [1, 2, 2, 2] } - def __init__( - self, - image_size, - in_channels=3, - base_channels=128, - resblocks_per_downsample=3, - num_timesteps=1000, - use_rescale_timesteps=False, - dropout=0, - embedding_channels=-1, - num_classes=0, - use_fp16=False, - channels_cfg=None, - output_cfg=dict(mean='eps', var='learned_range'), - norm_cfg=dict(type='GN', num_groups=32), - act_cfg=dict(type='SiLU', inplace=False), - shortcut_kernel_size=1, - use_scale_shift_norm=False, - resblock_updown=False, - num_heads=4, - time_embedding_mode='sin', - time_embedding_cfg=None, - resblock_cfg=dict(type='DenoisingResBlock'), - attention_cfg=dict(type='MultiHeadAttention'), - downsample_conv=True, - upsample_conv=True, - downsample_cfg=dict(type='DenoisingDownsample'), - upsample_cfg=dict(type='DenoisingUpsample'), - attention_res=[16, 8], - pretrained=None, - unet_type='', - down_block_types: Tuple[str] = (), - up_block_types: Tuple[str] = (), - cross_attention_dim=768, - layers_per_block: int = 2, - ): + def __init__(self, + image_size, + in_channels=3, + base_channels=128, + resblocks_per_downsample=3, + num_timesteps=1000, + use_rescale_timesteps=False, + dropout=0, + embedding_channels=-1, + num_classes=0, + use_fp16=False, + channels_cfg=None, + output_cfg=dict(mean='eps', var='learned_range'), + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='SiLU', inplace=False), + shortcut_kernel_size=1, + use_scale_shift_norm=False, + resblock_updown=False, + num_heads=4, + time_embedding_mode='sin', + time_embedding_cfg=None, + resblock_cfg=dict(type='DenoisingResBlock'), + attention_cfg=dict(type='MultiHeadAttention'), + encoder_channels=None, + downsample_conv=True, + upsample_conv=True, + downsample_cfg=dict(type='DenoisingDownsample'), + upsample_cfg=dict(type='DenoisingUpsample'), + attention_res=[16, 8], + pretrained=None, + unet_type='', + down_block_types: Tuple[str] = (), + up_block_types: Tuple[str] = (), + cross_attention_dim=768, + layers_per_block: int = 2): super().__init__() self.unet_type = unet_type self.num_classes = num_classes self.num_timesteps = num_timesteps + self.base_channels = base_channels + self.encoder_channels = encoder_channels self.use_rescale_timesteps = use_rescale_timesteps self.dtype = torch.float16 if use_fp16 else torch.float32 @@ -1006,6 +1024,7 @@ def __init__( block_out_channels = [ times * base_channels for times in self.channel_factor_list ] + in_channels_ = self.in_channels_list[-1] if self.unet_type == 'stable': self.mid_block = UNetMidBlock2DCrossAttn( in_channels=block_out_channels[-1], diff --git a/projects/glide/configs/README.md b/projects/glide/configs/README.md new file mode 100644 index 0000000000..e9081da481 --- /dev/null +++ b/projects/glide/configs/README.md @@ -0,0 +1,77 @@ +# GLIDE (Arxiv'2021) + +> [GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models](https://papers.nips.cc/paper/2021/file/49ad23d1ec9fa4bd8d77d02681df5cfa-Paper.pdf) + +> **Task**: Text2Image, diffusion + + + +## Abstract + + + +Diffusion models have recently been shown to generate high-quality synthetic images, especially when paired with a guidance technique to trade off diversity for fidelity. We explore diffusion models for the problem of text-conditional image synthesis and compare two different guidance strategies: CLIP guidance and classifier-free guidance. We find that the latter is preferred by human evaluators for both photorealism and caption similarity, and often produces photorealistic samples. Samples from a 3.5 billion parameter text-conditional diffusion model using classifierfree guidance are favored by human evaluators to those from DALL-E, even when the latter uses expensive CLIP reranking. Additionally, we find that our models can be fine-tuned to perform image inpainting, enabling powerful text-driven image editing. We train a smaller model on a filtered dataset and release the code and weights at https://github.com/openai/glide-text2im. + + + +
+ +
+ +## Results and models + +
+ an oil painting of a corgi +
+ +
+ +
+ an cartoon painting of a cat +
+ +
+ +**Laion** + +| Method | Resolution | Config | Weights | +| ------ | ---------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | +| Glide | 64x64 | [config](projects/glide/configs/glide_ddim-classifier-free_laion-64x64.py) | [model](https://download.openmmlab.com/mmediting/glide/glide_laion-64x64-02afff47.pth) | + +## Quick Start + +You can run glide as follows: + +```python +import torch +from mmedit.apis import init_model +from mmedit.utils import register_all_modules +from projects.glide.models import * + +register_all_modules() + +config = 'projects/glide/configs/glide_ddim-classifier-free_laion-64x64.py' +ckpt = 'https://download.openmmlab.com/mmediting/glide/glide_laion-64x64-02afff47.pth' +model = init_model(config, ckpt).cuda().eval() +prompt = "an oil painting of a corgi" + +with torch.no_grad(): + samples = model.infer(init_image=None, + prompt=prompt, + batch_size=16, + guidance_scale=3., + num_inference_steps=100, + labels=None, + classifier_scale=0.0, + show_progress=True)['samples'] +``` + +## Citation + +```bibtex +@article{2021GLIDE, + title={GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models}, + author={ Nichol, A. and Dhariwal, P. and Ramesh, A. and Shyam, P. and Mishkin, P. and Mcgrew, B. and Sutskever, I. and Chen, M. }, + year={2021}, +} +``` diff --git a/projects/glide/configs/glide_ddim-classifier-free_laion-64x64.py b/projects/glide/configs/glide_ddim-classifier-free_laion-64x64.py new file mode 100644 index 0000000000..5344540c3e --- /dev/null +++ b/projects/glide/configs/glide_ddim-classifier-free_laion-64x64.py @@ -0,0 +1,35 @@ +model = dict( + type='Glide', + data_preprocessor=dict( + type='EditDataPreprocessor', mean=[127.5], std=[127.5]), + unet=dict( + type='Text2ImUNet', + image_size=64, + base_channels=192, + in_channels=3, + resblocks_per_downsample=3, + attention_res=(32, 16, 8), + norm_cfg=dict(type='GN32', num_groups=32), + dropout=0.1, + num_classes=0, + use_fp16=False, + resblock_updown=True, + attention_cfg=dict( + type='MultiHeadAttentionBlock', + num_heads=1, + num_head_channels=64, + use_new_attention_order=False, + encoder_channels=512), + use_scale_shift_norm=True, + text_ctx=128, + xf_width=512, + xf_layers=16, + xf_heads=8, + xf_final_ln=True, + xf_padding=True, + ), + diffusion_scheduler=dict( + type='DDIMScheduler', + variance_type='learned_range', + beta_schedule='squaredcos_cap_v2'), + use_fp16=False) diff --git a/projects/glide/models/__init__.py b/projects/glide/models/__init__.py new file mode 100644 index 0000000000..6b40ebf542 --- /dev/null +++ b/projects/glide/models/__init__.py @@ -0,0 +1,4 @@ +from .glide import Glide +from .text2im_unet import Text2ImUNet + +__all__ = ['Text2ImUNet', 'Glide'] diff --git a/projects/glide/models/glide.py b/projects/glide/models/glide.py new file mode 100644 index 0000000000..eb1d96e861 --- /dev/null +++ b/projects/glide/models/glide.py @@ -0,0 +1,330 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from copy import deepcopy +from typing import Dict, List, Optional, Union + +import mmengine +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmengine import MessageHub +from mmengine.model import BaseModel, is_model_wrapper +from mmengine.optim import OptimWrapperDict +from mmengine.runner.checkpoint import _load_checkpoint_with_prefix +from tqdm import tqdm + +from mmedit.registry import DIFFUSION_SCHEDULERS, MODELS, MODULES +from mmedit.structures import EditDataSample, PixelData +from mmedit.utils.typing import ForwardInputs, SampleList + +# from .guider import ImageTextGuider + +ModelType = Union[Dict, nn.Module] + + +def classifier_grad(classifier, x, t, y=None, classifier_scale=1.0): + """compute classification gradient to x.""" + assert y is not None + with torch.enable_grad(): + x_in = x.detach().requires_grad_(True) + logits = classifier(x_in, t) + log_probs = F.log_softmax(logits, dim=-1) + selected = log_probs[range(len(logits)), y.view(-1)] + return torch.autograd.grad(selected.sum(), x_in)[0] * classifier_scale + + +@MODELS.register_module() +class Glide(BaseModel): + """Guided diffusion Model. + + Args: + data_preprocessor (dict, optional): The pre-process config of + :class:`BaseDataPreprocessor`. + unet (ModelType): Config of denoising Unet. + diffusion_scheduler (ModelType): Config of diffusion_scheduler + scheduler. + use_fp16 (bool): Whether to use fp16 for unet model. Defaults to False. + classifier (ModelType): Config of classifier. Defaults to None. + pretrained_cfgs (dict): Path Config for pretrained weights. Usually + this is a dict contains module name and the corresponding ckpt + path.Defaults to None. + """ + + def __init__(self, + data_preprocessor, + unet, + diffusion_scheduler, + use_fp16=False, + classifier=None, + classifier_scale=1.0, + pretrained_cfgs=None): + + super().__init__(data_preprocessor=data_preprocessor) + self.unet = MODULES.build(unet) + self.diffusion_scheduler = DIFFUSION_SCHEDULERS.build( + diffusion_scheduler) + if classifier: + self.classifier = MODULES.build(classifier) + else: + self.classifier = None + self.classifier_scale = classifier_scale + + if pretrained_cfgs: + self.load_pretrained_models(pretrained_cfgs) + if use_fp16: + mmengine.print_log('Convert unet modules to floatpoint16') + self.unet.convert_to_fp16() + + def load_pretrained_models(self, pretrained_cfgs): + """_summary_ + + Args: + pretrained_cfgs (_type_): _description_ + """ + for key, ckpt_cfg in pretrained_cfgs.items(): + prefix = ckpt_cfg.get('prefix', '') + map_location = ckpt_cfg.get('map_location', 'cpu') + strict = ckpt_cfg.get('strict', True) + ckpt_path = ckpt_cfg.get('ckpt_path') + state_dict = _load_checkpoint_with_prefix(prefix, ckpt_path, + map_location) + getattr(self, key).load_state_dict(state_dict, strict=strict) + mmengine.print_log(f'Load pretrained {key} from {ckpt_path}') + + @property + def device(self): + """Get current device of the model. + + Returns: + torch.device: The current device of the model. + """ + return next(self.parameters()).device + + @torch.no_grad() + def infer(self, + init_image=None, + prompt=None, + batch_size=1, + guidance_scale=3., + num_inference_steps=50, + labels=None, + classifier_scale=0.0, + show_progress=False): + """_summary_ + + Args: + init_image (_type_, optional): _description_. Defaults to None. + batch_size (int, optional): _description_. Defaults to 1. + num_inference_steps (int, optional): _description_. + Defaults to 1000. + labels (_type_, optional): _description_. Defaults to None. + show_progress (bool, optional): _description_. Defaults to False. + + Returns: + _type_: _description_ + """ + # Sample gaussian noise to begin loop + if init_image is None: + image = torch.randn((2 * batch_size, self.unet.in_channels, + self.unet.image_size, self.unet.image_size)) + image = image.to(self.device) + else: + image = init_image + + # set step values + if num_inference_steps > 0: + self.diffusion_scheduler.set_timesteps(num_inference_steps) + + timesteps = self.diffusion_scheduler.timesteps + + # text embedding + tokens = self.unet.tokenizer.encode(prompt) + tokens, mask = self.unet.tokenizer.padded_tokens_and_mask(tokens, 128) + + # Create the classifier-free guidance tokens (empty) + # full_batch_size = batch_size * 2 + uncond_tokens, uncond_mask = \ + self.unet.tokenizer.padded_tokens_and_mask( + [], 128) + + tokens = torch.tensor( + [tokens] * batch_size + [uncond_tokens] * batch_size, + device=self.device) + mask = torch.tensor( + [mask] * batch_size + [uncond_mask] * batch_size, + dtype=torch.bool, + device=self.device) + + if show_progress and mmengine.dist.is_main_process(): + timesteps = tqdm(timesteps) + + for t in timesteps: + # 1. predicted model_output + half = image[:len(image) // 2] + combined = torch.concat([half, half], dim=0) + model_output = self.unet(combined, t, tokens=tokens, mask=mask) + eps, rest = model_output[:, :3], model_output[:, 3:] + cond_eps, uncond_eps = torch.split(eps, len(eps) // 2, dim=0) + half_eps = uncond_eps + guidance_scale * (cond_eps - uncond_eps) + eps = torch.cat([half_eps, half_eps], dim=0) + noise_pred = torch.concat([eps, rest], dim=1) + # noise_pred_text, noise_pred_uncond = model_output.chunk(2) + # noise_pred = noise_pred_uncond + guidance_scale * + # (noise_pred_text - noise_pred_uncond) + + # 2. compute previous image: x_t -> x_t-1 + diffusion_scheduler_output = self.diffusion_scheduler.step( + noise_pred, t, image) + + # 3. applying classifier guide + if self.classifier and classifier_scale != 0.0: + gradient = classifier_grad( + self.classifier, + image, + t, + labels, + classifier_scale=classifier_scale) + guided_mean = ( + diffusion_scheduler_output['mean'].float() + + diffusion_scheduler_output['sigma'] * gradient.float()) + image = guided_mean + diffusion_scheduler_output[ + 'sigma'] * diffusion_scheduler_output['noise'] + else: + image = diffusion_scheduler_output['prev_sample'] + + return {'samples': image} + + def forward(self, + inputs: ForwardInputs, + data_samples: Optional[list] = None, + mode: Optional[str] = None) -> List[EditDataSample]: + """_summary_ + + Args: + inputs (ForwardInputs): _description_ + data_samples (Optional[list], optional): _description_. + Defaults to None. + mode (Optional[str], optional): _description_. Defaults to None. + + Returns: + List[EditDataSample]: _description_ + """ + init_image = inputs.get('init_image', None) + batch_size = inputs.get('batch_size', 1) + labels = data_samples.get('labels', None) + sample_kwargs = inputs.get('sample_kwargs', dict()) + + num_inference_steps = sample_kwargs.get( + 'num_inference_steps', + self.diffusion_scheduler.num_train_timesteps) + show_progress = sample_kwargs.get('show_progress', False) + classifier_scale = sample_kwargs.get('classifier_scale', + self.classifier_scale) + + outputs = self.infer( + init_image=init_image, + batch_size=batch_size, + num_inference_steps=num_inference_steps, + show_progress=show_progress, + classifier_scale=classifier_scale) + + batch_sample_list = [] + for idx in range(batch_size): + gen_sample = EditDataSample() + if data_samples: + gen_sample.update(data_samples[idx]) + if isinstance(outputs, dict): + gen_sample.ema = EditDataSample( + fake_img=PixelData(data=outputs['ema'][idx]), + sample_model='ema') + gen_sample.orig = EditDataSample( + fake_img=PixelData(data=outputs['orig'][idx]), + sample_model='orig') + gen_sample.sample_model = 'ema/orig' + gen_sample.set_gt_label(labels[idx]) + gen_sample.ema.set_gt_label(labels[idx]) + gen_sample.orig.set_gt_label(labels[idx]) + else: + gen_sample.fake_img = PixelData(data=outputs[idx]) + gen_sample.set_gt_label(labels[idx]) + + # Append input condition (noise and sample_kwargs) to + # batch_sample_list + if init_image is not None: + gen_sample.noise = init_image[idx] + gen_sample.sample_kwargs = deepcopy(sample_kwargs) + batch_sample_list.append(gen_sample) + return batch_sample_list + + def val_step(self, data: dict) -> SampleList: + """Gets the generated image of given data. + + Calls ``self.data_preprocessor(data)`` and + ``self(inputs, data_sample, mode=None)`` in order. Return the + generated results which will be passed to evaluator. + + Args: + data (dict): Data sampled from metric specific + sampler. More detials in `Metrics` and `Evaluator`. + + Returns: + SampleList: Generated image or image dict. + """ + data = self.data_preprocessor(data) + outputs = self(**data) + return outputs + + def test_step(self, data: dict) -> SampleList: + """Gets the generated image of given data. Same as :meth:`val_step`. + + Args: + data (dict): Data sampled from metric specific + sampler. More detials in `Metrics` and `Evaluator`. + + Returns: + List[EditDataSample]: Generated image or image dict. + """ + data = self.data_preprocessor(data) + outputs = self(**data) + return outputs + + def train_step(self, data: dict, optim_wrapper: OptimWrapperDict): + """_summary_ + + Args: + data (dict): _description_ + optim_wrapper (OptimWrapperDict): _description_ + + Returns: + _type_: _description_ + """ + message_hub = MessageHub.get_current_instance() + curr_iter = message_hub.get_info('iter') + + # sampling x0 and timestep + data = self.data_preprocessor(data) + real_imgs = data['inputs'] + timestep = self.diffusion_scheduler.sample_timestep() + + # calculating loss + loss_dict = self.diffusion_scheduler.training_loss( + self.unet, real_imgs, timestep) + loss, log_vars = self._parse_losses(loss_dict) + optim_wrapper['denoising'].update_params(loss) + + # update EMA + if self.with_ema_denoising and (curr_iter + 1) >= self.ema_start: + self.denoising_ema.update_parameters( + self.denoising_ema. + module if is_model_wrapper(self.denoising) else self.denoising) + # if not update buffer, copy buffer from orig model + if not self.denoising_ema.update_buffers: + self.denoising_ema.sync_buffers( + self.denoising.module + if is_model_wrapper(self.denoising) else self.denoising) + elif self.with_ema_denoising: + # before ema, copy weights from orig + self.denoising_ema.sync_parameters( + self.denoising. + module if is_model_wrapper(self.denoising) else self.denoising) + + return log_vars diff --git a/projects/glide/models/glide_modules.py b/projects/glide/models/glide_modules.py new file mode 100644 index 0000000000..0c2d95203a --- /dev/null +++ b/projects/glide/models/glide_modules.py @@ -0,0 +1,111 @@ +import math + +import torch +import torch.nn as nn + + +class QKVMultiheadAttention(nn.Module): + + def __init__(self, n_heads: int, n_ctx: int): + super().__init__() + self.n_heads = n_heads + self.n_ctx = n_ctx + + def forward(self, qkv): + bs, n_ctx, width = qkv.shape + attn_ch = width // self.n_heads // 3 + scale = 1 / math.sqrt(math.sqrt(attn_ch)) + qkv = qkv.view(bs, n_ctx, self.n_heads, -1) + q, k, v = torch.split(qkv, attn_ch, dim=-1) + weight = torch.einsum( + 'bthc,bshc->bhts', q * scale, + k * scale) # More stable with f16 than dividing afterwards + wdtype = weight.dtype + weight = torch.softmax(weight.float(), dim=-1).type(wdtype) + return torch.einsum('bhts,bshc->bthc', weight, + v).reshape(bs, n_ctx, -1) + + +class MultiheadAttention(nn.Module): + + def __init__(self, n_ctx, width, heads): + super().__init__() + self.n_ctx = n_ctx + self.width = width + self.heads = heads + self.c_qkv = nn.Linear(width, width * 3) + self.c_proj = nn.Linear(width, width) + self.attention = QKVMultiheadAttention(heads, n_ctx) + + def forward(self, x): + x = self.c_qkv(x) + x = self.attention(x) + x = self.c_proj(x) + return x + + +class MLP(nn.Module): + + def __init__(self, width): + super().__init__() + self.width = width + self.c_fc = nn.Linear(width, width * 4) + self.c_proj = nn.Linear(width * 4, width) + self.gelu = nn.GELU() + + def forward(self, x): + return self.c_proj(self.gelu(self.c_fc(x))) + + +class ResidualAttentionBlock(nn.Module): + + def __init__( + self, + n_ctx: int, + width: int, + heads: int, + ): + super().__init__() + + self.attn = MultiheadAttention( + n_ctx, + width, + heads, + ) + # TODO should the LayerNorm support fp15 gain + # and bias but fp32 mean and std? + self.ln_1 = nn.LayerNorm(width) + self.mlp = MLP(width) + self.ln_2 = nn.LayerNorm(width) + + def forward(self, x: torch.Tensor): + x = x + self.attn(self.ln_1(x)) + x = x + self.mlp(self.ln_2(x)) + return x + + +class Transformer(nn.Module): + + def __init__( + self, + n_ctx: int, + width: int, + layers: int, + heads: int, + ): + super().__init__() + self.n_ctx = n_ctx + self.width = width + self.layers = layers + self.resblocks = nn.ModuleList([ + ResidualAttentionBlock( + n_ctx, + width, + heads, + ) for _ in range(layers) + ]) + + def forward(self, x: torch.Tensor): + for block in self.resblocks: + x = block(x) + return x diff --git a/projects/glide/models/glide_tokenizer/__init__.py b/projects/glide/models/glide_tokenizer/__init__.py new file mode 100644 index 0000000000..5813d9545e --- /dev/null +++ b/projects/glide/models/glide_tokenizer/__init__.py @@ -0,0 +1,3 @@ +from .bpe import get_encoder + +__all__ = ['get_encoder'] diff --git a/projects/glide/models/glide_tokenizer/bpe.py b/projects/glide/models/glide_tokenizer/bpe.py new file mode 100644 index 0000000000..6993c488d0 --- /dev/null +++ b/projects/glide/models/glide_tokenizer/bpe.py @@ -0,0 +1,163 @@ +"""Byte pair encoding utilities adapted from: + +https://github.com/openai/gpt-2/blob/master/src/encoder.py +""" + +import gzip +import json +import os +from functools import lru_cache +from typing import List, Tuple + +import regex as re + + +@lru_cache() +def bytes_to_unicode(): + """Returns list of utf-8 byte and a corresponding list of unicode strings. + + The reversible bpe codes work on unicode strings. This means you need a + large # of unicode characters in your vocab if you want to avoid UNKs. When + you're at something like a 10B token dataset you end up needing around 5K + for decent coverage. This is a significant percentage of your normal, say, + 32K bpe vocab. To avoid that, we want lookup tables between utf-8 bytes and + unicode strings. And avoids mapping to whitespace/control characters the + bpe code barfs on. + """ + bs = ( + list(range(ord('!'), + ord('~') + 1)) + list(range(ord('¡'), + ord('¬') + 1)) + + list(range(ord('®'), + ord('ÿ') + 1))) + cs = bs[:] + n = 0 + for b in range(2**8): + if b not in bs: + bs.append(b) + cs.append(2**8 + n) + n += 1 + cs = [chr(n) for n in cs] + return dict(zip(bs, cs)) + + +def get_pairs(word): + """Return set of symbol pairs in a word. + + Word is represented as tuple of symbols (symbols being variable-length + strings). + """ + pairs = set() + prev_char = word[0] + for char in word[1:]: + pairs.add((prev_char, char)) + prev_char = char + return pairs + + +class Encoder: + + def __init__(self, encoder, bpe_merges, errors='replace'): + self.encoder = encoder + self.decoder = {v: k for k, v in self.encoder.items()} + self.errors = errors # how to handle errors in decoding + self.byte_encoder = bytes_to_unicode() + self.byte_decoder = {v: k for k, v in self.byte_encoder.items()} + self.bpe_ranks = dict(zip(bpe_merges, range(len(bpe_merges)))) + self.cache = {} + + # Should haved added re.IGNORECASE so BPE merges can happen for + # capitalized versions of contractions + self.pat = re.compile( + r"""'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}] + +|\s+(?!\S)|\s+""") + + @property + def n_vocab(self) -> int: + return len(self.encoder) + + @property + def end_token(self) -> int: + return self.n_vocab - 1 + + def padded_tokens_and_mask(self, tokens: List[int], + text_ctx: int) -> Tuple[List[int], List[bool]]: + tokens = tokens[:text_ctx] + padding = text_ctx - len(tokens) + padded_tokens = tokens + [self.end_token] * padding + mask = [True] * len(tokens) + [False] * padding + return padded_tokens, mask + + def bpe(self, token): + if token in self.cache: + return self.cache[token] + word = tuple(token) + pairs = get_pairs(word) + + if not pairs: + return token + + while True: + bigram = min( + pairs, key=lambda pair: self.bpe_ranks.get(pair, float('inf'))) + if bigram not in self.bpe_ranks: + break + first, second = bigram + new_word = [] + i = 0 + while i < len(word): + try: + j = word.index(first, i) + new_word.extend(word[i:j]) + i = j + except: # noqa: E722 + new_word.extend(word[i:]) + break + + if word[i] == first and i < len(word) - 1 and word[ + i + 1] == second: + new_word.append(first + second) + i += 2 + else: + new_word.append(word[i]) + i += 1 + new_word = tuple(new_word) + word = new_word + if len(word) == 1: + break + else: + pairs = get_pairs(word) + word = ' '.join(word) + self.cache[token] = word + return word + + def encode(self, text): + text = text.lower() + bpe_tokens = [] + for token in re.findall(self.pat, text): + token = ''.join(self.byte_encoder[b] + for b in token.encode('utf-8')) + bpe_tokens.extend(self.encoder[bpe_token] + for bpe_token in self.bpe(token).split(' ')) + return bpe_tokens + + def decode(self, tokens): + text = ''.join([self.decoder[token] for token in tokens]) + text = bytearray([self.byte_decoder[c] for c in text]).decode( + 'utf-8', errors=self.errors) + return text + + +def get_encoder(): + root_dir = os.path.dirname(os.path.abspath(__file__)) + with gzip.open(os.path.join(root_dir, 'encoder.json.gz'), 'r') as f: + encoder = json.load(f) + with gzip.open(os.path.join(root_dir, 'vocab.bpe.gz'), 'r') as f: + bpe_data = str(f.read(), 'utf-8') + bpe_merges = [ + tuple(merge_str.split()) for merge_str in bpe_data.split('\n')[1:-1] + ] + return Encoder( + encoder=encoder, + bpe_merges=bpe_merges, + ) diff --git a/projects/glide/models/glide_tokenizer/bpe_simple_vocab_16e6.txt.gz b/projects/glide/models/glide_tokenizer/bpe_simple_vocab_16e6.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..7b5088a527f720063f044eb928eee315f63b2fc0 GIT binary patch literal 1356917 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%0D-8anuzg!0hrX~L}M*$l~SOpZ7=I+%ag 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

Rp5@H-63rPkl?5M!`%e$q5M^(XmdeOwiW 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%0D+{l&4Elf+RUJ>DPlT<0vI!uxp-LitG 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

nj;X-C@gua07)qPBmS6kxKbsrp_1VbHQ%kr&^ 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�J#6HekB- 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%0DQu49$GwTP{0?>4l_B{}_v8!N|W%zC&9> z8RY~ssE=R2qK8T{Doiw#V{mG~-8N~7=E@{d0y13QZ-L_na$8k$AzGkiL@(J4*Qytf0z*783v)RHW)+dz6>AptOH=dPY=A%Z6wC z1>In?qUYe)-siyT<=CI4D&FCY1AkowjG~py0-n@NLIlKzr4#zhxx^-v%uI!D^AQIq zn@`IDYzmR4i8BA}n)9)GG%;RtCXjQpKV^`$(hM3(D@ip8)+^shXCsmGx)1hrR}{;| z)ph-sBChgNJvOY#pEgoG5-Ju|&mH1`XDZQd;9Fo<=|O<%5|ayqDjjgvK;OAbBS)9* zX3Bz{4G>WFK+juX39&&>rav_DScf5bD-UXF48(0PQG_>1oQeBU2{1df1`G4-(>8;F zqi{1W6($@eRp%N>?tFqhow`zZ2yu@5--hp}g!KWti9av^eE8>o4(S(QoPMqn7!c$6 z;p@lptBR)l5;LdPZk39$`6vSq#QOTAiopf>wr3sK4IJML?%q03HLns88h|6Y;)l7r zG>CRyuvc`cVJQpBxb?AU_87ANj04Tq;&SmJ2e5NK%eIbrdDLxCe4BKtbLScjQ?*Sq zJmUEj#CT!-qFrxP!o3 zOaT^^$xsWy2=vbO!04AM9i|SJYL(Z?5Am{x!R}sjH!e=IOU_y?k)L}VTT6ooF&nn) zD2eGPUrigJSpCGE(M>`9ZXtktY2i6iGz`t1^)zLL8oTszuxN><{eJjf`p^@l_Z#Pe zq^~9>KzjW{$Pq~>J{`q17_V7P+ac4J-YI;>>c#yU%vjtm&mEw=A%jg>KcSm&RfRG4 z+G*2U4;2J1?g?p6qDDaXwz^8*c*h{E*%_1D{U|UQOc395)`moX7 zSNgb(C*ba6pzTmM49f2(K~5-?`4LxfD~tx^iBwPvec*>-?|v?Lb4OUYatDjl+w|`({W1F?4gM>>m~O7x zZPnUe?fTO)u99f>7KQV9(t?CP!x>SWJ>$7>-){-S zWc^D`Oj%VxX z=i9h*_k=0@sa~*f+oX$@bO`E0DCN(p;6k-to!SNK+{T$&9s0kL zlVzYQxdAMeCAcC#z#*GdI?L%%RTc}&N5dZILYVr)N(iO2;(?$RXzkme7kpUiB}?W| zm?iDQ>N<-|&#EdoJ0mPhR%yhWM`Kx-)ZxC-;jEGqS|y!`u7@XVpchd^;z$+Fwzz<$MwZRoA;sD` z{-Mizu1c!V^8~u{}(JvWne#~I=W3557awhW3PuU?!L(`R^RKvT8x9`WMiI`OSvvOTxI4O z6KGcoiiO%PEjzP|l789=Kz}FIHVveWpImqi-A23jk%%to)<%@}7U?%c7RVT!$?n}b z%28IQm0SglUxDQSs#J9mU3XCxT`DvL!elteNUVG^P8__jpo@cTyTnyS%zWmEM;nP^Kn%dw~P)!xl^tUquQQ3R_q7yxPR1 z=hi^Lk>x~4gL`TP8PxGNGM#Ga1B~CNjgo!x zxF&MY0r2W0gzVJDM7j(B5Z4Loa$@$d0B{r?K6w%d3Kf=mOs#MKUlF@M4= zDEwo(9GIrhTzB3vOriQd6!O%j&{ua5yEwXfPVH^ZI z#rIt^z8AtobIv8wtUynrnF?tOif1Ahm15Nb6z4#zv(yv4g;hYFP*$BX8W`-kL_{5i6C_-L z%b1Hu0t7aCwv&-=Rr0+5ZFMkZrb?;NqccOX0o>gSLSdx+aZ&^77-*Ov&qwu~R5zQv zyaihwDh7tO8{i}RA^som5B>Uqb(A#MPk~^-iCKA9JJoYs+-@ECa1%d3(RB9+*J=Dv}=hMc|6PEN#gQKYC_F*asX>=;YYnJmZTtK)@>mT-QF|^#cg5jJkVO6nbiSvUh_9EY30Rqqj zly9}Oi<^PV0EU9xa>+{=re^?9K(D_P+gQmDutvAG1f4+H1dnyYSO7VXLJ=xZ_B;D7 zyUJc6>|hnYTUCR?Wvv%{A>3~VF^g^E!^r#GoeP^JpH=j}a~f`a(L{Do><9ds&^_qw zhWI2EyRpF_dl{S=-%X)?=-@z>FyZbgxz!fs)GiOB++0g2NGoj*G1w?rDf{^DyzN=dJK@5ucb_2yqx*2@cPG)(;H|= z{|{`j(?t`_Y}Z+;jvMq7S4MHD>6?y1Z?Net0=07sM|`t)8Fep}r4$4lxzwHHD~dD2 zqRTIG@*%&Ea&N(L*ovAayWpI~Rqn5rem3lerOUxq;-~NL?+yT@qq@hq`muW~$^!!h zYFqYU4qR=(M5gTD188oOMy~f)AUX+NF8f$^m!6{wxsmz-^eXi0gxWc9GrOXCsa!X~ zeM%Pd+w+vWKRQwNDkVOR44yNrl}^I~_}4fdr3)&`b<}2lTJp0$)S;*&HedjAbfHsL zM^5lHlL)U^h0tPI^^C89D@EM#5)T(b>UP)Q-W7;UbgTGu^*eMq%Z9YTYQSeW`i(3}~$L`+~ z+Wnj&u1N{{Q%XW7!05Yw4li$k($CT7?%uq&?wZ`DsZYDFeo;3w!%1(@V%yz@51UjE z_W1zAPv9Laes4u@o8+~bR9+6dy#S#JtCQaBs@6;$xC3wO6p%Lw(QXhq?4hq7$%if* zU&akpa95$B)J#5D2xvi@OM!o{&^!@{wXH}Ha#TuIau{&hZ`FqSs_ZZ@?iDRKojNG6 zO3xw(1%r%*+OQ2CH*r7bVpC|A0<^dyhz|LUV{;3X9O_-B4#ON``xc-w^Uzpsp~}p< zSVB@FyB-EGEHO*hL1GF16TyES1mohsnEk!)h3|bY&GbJCuQvPtZ{hV8{0D#%)*B>u%5Rh}+H&SBT}5atV#g={ZE9ApE7<5p(WIxIU4juW0WmXH<)qs(&I(thd!vG0(!5z6CliK|) znIsC)PCE#@yBbwUT(u(m2>U^!sxOOU+MeHKa44tY*;vk2s&1iF$^k>6xHAo z%B+*50yM31J(t*Y4}4m%Il%~=S;)mr3P*QAmS7IlV*!AU@fc^jwcQYgE@zyod;=CYeZM&Sy z8NXTj25{U*1@_arx1_AuhqQ+PTk1 zcAy-`sIa5-8WbA&L#!2ea9;V_?}qQ2 zVCaa7T01?tbe7apYSs~Pto8w(m8^_r2z8uY@Eh)dz=4iB44;h1<5RnL&nRM!wu@!kl2Zci(xJFTD+D|ln%!=j>2&?H;8@d`9 zS}`sL(Se4rj~S%%UOVuP3PPptu4_|*5Nq{JshXXLx4<*l6h$#jZd`Q^)dQQyeIkEl zh8$)yDygq~cI}h(>PxRpn$|swf=I3lSE4UA2`CdM`8#}3dKxAJuZ$9SA$ZBy)#XHs z&>f*$y>BM;%v*E-ok}TAOSTUkrriNLJ=P+TgAuhCxaS6YtXBX(dzw#Up2NjDOpj3* za2y+{Dcn)tbYD-PB$pPY&k1Em(EnMbiPOUZ!@Y@Pw-ZENOMfGQeB+xYYhB?Z@Ei*U zq`gF$;BL)Tk(f|4cvP?@Q3s`br_>?@IBqRkllJ=SzYc#*W58eWUj3SD&)+!4;ytXz z9U6JuWZc6zB@i;KD$|ibBy|vyeBOia)Ui=dI?v!h6w-XU1D*6Qq-M9s?-+adUKldF zB-}uQzu;7CjxM84v%s~tSIk>k(|}fhbl3^OK+aq3@Pw%D^tCwKg-haqwyaT5RVHIEQlDeX+Y(#W>hxN0>m!#aE-b(4W zNZjsxZZ9$Q8PZ%Mm0eI`ayqjj;!nOs#`RoVc^)=Otsy-{D0LlGNx7@I-l!?VSd9e# zL75m!N6H>z(ojxhnpefVyQVni;|2Ha=(4dUSCvA3t=8yiM-f4Pr&l^w9TswC=(F4F z5rLs4C`j6`y5?W~efLHD_OCf!eIbX~EI>Yd{p96e|MH*V@eQ)cSK;Ne^k4jU`L{1g zh7qhkRN&N&mwNMw_Z*N9+5+v1uc+Mz4q$rw@Yj7--T2YA)LHdRT9yu4;~g*fTHFsL zn}rsIilxC7Lh)M=x1vLd0(J$2sn1=7C2spPIv1tXOPHZ|}BbW0yT>G-)&x zj4!Yad!}xY4@D$ZprjgHYgf%w(1ge**FXrtHdKmo zl)m%t^P&0GtC^(!)>y;u-b(fH)9~(RuU}iw2`s{OA_U|h&}a#b+z+D1RUTzz8jKj~ zkSzxLOQ{J-0o9wZ+7wb4M6nNeUJYGKwLg{OeB|^Y$&k1$BskDeHoi>~-@9Sx z8a3LHq$oEBbxr6jz{$^>$5BZn@~|KFtPFH=1{7I{Yp?y~C7C`Q~jzy9x3>c-X-S#9k4EUkoULt-H zd{8ZTcC3!21U|baP<$|Vf#1BdP2BSla^Qpq0096{s==@2*eg0}UnmTI-X0bP@)M_w zeT9JmY2H_rl1O(58PepQPl0P1Lk#O$7T!XlMsT*9@MFEWKh9_E> zZu)ps@W*vH_yC|9gmAeYMCD3S%%!7Xg4Xu(9bdU`51Xw>fF*YiE^tGpY)Ynj$!xzg zox6=tt(0+SsqD+5Ld(?Rg}O!IHclY0)u=M0h){55Wir|*#(RmE&Xbm;4E1%=aSF(Y zFm#5|w(xgHZQ-ZPFs(xQw=Cl5wD4`m1^)u&7JpCK#s9DG!~fqu0KFmY-Ht5Ro@Aup zYszqNFV>dO-m5Q;^@#cYsJNojuDSgmJu0EMgQRxeF0@O2rhuZ2r@0BWS*jLSpQTDT zv7up7v9&=tbTKF~AQ5@k88xIUfoLX~cBr;eWKbJ-s=sk1b&cEL@(2h$ZKrO9Qh{Wx`d;VGjfyatE8L+n>?rPe z{sA(jK6j1l65NZ_+@$POOWhxi2U)^?+F?>DRis->#QZl^3LkFhE`)(kvBa$WW`dPm z4*(CnPUlUfC;z0V@Yk=C!_*ge_cpxz(ZUiYR5n{cu`ao7Wip?VV(*!=KAfzsZkRtF z&;}}zERT6oab(lx?%*}P(=<*3T#DAZVZb;a_GAw8D8j8v%VZ|#P*^k5qT&L2*H>hh z3Ln5FMA{N}7|l@Ur{)Z{-Aj4uX7VEqCx@sll+k@>l%z|1R-7dH`%^sz5;1}I@zl{5 znU+#@p~Dmcy0Juv7J)zy%)%_zKy7FTZZ1cc-?L4X7g=9~TO<8_&+>6>6L|W%2-+;G zOL{AOE4V0sNhc88?wR;@R>Ieg)}#!VozlZeSy{eKhiqpd>v00W3{Rm7%I)!oLVM6O zKvEi+J(Fp9SmeI1TXcz>^1`k!`xV3o`2*N(%Aq(XV;@LHBC>Y%?z=U74W{Kl9brV)Kdd+O%_v%Rpk?~ zVr7F?Q~(46f^8xgFdVbgXmWy2!CJ3dhph)j>$lE<9r8#)Jy^0@f$E)5&ndm@*yeOs z*W|-qzV&AfbieOlfIB6Kw}pl}-$eRarRD3zhGipAFGNa6`g7bcZofox`MLREz(-@O zxAD&DB1w8$8efqmmFZL4yASd*5mwX04cc@zgjK)>R1(i;iN6KA3z#Eiw{kh^a!PG; zY9$?<^A7E89J5pd&!Gbo%XtqoKS?jsIuYV+Yqa+@HRS}T`3z}SeWMgs3+)wzc}j>7 zBBa`ZNT6_O{4j^n6oo2}t4{pJiUw@gFg>4upXL{!tH9PGDRG5Y8^(i3^@Bvx`vx9c z;1wYqrc^nFON77^?ks#f=hH0^jRYKyZ=Zq2pt3SVy7n0f@Hq_mFP>qxwi~B=-0_Ev z-4z3<6jJ)#`AAKp0pL+y13B^l`Q3I2d9Z? zPSRPKb|UE;1prijK=~DR1m<~M!kyRCU0)>2Eg&%uspdvr%*n{N#RBglJK+U5G>r|O zzW@F2ha|52kQ7;J|LXOt{M9d@wQMg=#{pTZ;!JkN9a3dWgqV2+SrPlIAXos@L9BcC zyq>uuS4;CviOkaltuNt_ps?(Nc1~H9o&gfi*wi(Joh4}k6Itb+W}{Yq=gX(~jw z!uHz%?vkih`-U-ealgVfPz0h>B_dV*&kmtQH)Ovp2$dFT`kY?Mt1uZUpuoRLarT1` z_^dvAe1f0-MT-3c)U{z1AV;E=2rEAz9E%^!i_bKgAcJx4{W8t!>*ZsK^{xhyzyu7H z!$no2L<-1>`zHCkZip`>Jg$zM+hDq5dZRfAYs&w6rE5B!uFJA$40R$wN9Y>wqKxr2w>K&iHH7mh>CmS&d~P0gUhDf8?8 zUHa<3y!;}(`)}Ak!`cO`H3Bj2Kz>ZpHtA}*B&rZ2mi}SSVZnKubos}*gnX;#Ex5;x z`Z3`e!H-GGu*~^i2V}_DJ9P}cep$s2c>sxunI5-so+EHrRTgR~G8`=e_kEmZ66B_7 z-CF3>+n*1^cn5<*pq{=zsz23`z9eTG*>o}$Bs&?t? zZm-pcY~oT<4be8Rg#x)A00vS%T-$M{Ka>)y48t!?xwMvG&3F|nrz{fG1SiOjm5b|w zs`Q)umQzu-Sg!^1M=e68eLituxl5;Thob+(g~euI-A>!SN=7HOO38jRYm&j8BBV@B z!t{nDPMATrivavd+mWte2NHaOq^7>SmmaGjusBDxSA(u;x`uK_nsnU832 z5q!7sJEHYYO=ckwuArp3LNz2r$Tz#8q#Q{xk`tsN=r${e?mYp~bNUi)WWJI>hd4cME!EgyWlUZoY$yziECKavG7MF*AmYU^GgCXk{CdGAkd<)D|_x?|DFB+5NqW_ zH)#+{(M4)zG4QdJ1EqZ`NEC~Xx2=Iy&rWv@1y>k*R0%&8h}XjvD=`T=DCSihT02?& z`B#7c58>~>n*;FMzx-$TxBi7f%U(ZBv%HT^_oK=m>>W&TM1xfc6;9m6m}r2DGmEE9 zryyxou`0qdi^1WyjXZ9PRDfqD)_JO+yj0S0clQ0LhHx1cUDydl2j){3pQ- zAUOPl7Rx~s3x!jr|AyH(X+fJPn7qKl{uNbQpSvbB`+^Jqlp$F6R;t3oX8%&g9H(1X zW^sZ|rDpGIdgT1xx8g$JtU@e70CCxTEba^HcVrFTIm=1`0B&qjf1e+A?6;s>i1bz( zg(j$&p5%by-4CQRB|Ldhx^Q$4MpSWj)*v6mo_A~u-veJE8SqsaHnJ}32e&JIeG#rv7$G_3-Q(3Z&;d#4oKA(NfR&gNWnIqxXTAn&dv_xgcQuxJ6RN?DIaH^!@1v`1M1Dz$M*K$eJ3BK zKfHb(zD;lc^5rLq{m%dJ*XeLQ`%}5?Y3O48(G970bwRNWX#|RWzB(#xWRDCY0U$o_ zk@^J_99EaPSb2ip_cXHGmciZ)f^aP!q&Hg!h z{))F^o*vXs0lg&-PI3}AXmT*5s?7SFN^468VLDcYm#OvJlm=Py(Kma4`p(~m|K&UO zz`u|GrRy)B?o(R~@`4UhK-rOcu{{`&;s@@$(3dFdN{Z_ilhUC*BV;Y(mnul!cFO=4 zwvf}Kj1)$+MjFYkxYIh#t^L?4$e1s%-2gUJCF&ic={E$7IaWV85Q}ifXEx;%g zLzBk^CcT)fdj2p;7>V!T?gC%H;Br^ybnxc)<xzAhO=UQ?91}; z*ya)&7|tJ{jK6gywTLI4ocIKPty2V}R?6`R7IR^Lh4eMugh}?1xa-}@h6fcC=R)$G z(S@y)N(uE4RW?B6wblwfa zcH|X%Ew%B^Dio0ZVnI2Irqc2XnoGLG0_#jRifPfilHmj(3Mp#~l95D)G8wY)H%;}S z)=CQMw#A-;89^MyxZH9q#6NLYgo}ecVp!h|qg`;16d7b!hu84Eqttfb_Js zn>^>OxKlT9!61s`8|YSqiTd9CLtS0s@TW6Y$`20%{U{Ip4!9MDN@cJ?2$ke0(L&5`%y)+rYX6@k$+5!3leXn4%nvBHFvGE%c zeLU;c)knSAB$v>?HqNcWREUZOE6L_U_*OaOl|%EsY4tea<|^lP48Fd+$zOw(0JH7% z2-kHFbd{rsi(JdIrUbi}hZ;Rw;tsim-ybSv9Ak^BK(8~oOQ6{}@(sj9)px9hYc`Hr zVAKmO=H=$DfRnQ#1TT!tvO?=W>mfmK;3Eb?OcFxxyCQ%+%g#)03K*|R0o5rik`);O zpITTc3dB)Wg>)s6OBrZHTYR#$m!X5-{mYB04u5_+iqWG|avgjisof(SC-73* z6Z$G8th#h2m>eZk{N!I8IB7(bs*X5`6@?prt@kd)eiE2BxJj%TNr29ljCuLFZ*p>$ z8{A8%h}xPE$L_esu|v-)zi*=bA?Xe}cjif(r46?1&=&^|9q3MkRm#^;F8NRv8eMYF z*9JVqgv(B2>D zFm$+itjZ%{4Xexx&Ni^{-vU~^DxP*N%K(fGgo zWK3jSt&OV@xN9?V0Z0iEj8)x(FQq2@!<8b+a6TK!4McdFyrb`2NcyId#qUn< zK6?2E5anl_zSGlFcQzc( z7a}$2fi1FKM0m4zRFjpGpTHRjv<(AY)9s2=(?yrv|E6o?qb(}$ezdG-w_o>xXIDLL zAwfqn%W`1Ji$zPHam^r5>TCf^>f|^}@6sL|Y&c!(J*UjIlo4lX%6huVMS`im8~!K# z^{>KrlQkIfL8=z;`=A!bc959jYmb2N3W!5M-gs zHxj%F0051kt59zA$|>Qxzsqo82_#s_TPqM7GP!y;*0@SQyqLtb>S-J3ZI_Z{I%Ag% zKHdomWiVUk2y%it9_*}1o|h!**7g}TXck+!%)N)29U0ceba_!RS)S7Eu}s<`7(J5xQ}I_jTvK{E^)Pe& zE-4Zv3X}6G--T@wD@2CL>Z_?t(gbJAs9VeHJYdhk>5uACa&~xxC@sC*g6;wAbtw+i z5%plUfzN@JxVoN=3e1=cF4iXCslD!2k0ElT%aZxld>*AixHy&ItnQlp?eb2241Xl? zEd`z^pUFu1xiK%W>o`kZJJeumj6~`{z=*Wqq)Je6ej}|AaPOQYP8lMf)G^RMKrD{p zVzYZYNT3*)mEL{)^4phRNI?JB*FQqe{^jT4-6yYq{PRD(`{?zvmk(9p{_VR@UVi=Z z>vtc&{^Io)`jyX_mVX&ulBS6o6Jjr(-l;dRucvOhHnmXx#O_tC#Ox&8b*e!ifvVoQ zxzqzlL7hPI7*?8~s8`6!#3sjzc`ti)0}Jb&M5i&86uFJDO6+2ss*exeCsuo7_CdIXh_<{rFNkxh;SSp9DU&c>?I6X z6h&!U!|#Xhm`ml`KmW5FlDDsa0*Lu%uU}*75W_je;~VHVr1K(QyHz<#dq`eTwnjd^ z_5PqKw+@rbX|7kG&$Qt3fpM!ccGMh<3iaRIM&?dN5;~{@ratbc1ZLO-<22uf+KOr- zJOkz=g-!m3s}(Og0rCm6TOAtIcPMnx=C`unEbCv#@FcOP*;#F0q)EV&W0XwO&d^Ob z6{DgZYQ~SPIRTABnlt$CYKZahfK+tSM+Z?FRtcXR9z4PGgdFKsZjWRW$La!TAdTU7 z!vBg@LAD%)DE-e*Fz78^=;|0Ac7Lfab7T8^t6GEh@7g5MZXC#am>o7=?SCt<-KazUR1iC}k@5yIl zvsB0r;Q?_O4Wy5dRL)njO+lBEVOORa(oF4AC!p;cWI#egrHqE5b7QlWGNfrGn7qBllUYtgk z*hDK^RHv!~OOg&2FgrqJflbrlX9<=b?mmH*PU;RQI@t8347Hh}EMd13C@n_1}kokpIasd;OCMkmJRP(c`n%pS`@ro7dkb;5`VB()`JROvm#_Qk}@} z|3~v)g~kE+r`G4m$C~aX#{U}_%sw?nYyO@Fo>Z+4XkM!po_la1^hv>!YdyT#mEPd# z<;^aIF`1}9SIPOvRl|sELNX-CmV~uPF_76!5^Oqu{Ly*g@+2T8$%S4VX3%gXQWeiW zZjw$1gM9gZ_L9=IJ%uh6kUKfz8p%FDnPz}Q(lj=wBqneF7NTg+e_=oMjam|f*Ke53 zzX*T+Cw=|ASJ#Ke@gSa2N<~cFY^8dKPA?!b(r(|~B@kH!CM6ueL%$Mh5@HLyhs7WU z#ru6hwtkPEI6IPmQZPW^!f?7m^JkD6QS!h9-qK7VRXEg0az~5E>i&j3uC1P=6qmbP zDTS3QCv2jn)P@YbBp9kw$?w=_7Vv6E;{*I|m|Z8R&8VMdA9*GlxLu}lr zsz4ngZQy9Me~Br!Y%kP-mSy_8PXN(9cC-Lm=g%=~pl_1I0O_ z%TN~0NsDW$(nrPq`F!jgau*6op1kB4@!cQT7-o1$=xgN<4x#gQs8^sJSuA({_|j_J zPuJ<1#H9c*GL0trI~rA+RQ_j|wl=GlXGA6GYx`*$Fbx;7Z1J2Q=A5oro}Mte#F|)p zk`uu|o?ro?34QYUO|hWg>6UAj9RgM-b63$X7Q6L)9o9?-_5$jFje8Ek2|n4rkP@ny zc)ULN;DZNa@k}EPFBV*X_WJwq`djJske_TFwH@JRn;RTI#gMqX?+WQG-55`H_ty!8 zVy@tBsNRRzXT1~Pf=@~}RTc7S?U3wUS~z06e_9|MG@T}Vu5WhR;lWoBqg=1z1}uL3M)38e`G?2u=<3t zcmsKD3P&_iwF%^c7(wz(<-S@4fWV`e#xz~>LICcAU>{;2haZmD@L4*DNU5nYxX*E+ zB7WSqma29E?&luP(fhc!uRnYJQ;=WY8nxn1r{$Yc^Gia5^dJ_t|CC~zR;qiscC{-Z z!s%&z)Eg_#@nL+4g$k{wVu(W$o{CgY#CFb6V(!>AM}H>M8RrXU#$q*;<}7WFFp5*0 zhl}5gH508`P>p#N+i~xw&Ots;>x=6EoVqlJ(|D(23{LFn0?L7cL%(GX*sZxBmD+Ky za!1-gg5Ex9dE{8wV}xucwkZ@FWPx4|y|Jgp=Wt+JnDP^fs=?N+@;T?i7=MoZZ$cEb<<%6LveZFD6cma=wN$Kg_yfaVmVb9=nbxRYv@Um zW;0INDSLVXvYX@%n{JIz%}3*g=|?G79Bu*W@mEUw_Hhut;YYgGfB}7*ohek3qKuF) zOV=N3)2rus2q5|dN%Fi4QYvluBypp%!Ov7YD$ZiT=eNJ#F$ha69a|HZrOAGvB0m#K zuHMgkP-sfp3tpKgnMy z`HNg`IlwC<+G95RJ}|=ZcK}7(6CWRZq+EwSEqU*N%)2yz1J0!t@Iql;56prgi|;N{ zYKWY-`M3|}KvBUTcbK-sys?J`;2z=V@}!%jpy~1bUhtVa9ZR}G)OJ$66(Q1Wtb^I3 zN^LoG{N|suE>7vSX*v zE^E)wv-pgktanU4vkQWb#{r^9?_6B2*f)$dq(SBSBzf47TmEyC7EFt;X|?_D3LE*Y z&2}@IgP@8qcr#RDw`MVXncA+*%2_DhB+y6{2U*jqa}W*->RMvDDj)e&s*;;MkLTbz z@jYwAUV)hw3nA`CCFn^-OKtRb!KB_G6&KebhUXi|bfpCf<SgiknYgLNWQ3b+B(0N?ug?sxL*cCY5^3zG=uJVft;ixa{D> zOh>Ci#rLIwz`CAO@I%p!_Kfu7xytU!)A8j1KKWA z#veNDGo&)C9>v9b5Oi7zyU&3d^00*pF1yjM|J84limHUN#KixpH7`fc2Vz?3>-I6VPSoB zN1Rm!9o9oaxx;LV$B{XBzaYJ$NNFw3toYzg%gv^n3wX1O>o3T~C;l5)@OdlTDs_Rp zD3;>(p}yIRTK{DG_iuvTY7ENk$--58@#8o^MsiEpniFts`vTBx04lm6oFs@H(rl)X z3nAI!s=Rn9F5OiKsJn$gi4EFaD5G`~Js~z{hX`#--TBU_NuDv=9Hjb_;vL3XwV~ZE&kndYo>L((j)A?#0CK~>(O21j~;O{Ls>1vF+Q3b@X1@d^M zLLOZ-6cL{uB0Y_c7A5Vd6@;@aVXNCk>%FA+9#vmYFRrdTF^G}0!SK}1xp4!oSKpR3;+%*q**C^D-foAvj_vW=?I+RZ1G zh@lQ+9n6>^)$--!wnCwC=NQ-~Hjqk)$%5uGsXiQq|9Yr7?k@g^elE?o?K}*fYkokn zsiD>Lge}Z+z=;8dB1`uKB@73| z#)nBMq-&(RH6`}71vgfHW_JkfR$kj@2~z7+b$QN%)hN`4z{?_JsvM_f&{$;{8Vn?J zT5eG6Jnk-c%3R^e4;YRtne>-fm~ve<-)Ae$-wq>W0IE)19DABcp_a6f#f+|*NYfFb zL6&ZH49P79#5Cl}Fx&1~z~>q%gmf)xI1!~AaoK0ZF{LM|u5F`^ywU}r*%tI~b5LhX zTl9|Q0Eo@jt!Lagh*p< z9mQfZ%|gePi>v$C@BaXE@DCoCabLcEK_i|o{PKRJ=+c*u^q;>>NYmd~*4AN}T(P~c zC43{R*k`7bbH_I}fnj~GgEjTr_P*$%gB_G;%X_Zm_}$-x!RIK_74ur7MtQRn)W1M2 zi>xSQh-X`b7kYKnA;=agl?}?|d|=|-PZTRj6 z_bjO3A|PQVD^?K;`>(EaW52%rmJZH`uO9}p8j!Q~Wq3`_*YE!KVC2nb)d;Y$A3ULY zJHDwn^fE(A!wH&d`(jVgEHD)HnYHaS`y?~3ECGPJryz4PT$!R*weF@y^GMs^WbbXM zVWGvSvNEKhs9lJ8f`x_!;ql;#Wt{dKusul|ypBo%96GABj8ths0($WNKF1rIIH=1{ z8;VLWCOLjdfGc~6&BRiW>LH&KoPCQtu7@CxwC)_q4?c{oeen;Pxds>dQ`B85QkTP7 zQMHb(?Gz#x0#**$Zi9eSa54v_!P(=*8OeG?F=SD0@sYODJo~~NuR-u6$rAlaP(}50 zI(z7lq?ct_7n6!Ub|twVL||MocD&{rR3N`%(BjFh3Ka>&uuVwc#{U@p;U6GvCT(&@ zki^|ZJybz!?R>nC$-k6Ar!8D0@?*%3*+RAuD8rhiI5vZhyt(hZ~HySgF2Z~$Lm|`S=a?cJ&-xX>R;EMo6 zhPeg(qM}Ynm@7LxE2bM{VRagiVIpe234!`r=SRJA?69E`;LS{wBBt0+5vtAf8Gscd z!_D5iT(QH$N_FrVQ{SO=3JI0-tnYjhBHa;(s8Wm6eElpb0%N}#L&cT18%v$^pr+(g zo!)@k^{H&v-^f zK$zXbNOh)gOUD z24)2PL>FRMaKg>JFTlr#Hge?!wOkme0+ux7#*)T_zllT3rIr9p4OLs?DPf=~%Ln`8CbQ8V(Xo0Jc! z5);5j$`AT%hXUeKC+xmP$OLImWG5P+$2%o6aidbXmNwK!)=sb1%w{<9_VpW-!uuMor(KIq zy3;~CesJxm4b)PEv++H5taj?M+5}pqSfAq4tXG)5I=I|G9F0XO53>&joq>^-HTpGNm7ro# zkvkk$DBo{!O@8!TT_CH&x^z(s^md+`VsspYzCZ1!n6uZGtmQWT8IG-}+>a5><<}x~&a8LCWxMw!^$j3Ki3KSPR`! z774juY$r5d&ioE_4LJrme3IV`MUu;oGjxyWb){SxyMTZJY9m`N1h1$H_YzfBRZ5Ub zvd~Cu-=@s1tCWj09qJPe-^~nGpfEEJwv?0z>a8P&7FPq5IMqVRGYv*Zvg%amouwRF z1Gubsip7wtdWf*77a$PTb8FD4a<+YDs}2M>F@&;ol-s9$F-yPxfZbql7$@+m5?dwS z7Eg+mo)Ya(Vs?h$*XmzKH(@|o3_3KpWOBl7*4!yWR9zYgx{jiLVZug^p!*r-2~r$l zmPFmOE5{EB0tmWxvrr}Ora5tGI{Wdsh*I0mlN40w! z7>Q6#dy+%vFa;3B93iKM##V_!JkbVHg-%##D4-+zfh`24?~@f|MIj&bV6Ke@GyDzh zEk0%f`P0j<9--cVr~Tyh=kldbUVof^&wm9R`MG|F*E|LQdkusd@ySztr zdjZj8*nFP)X2)g}Gh+OrlnbaYlg`^E4&aJs^gt+)&*UWKBs16&Vg7QKfb;-REGH?i z0eT=ATrVjF5e_|>LmJIa*09q}_7v6s=XH@E7 zP(;VPgW4uE2@e9<+qKAji2~623A3$Nxb@=V-( z5sqhzmx3zbBTb9?YhF1smrmU_;Mmo)(Gpe?m!79#js{8E<=ePYM_LE}Ft*1eN*M)f zo)u(Y2CX}@MvnT%Y>*QjH#l9TFJ41O_XK%R4@#2KvnatQIY=()MBl)A@)Na9O;kHq zHMa)8kJ?jUg21a9_GJjPU8TH!7V}s|1v2R8Y4Wv%g#LZRvq{atbOrAtbO%qw1ZKdn^jSKoL(>=GxpSBaU_0q4V_x4UTS<%IC>DrL7!{A}GrLNgcWaI+BxaRgBtHNfcghU| zoCK*XHB(G~^xuXDN5J1^V-pyF;O?CEr7Y5rA%$hUO+#B{)v$tuwI(#*M?b%yM)PHf zhj-ePzPm5Udv3OJQPo8?YO5n^`r;PlAZ?($u1kI=Z$ib<6c8+fgB#NDP6B{3igarY zw(L}KAEA!79`51gd|HERjH`Y1NvaCk5UEk)45>SZhqD7QMPkktdtgp6>a<%f*{F}% zryj-@S^I4$V2F!jfi*4~8R8Q$+dj2rNPRt~0UGj{v7^L%N9@ERurJ)hrNbOKy#-(= zxN2FYh>2$&n-yKrp8G)g<0EkLo{AFFsM-kuK+O-!LVDpr)gc`uC?GuOos>#G_IEwJ zOiwUS47HpLDh>>Luz_uHRgd+dkVYhK;pmx0>Yn~bKcWB8Pfmb_TK9Rt5Jb+;J_n!n zVsDXU41rOL{f*Y_$P@#d5NT__UsY=$y@4Hu{BA}dfDNOkR zODV=fb_kN!si zuMUXVrjHl;p&s?57A5H*B3c@hWm_n=zG4%#2Gzv2FSM$CHG6q~n36=Ij&lsCWusP& z(%y6W1OX^Ftz5BA=nvqgDjiwFCemP*QsLQp{(!$|dbtBtFHQKvij0K>>~VJ-4o(6F z=tJgl$B^xWJe&DO$o`qdC-uD%psS4JGpP1LgZ#jO^>C>(4ul6vQFs=JT+Kr!3@R_C6I)aZZw?TR-5v6sK7MiPv7UQae zR+X2~S2*J7AS`CjN~s9Q3thQZgFY2D>5V%3O|CH+{P$Prbg`nO5^0tZh|C8AL<94Q`rHX=nsz*bNKe{e1#Sgp#I; ziTNbxFFyv-l?r_~o$oqj8cQ21;WynXpTG;xnjMm^j?}nIM#ThpRYn5&0{AhF>W8K2 z6`y#7S(_z)eCDpb6_bbQb5>kv(`T={8WOnVR`gUIzV18$mnle-dXXD6A+lO~EGLUz zhsjeIeWU%LQh3dJ@`xv1`~#Ij6C^z)=~#U<-v6S2F2lW(e>8S!Ad+tFRx>$=uW7pY zzBH0G*F=-Ne3ZVbbo~$Y_5Gkogv5O4{|BWI!tK>0w-y(!*mMPH=@UFpES~AOl+tO* zR(b@F!g5}G)UVS?3#IJjyG;*lcOs6d=veoR7=`xQW+4@NJfMs)C>{G>gxvQ zaAHqxb^T>mHNx~-@0%sZuuA2HiV4Kx4$?Ytm{eH0bB3ne-i3D=iWyG^FCJ^Htlo3< zfdY9PsjAc$_}J8$X|%pV71%77?Of0mI&@~K1nr8KABX>_Zw`P_`sCUXW*6SQcYUqe zDiG!FAaZ8W48v@Yx!J<5yWv@!0^-Dvu5lG7KnG`Lv3RWTGf6fniOM(GZ!oK zE~k+b8F?!SEK&=opxuY`+2d6$D(lvTR;r*MoTfK9=j0?M9H>WU1uEKqG?nsb4a?zl zEC7wreM7P;ldc8?qB0VZtnQCA0FH1@`d0gX$$Gn}tW6Q21v(v&D{qvxV+9-wb&=}}2(g(eLwsRFycHgG##6^cT5+zClV)+l*LBDfmn z7BeYyxLeMS!L-BOxQZIGHB!;o>ab#5`@0Xq-#uU^zb2yXYwiRS1mO4YC3r(q{`sHq z)jzU~)33qaHh=9d`PL=Wfi)UVAi)+a0(!cWNu@ALE4q->w{GKu9QCT{KrW+Z9sYA8t^D!_R-2j`z_iQW!q`Usc}>Pg8%gWCbV@ic zeUY>THQud$2*)V(`!2=8s6v$_$H`Mv-&h(Kzz#aA3tY#2%LC)KaC^c_LR^PSaY)d( z*l|@2&AB)lb3bm9lVdug64jb`0?U4po)0V+J5N{-8991yteuv_pV{#{n8HuKR za-S3T4=lZ{lveGiGG&e$O(?H0Ve(Prg$H6l3!0uNuqa$FM@>pn>m|osiAuFPIbP!m zz_~7kD(0l;XNsR)!W&G49!4=K#B{dLg9+YgcMG-y8w38LAkX(hQMM8IFVf{gZdb)UO9)-x3y>KwDI5B z;P#Lt1{)EpHcL5=kXW(lYuEIszF{I&N`-)>GCBg4U*glj8s}7;l{h%vYyqGyQN|#L zzK6mE7+CMceh2VtCE5LG2oG&GbCOqQ6mX~Oy>M>i z6{Mog@#ohOGZLr0sMlVn3V#KMW@<>4!g3)cmrHjYu8A!j88#_N&qWQ6&sZMA0``84 z)9B*r4+pM-4%@>`Ca?^vg5;#rvZpDkCEX{VcQ3746uBJ1jENgsoT(?RUXry*w?TG(l_O%1 zO}U;2s*C;1@8^n%kL_I}glr;LuN`w3NID}YJ&i6C>;S;&Zzsq*9*l7?(^l&q2J+ZT zyhmG>ZO*4mvQTjs3|+9%&bZoYw9x}*>*;bopmb*|Kuhc@SDqO3@taEf(iW?{+UE*> zT&;3ov;27k<~+-X(R0!37P<%=w$xAWi$nsN>bsqWq{IJetNhPR`|l`fCz`AH#K7_L zU0DPz1f^V7Q<1#G=@y>22p+;vojEl}7gVF6ZMvjSzI5EKY=s6Q)@EAJ*g;w6^8FT0 z%D`D}9N-!!rHe212_6?f?z0K)R8nB^x?t|2&l_j>98E>dh;OtRlrE3OkLtH;r80X@) zFo0D+U=C6VuqKaV8}&T(w0Hq}54t>f4xHi@C6ERap<@5Zyd_`0dXNSD_3Kxr68Icr z5=Mp>GO?p~C~Yq`2u^;J>0<@Ya2lm;kMxntpB=y+3tREQH+Jw^jMzB$?X-DK(SjoY z)8UW|JJYA%)$j?gJ1+3SJH&XZmI`rV1Al-)Zm+|Gt^2$;QA#RTGMTi0wmYJpFvRD; z@GWwN0>q8&0FEAjKO0Hyi~9LuO7AXprTQW-X`Q#yNoGLAUco*oci{Y_MuUgT0d(n^ zqF-0gx))lGtB|G@Cm@>5w&Q7!;(hm2gL0FlPrnT?E&eHgFG3g3tTl5ITZ%ZL6*i^=%0V`9w%-YD1 z1?qT~77_ZMUToHTX%eOO)IWRuB)oj3grJu%l@J7a(2rk#0cqL0uM}>|ea&$tT@6?= z(f7p-p4SZ(qWkb{&}0qSNn!>hzs79FSc)k9?U2uod7f3g=tk+J8QZ4yG{LkESg!QL znc)Oh8^qZ|-=gQ?fW8o;hOP1k>7;maMn?ak(?qhF8Ls0*Fj88F?s|>=>R3Zq$EQ3Z zNp|ryiewcW(vCSsH7FKoekK>X4d(Tug-1aQ@mh2|^j#S)msIa$FM&1Hy%WdUl0VK; z>sq2x6$b1Xu|_||2whM7FCDgIY7Ndc`m#Rj;X>ap5EioOd1Xi_Lsu6MjmK}o%P-TV zmm@%kFXRccy64t*ORa882sOK&(uMM~=w4IEAy5o3YWd0R@k8rVB~BE-jqUK7ZDfj} zd>~N(BgU=-+LY3~s(KaU-#jU1%zD{wnAPsp7A1wxXvRs3rDTaMKf|-L5hV5&lr2=x zmcG*ju@L8eiH-ujI6b=ErCx+fDChpIlzU{DVG~0;2u>goag1XKd&8nX0XPgn0k8@j zjV3J%>I`fkuH+qIAZoG{* z-BEN)T^Xz>nIk3!5iDB6+O5)B(tn^=>$zSXEVA~ca|VcbL0|q103jthzz8zlDkf@o z7JaaT1^ak)f*{ycKATUD0O}M3@2H8efpgL)xfA|;hPj+^DbFg1AD`c6{?&{U805?o zRQ&j8o%vk?uWgzxc^0UW4LQ>SUbiLV<f_QfII+ImBpAEETVrAzuT0aKzIL4HZtc+tWUh5vN=w ziQttL!Q-y>cihsBP1sh3`d*Kd)Wz0f4hhyGQb9Nwf5^-la+bPOsp%7+?`&-!vDd!0 zm7`Ga_&3~LtJiUke}MCcl42POYg)nY7@=5rrF;Nm4o}(BK1u?Kl*J^Rp-7acFTJtsM zptIao?M(9rfwK+Jqp@sWH@9V1aDH3sE4*M#!Ajy(mhHfnk^+n33UYEzeE&?$;Rty$ zo5;6lA{-pAd(js@x3)p)8%no21$U_s;G`S@ioyg|gwzQ&TmUOITxiJ&Mu0-5qGbIX(p?d<)?bv?XH=aX||Ls^Kt^KQOU? zD`9_l$^&2;iCwG3`K3k1?^^>KUzv3@l0*o;6$ixLflxwwv~@I+L(O^$h!Zd$h~8tL#&TWkT>BZpJ%U zk>k^R*|tWtEn#Gw1@P{U_U!YjGQYV(Y0!tzZ5^a*4B{<=oHR*Ed_GcAXwq2nwFyxH zNH81deV#HllU1aOaTxw7#Gx$QU#Dy5FuF+$sG&9^Xllv$rdtZZ7KlpVUvs@&OL*er ze9v-k7G5T(L6Uf0vsX|$OVz$!jKBtPv-!-TcXXy~3BS^dXp7XfcjlCKykwYA(-1c7 z1AcAkt9HZ&7&q44x=+y2?NeQY@;#I@JuTAxDHWx4mGOs*r@(VVGHX3L<_}~543jtk zD1*ZvH+fP}#c}z$!baEa1{-ilXBXL%Cz^H!@{Ly3fn5-M;h7KGtX^DXY|Ozo?+~bQ z=07t2Cd~s>DLB6xU~ou7saPfT!l}=xA>=gSyx|Q-H_cQzf?tU7K&AOL<4`Pl++0vH z%cpNhF%_w90R|H05jn=*(RPiEl@GHOqiJSOo$k=9_hAE)j|Y}#Ix>o&zyXom!^kqs z6Es>*#Xe=Yr;({0m!pZ!LECLntd!4qF0B62uySwm>7l8t&VJ`Hk?U`tA#Y)}lQ4)1 z5Z?eRe5B2dCmJfb@d*a7?ni7+qiVOkQ$^%v*ZT;5$4=W^tVW&(2ltCM!1fq(xiu$+ zhJ=fdh+RjW4_jbh*&T|fWf)LK8>u%sDqn%{PL61+YOo76?&Sih;m8eI@x_GSQRP@8 zrrvmI1@!j?7QsEcMo59?7Qs3MEvVd;4DW)KQgXR~zilS0IeWmDaK(-(^0%F;EvI#F-75$MbfXT7MhzosoL^v+7;#bNKgUY=DRLMPAbS*f6-v^0{cs?Yi3A^R9<{k8&#jDc-|f?u%uV-kgM!nd0BU3;qfG4CKC*afCw*p zSW{GOTi^$*T$o6uTO^y3 zX9%Uv@P+rd7_wwFge6uGHHkwuKo=v42?MkobCoED~?mHZHs+F zR>58a%_~>2Lz^&fc12bAAhMHD4JD=M4jF8YnX^>9H%B{nc;;*(8Auz%7&YJT9h}d0 zG=@Y^dvaVPI+{Qtwn{*s5t~9)cBL?G=PU%;uWDYRBF!8?nGir|_Q4C%i$;C1S9NkZ z?qUbkkT9x6)r7qX#w3L=YX`RFaSM}TkraVGQTJl>rX^!0&~x<-cL;fp^;`BT(9pJ} z4Qkmtcd^Jbax_+{L%PTT2X^BaLY*S_@+NE!N(CRDdyURv0noIg{=Al_lgjbiQH#0( z&W8pxc+%h)$idLL}%XSn5C$z8(A28056QeSUyY{sh!+_L8^}MN2H9MPPrU@_` z`&PSz1#tp6?o_m>S}URvk5;NYyhxR74+VzZ_A`K{sog-MYf+QW0WX9`d=LT!dafNk z2+i1adk~Ujbzi`@_pJlfMJX7z0Ml8KHHh7*$Tf;Xgqk*dbEjlt?PS;^5hgx01)lW^7W@T7v@P-nykw;@g{K zg(qW(L|x=B+9~69!cG&*M7MEKOyqKl5|1JCV3iD5o>m?h*Y!)2*L!PEhmkilh4~0A zWSF43wa6+3Z8qCg?+4#(I5ee4xJl=PXT?$?yigVA3(2U|!|9=ssB1lULs}+O_$N!4 z=w~;08T}EPmr2dt0Cjdg1W=Yc$Pkn2nYh;{FqrlVlvfK@YL7OlFS+ENr`0jxP9HXq z!F;vJ{taqEtEP17vi1(rkn6AeJURfEIEacdxI zHK}qGz0s1CwSfY6NqVw|&I<`Yk@4zxHx9Rryn7x%!b@=jE`3v_@=}Te0McE9m(6zp z+*j2vAU_|@LUf){dG8f7&3dm?AAus8WdaDhR}aDX(t?>CYvP2KO?lYSFqm<9ij_g~BZe=h(3PWbdcKE8K*!x|dkpth9ritO5F0LSFJIHh@@F#_&bP7?RG z_{JQ~F|?HudTbsXYp25F@X9AuG&i}|@dTyLvpk72xO6!}J(Mug4qgKR05mf@t89L_ zYWFL(cd|wBP^yyB=nI<)PGa_&BR)lbA&}c4&5m-Lh1Xtzs8*7zV0BelGyZ7PlMzxX zyVjT<^*S(U)jFd$nm`>XM08&uJ(S!#wSw-5odd^=U8P(nhD!9=MWXgw$EN--!e3mZ zVSWkvj=uQg-{qX9_EBu6pCgqHA5#_Y6U;e@uUjB((|W?Q`GM9z7d@x@MBl&ypEfIv z(^d#knI526V#--uDvVJ}V8FnRB7k#~zRgwi^(}SpN0$PP{i!-RJ$>E+A^TG0*eW@$ zNPh>^P?l4hD}o_l@}F|CH*=z^br4YZpD&x9TV)H?;@qya_9sZUEXo zL-O6F6qS>F@ADLti8`qmKOs>N3^WR$l*p5Vl*>u&WY0~k)ba}Ae(w`i03#MkcS-N@bcpVEE|h`!MHIC>(qs>- zS?cZn&2BP?4V#1kj6~OiyJAbdNRhHzy5(3(TcwtD5>Bm|0yD|& zPULdEd3bNL>$#hgNj(e=@r%}MgqFwogn#w%D{l0Dr5}~z#(wsvT$CHc2~g*)bO^xk zk);W!3*m(LK!yk?Hrvj@(kwqV=vIdbb>~1si@alhN_*Vg;G4!iVNs(73(!(36^e?z zEiQaFPndGsO;5_NU~!@m9#${}%MVivXxMT(f)7bWu0fK+vtf_;0-QzbK^z&X;_KeZ zSxkrnq3hE6rr`$7i~v4uzR#d8_b53yCd7{mpQfzqH0}e}_6xdecY=;qI?9cF+Koi< z=u3JjNPZuBlqJMs9PqIl+zuF|W{4741-e#uti&VatVV$T(S_L1q#!j<@A>z!*u_@G zaRdie68X_yX?XR3HZhM6mJ#^d(xz0Ft)DG@#P+VEZ9L$m@vWseEZU9RvR7@ms@^OZ zD^O1quqtjw5ageBy8$d@H1AEZ4`gXaJ&% z)ZrQdrTNktvqW)2Stc0v$f=30{95zqU_8I6F|&$&UwzV`%W@~69|l4TZQ}i6*Ndq! zRLi7Vx_|@NSao>;k7zoBU)9C|w;h5$a+K_mU-nWBWL(>eBSa_^j6jNT_^MER)y~N8 z!DBW90(DU%dh;=nSrGT2?g~6s01c{ikHv>KUGZ`yr*^XI4pp)-mC)<7kC)+eDN%b7 ztL$EbB3iS0r^S1?w*;8KZfWsY12)s1#ub!dci1 zEuPsYA0yx~wjlWQjX(bPK)g0ESvs)UY}MW;D74yrYis3A&;fi%zC1_8q@ue{yv8Fe zmkYb%jECcXwZ`3dnY|HL_bV96Y1GYEf51r9!L>MRI|mUx2^$K+8OZEUdAkUjTwH-GlZ8!{o1;^3f2kJ5W)B8`Qyvq-< zq*KVPrQpP8lysAqYpZ*btj~yjBSF?0?@GJQu*;DGk=t`Qz=m~OQMgEi;eD5Huip^W z=b1BtMTgbC>i}an-BeP2yR#3M*Adu6Uv8WlhaJ}a_UZA&fMbn^L!R?#&esGxWa!6} zlq>Zva&i@v$9Hyox*?w_`k5XeuJ)(=F>doybtcG{mYed01!B}^7J8v*w38_N<=v%3_gbqex{SDTZyF9r!0E1s8 zR$~k#MWjlEmDqmEHQT+QksG@@;BJvWnCaWOA_jKHZIzH=L32}3hF_>f3Apv4N&7k7 zP*cN@)n+ zoCw((-@e1vR23Qjn(16Q=pweYxoiotf~Cv}zVo^^#qck=Q2JrGKxE3}7F)u)qY<{7 zi_!X5A3ysOh@8$!0`&{>`uclZUuP)uu{-zZ70Y%~x}FGqqd~=X1jbDjBJ#tj1HKDU zUXJstJ%1A!*-G1hX|vLs64jgL1Y;nRkCoe9P2+Hcjp~+jyku&56YU_NA8fg`mWH;t z4JD)qI>y(qIX({aaY{D<$r9E?`7`V%2FhDYJwrBqv1UrW?Xz3XIA7$a#Ll3j7=H!& zL}EF{PODK^gS~`QX>_z&BR|kI-D*hdxQPxXdlIRAswz41el8G7fNi*=k_e7{tna8= zwE-b>Mml3M85b1L7Qq*_fg!D@06MRi`go_NLJsR3CF8Yqp7H|j zxW1^y4)Bp`hLlbrOm_0Zqy0=yN8k8De1R@c4}Hv+dTq=UE@+ZU6R<4m@lk?>K2KHy`8<2xeXLY1x>%^lu<`bdSQDH z93Gp}%w_yGUQ9D8Rm|;4e}&4b+}OdFCK&U!TBY?Qh2+UEF`V(p7#g|DZgx+hZUQmxOaA`p0IayR_ZqC zK-6FXTHC2qah)aPMukIe%or-fR&pdK4@Hlg1~IA!Z=n~z*qBpYLrU)6Zc3lBVukK2mz%;;b`ArzkrlP{Uppo)q+RfIe%9;&DE4g4e$=XWFPubV2 zk&5slgnN-cEi?Sx0zviJz^&x@QzUA*c(y6oeNu${@YyittIy4|R@KfArDrlOhIuPRp*mifg$Nim{HqR z%ez+PwmTiPVr^The!+S{906pXpX+u2ymbo~iThbsf)KIUQ9z7z5rGG&Zz*fYiZmok zKOh)rC1Z^}j802oihP4x%xO)UwnKSoXcg!Tt|vh525kT|}O)uG|iUD#Y;MJ!-ZuB+bZj>cCCdKmV(9WM+o+oT#M_8#i# z7H2oe3{c=;-g`jt#6qe0XJp?ox;7aTAdTv-K}5_P=R|eL`l_n zM5n8;DNAzold*A#njIxx=|UYGDO#WcF6vMuovx}=qwZ@#MR)w88Z}ZrZy7G?3#b7o zqAI0LXm+^eoNFrW#@_!~UmyD$+%o0Iw#MynhnXX~z4nu^91K^a6(w_x3kg7e z(A(#eL<}s5@mQCJelOkL5yMlXwYKU{1anU9WbFQjbiVDfD(poL5bLK+& z@a#Rn`E>ykm~sxB6yK$Sl~e5qV^D}TuP>_y^SKl&jUN2`ZfxDTUG;PW*MYXOg**0H z6;_}I6A*(vZ8U~Sc^U5Fh1mazBu&hY{d>I96}~QXmOcFRo??&Qvs5zynAwY zBxeZ@ENad~vPeWo?Lk-VIhy&G_g{W|89x2+{kx{N_C$!Gi&XYw;m^H2g3S*t@n3g# zy>nNvm2DU0TLY+KrwLwkCWT ze@nm>xHOe7Ur=fF&`MS%H7S2NhcEi`8!Vv5_W;2EfE-5Z9qkIBEO7)yQQ|msj1`WF zRCREh;N!&Ev5FP2%2umo5^Vl8T;JHODxJl;sQU?rVk>CK=$+?%m^)X>9QMn)bXA+4 z#D~7TH22F@l0Z6x3Eg~t`jhT^+L2OsVDa$jmZ-Ac86<2Cb3iS4%W`%WHcq8;B}mpF zM?Xl6kq6`68&VqtcUWxHT4zb#yh9c@S#Z8z?A0VsQ&ZxO>6x91@svW9j_}fHRNyO1 zW!Rf-p&fx?Rv{7fVVUk>Jt|Kn3iH!sff*e#0YQZrO1Zgf;l}URZ+G(w}-BZqst3m?D1dH4-^^eRC7-H?CFzgkY|q)kv& zxN5@O1rSmf@vb%HZOgu{7Y+(iN)46u4YPY78Jm_|z1W@$0hP%CTr-Yt3G6nTu<6WC zHc%Q1c-45ra%h%&8^fysGbAZL<;+P<^2TKk+83RuP53XijxW9+YZx4l3pVZYT)-D_f za;U)BKVbai;-rA&48uk0s|$$vQ=P)Wu`m)t(%+%v4gtAHcRnerR`Nk4F3Hu6(tJ+_ zhJe&avw0PL_QbUyc%B-m?6xg8?5EH?yg>f zlQNb_Bfy^i-*PAo`K6V|vXc5&!lW#kAG%bux=}Aru~8|`o{+hx6d{WNz+oYWKzLmN z>j;Tm4T@GrgPz}W710CqK#aYP!QecjU z6vzX}zmHg+I=Zp?EF@%xtz@#v^@w;+d;d{z@>?TFl`~9<;~v2Cg>OSuL%zXS4{_A zp1c)#nuFA1)Sugj)@)aeN_vF;ZiqCb)tl1L&iGO50y)3bTm`8_dz*$(TQ7rU+L+hX z*fkNqiK-Lz|3qG5;HoioVT-rKz#_-{R85D;E|()!c4t%C5v?gfPTNOwEpp$Q024XL z9GthS(ALKy!`$wOfsFnE-vU1V4ZlC@cD2hWd8#!E}%+;}5TlDG8I$ zm=Q!Oq*$!gZFs8ImGmbA<$)=&$Brn}}w)Ch~N0j+|SuS>-< z;12Rj^rMBHW~??`D-8K)2meEgRe0DD_z2+>n-KN2!Es)IC6`bEtLn4e`-@ z_eR5|qvDo3tS$Jyczr0(ITtZUI{CN2y=5^2klBX9kuAI4!6C^rMOUS=X*;>N5|b>Y z;|cdkPbmAmf+^98QNRR1OG`=XXL}Yjl&)a*fL@lp#;nsO#h?D?$9F&d!}}lP_iyX( z|M30`dHtn&6#q}?VElvRwSO=TgSUKYT5B;uJm&y)olpW8;zZH|R3ROOADgUqn{TDc z*_ndC5l9V#pp)IoKE7aKYH8un`AA-moRXr_=N4%r-RD(DLd|j@Tw?>Mqx`8?k>yfI$ZQg=uCd6^Wu1o0% zj$cWy;leCdJt>1e=Z}8#{d=Fj8Qy<%+h2T32FSsoyI7C1ShlBUZmeB!Kmk}J+H8oj z8z;O{h#=Z0f4lVdV#tyJEJ0{0D697QV z?ki=G{iNG_>&n%_nhsctTtYikZO4Z}3XDmerR?C8*l*$S&w*htuGm3mX!+(;Brl{9YIMWW zx%gCA@XKsEJ=lBLT?e>l!1qEWWT2QGcM(;SONt5z)c;#hUrKuxASGsT2X0E#sf);@ z4`R_C!TkmAA%2l{YMcW)asas~Qgmknv7jTfst2+n@`ysq;op|=A}EpS_!d}tOO^G^ zcN`wI6kB_dMv0vgrf&`=vtyjihVx6wyO>vf-)=}!sEK>lCd_p>0J|fM=U3D6rh^RtmhJiC*;z4=u6kgA;8HqRDF zlx8BEuTVD!P+O#2qm+<#Rk2L!xD`jvM1i`Y9vk!pU>=lBO5Jfyq0|p|CEeVleui9z zB?>s^dZE0mYmiV6JSYO`aB{1v0kx`CZJl$^4PEHCwnL|Y4h6%-wPQ@)p)@a@fMG@}z8 zCuc$2im85#6$YfVA&JTc(mKH{DO4F)@{SaZ(1f)|dPZX)X9dDjjU9hrdT3gD&(FJh ztI>T@UgTr)uOB}TA74Sl^k*Nx|MbK6pT7U#(~mxWjJEY(q-`}Llk2?g>vnwbR2ppt zfGpZ)LsUvF4^_x}!zPg#1*uOu-nY(;+LSg9wKTUdRE+F4^(o&Ll}=;#N@EGdcWHW- zun5gt%ME$nmtT)1OwwV#XX`=)gKtAQUA}LNL`&?@sVvcW_W%o&CsZS}=Z1TRu0R0D z=%(4DzKv-Iq_e-lEKg1AMh$oQo{}M@6;Z}UM)_3M6I5wYCkq#At+16e2kui6 z6ns46LAEZAg55=AEW;;}yWw^wrJm$B9&AqPF-XQjEpkPK`IGFrd>_^80qPg) zlwac2$q3IF!x=%o<9vT@kJv~?JCGiqpyRMMTv5H}SAo{&hQwL+;P{61+&*&7V)?TI z(y?tT6qs$NyVQ0bg*P?6Lv2(6=on)TU!J}{)3ZA0O$lN;U)@_Dv#a}$ zkGRvTVl5H|tJ%^#pIwR6`$Wtm_&B#s0&L7{6&j$?quQEm4daFfzcB8WnF zYVowk)x=e9rU^nO4zXVX&9Aea_Ygh5W)5f$3^)fYKHJbznwgJj4gAiWXf7oGXounV zfHdyPZ%x>_pKxg>JVom4xn*W(fZ>2sMWn-GD1y!=Hm>>30@T|f61^Fky$G{eT(;B{ z#w6c@3kY@F8Bc!j{wv~Ke+xy|ufoUAZ=b&V@xR`GCcpmn{deKh_ujwr$G_9bucXs# z;cU@HJ&H+1lX9zQNgGC~ykfLO;O(XZs}ZgOW-AUEXLKJ=cfea=)@F}<53bfi9`ZE9 z-*H<`p!bCEtgj?%ouk4rg}u8CvmL=9xrjoiD715d4x%6yjfp3{WB7kj&j1^oz~`ou z42I=e7^vDDD-L<@swS;KbQpE)17NLIBDbqNQVZ6hRvOJXL3Xq8^HDNK%Bt2Ff`7(h z=7%?WYP-3%8NR&#hQ9~C$oCU7&u`^v{kLwfNc=O2p}p>AmV^{horZlYHh-jg?VZcL z!Z@C-z%CWFp_zBcS6SaIH8LFQQm&HgNqr<7nvxg;)Rvn4baekdc%KmxHS6l1Mnb^Q z`JPuQ>t-T3^i4z8kvKpFfSrISH5lu5`BX!MHmv-KuaGd;#S|VZ6e)Qk)er`GVyZ}K zE`Tv+*W2;%f^&Gf$f%92WeU~XX>YKj4eM-3#->$|9QE^-v`H(NOefBAjWj0>TikB< zvUAz*9@qp#94hv!ZoA=9(<7i{bh&}ib)PY0rR)VR5H~+r_B`H-e!mL0(Z3@qq=)w& z00Frea{T_w|9O?_3Ln3`TDCxt>yQ5(zkfUMWB>T^J-Yn?X-C0N#eCNdMqTpSUY_S) z(JU--AU9#sz8%@rdbdjeOa=9cMtZX0vl6yAq6p2+|Kx#!bfC+k=yxs{; zUE{-j3gjpvws?OAwInW$Q72c^Yj8*~rZ6-cofK;YXJ9*sC6M?oQCyh>Tb7e9+~K&7 zZ3jG@ZF*X{5(B%s6@Ds*W2_VbV>*D4=WE&lLxGkA4GaiebVcQ(Y_9{1LnJaA7RB<6 z-tXaV?cZI&NTz|YP|H=W)Q-TlwsW|krlRuIvAvNe$Wqb}8naxMkRn-WRxfk)r#LmZ z3qV3@U){(d^IRRVNVZweIQfR`4UCv}TMr5YZqmR@8)*8GC#GMWHpo;&Kqenbi3k$c zM|+KzQa+UAPp;FQ`&P8;2VDuJ>*QutQMx=PYQts6M5kou;xG}{ZPF>E#)f*yHy(DP zUGl-kthFhrvcC30+W>=iOKl78*3?$abdma`kM^^oWN172!%z8?u$FJ# z0~#=QcSe*BQ?a^~^*Y&$>ojA@W39NtYUSqEIhIq)fPotFv4}2-zSuYrG?bB_f1QTG zyOS`L%r>fo?TZ^63Czh|#Nd%G5wDMX-KY;HwkHO|4O@P4<&i3huV3IBdZ#N*QpexI zo_G`{t~oB<^izRNx6G9cL@s5(0zmW-Ds^4!S1^fF_Gn*-xJ#q-%ZLK3>QuIXNK83A zM~~p4z&2cREB(haHcE91{N8sA%N=uFdneSL`+H_Ao;UP8Ji`zxaEkLMFv(vS;s+a?uO7-%- zEg`9Gi$3Wqm`6ZSk;uHXLqAc)e9N%q{4irD-x6L6Y=YryA;3PXa4ZzDtb0u>^dvuX zg6N{#`YQ0&!L>zy8lvF_5X}-{&0vqW0$VwL$$ zz~&PoyZ$fotS{ESpe{gB_E=v`;MDjxQp6dsT-R?4FMCGpTdM{JYO732;!$G1DT`xE z*!x0{JqvXu$FIktgs{d~VL(@%vBW(}era@CRa{Pe+jS;*Bb})gP!IVQU+iE3D%Ngo z?WWlqfJUuS0JeQ$C$~j)SKu3nn=`k-sMRg`ly-iRD{e;*;71bqFeN5H&-IC)m$#U1U@tD;e7z5@X#@)+D+g=XP*UO+v|pFl z#tGeT_fY3g2&d%P0j$-hZ~XBa!2qI_3J_Uoh{4F?CPl>tHPbo`1dbx4V-rPVdXAppESna}Y_AM`u=SA?V@)QMJW}H8Qy8*d zU&F~-vQbTo@eE;6*0SC+?#ncEu^M}eciVr-!#)~3=MJyUq!w>%q7XxG)#Y~(;sCn7B#i?!=;tnIk<%sQL5Ka>AVeO-~nhGmer_Aj=AeW)uS zuqRSjvR@xiEIfmfn|RWwiP4|r0Vg})=s{&2M&4-H_kvh=)%WUd>HuQaI)-KfxZ%YL z5a2k0ew%`qs5(S(wYCcSSk&+;KvRPQEY|(f^wSzoTJh?@4ja8pj!g*{o`hroS9Tkv z<4tcj9*n@2DNq&Oc#GC3H%7jT!~8fl$se(M!9@jCT&wf_7Tia z(BxqUZL)nya0GnJP(XkvtJk||N9T&{x`DBmB@i3l{vO)Zs^*(ibr+z$WKu-=dE)wa z*NO-;aPW3EEiti%HI1!9dP~I2m6kYJJvzT0029Ly$UP4NUupDE@wL$O3aIXP^DH~J zw-UDE3mRo|@aHw{V0KTVgRa|$S`fJBGE`#nOY9=$+}u=Kg{zE7ZmX@$$4d7?D{t!n zl_xy#(07z`0U9t(^Ds$q5k{Q}84?9vk%hdv1tZbCGShH3Fx=l5C?LaOtcRz9r`T6@#17GCG@=b~8pT7CW zZ`|H6?s>>TB(LZh?k4I4%fq%K-X-Ypz@1iL-_|e#BA|Tk{JKKpMQ0r^x}CeA;Fowu zKbkD7&bx}K`nkcJ4n(PZOa||4M>vmEbX~S}EuN64FYjQovSb$x@NU$VRsNB;p3p7! zT4BPPi1-*7$3rtp8h`?>TLExnxtZB!H zwy#ud)VdSFuD&Z6+pELdxuUzra$Du>O;XY)YylWntNr4rs077?lY;f=rXx~IUWz>m znnzjVtt%G$v<8PzeZG#-Lu46G>E;50f!LMCEmxoGrP*DgGWRY9?7#Z>p8J8z9msw8 z0eh4Y6L|E`7vR+syS68>aS=bC`GKqAB}ud@Oq2!nN1eEq3><1b$dd!YhEsKxbVpK1 zvbu5%xlSq5O5@eDRV7R_TN%=MrIhF04 z!yB>*#yax1PhBVwq2Y-!@GvQ$@a>L{6d#IcpD$z_Y$vZRA= zGVy|F=>V{!#T7N{BI4Zz!oh@yJ5;G8AApxwHhYIjeC9^9L^~*zl~dPBrSD2-rHwU+ ztD%}ChGRPFpcFVpn&z3Rs)z9R2?h;2(DWMol^@Igh1koT+aslO?*{w>80?5Qlh00<@=jmX9JM{9Wljo;O zr4fR30KZEMhPXw=n%$j#zS!mIUv-Xo`Woo0<)#93datrCGsYAS6_gE@Wk&0EXhJ!Fe)ZrfOQh+F@G2n!2;|Rs>@& z_10%3cHPTFe_e4ZdzqgU1@^{r%#LgjwQw*hv5INT}w@1$8N{xdq+Mci@oS&ENhUM*5nT$PY-k zPV7WVfn)$SJyJ-x>XQ~tV|BZ@HxU98DzG0phdB z`1(opv0XO5X`Nu-gjY+j3vI<}wK`|K44s!*^1aXp*G(|{_z14Hq@kb2nJI9=hdgWH zu)UR)RFo6}(5LBq28(^{vX+&-RfNi|fMoc_6I=P*p@1v`u{h#@J_|p$iy8ZW=p!Dz89XtL6R=l@QfB*hNciDquK|bqJlbnfK zx(uWmWqfeO4X`}bT6Gw%y5I)xf&fuKuD@^~3dh;)D_5y-8bz@fuMs%C;fMIxZ886y*zAW##&GvvK0>yosqlKye@3esDiq3x$t zq6l~ZmhUgdhP^7B1H;W?zfUS{fR08Ug3@|TMQteSA>DM+DnI*CGSJp)m`&q!)tbC} z(FJ~U%RIgkl4oCOsKiMw4fEZG_s zG}hL~)!^)G=geEen|zG>3rt9**04WHKD8)Aa?cv9c5I=)o<;^M0L;J0{5ZAh!{#lG ztUcxIY)IN=%q|%25RJW1#di>Oav(C0_R#mz*`x#ar$T+Ir0jwAMU&8_4up4%5}&LH zMG@z-odLx{epPTLpd76k>^jFD>d?Dup{2w{=*t42*tA@({tHySrH6|WU!@{9*&=o7 zMXy7b6o}jy9H~*oGb>hV*v6fc?CeB5z|~BenM(fNUU~q8bome+0G*J8tXKe{)T8dW zeXc%(?cG_8N_KJvA26qsufN~1V@`6wAxLgRlOh_aHH&EHmpaDd=2YEzfjvBTH#pgnF(d$vOuE>W~mz?cj1p+j-dm`8eoxyXp2ZcxqEKBk* zJ^_3UY*s!RUbh1-sFh}iCFu+2#EO8v0qZcGFi&I(c;2GBmSf&i&r#tFe0tTi+qObuReru6x?iHoCuH@`e25@yUv_j{Mty;nz$#u<21u4uy{z6+#Bpq$d zLb_yez=kjL4}o}=X6OdMCDu8k#Mc$b^TeF}W%&AeNPqe9TMEVgfsOpl(A6pm5Y_V>Fm@&wR(`e-IISXPEwB%TPrQj)YINJz?RDi zBrHK+i#zTt%EYiwIOCC(4Ak}9!>hr1 zLP`VkUE2C-fQV!qR(ZoYW1v3xh`mluu+QXbR?^Wta(DPP?5w*?G^X6a%e_ptU;P~4VwpB)^nae(zxw$19P66niF$=fZBOiq4P3rl z;AQfl9wZn_$_7abd93#t_jW-Cth4qYrIh(RQkY~NGK7_h7EwqeASDp zr4b=lP-~Oi81Dx2YaCjy#5Sep4i>3a2>* zWED$^LkrtyX}iAI+k|y0CNlIDN6AA$ms-xHlfbv2j2)@j%KenA0wqgQsJy7_z-eHW z?iexATtU5Spxooe@``k@n9<^!G?|t=P%{=De*7mo4o2hs-|%{EW%k+X3@`Lg|0euR zPJ~l{8R4>{SOT9`N+gW$XpRN0N__L~Tb*rOBW;DpU2#_JC7eziO_gPRKu25snCO0F zDS6BkG(7N>e*vEiJ00OoBhV^=r!@2t;IjFyFRJW=EeL?@PM913SI~*Y29qPTQY0@) z&fZ&Oxt-Z1v9GyXsxvE|u_LrEoWMyAF&t<=ty?wGQZs_64s}$tc+w0GTw+1{nU*Nc zE^%eHFI)7Wd2v_OXVX}hz$mm}YY%pan1-Y8fjvs6))?9Ej@TxYFZniqFMRys#_{h} zXnV)4hFQ+;yTW~18n;E=8#4CSOG?l#1ARZq>Nrnn)pQujKz(NF!=KcUA8qU zu`ffRU&^E8W8eWr%yHH$i&B;&F*{SGE)hOPQ-+eXG51pk@{WwYsOTqW74lD%Luv;M zKHRnRX*&1kk`uv1OWNT_Ff5z9$V+m;#X zRszj7e?ntNpTTvIfIH8m8~~9>@14>6Ae9v#?T18Oum$R&R&#c8dY;+gBH<6vw@x-Uo7%fS-EsO?a6oLgt|I7fjS#f(Q-MWMa zT`t?{P%8bJcc~br+5BmOZ2bx|tk2!f02;*z0Xvn8!gs2aYuXz2xRoMz4I~5aWyxnG&eo`IDMo{}zV6srn9Hp!wY_M$ z6%A674+q2_;z?gpHSu_npF4$jvX8_C*azY~Dy@8~uu?iv)rz_vuoF&~ZK(pm$h<^d z47BJA=1m7{T5#>Sr*sM>*DM@cSkxBvF_@ZYj}@V7sHZR08Mo!Hhs zT{;s-j?KI3fqt=bASh*ghQ}KNH~YQe2lp{tKA&MNsJ5q@q0>%8<-yepI={t$^&D@? zQv;oa@uXUUI0^ae-lj8BVV{PcFe>5g9q=SpltJ4z6;tT_Ty^puuGB19`^vhRPP$6- z9f!ac*=ZeA2(6lcyb^hm`071xQr*@N03N9Yf7h*orKNi~i7Ztc<_7)ItZkvITlSEO z1PgM@hO~B&k~WQ)K+1jW50j-R_ERhcO%YmNqYeNkkUw6lgtWbpZ$V-VcYaAtxVWKv zs!DZq5bBDtNPeSkzj+llw68lC;^)PA#PuqHuYJ>+Ml?tZRI-P|ZMV>U>S%P$rtu0% z?Kp7UL%{(vG!F~1=h8AO-ay)K`ddMGf;7n>{W7%c^otXP{7>7SRZ6 z!j^}Hlscbz@RH+|KMZ*lVpStIOd~Td6fse*tX|x|faANi!1yqarB~hcM=BbEC(==S z3sBA)fFrkzspCFwr!3+cx*i; zVEo-n!^x<-JKPr)PQR~A>fL3E4JMyO!xu$B zknmm7rLcu6sWY17vBaQS?e;9w(WYEc@YLLc)`+fXEO$0RU6}01qQ>QbsUSn)4zZ5K z6`bI(26R*l=N?QI^H34xU(cii$h2KIIoQM_VO_sa9KAx0ru?f!kp0s)-hW2o=T13q zdB)gKf_Smp%g@n@8MbDpyOM`~zSym`134JKS~?|J%qFRSgUu9N+gB z0KWUIeMC+#45DgU-=!JCId-V_9&ATBM6cdDYI}ImpJKBouA;=_#fPBS z^0GixF`#&+%=Dhz5g@wZ!!2!wstVW+0PgSD^}9qR3X776Y7LcNv%|4~CrpopMsdj< z<^@g6nKg?7GOvD4r9d`ZRYexuj=4t)V!B>p4Np6}hH?b4(XePW%_z8OU4axy#X5CA zMh|6(vZzn@$O3+JtAc(~!|F{=;~I%r?UQp3u`hNZ!jdD&29?W_hKVdi#G&Nk2~3Wc zbx3^2^rC~D={20113ZR<!Uiae&M> zbQM}(WN%^S%_`)X_M4@e3Wk1=irp?wsc+P5grA>Z9&IPH}s zu(NVNK`_?079;VMx0K8bgM`KbrryE2M`;Q;pavh0s-w`H%v$dj4is`_^FE0&J6SI{ zrczHE)+g;42pq6d2Mw$(p;(;5!Q_UeCAh$)LGCaUu;?$J=a65~HAzs+DEM^N)Rm+J zJH05K90Usex^snui4^+V)wliiWD|nCi3soCx;@nl%#m`>?0C#~2z1UPc_gWBfn8;7 z@JPG%~aszfLZ=hrGnJ3yDTSahV z23;aRIQL&7&Yc7e2vgs87n^x;1Y8G8x89YrupYsR*cz{1S&jVi-2@^04y(}i){Uvi z3#a^N?Zp_gJB=?&*zo~8A%Su{sx&#pSN)Oa*-;@N+F4v7-}m0f{jAEMtz=wM0OkTM zTpbfXVN15y#87Gr`TIn_l!)5{u`fDxKA;g?oVGf;1Pfi4nP7Hvl+TRe)J^jqyG7W) zIoAlMjxH<}=6?F}ufpH{RX$$d`S>yXqTVoqhNDO>Rm-?>qx_tt&@$f3GeMaiij*A( z1kzPG=a_5%ZQ8H?Y|47Er~;8Cj*XfV=BHq}k=XYvbwTyoC2h*o!&A`$qu0pu z%y=n(pK@l43#i*$+ypub0-40l6{b`=3b1!z&vGh&-Q;a1&RvQehzOtT$8pj}UZWkd z0FJ8MrI~CYDP5!k%AzYOeq%Pw{$H7_dKx zy$wd()8?KkrO~qO>Y!1d;$!O(y3=t zkCw*=5f9u3Xfdq@L7r9|w{r##)C+xQGUQExAT|%TjG7cM$8B3gk(2k(YA(Tn_dFjO zAE?_Vk6jP2ffMwW#j_Q*SA`c2ou}Q&+dB54S$QSj-sFluWt;uOn zZD}@J%??F}$@Y`}b@;D#*WQ2h@q^q7Utfp+-5&s4mb1WvVHJChcHDhbgQv$;av=B} zva=o&hHCB;B6e71zZRk6JSH12DYu=&jTu)xzbbiJCavEg+rIL>f@Bcz(AaF}1_D0G zt_8?+Yjg}OdmUiE`Qfj%K=>o8FF^WWrzQV z+UlUo_8Zu$n)<0GH4ug!bEd4XS8tskkgNWK z_uph7qTye4YQntmg!S1FJ5=8G4d{gRw4sxjRWs?ZT!ij6_Q|uvV9P=fi&Pi$G|cJ_ zYW)#zB?r>&tRq!oGb)w-{=(iBJQrBFxwI*&RqMReFeltOp`L+(x9&&24>Tj>ZS`TR z7)9jN-!N8{ue5vV4LSd6FXa7p3KlE#0E9jSla|$QPg+j5Lu}94sNh-khp8@ESj&{*JKziPu$uo1bjj-jjBe4eo^ju(2$wrUe`W&MFjbXm(4i+ij`7zkqjpV#Xjz^4ssfII}!48#5ND zKPY6$&hP~P?UwbCGTKbW&B=bHuSqWJuT@m`HEgwxITyswq#deWjn? z8FV>3azvSgKVb5Ba~h{A)yP(xBSYlbsL|l$w+(#BGYBh3BSoU|RNp0-IAH4@3jp#s zf59lHRU0$!zo4<@L{#8UNVoM}v4x?nC!jXfc zFQ&g9zVUWcO=@cpTLjQNb~4=a;hA=|g1Eb-S#>~)J(s9CNaYY@{qP3s2! zz-aN1-y&g*s^n0T>ffYsftlOx2d?)G2Na@I4UV{i$I>Y#MrsHEtDyW|Xr zPB^zn;<6IkDf^P6yCo)7W0Jd4=-_a@topG$%C7*6u&w{&bUK8s^mg1b09+BY)GUnZ zK}J_Bm9RN;F}7BJ!8CSZ7D-O~_=#H7Loii;%fDI@lS;ehg812vz?E^3=`%8QuPdpB ziS>_U2P!1Ubz3oTZ$X8P`zzz6WCANZR4oljTzxjF*1b)@E&vxd`eZ%UBUzY}3Zp@z zaP2S7+-qB%Z2~;}d_f_%oCd#uL3$itqVu=_ns*Ig%$%@gzOV`A3CmgXN@h3jf-*-k z9@0uI3O>+ zVpI+`JT%g+9YQCWNBKz>3tQdu23-r-iI;D0MR<*GTOvfDg>B2Nmi{{$;s72DEyUx) z%FCM|onr}EO8o6Ki7R3Ecfq#Qjd^AMSM#sJ~Bf~tohY&^{a zrs5^(@^17&>J+=Y*1uuKv_`meh29D-sa8A6&A?Mkx3WE~NURHisF_p?B@)<8MZ;Rg zx1|82lQ9aioK|t=lIlcBqIt~VM%L00UB_eXe+gL8q%nt5F_ZFbAP!6I_vB4n#60}m zsYnm~l;5k|)-H8Nl)LgJGcK_t zdjdPC`*3?e5*`nU2@zp>*wQ8P)L+BYq4#x}I<=7kw;nyA(yI4ddzl843VDcMElXl3 zr`XASg}z{To71LrW)`uE%Dgm(?QME(!Ioxv1cP|7v8I^<<4rtAG~_ChYcg*KcR##8XSRmgljH+QXS)Vn|1s25zq0pg&qwkIC?FC)zfPKa{Q)e|k*967;V2!DZRXk?XxkDkdyt9xmjJ ziXF&)Kf;9sG%0@ld`OJm2nDZwrvB+WAHRV6&UfB_XF#Gi1fO`1CiHb=ZR6)_cq(^< zTNXuf18Mq=2~qiFzKh2WG@Bn6><%g?54dP5xYjI4|;Nha7rr^r+&Ij z*w*SQ@07@Md4x?WM;#(q(UZa*m;qEKfFR11lAF(p9QV(sE?|@485kQcM{4%t zjGg+v%_L9k>jf7&CPn8NmLtB&lXY-GJGOGQdz&T8rT8BQen+fd5F?) zv2fQTlx|g}?t7p68_uYiSHQ5l^L8Lt(PVMzW4Kf0J1S$9E*FC_9w7O9zdI22lUItV)Y=ioCX+*1>MQLw)tFJOo0~I94`1pIkfTM(`}C+-c3c)$`cG@}X#={lsKX9c zIXVm2_;024wZ#ddagS}u(?*8HIxVN&)PIy~_~pkR_$RLP#XtEy&lsgKus*4P4b6wB zt)QDvm5)bI?XG;N6#tQf%rmH)34#)6$QF69+gOt4xb>;_d(DL5jhz)mluGsBz9ufA z4d@M&{1z-LfFlWLQf}%t$sDz4&vGg;?SRH`XOCLIdj3AsD(#B^<2h5Ee3D+Su_2gL zLILCQSmiN%K1=w9ZN)P{&Dgf{=$I@jVLP+Bs1pf^XkSGb2BY{diE8m~LpX zv_VSJG)y<(irLdZ65fLtAan!9kMRGdysKjPi{vb|N;Acag`!ehdd!VZB>zac*7$V# zgLX9ojuXA-AS&v&2tH6#4l-Z=^W3BV+LZsPM01g=`NfB;*T~-sA3sCeBT0VrLy#G* zuoj>Ii2Mi;s^#Dr+gs^j@z-*1KJYScctS>onLS{tEzxU^d%uP(y=u`2=Jo{(T@cjn z23f+~BcCpy;3|1$&$Wnz8692^=bpqLPB|k~eVBl&z5!#rOTmjH?(E0W*oFfj7s&>ONjn|7<0 z-%N}(xGZwMu=|q!v}z^{Q7!o?>CxR>0DPQDy_TAU11TLcX{8}I#YYxptD7=zLgZ=g z6y{n+Z3I_JrfK=0dxH$lumiaSuawpe6U|&_P{jbb^}&f!s~#I}7dS|S-F%P&d22Il zlHwBPZ>eE%m+odqycK=6aznOBTMY}5lG67xXu?K=s*TH zW8zp$P?D1eH-CwGX>-K`tZA#Ma- ziCaSe5A57wwxqLK?B}4wKUV5e3)SplTI>ibq)WSfHD&k{kzy&FA`-<;{fNZF3F59@ zX9N0v{L&mKe<&TeMj%C3|rumFsF~M5Heph zht&(u(&qAjc=V8l(_~WBj3j}spt&ss2*+~;2R;3bK~aTb;9ixgY2YQ8C&X$3$0SW= zlH(-pl=(@v;PK~|3BB(qnPOoFxFs7hQVs-=7YlgFh3d zP?L^=18$wB59-D+?kMBj4*9O0YF?*JVRpwcmB~1TZnF^`T@_yEa4IrOrE^H*LY9xT zePK>@XwbrkwE1@bQ z@4pV$+Kp-S_u)O0)?QgNKjRk!6#!6f=p#E$VLWbY2Q9S(K`E6?EjTIEiY&iY*;>hU z^`)klMn>gkb_V?=yCF$^9`P8?4ju(dz}@KQX~vY+Iw(n`?UgY&7jkfmwJcmoKyqKk ztSI2X$}GimnFmyc4m~Mz0yxV_hegh%w}*Q30X}sEPhf-2H5llmv^2OBMkQ8D=NSV= z4CmJWg+3!7&EJ5Ga}+sHe9lRg!*yJzk*X;HE08u(Lqf$(W@lw$%#`dYQR_o69TYbu zosrZxt!qh4u4WeZ2BUwNBNSN$6 z*c<>s#zX7{T13Fb5q+b?CazMX0s{0pzX9%kRGyWUf~`vnH>d6Z%9IezctN^Qn9kf5 zDJ@4PPfT+5^62B!@$pM|mhwwk)(nC3s^ldl|He1hag$0y4NqOcZz$!6J{aRlWm{4F zvJc#rJY7(=%W8QxJeMOqQ2jc*MB1lH;Y#f;`P&-+#_O#qEOj*D%|hMkj*ild)>1MV z4ivMxd_c7lly)OrSnO!Nq`D~g(`N`GT)ds73QsZd21gx9K!7GbsOK#=#f2J)DWANO zpO8|PKV!Hv<@ELnW{6=nn^(OH8&{_&n9U z9-*>%#;jfrM4`a7xB?P>ePRA>R4M_(SO9%p=nYHFJSkYT;_o$o6307*1|C;fZA%)& zAb+k5{|nK;?Nq=U-=wf3MN%;jmlfP}PJD*8?*g462AxdX={Z%NaldxZ)SA{XdkI1- z&L>xMD`UbO^Eh1{E}H}HsIR8Km3F_LjoN~{{F~fox34*nq+JUTs0Imww>wn%sf8n< zA|v{(ElxGTps7$$;zDE$sJ{2{!73YvDE2o1Y zOhD${jpApu&~g|1K~)dlEa@JGCz>GrojpbjiO$k|l(gF@CSvR9CER0)#$*d;;T?NU z#r;*u`16Bm*BEz84v3mj5+AChcx7i|07IVEz1KF<_?JB`8mj5yuO?9{=^|!4NB12E z9~W>)2{Ngh0+gr~3c9mP-L|Sg8q`$Sqn$q)!TgY*hiW42?WD9?K8O82lP z#@-iQr|NBR^cPQvNUW#~^0(nH|JEXxG>fHDS2y)Bw!`znn(Wa&$n<hmBg)fjj{s zNgvml0(ZV1!Uv~)^iwPW7z>!nO73_n(aD5_V7Fr)fl^~u>L>JUc`9HRE%3ktC zBQ`0nfcYw!2&(TjXiHLnY{b|>{~cI#dR0l6xciJ}fY^(@mP1ZzKA0BP4SQ$575??bnC~a z%cNck4tYAB2^=)2%&0Jk87?RFNchUoYkeOB^=NwZgIX92(=wVJM^BF`={GW}Bj25! z{XZOK4&OJG&EadzVw$!*W|~>GK>mSRcOlMPj`f;SRVD7t;xkyk`pUYH_ityLZDSLY+`9(zKikwal2_c>;r0Qri`;YWW`*4-dg{%xFlX=+Vh8lZ~4oFr=4N7Tlw z;)7b3w_Zt}w;sDsHQ{mmmBJsUMJ3L?LWVjXmm@Wxy~+;EZ&3jj6J=bUR9?JqhBM6^ zdZ}=3(8Pnxb^h?YBKpKK0byYes470&gIuX~n|oS9Ip@S=j3M1Gq6*WXLQJ^*k`sW{ zj1=7Okr|g0&^WEdL}e@If&~*ZP)@ELtkzDn93d-=F1C}g*IZ|d%l|91UP19|Vs8y(iN zPq*q&S{k*8jSejvlI3eB!6pnaeU;LLkppUI>=M2`s5MKzRQKuC>ks6YmOQ_tqeft+ zrlq=gEp9Uf6(Kt*j z)}#)VkT~5U;F@+S|2%wM|H~2Y%a1>V_g_lExag69l9CkL(K6H}^2uYi7nm1rtzRS+ zNwMrTUis5_^eRZj%)q;HV(SU=5sDN;A{!Ysda>nTi5!x2wjeEu0mYsgkF* z%n$7t?$+f>t_5^AQGyR7IcXde_-99+3UiF20mK}g7^ zVy?cggc#RCKVbQ3M_^LSUVa_6!XlUtm9QMEP60>VI}G40UOYBcCdDdEI2{BUZU7Rt z`<*Viie0g2EZJOSL)V_0*h^$Y^;4z`4eejUM+Su*a`nzJ%D%$P`s9^Kdp(*-I^-m_ zhvJ2XSgV@5E%1@!zYS=}%bzUd(VtEOJ5kJx$(YAJZiM8bl7roRYq3^%2Ii>r)2?Wa zJ`b}pz-v`f9gH`Zx*? zV@_csD-A@p6oSt^xa$~DH~R!}tn?o`qdP8p+?KZM;NL|7Wm5 zDAweV_C7RQP!ZQ;8tdAEYk*n0$*43vGD2pk0j1|{3@5iJ)H`DoJWCT#-nPNsX(e1~ zQ1>DFjK_V+YOf|I*GCsNg5!bQSSpmY4uz`W$4EpzR=%4KN_G{SJzc*OU89GMq9EsYX**mnBEcn`+qQQ`tU7l3wP8C2nBsB1g|?TCLL?`F18TFOY2I)X z85!_cx;SW|paoLi6v$3_fFpYaDOtgenij6Uj8HOs$ZUAG*h-s9XQApLp7KIR>_JZT zwR+c3YNee%hZ{i5CJwFEP)Ns}!_}}s0bsHr2E2w_RSgf}9H90~hD1FA=2@itJEQ}& zi3<0ny#z1G$XQ*bXC9rN5|iZ4+E*zKeyatL;uT8?sQ1z(7+SRpVdGL2NtdKGQDx$b z;p4aY2xXBY4#^+zqnN;d1*#}YhydBw15(lvi&~ns8DEa@Mh>5isWl zDqGjsG)HHDV2mM;*8Qw9p!a#kDQMcHgvGuDZYo}kZPj)P?c|fH;v{Lb|G%7ix0E(LwimJo< zAi9B*Z12knSGUWig{A_fBPkitvV>W0ciDDu~p3Td~( zYbl#{Ly5l94Bb-dk%ATZ&o*iMof>XTQvq}^0wDp28I@^ey?L-E46~0F=>B;&a+kq2?yPS5EP*w?mF*!;^?VR)BfYS19%4+_q z&6z*EC|z&VQhaq-{s=k5&8OD~A(qN2=EoD%!s|M+RNK`2iQ5dR;$H)ow5qt1UqR1h zl9Y4yRvq}(FY>9P4Zm7YnXS%8-kNARiG55(g9_EVl=gbG_6<^kjh)5{dI44}Qgam) z#1k@pahHXNanS;pS;7=+a3Jwh_Chsx|x%mWUp4=L(_AF>bgx|fs zhztJo{fEJ3Url>PY^l;p?AJIqcxXvRnQ?HE_&0GyX43y`akXY2RM)pvd}+Ffy-}J6 zhm#!L=(sG**~)1nVrxB}Ua(7*CI*8FIjI?FzWK;8FOlwcfR$~tc{B_!(le;fltC*2 zuqbw0Jp&7_mRW$ijj`eW9_k`14`CBu^pLe7?HFdL=9&#Ey9QceFLo3=^#HPIm^}OP zPo#ymYN{JJjbZZvP+wO%DPPy-Y(I` zZ+uCZQkf-hTy46LpFyIB@1HgqF)xZfIunCvpm;IpI zkp-m=o|8c2b1E2<>r=L(TW)vbZ!0*mw!%P-SANA96X z->hZ1OM+k)-IngXr!B`g`5r}09xYhN{QJFMhb>X4z^uE!JAKLc$9EC5z4IaUvJ(VOX9u`TF6D_MIScdOzSGDTs(E^ji ztF?)9{lJ}wpsM0;f+}7Aqot3(dh5hbC%#Q4i$P@f%3mDH@ zPQLE|xU>tYQ1|v#KI85>v-eg3zo<6sAE@V5Qa^zF9P28{>QGmi#p0|-?6)aO*|&qb zBx>OaTTV}NCE(^9Jj)NNcA4dLn&nAVds9&5n5{Iegit|{tT&Ziu_b#Zviu>gv$jTm z+t)KPtIC3#{A|;#n4O(Oc8$lDt@RF1AO)8mfS+M-S?T3Ty$0>;fv!kZq)a(P-O$am zsYa1cvjcG6B>A`7$w)KHvppp>KJ+-DHJtMuIds7K8lKAXYfph%-GxlaZl4RML z*t`FVO9~K%!jO8W0CN7vKp?IyZf`)!o3MF zBPEn-cg>jT<^=Jk9Z=<_*Q(KD@u4DW$hJI_KE9 znhLj*NPlqrq6-Yd@7##@d+7*pJ@7=@jT{ zT=Nk88wFL&)KMsy5yHxq7>uVdD<-LOMrjv1w&Ak^>8#Tl)#YAYGgi5@4>>h#nh_9P z4<@^I*Us`;7~hlvVDdbOgVY*j`d9H2RicRgQ0|m9<^5IAC{~|5JkLA~|!OHtudWIjpeew45^yj_|KAt0gtb?8vkM^f0*OrB;_a`Z{wq`4J5hzBNj zeSb(Xy3wo!NB5O6?L>=~`o#C6<;j7k%R08*IC-Y%Fg3um%?u~*;K*L?b=Y4_E2O^w za&t@I2bIFIb3l28|F(V?^gCYK&$m`vg*8uBhAV zX^vm1B#alNm4xe^3?2YR7%jDXUbBA4&Awq{v-&YEd&t~9Qau_UxCR{2tK)MRN}-6c^8bw>K}G= z93Nx+f@Yo2m41i({xsS$um^BH9bx&#Q4U*~-Hi!%Z^s+gB)x>n=XmL;>~NQ)BjuSb z!f$eh3Wi65`ayA*D`{`!sh<}3k0ef7dAZg#fX!tmwOy}tEj9r!v8SYB?9kN>t z_;PKU77Gn21#N7u&cfP~vUr}Q&9c)tDx zLu?I`bHN79@+c&Uc|7hVa+p=>tIGDd-!%rls<7TO-%9^wvjGX?;D})ppFW}P>=wA7 z7yo1sQ#Eu7@K#lDL5R#slgolZI`z8bTGm$#YqFZrf}i_jAqz!)=~;T89e|(|KO#YY z?_);RBbNI<(3C~Tv;YWc*LA2uKcp`JII`Azi$IM-UVy`XFrc-bgfgHZm^L@GC))PXh-9uUXxx2H~Fy$ySf)q+f!T1kkG+ZLrzzu%3AF6`9! z2$4WvsrQC>#)0Nzg0cecniG+SNt#%Xm)i+tm83qdG>U?D zL;K1p!!!q_-rCzp<-xVg!-O?HG0dU(5f+QvUXuEw+H&i};(MT$tHx?0Ck`(`MJp^ujjay( z_eimZ5-m~yO+d20TtG^OhTDUTHaUaxcy4H1OMXHUnOt;-j+9-e)#%Er2ti#tT0=N` zWt<$gasT@LpFa|edHZePi*%e8^(U2Yc4ABRh`x`&N`y$|6$m_-52gX9JUM1p4FRf} zG0OCZa_z1Q;%8oh-VD3Eqy42VFu8tVOSbVE&zv^FgnikYS@GJ zxTemm?68itX}4OSJlx{(rpiXHK$M=)CarnUs7X3@5Z|?49^S7&PcSL|qQKefPRWfG{mbo5brOf^S&})fxs88fnR^$ZNRCQ?sIV5uF zLO?5>j7%}rQBEWy9S0oHP&0*!vGUWss%#F z)!2YQnUy!w{~6@4SosP!GglRttke{80p*+N_r^z6a-}T^U9q(txxTfKa>Yiss!!vy zKmOzJ@6$+8(NjgE4?dV(ohXw^8|Code8u`E`mL(FozAF$3mI8Wo)L| z21*CFY=fJRqFaTlGV>4~69!sHc_3}<3s?DiR;dUMpeC0dK>fhMph+6*KBR7xN}kTd z1QuY)h*8UhKpyEm7lmT)h>llyM7saW9-vjW@t_dvY!M==t#gD23|nsWbaD@@5m2#$ z4U8#3Ql-0C+2L$AxHvh3qiRpeKt3>dRby=FvDX@+?DaT1j^WAx0s$|JcMo;DyvQZH z$D0&jBy}m7bZy#)0^?g~(#!WW*P!fl#MMI-uFC!+Qn46wf2lXnqPIPJ11>e{S`H!P za!zFlL*3B>kp0#tyZpTrB^1}yR`iBF;NJyLdV|pK+a4iUM`y(Wov9riq?9@>Ukx=N zrHC{d7FiTqVV9$;Vet*>BJ_MEgQ7Krh_(fh_PVVIAUBJ!4H?td9SyR9ldch>CLm5g zy;9m`>vJ)N@4U|)ocLcN3iJ+^*|K$|5`looRoO)z3QUu3=xnoLR`HQofx1~hBI5*S zD~b}1$&BLzR{r0O@d7KB^ z=O0spJ9cZA3yfji6yt#KdYEjfjk{WpBQNMSISXV{zh(mT6j}TcFI`pZfizgG@d19wDR?w39 zeL+n=whOVst@=@2`i~k0P{U4C%T8+n4&U%|52d`A+3t37p158J6X5`G{(W zN=Ac|b;KLiVxP&O(7jkf7W?J7dc?`g{bU%CW4WGX)O48t(umr=$gVhA-S8j_rt5xb!CU zg{q%$3+lqvB7>H3B((N$sG$nUsypcw{)I3yjl_V<^90FCwMQzV%D#!n+dTpekN3-mxfOdb-!;#6c_B#dX@jes{x~4>y6?gPjHdyBU@LZJp&*NWy{?$=F>IY2R9IBvG?V$E6^%$ZLp)*O!Ub+{aXbBzb6VN)M zDO75e!>SJ3NFbRwXhP!~&o0xqBaB==?rMBv<5=D5QmsgDjNR#Y4M)Yb&ca=0x~qF% zxFL73R}}$L#dI*FLIoULOc;tU>PAz@FE^~x<6{017#y{x7oV)AsY?g1p2-r`AA~>4 zC*_;>&(cTA-=044k%ZfaFW-L^-hO*|!F}+||4`*=1J}yElhZ(lX;V(pp(M%hW(}~ zWlTD!hXn4!QVLL|P`9e2v*pw#nd?H6zAanMu2dz%7zJuNZv8z}*6{c3on#0KUZpn4 zPR*t(Hy94A6GyUGNl&)mDtL8cFERSGornp@a(RUn+~x?GcDy^$d+)+4as92|I1Hf( zvNj=J-v+AA)a0w~4OmwLXUYrgkWP~tcup#K-yZ2fp)n5A!urZ(aOsY*+@@;6VQfn5?cC6&<&VjFks*VGr}YY+#z8BN8cfzT{B&7vYu9n=1D%(geI!2J=HB$-(qi0uMoL#qU*5;A3 z=+GJH5w)-t_W**VwuWmpm|M@(`#@>P0kmW|IRXJfS={b;jc8>&> z>LjK(;jYmv)Li$121o&N1Y{%4Jmcc3V$ZCYt5Wpf4A|01$J3+YDC7}yjE~0DHH(Fx z*x71|NCA4_KfH8E(?K9Vv1EwzMJ1#&-2HoR-wWwO`ZXQAHoV%F;1%*y&zfD~qkWa) z)1>E&-dDf0B|T$tpw7dc4SS+jQnTcI-6z++f=qPbl2R*rj0d&d7Jw_D147DQoxD#u zc+LX6D9E5nOs9<~brkgn!J=kO7C@&`M7M`b>G2Z&#qV}AZ4jD-U~zGt1k`b5N0&|6 zyD(dTeFaI=7@g8mgzE(Yi-@LHZ>l%U0699xoO*VIeV+}oIXHoE38_jyn6ekYL9;U{%v^s`Nu-wzfJ<- z@*#ajiuSi32K|uGkAOv#(OtftKzag*Y=>g%F_pHy`%$Z2LQp>Zj8ZJP!srf@*#68u z!U2Ifaa~E?mJXIUF16ilFY9ah3h{jm94)0obZ5md?<~tu_ms+Cap3kWMGk7e!F{9+ zg9fv^F~fbkx{PIvsL`9&v!xSWoMxZ|<%QCF^008!KRo17ka#B152GGV zu?Q$amtjDRz2a3$js=WC3l{Q{H?i*l_a{rDXl|1X0wsU)i60K+nJ^L{l(imJ(_~ut zKKWb`vp7QN1rH*1p^Ir(R#OpM)_&??&NQ#00W2)!bYn~%GepbEDLXhnKdCEAZS@6< ztS>IFSd-a5d3ZonB@L7?lUGk&>YCE{nZ8rCZlbeJ&=R%gLi4GBChksq7YtieB-E)K zYuDVk)wL@0Tg)1`Bnh!kW;?jUDkwU4X(Ra_RPkPd71wu1eg-PAU;uAD2+w@GpG zU~0+f;s!80J=9`*YP=9tfYeh>?S`4-ok9ZZ0=+wGw_sA8&B>#J#9QeurGJy!2D@Eu z*Ok~Qr82RYQAg);>E!TO{QuwVzrYs~Wx~C5EF4y0-9>H}oZ|@R#n53Uks;9la~RoF zD(VWsE?cWhGs-Cv2&|~;O24gg2Mkk>BThv{m0ZbghZB_8$&Vc4L@xFymwEB$o(2Gk z&Ow8Eg*(^FWNLPxV@P|byrr7|0K~pn&t{exyip6gU$-TgLoFsxG-bOUwn(qlVM>n5 z>+69Ejf5IBYT0*JiWSr<^4!6vZmZp`DQamz=Ufw9bS$Ree+Htq zeQybZ-s{gWtk_$Qt}Y^pDQQJgq0a7IucETtD-Ev4)9t<5nppL=CaD*n3bf;0?kENc zaEni$jl+(|pF3E2{^_@3Djr}1F=mq{Z)d*aT&3zKCFR6MxLrnj)Im8@a_=1?DRCWwjRaQ zlS-GE#!~Vzc|yc;ajd(9ZMmSAt4?#7ysnrOO{612?*zT!{Q|}Mczd9kSZSlNdbhU|0)txseMCi1u5YN}2roY|4R2u2}f?8xR%oo~{L8qyN#4+`l%` z{8n4@@ctu$b^iM8E6e7G#0vS3;&mv2@6$rE{T?R5zWAwa#d9eYaSd{)!;7{&&Ozm= z?jsxnWjd&?&ijaF{pkuKs}^M(6QTc8V4*dupIB3VmoOE_w_VmZ;cJDxAQ9a zV#qPb%&H4cU8q7>hTOY#D_!Uyi8NX?>|2tgwS;Z#GGJjl%{7br1Xk5CE(Y>)y?P>t zc9-kHNM})cgeTF1>q$U~Ft)ZgP*alF;01K4+IDgg${ylTcI4Zvm0f~iNCx(b@i!EZ zTAGSu4;bklqq`!kh{3bF{7>>xWSWeS+8QkISDB_dvP zZh2rnn-GgD+cumz(i9S#+qI7m3*{=a&aoMsmTd&PJwv;AY)<-Q_Cx?=Zj-K5(b^f`ftVm%3g+_HiBy7V z8IF*E?N-oAa8|UQJB0uod?MS}u*uOAs}4$;*VYITKrC1x<)!oejfjM$FvgJ<`t}zv z8$dK%q5}vyv`bIICwrdb!9?JstDOvf1Cv{a>7P!0EqisLNMGq5wv?!pLOZl-9Ysr{2JCVLK&A%_ z!zc;+*ujIIpz4a;dW8uRl@bp7?S>bcU-H_kX7z#)P4t%PqT5UaKecqW_XueaTgP8x zhUMT8(=v4f(z0#jP-BH^*_@OoKP<-W^+~Q4;;AEjXAyh({iCDN z@D02cw=-AO+)Vd(0EmnuTqxGt$QF`UuD1trw%uo4TW&S(IE8mgSbnI@5QnjeS~RGW z+;p|i(eoCXAcpV2C^y}%KMa5V=YO69*vYZX7M>rKq2Ki$lkoPN_fO^5Ux&9Z?MxXg zM~Yu_B^yz{Lm{-!Y~2~vNx8+Mbz}6+#f>&KwF^KIruVSyT$79iBoWj386}!Eb{x>b zV}MFr`Jm_0yPrt8R&M^D9^RL$RBIa;8t%0CK*^gPF)-PuSf&~8lS+~5wzdK< z(vk0}DfL#LlsQl`0+@<9Lxy3fS%@k@U)Jy>_ak{rP>M&+G-mjuXoIH^G;~{W6Klcp`sb{Zn`0HtFSAvTHa-C%NT_W|a2l2Ge2K^*Rekp*`R%G1+c^XE|oC0>|v z@TRypETJ3st7*_oer-PC~MY+qP8MJ<++ zQV>kQgybq)&BW-1s*<-AmL(4r!P>2dgBP_tiWlhtta!K`s&gzYQ_`6sEbtx{cSY58 z(X~J8@?kGf*Cz!!9T_wlVOzKj*HCO`bpWM@w(+{P(&Y%HAykyaMxrWZZnptrxuNXZ zqHsGx9Y}qtFLnue=xyY=i#VIWm`BJOFRqM+`8A{R^ERDU5y=5u%90HOd|LTnHUzQA z*7x_4n81cWA6{mFE$Sx?t&+C3)80CT*ma2Ot?)2g-kvq)E0+FYw}qo(?e_!(*g8x^ z-VIa2bxPW}?-0Uzf*k}}=;AY)xwWMf;>&V7$J1 z`aM#p6C#?@)^$3GXMxv|y>g#az`-^rAtOq!xbW$fiXo<#m^Dd_bWyAhcL;T|29)Pp zsRp#%z%YYmEUnMvluu?e1ngH~y8u8hbOr68EExi<8q#(`uJBi5^|DiOtnLe*VxKamB^F_k`T@9Wb(E+r;(o$aev;kdrpiXsZszULl%5JYp zERRGx!{*NJGtfb`2i8Mf#kfJc9f-6oBP{0r<9Qw;cTt{^2{R6}ySVmyTT!VAv%>RI z8JUwq7t?{U1c~&Iq$n?-Ooc{~EanJuj*k*`{*qN!TG0DC5Dbc?9ytfR*E*w7J3>N( zZ;ID3MHYat?N+1dFwY`XZ**E{Vz{Rx1lC|=x2SXv;+Sf=t2x+fYdrQIYUpmc67gR^9w0)uUYC;+D`2{<)T`M+~P}{ z^sMYpC_nG@>NYS5OYMU=LJmq{Q zRah!(srXUuF+}MkK~BzLacI$lQ`_!YzCvS3O2GnF&n?oJtz)LQ4v-gE>f9tC_3+I-BR?qJrEO#DFox);9BC?V{r- zt9LIaa%dk%66=$KMC-&7xjf2g-|jZ`fd891rE@g5wAZuFK=MB;VIP#luPq{mnPrWn z=5Ilqo^my0}v;A&&s39Ie6)$f?wp?R!^l`^e}oz z&jJvM_EaE`p;Jo5pFKDoNbALpX`6+g`#vAOE`{}rJ%hI$fJO>J$o)&81TZ03$=#@C zZ`E^yy$f0aDOPL@lYEw#rBu~E__QVh@NFkux9_vGRjJ4hf`y<#Zt+xy zG#CP8$DXM2B@SnDa#O_q9V%6raRZ1b=Y4}F2$~r3hFsqv5{w(*y)3=$CzfreIiLv4 z5lJoS$PEh!3CZuRqk!!A|tR zsago(DL>f>(|Z6`Y)|aI!U_VKYmUnW?@K!Rv?SaB*Y*v`RXPDV1`=s8{j(=QEimXX zxr5akpu<5Kj&%>NzP?JrsC3^<$WI*MfxO@mD5u%`6i77hjvs)8SWUyX2QocbcApU7 zC2{$h6YUJ;klImTFo+`V4}yu)a?)FxcQ^)0CV<6sByRcX2jZLZfi?*W0clp zu?}H43fR+P?4u44St4eb0I=p$vVfF&dP+*vQ@m&Is{>C4Le}A&!I?cpQ=l4f%a+p8-`2ELkpMChr`xo$m zc*2W?$yqUri|+1D(txT_o6c=`KJ5jyQu%QM4J>645vLd&6mPRCAYesTdGf0hS z)ATgW&IlY>zEu;+Gw7)>9$n+fb!tFhf$kc3a5IVX66@KV;CP)(un~-V_vQs72u3tk zIkbvtFr2+NSMrp-SX@4Q>fP*6Z>jsi490g7D;2waz!%B04MuAOU6_;v6Gn~ptA>K1 z{28L6pv+5-?GtW1s;pt37+b%xfI3U`>@Q^tlrbr4P0@A)Vud7aog!@Qi{=du=j=rwv`SRlDnSH8Mm5RA--Tl|OIonn6!nODT1Or} z+y#0FP{#BooV-{iGiCG^yjYm8ugS6^@gD?@Sy|c4=(~mCMyhKuaJ* zY>?-WnlR;|k8yNPu2B_0pTy8ReIJ0dfl6_aWOX&X1;^XPqdJtR;<-2F?}bL0D5e6XBsnqX^i&(GfkK#te76f;%&l7L zu!gK|x^4fL}}w;Ip@H!rPDkE%4*p&r)iAaZ&N-l&#yI@Fc`( zyRkOfMmhiKEX-gwWsK4~U9sxpj0qD8_h(jIR0D)b!WFT{niVUQUP58te#mj!wEMXX zrAjl@i)XObWm$>fg054v%L+dI2w5qBUSPpzVFP%1bNG3L$=8%n95h!pIWgAeN(y!o zd!x3@jZXTxz{R?mL}@7SfUlG-yrIuH!t2kv)tmf;(%t=tcYTbYcELfCc`#}Ev_!FD zgI-HCEEQ9kJ~?FKoP4cc2fG{xO&6XCjV}FKxx_04y<>77=IR~ZN)e+K2(U}k81P(s zb)O{YEzhXpd~vL5wFk{kslL$yRkhk`5pb}^bYDF-l&VBLjal|vF1yWVa( z<|+KEYFAPcuYh9XkfqL)sWC|Cq_<>6DXXP*Oife>$B|5=JRgF4z8e||3DL?4=kA;2 z>ZkADynS);0oDPSx!CQTpJotTD z$SISv(=hVj5upVj%vhlrWj9=RR_SFO_m_mgXB&AE?gV_=&V_2qVdT0p6IPkgh2vy* zUSlN=NbFB5NYv00Jer$NNK_ND4|0I~XU8X@o|m^9rQ=Xm0Dz>fCR+c&2Nd%nV}~G6 zO9r5BTbwx9iv56i6R{Zy{yjvsT2C*lRj%Re#aqPijqH*S|K;tZ|M0W-p9H>0gAfxb z|M2&3zXmS8LSD@ltFfF3!7 z7f9wxvaOd*cZU<`Dnq;JtQfkYL19t@18!&=;#d}63{)+yus*H#erc?L1zBy9fRtuj2A88?R$3aMmli_PjBC9kox_9 zVRrnTOVq&5B}}`)Y!W1Cwsva>{Xxq zs?O&zxR9M3%Q8@2c19#%xWFl=mC){wlhpN}?0ii)H!8L^%YUNX8yqdrEG?B}YXxah z7;&h5$qUMXbiBo-dj@;1uxv&*jnq zfUZoLTu65<(eSs>H5{<6ssW2;RkzmQR+|qROfe~JRAR}=2?GSB3|zEAQitoi6-Z*N z3Dh-}c@ILz5iORTw}ujJlggUf1WHQ6ZE`qK7hwNJ>Ld=-Gx}Bvs&7QCW8R`esA9rU zfn4=oKcIVsFQ zmyv%*D*B?oD3$l3Ix`rIF8l_f&ug)7!Yax*l79zr^S^!j(gKrSW(;tj&(L2~fDd0^ zxBf@kYDfuXP=;r%t!Z%p%_K#t{CYbQ+h$yoMkKaW@-_CJgd30;Tq+CU$s86q06WdU zSh(uLXmfDs+Dafh)idx4SD9(m5pkqgq-n1gHMv*XJPWww*>=rP8Hw4d5V)m*aJCiyK#iFc#}^Wa?^EmJjB>$PoE<6l8n7Ke zv!F((OngeFf@)>ER9@W`?*9iw;pS>^_>xn<=fYiTfMMpb)Y$gh_n-1(`0gi?OpS%a z{~Z4Ke@^EQQ!*1YRga0=Zj|x9b*J+e7^y#DDy(ZGn9$hwu&->|B~(^4rw5-xA_t`o zM>WoScEL+6X`Hh8+^XB1(>QsB<^V8Q_U<;F@pu63xi;5;=RGw2R4|spiN%3N5W%I> z`dSZi&kRQpUd_h={lPGVi~(CxSWBwoFr%XKfci=-EzMeHIKRm8pY@5-d2NcX$Qx?1 zw(tp1Vx2tzkG7VqK5+$)PuL?jlwoPXJhR2d9v#P+R)p*xXnU2N*iBP2P@O;=~qN-Q* zMWytIslSxNbR*{+ymi>Rr{gRM!nnJw8m2)y)DC*?;);ZBN=N(%dv%G=dQBeMP&WLK~$F3#m2oT z2Gw?)3&3Q}`K*mA(8_ub|7c836N}=@!Q) zTu%pD4#4S0Dr&%*Z6Mru5&z-GZ$A%jHm&%(_wNV!CB0J~d}GA!X@s~^;JteQ(zb(y zBl)DJT(2&SmH3I&swlZDT|ogBHyE8n3$qyk$I6p$;VEaGHASV@sO{3ju{avJqp~~CfkE}(vXj8lP89$LjvpOWyD}Y^T^=7e-f)Nk34nAK z_8x755Ap`7Oe}Frp5nssK84Ium4D;Ob;79qM?+lcIyi*1#VT=W@9mvM;OLfl)G2WI zFo@TZOw_VN`cg=>08(SaJ>bs>AD$#>4pZf`Jf8;wT*}Ld#I?}BHm$fE@QyBY&d|>e z9z~dJTj-Lmz96i)E^7k%qUY7=e z5Fezs)qeb0h20rv(6PI19{fWbvjeF=`H)#%1IoxsxhR{Pq{7^Pk z1qr1Ap_m~aa(4zC)bog~$9LJL>zpnJPxe6I4EXv>)^-Dl@T5`o3Ece%+SE>5+T@*r zLDIp|r4;RkR7gX{)T^}gxjAtq-Z)>z8$=4_%e~?}%Pp0E)hamY@I0zHk_Wa5);MD# zQQ5#FId1o*L&F~1;G4PYT8sO`L60=PXYxvSRmc;EA3#6O=qSxA< zBq>ZfIe|BduOwOMpnPo?_yn)BVo;7P_Vm2z&nw5-8^yoZ1M^4@Z;HEOtsGENU=eg> zz)*w;5Fc5^Lho*n0FvX!s+0oiyu_S;))HuDIdV_esEAj^EoX#W1rHLlTCGbt89how zEW=LLBNGfpoa zxo}@-4K-0tpTmokLu{F7M;c-t+JUXh5+HEJvVnIGPC0>f;PNbrGd{99ZJD&wCDdB7 zkob2SKa$^6J`|}Yhan9$^nd^TTXVGf@B;{S{gR2`H}7AlO2Yd;U!FkoNgd#W>j#K@ zc1ib);M!Lx^E^qQ*ml)gB71UaC1Bvz#!u`MF(Hs}d~$D(r@VmxNv#RuP6$|1<*{6# zDdJ|zjzH)k6tAw_rChwmIaF%GWKUY*q_kx$hoJVg=`HB`lKt(C$}LlVZrlJ!usI@% zA|rRqDo9Q_FsujwVNdUHaNVg`8l-79!@rgWMU`={)3q4H$Cq>D_PKzw)9=#X=$F_8UPbUmhf1R1cGkB#(Qz1kSB zYJA3pokaad3r9go>oy+3V{rksf?rU|dDlS16KOMzYm1t^jE>{Gg6)FBgqT4S1?}83 zOhRf2&E}TV-YPbpg3A;kZ9LE;1i8f)hGQpJvl1B7$!ldr3Q8434#R(P`TNvl9v|v|LpvC|OD(7)+ zZJgBY(%rne59l4Uzw{~$cfPP(3HNqqG~6caG?OSGVP9n^ZGO2ZoYpo_? zFw&VXgy(>=-I2op%>0M{`u@H2o&0h5lRwGv^4swCDex4nZ9`vG-FCB(xU1vA<$177 zLB0jLy~QfgT`C~04oSf&)Pv8xt6QtC))eGa?1cn3s(%B=pF%IF>jqAaGs=)1lSOR z83ByF!<|qDzL2fHbc%vlR9!~p3xM;pthK2Vz{vISAYIHFvzK6x{(uAN%YH(r+Cb+OQkE0$FHHaIMt4>}7$; zF|2ZkYL`@$`r=z%`t%>`CDko-kY$OJ7I)52$}&{QRaHwOK%{Cp;Jhczzj%`rj6Pt@ z_Hs95a+;K4P;4%J=@U3yh3(VeOJOs_QjH>lZUgMjPW;bqZy4N~O!Di#EOf8c6_^`w zsYqhOq6%c$a4eY{*g+h@@W^n=k=#U@wpvBhk@^n9hCv=WDdG*z1MD87!&O?n`qhqx zlvOrK+(YBqY0C4n8^3X;qO8H*pulo(uA4mHY6V02q4t1lQ5RZ{8IvR^xM_a38yCJV zp^zGqLmd>FeO^3{VW&zb1~KxNJIdee>i*aBO&3=Q4^_28ci0|%^l&htqdOt03#v{OVaK(Osa0kpp-Unw7VSGpZ07|NCl8L~;?1Rlr$vafMw-uAv^sawW9 zBpshs%TY%BVXU)Hth6q~Zfr9^+cXN;9))DpuRZXt&OXqc;y!!W4Sw1aA1#Ssy2f;k&Ak} zxTql?lS(K{yxA{F=qp*AwAFOc2rG|HCiM)*6s~dgE_`s)(g7Bogi@7P$wG(yj9sz{ z>D0K&O7kwx&}6n{?0GYc_D$MN>**v@(&?#Pu>6Ts8CG2bo1M{m+#g(sL7vo>ky?oH ztLsY6H&Us62ErYt(US}k-9TK*fDw8(EA7Emj<$TQ!*iuuQ&RF`im$Ds(aIl** zOJo+#pB5^8b-4l%dtwy?t_UeWCOGyQ8U1kkBZM~RU^@kdJPHpbzu43)@Pe4 zJIuf0ss0tPGv5pEKfwnKD834B|Db>Jb!u**Fe?^GvGxK`wBA=IuWcr1rN^N}LZu(n ztp?&pzUStm`T%$W-1xI2KW1$e!$}LDa79(GJ3D;Aoq%@$XZq;4q!rp76*Y(;0^sGB zLf^A3VqGq~y5vFm76UlgP;OrP!_GoA>Ll;EA49KGNV2lyqKoi4eD6!lE8lrDo;DcQ-vB(=e|a# zuH}A$(CBk`N#SkUI7X@VO3ovI*`*dMxF5}F!BpLo-PB5tpapaGmlt~nN;}sc+>lEV z&afSQ6@;XnU1uUnd9T@1nG%Z|;4FlsN+?S>SzQT3m<r40o*iQnjEpyin5+Tm^K{N#WOs)|j@K6_($7P|^`K&*LnmNG>c2HI8`&4lm z2$u3kMzF|Q!81jNr)*<*1LJJ~E7pzxFY6tC*hF z_==p2S^CeLDpc8w@TSH+auqqo_qM;UOY8(^c&u^DRqN>2IL_@EK|qOfN$GK(f%8N3 zVz8?rQH?1-E|Fw~L7Wm{c&Me&6Lya-RL!``09y zeNBVKpVMIRXP2iUu-Q#N<+4jTfEX6sD&vV)05v`89^@i6G-WkKICxTL#J7!5@f=iln_#`Yg6wJOb1{NO07a-vP{}eR^wz$31X04LZ;s{f zRn@8YxFU~Adw0EBNE~$iY>QJYet~SwGn{I%xi=~rOhxU4mq;64sljYFy?|MvcR679 zOc`OddEI9^oYE$`Q6YMnq3|OP;mS$}aqMWSJ>0FQ(X-=1kT0OhuZ)UMDBv zK(+t~;>3drkB6KzS9_enWPuETTVnx!E#1bk0K0O%TI^~pmtB`u{eNP~c%`!0cqkig zdkTXR`+fyxyA3lWh^?)<5UUcbjbsXt(}q*ba{jfvMK7^RFT8Kv!kX&k#hm;Yc(@R2jY&!Fv{UVLV;DH&G{COY$sdT%8v zy?S)nR-H&jE`t>Mxcd}V4nRny3Eif#{vav}5V}4Bx<(oqPD>;}e7Rv9;jrS&}fj({^aMoeU0E*tztcEC2yHpL_CSA`6tP=kX`U3c0V14H#m2iq*kV}pDC#VwyyZ_V><>tg017`uubpf zYPn)NaAQ)$ARTQdXc6e`u5k;o$V$0Dc0bqeSWv8!u7IT(^I7*=g_1a;2TZi=HP{Vk z{hE`-L@DPKiblHfbV(y6`N@rTm?ktrF~uOHwBqJ;39r@}LJ2<|fvC>a(>NBkK`a3~ zs)+x5sBt(@y*nZgFyIYWh8^ABQM*Q$JC2c4yiXe6rV~?H7%vaZwQqbq6s?NT0J_gXY;p$Nu3R^Ou8k4)|f^Wo5%_{EdL*Df$ zZ>KRG@?Y21@==GW^naVBxig^)l`500=PadhFMC(98>fe47jt&etwaypl^XU;#!RcS zF?A)yXJn@Un64GyNa8WO*2>u?Dgcgrc8Xw|QtTb!-)-faOrV_IVLmD7=Vf{&`PR;q zavbRlIYEHbe#lb69WK z5$3rS!%Ae3LieDpy_RRoWINX@T5hN%!>JVW7QS=+M~j(nq^7hn%B>3oiwtlvHJb zkxn%&oLqn`G6C=icR)vMqtiH~-o3e~E^M)a+hc?K1?pEIwkXPXIOY@gtMF!;BtL%p z-rKhye)Rrjc>f}W%gC{l6cvaxgi}81rgnWD+!;HB&^WX}_QWg*k`Z0)i%*z`O;1Rj z1D?Ltk^L2xT`d$?RZ0+Rx)nHs?^xifRik}*EORfIWPf7GS^lsbW$-L5;z@NT7i=J| zTi!!~#JhMk$-s=RS0%`WLt7;8bxfW-P7WFmBGpHA#N(Nhd$mkg`VjP4n+B>-<3Tft z7wJLVuVTNolGR1>*JlxbxgTIv)w6(%dEBhU^K-0r(;3S$ZB*I07J#xmGM*dIv!ja5vT#o3$r5!u3#}?BX{7 z2(se#4Q#$uRV>r-teaLra1bA}==X_SicS*pBUx8KdejhON!0w*JfsGJ?NE;d8Ld3( zeG}WCrmG!F{T43qbxN~WIUjN*?-Je}7!CxZZuGhFLR+8rt|yCiP+lUIY&s`qbCHSW z&6MouQ)t9A1l9Y}aA#P*C=fF{P66{R-$qW}r8=>Ky>EGX7<9*R!i(J$&0Hy?*Y{8O3rqaP-zsd2Pnkx|qgdPS4Sf#y%TOU9)_V$Fjl_J;H0)KA*1-`gY7b7Ir zko@}F_wU-|zI_?q^3?9_v$r1yzW6uP5eep%>QwT|Yp5TN|JG$edX4K+k1WhrETo)S zF$K_@u>i~N8yLvJ34&}u98NaJbrK*=Z%RzY33i`>Ly2>4TpjOmJEE{`@kOvV?0=!GpLT;S!)jiq!#iXg$?>rHGk=MrQy-Y6F6M@ zah!#Xfe@W*iI8(VnKRv{Zs(W@4;%R9j~YqcVy{wyP*c#;{vH$wb0R-P4Nd5-l1C8H z%%!Sbai@y7Q7gMBbBNSL0{vl_uJCxBvjpsJ@xAA^DKqGHh}u$I*hxS&ujmX?%6z3G6Mi{VhT)Rx}>NF`F5kgA}7 zHCM0L;a}PYLrqqp@;B#wyqk=JZUCNjqe||Tl%3WkNm+1(@N;L+!j^nPxJx-gZHNX) z+3pu9lp6WPf#|41l5@3j-r6zbMK1F$+6PI7Ph>BW%Z#V zB!BT2e-Zu{Ru{hw@89zEuZeazxvRea=5okEv6^Fo?1Nm|b^|@WX`Ie8IA4D#!M22+hMjuI;6Gbq zVruSze1JU!MBd*3Z9kc_Cr5%5*FXIA+pjRx$1wj6AIqp^K1G2loax(Pnmi*h^zQ*bM{<}JM$Okju*sxDqoZhKLCuzn@Y%qDtMa03NxAsbK zu_Gm6$))uXN^iM}c(Q*1%W}_}jth?_+UQ6l=skA<>Iyy6KNAu<$_TR>B2#%rolDzf z>I~=_Mw_}1x`eeVqV`E5jZ>quFGmCEoVbNO+Ie{bsOvmEPe48(4c%!^@$YL{mKJ}3 z^_mJ_{eaMAce6vQaseh5B1?|C9wkI`nou1Ic;(@(lV}!7>n1`6T0vOXrB>q}S`12! zVzXipr3ZV3zK5jbmo$>Lf2H29xZu{+Ng|!*&=MJhk>6>PSxtamwl-9$>aoD$6GR*f z-SD-YF#N4jD7I=`dYUS}%6&h%-ohnJ>ErfbD1(8xpH0WIHUg1e0E~Kz!OV$8QYj$3 zd&ROZYuw~L1k3o@`_G7#6h&@+`u>maU#DL~`oIYNE5u_I?{A;75c>PKf297&3-EvN z!cGD8**5tAB0$3mFa2l`Vq#2{ZZXhUR+Um}6z?m{*E`xXRaSwt)XoJb78|2O_YO;2 z(`g2b+rgn{tx`X4js~2easm7dRY3qC%_hQd6p=@zBTrzI=N$Kgmb5zc;OHWSW86I& zuHS4&J;av~Uze7>r*0%9nxIO-2u#koJpItpgrVBQsqtV(3@R%vWilK)6NpSVHg-&v zv2H-%T?L=aHz6((dvhF+3=EFIvewnfm^rnKNYF|zl75hf5v;(?cMr<41Zol*Rk(;a zV^C4I;EbQA-EKbh?d3AIBWP|?cS!=|AgypM(*o!>x^rN3RiJA;fExl}QUR%bWSAQs^yF*xGlrX!1S zD3mBlFMJ0r%$X1fn;)V}CCh=^Hf6q8ZHz(oB4sCD4Pa|<)G>s~{>2*e3=-z+0oa~3 zIDP{tklrfG3cJIdYi6l<;UUI@P^xJV<%|^(x6uEmG>aYSkRYSX1`-Yl=_P7j2lGPt z?j(O+;KQ|j;oL)YUo!3KY5?6ILgoJlVZ*Qbdk1D9YvKimbur>otIGI?V~St`a z&#t8_%f>~z72pzm#M8*1`1LiksnV5hiM|TZ!8Xw5uC{g* ztA&{9Y)Z&Ys@)TTZ%C!X-axjW{NV-Le&?1;oDV+A$O_r8RgGGY+FRtW1x%lhR_1ED zk+rjtymZE4?@IR^hvX2x{R!A$lWu6GH@A(YYUlah3@#X#I5cXaUGfmiEwuF&gzIKA ziu~|j!~5q@BzZo~g6oMX_5&hu=@deeRc_qWyVk-^5oZ-sSSq@6WvxRc;C7fOXls5_ zPH?l@9g)zFYP_r#dMfz@~-aGPL}Xex&26N zLe}Mg)J?8tuk`>q{Oh!54Cz&U%hOreq5oL5sP}6!dB$8eSE_PrCj`41Z{kN)T_M-! zh6O6iY0cJQ0NW#zK>JLZENV4rrh$FzNkfiMRkMRtK#x*iLTUXEjTDUD(6DW%boZ1> z#>$>&e7Gewel|NHSY}yV0ycnKf7P3?*RC`smy6i7BXun49hfYRNB}I-l4+ig%{*Et z>1L47Ik>>KG(D_XP|5R}PK-QsYaz!2U=9E`$m8lxEUW>#{wt8Xc&ciPG%iZf(Pj`h zF(OC1kV%5I^0i4%yN9y4v}&JpbN0Y(Y5@DTb_P&d4w}lmONfKw`r5(YV|L3&qnV)Q zK4(ZTl~b;18Dy_pbvR5k^-L~RWzKj}OocN^)l9t9>Cm;`Q4r=Opk&giJM}l{qBwh9 z6j%bagQh;KZWWP8vIw!{lSZA|WZH}T*cziK7b-{1lxlhYwNFFb+9e1K~y{!Re?C7ssSFQkR zQqB~3m=Ne!;j3p$TQ4+`8^aZl>)92&8E7kgU3|e&9VR11=+TBHzl|j1=I^LJC{3sG zP(FHxGHcsR5YD>W$Zx$tgE78Rn4oGQ@4Y;M~shFCG$4V zNb=)y)dPz0CQS}^G>2r*9p0pwzk#7QCL^E)1UfXJbLi18b995|49tSyqdyzisK|IJ zU*Jj)+54~Y} zMJv|Q8DIcGH87_^rwqGqH#w{8jiL_00j<+jY0E41k8kS%A84foP^@8Rm3(AL!@FBL+9R@o?pq;G29G_7zt& za}-EjKiP?UTy^-ISnBN-@_UKw^}zg=5$kVj(2TyjZLPt}L>n z9e`itW?HRw-D$LhQtLv*4-_u|mFc;~>z)yISn0rkmZI(hk@r!ucw0`hszWx}=MhA# zEve=qz8=uRhew`UIKl?fYnOEU8e1)>z)1F@P(Rv@1PYw?z2IPLM7h*96qVF*zJ-`a zwjx(8eb>%|)FzNOEcam?gT;idEc7!ks)l00MsE34%G-s3rNKboK)4XziJtwELYTju zCu=cQxJ%R=x~}nM0*#jWc9x5`LNPE2H}bmz2^xk_nV>$pkT}^M(7LFmhPNWQf~J=) zIhbVXfI)&uOk6K!73BMglzGF@R=#QIb=;aF25#x#5;*M$*5-0nIcN(&xi2u*uH%67 z&`U6s6Ef8H2sb!Tm+KCurqnI!yFjH3U`wU8#W?CEVG;pJ@Tyo6{6$?`c^WIY>bPtO z(hsMym?GBLzt;OTM-E+C)jl$X2+S4CXP%#Mi;qmNoL;=XM$chKMm5J9l8PO z^%W=v;5$k1t+F=FhcDlM4okJq-@kePk=lZQd8r@L??aaU@7}*i79oFU!0+c|52)i{ zp6yD$5zJTAg<-5PJjLu+H+H7}BsWF^EYyOk)9hBFXHvno_yWhvaA0J01anlh0JS6< zI8E4w=_7yLWlB=5N_cyK(=ba%Y&!N+iN*3vY|?~jN#i5^8t|+Z7(@%u=#JG|CX+rS z0Mfw)JWRE(g-+JMI021OV|vzJjpHKppcDs&y8CoXtmeC}j9G7WUT@X5=m0fCj@+$2 zMr3H4PGL1Qtr28mR938QZdu^7f!u;aYNEm?on20CvkK!wIX45y^gOPBViQ)Y26^^! z4IPU5vIDBz2gk*v7#a(FI-#Y9?NU-?OebjZgwFoO+t+kH`uZYg?{{$P`+m$U@3 z4RxN>Uy%YlN!qpF+{+A&-k~o*WHZ`p7q$j)xhW9tt~>5TfzqW%BZaIRSPWsDCI=c* z?5A58iIh7eY0J{n9lcbEj#32$+l5_LaI0u}9BK@G>J>~Q%dyQK+%0d*77tf7Ywb;} z7Q@l#h(^g*6W!b@ESZaz@@$n}Q9BC|+jfE^md&xuY}h7BSl)YBSRL&B>osR12?|>e zEQpJrpjOsJxU#QPu=wyfwBNtMsrWj)nG4GQ8Q#9S9Po+639;w!i4_e9_0PHpo7p5M zGDvH06fmiV$Z~#OU1$*Oxmqiovj~}F7ic#OT!Kid$n$8_?bE1|shl;!RcahrD8(6? zT5S8rKnAw_6Y1MsfQ+)G9hPkDt1$XwPt`VBpE$q`FjK6Jx3-sRx5R3xCPV^D;(^Lw z1Dv44la+A~XFGct8@EVMvyjp?Pn2O@WGf66=Qo*t`-EKB$vh2o4Rli3X=+#?+@4@^ zn$JZI6C5RxazBTTj%1j6NSi4`s$n>2L8J~gF0PJny)G*1u1gSk0Or%MQT~b!;&jPb zn@O?SB4K83!+{o>;yv2RbjkoZ$|tVGk+C-tpI&WscW@RImjRFoK5PhLIG*zK?@wQH zX`}V~zq%Zin+rc7U-?QtEuug_L4o3>Rv`*`s3Ad-RBNOPk_h2?Kro?NAOMlx;lZqQ zB>BQ|3}!H$JXS??@;1&e8UIO>gajm{ZX)18Afqp+%IHa?BxVQ@pq{Nid_pOXAtzHk zo~<03*fUHW@rF}Y(i>kf2NFurye<(Y(wL;$ zi5(YZtPoN^Ldqbnr9bHC62X4)%?hMMNcWU)6Pka_KnRz8O+C`Yv+$J!N+^&8?M;~M zUKH)rgXJy}zVx*kgo3aZBG}{+h=e8bfz7BN|)51ynhbQRF$Ple;U@#cDjyw#q2Bn za}twn(LJ5uMv~t;kFgHWlm`s_7Iv`@O!+ya#i+8pY`qDxNeC{i*g;T$CxDdw1d|n7 ziWq%(RUHpZeMVQj!fdl`;z0AsmRR{!?Ir7xfpCs}?82~@w;MTfJABDi2*_n(B-U%Z z+*;LF*MV@JlDNQH@0@V;*OW7TP%>dkOHwIMyMV0Ygg2^!$^pM&r`LJ>5M zF>q`R%&0l2WT-=s{cegjECe(ID3aiE%mrZUD~V6VHE`_qbm(1_uFP@TDe8o`FU%ss z%poj%%vAox&nBH3>c3WRcJw@|a;Xy7<nppRo$2=qUL)mMMtRM_sVO;W< z9<2R`GT^hc*OilWtg5lStM^*^Ll|?g8j)C>;%cYDE)!X|N~J}KrxFq-Ni1)5ZEd0} zZQ<-ZYjMcE1wCU*TzR|A(7Cs25J23MS;+$b4@9d?I~;js224QCou<0ruv@=_v(-(P za>-(8*!_ggiINM2^i}*|;5jU${b(=dS|hg+FreZX>YB}88pywGk^#et(4!w+r8r)k7 zTO`rRF=IWGZJy7`Yu=iL3!T^)J-VoOA^$)k_H8h z*?O$$x}d_SVMEeovxw)cQL`GHB1(g)ynr**iV3wkfazj$20m!2m>L84F(KAXo>Wa^X82Zta~Cxb}P*knk5nZ5r^xjUEJ zh1|gA#=0F^I6Q)`4Oh@(45nl*%M(A@Aws}$$pHF@y@o%i$+EPKr~3$~kc1*P%ZSz^@XbXiv4$Aci5T& zd-WN#&DKrP^;?v_0qFYVl4X4D)|Z}Yw!U6;`)FrvJn=5N*si+mXzMG-9aVj4u~|=J zl}w##M=dOhT)^WNWpl@()((TQ5am4RPY=1R`{i1zppEvGXRV&A#Mw*T+37E#D{GZ$ z*_0mv96&zlk6ezsJ~&hYBtniHY{2BC1Vd(`pbv;ya95=48RlZ`bdpN^)@`xB_x|PE zXaD`bhX0;Fq=ozYkM!5i_17PU4`06hlE6aL{=Yo4mVWji_Jy1pbZ-+MX7267tI4cu7b3_y<9eD-JJvur#;TSId4@|S-{Wtnnu6m963}$+i zih9UHsIZGv`+MoH#D4_v7AI_+sKbRi&WOqy_Bi`d0Sn(-beK78_FXJ+GohSHTA>%0 zPhez8hUo&rA^J^9Q7IYA{4G>~gu*hz_JDn3EeW`gy5!km3(e+2F22-yKt6X-^2(0@eQ! z2rGnfCJM$H$@;Zbu+YTKkJN`c%11J&4YMejW>us<2gk`^()v=U&p5dgZZW=)kpqWE z&i~;O)NHq=D*C7#TPr+@wgJf90Jx|X@q_W_!ccOQ6Lpi8{WaRgy)1XAfVk-SzY8D! zcdXh{WcxGy+}l^6Gao8}XzPp`C?qUI0YHn4WKhhDv{4KCc@D>}HsoQ6diaP;c{|4N^!B>^8)bbMcV@UGS7qxbbGMLne~g!i!Z?ASzk zuxaEwmTqOORTR3}4`xhY^P~Hw00CeXmpYKW)^1Hv^aM%S*u!RZ{Hj z{Us47fi63cQWCEr#mmg09ng}S+d|Hvuu~E|1Gn{NK%$zZNnZPNg8ISILeXlE--V@;mU3Y zX*u=V2R>HHLhmjS_F``73+Jqd`XR96gkgzfk*wt{M`ZdX{$2Q+bO`?U;eVC?a4<>+ z{A0?C|ML3VZ@#CS|JR?Z8i8%7)%pn=d+bjyypJq@G2LKvC-0R3$c9eQiCVT(KRfpK z5FK_nD+Xs`5}z?%?n>k$$%s&|kUqF|X14*B9fzimtq55m?n*QE_WD}CG@Y1b#iE{i#5zw4raB)bl*sxY{% zuZjrrmcE8BK^K)y8+~-N9LsgAms=~ zR5uRrM0GVp6jTrXB5_rZ0P5LoK@}yWv%W<6s#b(m62VY)W7VK3?04by_t5N;%I4Uq zgpHV`)+Ac+$-Q9qu|@-bpNQgxO|L>k^bM;j8mOu~Ru95t43w8&_cRvu1JumOws3uh zbWt<_hMcC?YDq#9WpvVr&Xr0Rnr$NHW+R3H(?Wp94k3h*BoL`<#w0JtXp&ZmLi0*Z z^F>h%@#&(Yu#EiZaSizM_KHZrvVCDJ^pb8bw+a57)`Hw{2}@?SEfddfDd&(2kUUx> zxgl;_6Xn!7mUAcNeUrDHsO)wKS3}!kV1Bzahf{yB;4DbkY;;9-Q7vanO|`bV()D|l zFF!|a5Q!J{MOo@gS#JrXM_%VF@h08%WvmDY!26^BOj}^Rg#GLfYy&v>h=VU3j8?MX{D}4p+m?RSj8^ zlNV6lE8ev%e1*n(mmXql?0u6)vJcszLwd;)xJ)}NAr1i%@RYy`{R$6 zJ=X5W2ELGzl_W#+*1dI*mc*sf%m=FN3@TiB84|TM4>3;QnL$}Mk=aC|c9xJ-xUf?$ z<=weEk=NV|o+jrSK_j%zXSXD`1AQD3Uj}4{(YV!S+ICwdH(eD9Y)>#bwd&xSW|!&l zv|Q^93$17QUh+!;hwR}0`YNANZeSk7>!vEC1b;}zUN@hVkjfOUQK@z_B;i!$#-ege zl=M7Ean1!2YS||OUU=Gh7R5OXY7GikGWU;)Cg7qm`ODX@ZM62HFI!SvFaQjXx*D^@ zHtd~j#nokiuT*|7FV4hOaJNekj#E~>0XoCAeqwgBS+R1h>bsq{A--IuElaPd8a;i( zmmrC&Q^GTFL5<3$S|n%+Gb@%pv*S+20hcG}8pX#&rx_^((!KwDQCi#O+IMoGps=y| zVBIu0!zlky)tzdPWLbbJxzNflDG%Y8tL%TKk%hp$5~{LGRAnB;oTOJH1QZB$O@Pqs z-PP+Px(1N)$up0-BBEu7@ia4oPPQtyhKS>s49%&9GH5eGqp4l;#auZA^5BD|2H41r zlrS;38P5i)gqhp`oQtkfDP7dvY1JNU%wp~BR21EYvFV^%kjbtB8X1&KT2(_ITdFO| zlTptcBxcMiDF?k`=Q+k!4!Esl|Gh@wQ?YAUrbBCltQajN+#q#l9HeJdWlOt9fNzvq zEQQjvZ(8*_r)ffc0;Fx$VBglu@cw(Re;9MOjvq|T3YQhOLC@ME*BP_z{ z1BP^Lbh_ub8W7)-(>fCbs8RxBH;|p70L!bSgi2jNoM4Foa2Ya>sj7?Oklvky6!|K< z4tJFV=uy8oBpx~IN$xQs+WLM%O~q~56dc7+YR}5gVhQ5p)~~$B8vmWTY7{&zc9o9!qcXN9jaP zLWR%N%DQ7^_=qD@+dkN3)dTezVkIVmwn1(QY$?UbuhE^3onNet>T5yXQc)qroofXhXH|sGzXgx=mEIK9n=AA zTy}%XAl^GUm+3+~%~G_tdlNG0Gr_~hT7?aYDXU-rJC?$$2^2*w!cMEYiIYO`Bks9E z>$7!l8KoZ?Yv~2z4!WiLBKDF9T+krgZT20d9+BIOPCn}G3exH5ihJO}NZki`B&=Y# zWi0`AsNK-6464hPPET+_j#X0E)?N8~C zqM3yjc(2E1C8xJMco(`t7(ZrDLo4P^z#O0txLv z*Th_-v^pZ;Pz^_o)%@ydy27#t_HmZ=kRErcL(0JifX^b?hHHTS=2{?9CKS`jf3#Zs z04@)d`(A*e_;R)gtSey1%W?}yf%LG(89>9Z0)mrm*SjMkQkV&-$k}Iu;xdUBX588P zpS=AkyncbYYTLuKX4c$fx5hfFvN8Vwc25|{xLJXksRxGuLzxug5qe|xGbEdrjRPgr z9eE}>=Q;|IASI*)7v-DPcYe^dB_|%}JuzUNMl~LH)g9FgvBwoxnh+VRCJy)e6W|_= zCZ+w0Cn)fA77h|^K}6p(d5j#MUH+s3D=zN>QO?{&>B1559*Os;F7^m z*2i3TtOMe1dSI|%3r3J; zSEQgm6VQkh*4aS%^AqUostlq)KV5X8)j2K=?$Wjm|L51=fd>2qWb7)C$I_c{WH=qn z#%_6WWP$a7%ar1g9vWnYi`8L9UbD*_v^}#lv_zF5C3Ew%1YZ#?^)UveKY%z;n z$sfT!)P7buhLzWxV)TH0U=Mp4?!;#1gZho-ly1Ww`8I3ZT-#QC-+w zt5m$G-Np{Au{5A4XAxpI3Onclsp;afDAtUkERz+6iTMW*2HkYfJrW!@K=Y(a-Icu% zOc8V_;I3F(aWLdMLGF34@A{g%+M9es&}zDa&sj6bu}Eb9G^jqgGR6<1S~hz0u{CJJ z-ec&$bSijB^TtNr2pdu0U|y8MGG1k<=( zqL)IS>NvgLIs^A??g(bStkU|_tf+!|=NSUy4!W#E^}{<$VVzWS{b@+MGyqYp+=HXi zpuS2k#i1^(2U7)s+X=D81kkG1FcMwO@w^`7>pGPsUkDGW@n}FK zEw?oYsQye)u7dtv?D-30SlB=w`3N&sJRnQB?Re@EId?-eQV6Y$O}tAn*L1eZEHGEk zF0nNrH-HBxjQ&Y;3=WzLRAKr`5ez!VNPh#Y0BNmNwJ5OE{i!ibk{fzyCIxsTGTS2z zw!N1dG!-QGILt0bv!UZVNdh-AFYR zxoK`br$uPsrbuCi?Nz%kb~-1QdY1pA>T~85Ae1f?n8`}8&!X&Lue4OwQk6zxhrpV# z#S<7eWClnphaACY=o<;4ZuYYRRH8ylEi zVrv=j))m+j$}x;y;6^jMzG8?fZN{Zy;zQBo8(~)%3R;ND^>3Q==1BQcLv)tb?$a~y z;$w7NtfaD;s3hf;+?;J%qb~j+7Y=>)Pe*;LqQvW_B`3lYl!42WDge_cY|}FA#E22SD>a^B!o|fiZ;3_!U|{MpvAb-{!_#m!}@9m-0&e;Hsfh930-9 z#tG9jLH@7(82($o0Dpon_?14-Ki99r>nE%}eiYt*d3m&%bN|2*xJh1)MM35dpg6V; z-BX0R{`xM5$K&PNeY^;nDKGW3wW^ zUq$K3_g}pJ98P;*y#4O=S3C!P8h9pr1mA@;rhb9fgB<}!Ut#n?_pwJ<_NJizVD_RX z#~Khhw51evmh!{-7gSwb7cuP7_$>`GflNmMK zdB+TZ{+eq!=n4DqeI4%bLmKj9i3o{xq%6y84MTlXSS zUt;O%r?54*Ql@*BSZyfv(p8z?t`3pV3+MnhVu2zDWObk$t3EJT(l`$jkY0q5Ey>+U zNxgBsfQrm@jgI2g(8Ed$_0l6iR6${#8qh%HP*tUwRsbw*cJ3AZ1bG6%?3o)zN^!SK za2ql9)1cbc+&VNH zM}#(!Tye@|XLpHVQmy!w3@yyhY5VCnc&&!`V+bQZF~v!m=tz`Np6d zs{yWWCM%peC2?K~ePrTB_5`)bhZD^);C8dP?ywnwe5^l*$$$xFRH(s+NCOcm=z#7; z5}szjvLV#0o;Dj=jc7#Dvcub|6@2=!?97La2zTajkea-q0s`n;`>Ik!k^UhEqq-!7>>EwVId9fQxA%D6sywi0ObIO`?cTy|4T)J*F_t^#oA3Gb3flL1 zxPj3qD`JVJ2ffMxG$NE%&Nr|>xesNr1yfd9MxghfobeQFCemV}aZ&8grNRD%tvU*X z>ZIz0dC`OM*C{}5T8AC8RTiQuTE{9=;bRg%!yUq$eD3mS6X!!Q1GVA)W6N zmxO6}mXx6OvX9ehtZ1@FXMswUA&Eil1=va8k8I|FEOD)SqgwoJ_&0x@L-7}HpE#Eu zYtgU5o5=-z@%9JEl78{}>Dv#}E1$pqBD{T?9{BHrK6yz99jSU6RiJ9`4 z3b{)BVIOq|u^_2N?j4rIOQ-JW)Z^LvQXw>~*yKQaa8-sIZo?W)9_fQ{Gg18&l2~dk zqtM?DH2q#qSGVZ}3?6c5z7hjUpyQSajAO$>L8Yk1a=$WUg*0Y%c*~U0V^Wmf&ptVN|*e6&a>mA6tca+RbzePUV+I4_kBBOudE~cSU!D@DV|s zx6q{DzXNPQWu2kotm6>sCts6_83H@OFH>AUZ<<+`OAYvwvt#-@e!@x74<@vwc&<^m zU#2TF$u*Miw{gl6>K)77OcVf$$R1qt+G22_a|HAz*#UI=Twf?*&C1;8+@C`1OpzfV z+;_l$yptq*g#q0CteW*{c>RU??HKwDHqc8;F6zF(J;PN7)fi4w=_UuR_UM1%t;ZUZV&}9<1Fw>*_N0)s8$TF|R*?F^ z47=LbZK3AO36L!3JvRDHZ+L*cPn>Jdy$H%oa~@Qv0~@tTH)@@n@0~OV(sCU5*=!5j z?kJ#-(_Dab|2XK_n9n#>l+0aWZ0eSdJB=%#7Oc)%OLoXA+IS~c9^_IQj*dVe0Xz?u z&W^GRq*eK;C3X712I^V%bsjAdk9T#gS!@N@M;{{4pcIBt#|o_5O|@^y@#;~ae*c1* z=%(8+j@^?&X3aDGohzr$O&ENk-|U^v&N)iJy2*ThQ#=DIW!D#2erMMQW6nXo;ifmP zKP`QIGU(!b8dZYM*IP}5YLdL!-f?0MD{pbC*#X#1zuXOT!+In`8jA({HYix_j#d3F z`Sr6C17-wvxv|;sg7A7J$4^~wCwI!wx4`0C${4Z+L2Q;wQlavv7-0uRGAzX{+sg|; zy}@VEoya#Ms+Cf9&Vc+R+_-}>CeLJkHF%=7+j^uE9x$Rf)%v0x95<^OAl+R#-wsp zf+hKE?3eXGB1e?U<=3?a0WU3FbFkZ$SYrc);>yY(#b2XsdQyli1sfnG7&wevYCsTo zFUVB&Yq-3_SH={p0byOip$}bA+G(qHG6upsRBW;YodWGyOuOsBp;*JzA4R1)vKG0B z35z1NjR`dmCP+AqzU-5>s(T@h52w3th;E9;DA_$-4Y!6ph%4$860K55Sp%aa*J~$f z#D=n{hKPB917joaF+5$2`jcKy)XEb6my~ryv#j${`IS~?w56HCVQCjvO{%rnG>eXT z?)CVA{M)Zyf55faC;8Q%zgk%-4=(S26kb1-lJT4Gg}0xj&w(ds@1CG9q-#MIb5Wvf%;kLisFA2G!N=Ld6JI{R>7d-c6zhL!auTd0$Ia z8A{J2E$kIGa6Eiw#j8!WY;dtxxdEI?d${e8EGWp7A_ra{V*)UtP)xZDbz5Zlnhz2GUzaQg|$dZnNoS2^tjW? zzMLu|2Z4F$h!TbEDz=m~2nAk4YSITC&TwpY$&E{K2qC(tL>=1mIc>z@c+f5&PNCxt z7!DI{j^Lku^Y{E1zWsvbxCN?Ope;VnNJ({d*)Z^=JhQ~yx+j>`9EmZ3a7$mOw7+0% z^7LUDw8X1~mEqBMW_LB9DXk+x)hbuYmsBvibtU3ikzsjPOL6PFLUuVqlM|p(za}P5 z`S&%^A6^_vb{=m?eQVd>fzq;?bMS1pu;kYXQX9L}$PX6)qcGR7bSGcJ&Trr7fs=hB zWrOehll;c_`l9lP<3TOfMGF8r)z(V^k|?25_%^frsbVuK^>6c66bCj{iW`QWYu}j# z_%6v(?n(>A%mu9Ol*6hfNk#ZsM%C0Lc3YhQ;4f*1E-lySaRokhb_RJl04_~=s;FW0 zr*<}&Te)(uYLi+0SkOX7&ugeAHsjR$OJ^~$*+;lKDCZd&<@U91H1?w$v`h;|hx|Q1 zhHt-+KI{9hzmu-swcmdpUQ@n)sN8@7YE(a109Zh$zs@=Nl`>aNCCD})2WQ8KN&Ta> z*y`$xRmy|x2Ho^qdRdq9nfuHOvOh%Jht6U7ad zPNY*bs{duOF1r9aO)dzGR?;IViHu(8$6_suF*)1Xr-E)PZ-H8r^78#{_%|mtm#-+E z@%y)*rdL0G{b7K1@jnBc^Pk^-e0g!zCJb5~^NIo^S*MIs zUE0D}sLd8v2>4~qovWH&T1S-O@Y1<-yEidybX%SBrshD>6=Psk)b%yH<)XGyu>qQR z#0A4sQdr|n$ERc$K>>U?i4DAd^7e7M_CKTEIkbpB4kzB2T>Ey9+XV=wo@0e%l!U5r zpyKB-rpb_vE>^i{YkNYPN~PSXr4eL4*FEXQT2+`hUi9KYm)-F(Gy$YBU!uZ6rQjg4 zd_I<(x&SJjC#n6WK%Bj6xcZT=@*~;sd%3MD|4{~7H-TLVV3nWuXx%MI9Z+Ef6}*{j z-YBPa67WH@ZR5@!Q;Ch#xL#$QRs;?5$r4>n;)cm;+ey-TcKuMvS^Edb6M#4Pci1vq zdq2CUNivkYPr8VLj|b1jdOV4YB2YGOJnA~UU^rA;V3x}QGCjo2+oTw^=2$*RYkeI&OtEp#hld+Brb8 z8l*^=GK=Abssk1kl8Z@0g}T=|Y=ZDu6<6yMuvP;g)!m*(Z6d8l*mXP2e=q%my0cQK z0xIA)U3V$(=cCgWL&rYCTpNkeg$JoT_QyuxtHSu4g#TJsiE>Sif@PKz-(R;aeQJzGjJ_oU{?Yj&rC z#l6`rIfG($l8%eGyMsFlqs(#5koR9;`SL?>U;E1)%)z^)1zP4x0SzvlQ?@qgH?RR5 zn9x9fBEJzpG-tJ85sdwZ3ko2J7-;}i(TM}itLHNL1?u}nNzGgCOu-3f_K9*-E7oGP zgrssF01Gv>rUsy@?OA#f+(~EOmNT6mY$3IQnJO>Fv?6qAi^l1eP~z`i_aq+U;bqO!l$d22gN3@6;4vl&rd}ZtGuBtutgU4Jd4}=e)y~7` zv@GYu5I4g_-(7WKxPV2=DPau{MeLc$6Ym53cbW36G^%`VTm@H53G1P8CI2U%oTXzk zR)BvwnuUoJ;p#gEx|)F&wHe2bGJ!EZdixCz%s(hD=vy9`FH$b=$@3Dtg%7NAI>|V9 z$-1FZhn$7Yl<80bD>lKo5i)MX2^$ZyY3@}^Bwb!Fl~s4Hkeh_Z9;{N` z@b+%ZR-eA(ExS z$bir{s#1YItv6Z~3a@QFH+h_(^wB!a%TcY8=e!`D|5B_aF zG=Ki~W6q0JR~Q<^pS*r{(eK1ae*sL_SVc+I>jdBeP;5`Y$aZCBX9C`J zGK<{WJ$vlQZ$h-BR01>H>qBL|q?$Neu-)7aSXX-$druI;sZEzgromx?QV2I}GxNp| z_x9awZWkZs&ziM+Fx&#S!1Bw=RrgPxaIU&nI)IZZERErQHVRH+0qjlXSVvWlk#c?& zds5c`g+TG)o)RlpB$Cco65guVsRsf*CfwSfGisuJ;jSlTu#2N&34OMVo3*OlgmbiC z`g&k*ekJe%7>YJV?@-`5(-G`mFXu-Cm8IxXlx2x$KEvg{-xlJ?7sb37XL#pG(5#j=vq z!pYxSl~f5tNr>OE(qszzrCbt*#)N^oJAVO-$09G4Z_CTEO71fH_)Xy}W^__=LI5Xc zGV9uy=JVXnOEBK$U~AnkM{4pU`^%9?1!1~@ScqwPkt(KM7J4Q~5eKaoOQ+SYrq{N6 zHYs4nGlcy~gbUBkFj;Gt@2hkf1{js=xg_`{EHw6^;4Y#}?wgj+QA*K7bTgeIZIoRl zD-lbiKeI`qrUl9$tm;^1cY|(*9n{W6in>{TAS|VIv)v!yB0i*?e5vc)%O88#<;cGg zfbzh^a!&G(Nx43(c^39Sdt62X?SX&LP!NiE?*bRa$2NiRHst$INw+E)wvEWdKD-w!Eh9~xZzSBlAF9| zE~Ty~C_s%hTB;9}ZLN}f_5_BBxz~Z!U;*%?+}R9R4H1`^gniShdaCw3wsQ5PWBXJZ z)Z2}|2uY`(<8vs%!++}+ zuzl$_fA`^m^8Wj;zflXVe|r6OkUxHTd5JDE3I_gqnwXEPtzkJ3gounS>m=Cc_ULik zmL+FdU0U*Iz96JNIvD&osF^;oD8y@Z=>xYl7|3F+Z$L@d4jz7fgo#|O^E-6QPRn1p z5eJ=)+4Kth`>}`%@3$pPHz1xQ@6ta>N{qz>k%}^uB>qdq=>7_2*l|-N;-2KjWh?D2 zNaBfBC*Zi;4d*29;j}qBqOBnn41QPU$wJ(6qQ=RlTJ=g>X$I|bh`mRHcB2JPHPz@u zusOfN%V1)nM>&`jE?s=<#MXoNa`0IJjnPW11*P}d-9TYcxE;ZFklR+Nb&4%%~AA(*MOo*SjR zH|b($*pc)7g%GyG>o?zlO6?um6U@@**bv$RVjSB`(l`Kja`wzT)h8h|kmlVjVC*y` zcW!F>kVgTM_9slwkMY@(YnA1=(iGD|sz<%Z1!NZv%dsuAz9q!QeYwEUY=LH>1BW|H zZ0VVlw5%$jjk?laSMI<|JR@#oysUmC)$9l8) zqD8$PT_H?LITnz82YJ1U;B=s*EiE+o9^z8AfJyUW z=WC5sc4abOu{{ac$bH?NcC*k4SxzL2FW-Ltp)Pu_kO-agTNwoddlh@QI3OITWs zT!|es%fcO@rL5#ZYg+EzO^!549CB-=P?ILcPCMNHh$IM8CSmG?Z9~Unfw(Ic#$vPw z{`MrBkzPoWqS!R<7T19wt+iIqH}^Zbn%AU~0_>tL-O1}=p5_{Jxz?pApeZKj#)|_p z4aJEzqF`gEI}lL&N#j3>F%F&DjR4AF5ifV_YAIAMU155f>Z`1VCOs@S@0X`Ihs@Z7 zzm1>E*Qu9$D*Zz%Nk92|T9B(wKq=*>k^1G@)@w={QoBl}3F?J9SFdce#_(cVK{%tP zYiOrsnW%g&=~V%BDfo7nZP8f<@?bU1!r5HNwSK|y5C9f0lqCZ)1*XvYRr17DkJE4d z;k;H<^xVQD6^ZQ5DrVc4gu*o#8Wu6r)kRRZyerg|5XB%9vC=|dN0C62>s1vs&k1#{ zrJs_6+>cf*`0`4K74HH1Dnxa>A{1m59}b)je3zt@Yp| z*YH%cr-6f@Qz|Pe<-xz@DCN4#O>Ou46=*Qp683JX zd&OZf_q=2{=xE$oO%37@h=8nNf>Ir@uyR`D>n#=cNn?)4QaOOku1W3Ej{NX!^Ddo+ zIgtyT{-$v}@I%TQ7h?s7^VX3jG;W~14AW^SpfFyqHpdzZ=|Xa?9cReRf%E8yZQso4 zf*L}+C5O02=!O}1U(%pf9Qy0(O-X?T58pMw`Jp{*PjHwq=t#VXFEPCT-@o~LH*cQT z52P^H7KUSy7@$JVVwbHeP?WfsdY6Yh52qbvNl9Aj1#@$uN=uGx#MZ#l@-;kWJE1!%grTlXxVHN4mJ`hc zDjnKdvDg|?woF}mi5{6OiG zvFIpv_NhC3oS7%K#~HP!RNxWNU9L4@S*u4%Nkd`)F_%sa;j~nBF1n=q9oT^rD0-b{ zRd?rpO3yaCoGWx>>~34-i{gNo!Ch$Pof0)%<--Gj;8rHk!5fiV!j9uCSuJ)^X~K)Y#c8O9;o+RO1$q35oYln#}&lLAiJlkXl? zI-LxJH57xwm1u|qy4;EQEA1NM$wfrrW?b#I{)8md^F{UPInz{SJX8TKm58wzdLnJyRlb%T z`dtswn4^)JR$=fq-l})#MkwX(f|~1)BmNFphx}#(S0{C)`N|0tPdB+I)?o@PPFI)! zCx-&;Q+rA|ChG&F*wJZfJti>4=|Q|`_tPm!#97&98FhDv@J`5-Y@zjtd~@| zWBxy5EN&;V;=?okZ&h)~lF|s0!X!&lC~pF02i^CxSEeMOWzB5B10^|TnPJe~)eF&{ zA;c#}AHUF4!a0w}=qNuypsN9l)hW6Tr}}v78I6N2Y++`{mtY!o(u>;Y?s zi}Ix~Xsk3IJN1~Zxt*(20=b+(l4J?mLWF2!9#v3&<$ERAlUpn1Z!PjM9hu;^SgQt9 z=Pe90%aXcm*4%E?tjvc0F}6EET2gr4>E7sy7+B5Hp79gel zRUZ~%>-h-*2tPzu_Vw$JQUt?A(BvQwtSX=x@qnPsOHLZeJQi~WjB!&Q1B`0Ih(!9G zQci|#X6L*CKjr!su+re3WF39{v);l)eKGi`I@M?0CN6e>8W`YyR-@s1kn<57N&Rl` zvZ~{J#h_^R7dxcKcvnjp63*k(BLbL5 zt^QJ;;+@5+yExQZA;;5*o zQo`1WN`LVATiXYbe=Yf17-5m-n`#l1BEjz1LLxS;qOxEZD@Guyr{kh>vy!|qLGQJ| zAN;aNFqaDuP3ak^tT|QxA-pA$oZ^{3vN|I%k>FnoF$nKr4?wAyogTU_m&AnJ4c`j~ zJKj;-P|e`ZK7E-e%!EA%B(Jb&MOZ+q@ySB9)JaKgfwDlQzu!2rpP>zA5=?MvwG1}P znOAvKtNu_5J7}6)074&BwR@}`TkKHDx80z_hW?zhYZY%|hJagN<5&&=n2XxSR^>@U zy4U$5mrHU(-rb0_4|5|OpvsrfFGd|?9fkA+H`IC|tK}(}wNE#>oO7pBGKdkWydLF8 zx}+qQ0)D6bR0C&Q$l)4Eb6SQI$mv?ChQ0F^>wBD2HsQT6TfGk@5;A*LV)bOXAm^Zs z%j8ElNd^qjY|@}9*H-Zu@n+qTP$y|9(3&8w3YAqU#3qgqLfawwyNk*s*nS4zn@b;f zAyp(=sIRyLIE}3hO!hfZWuMzT*Jw#!lBe_~=ei2?4{!ep0_mqAzW-0({5=#!pjq#g zf>tf5Xz{7p*5M{e!&|spU6i?w0^B;r+3Rzy6+x~r1i#wA#*`h^Y)}_1;wuy>qu7gxorKFe0IJ1 zFdpk>QqvE3Fpy@Bl-3zD023Bzac2zd`x6*m4^N;9{V>lqLy}-u>2B?qmJ6N9K*K>C zuv`)y7P!4~mv@ffqh)v90WJnFK5m8W^dKkpJ_mx4F+92vVFI*!E{$3^)#BD^n5i~4 z=FO5sBpRJor33}g6di9>18o7>3>#2zEqdf$S`TBP6eWBB$9{HUM(0{34#YMukP zUyt^Hn!qDvk;g^t%^y>Lm7v6m*s4g}pEfE4h7;!(r~NQD(y;5C%d$<})MK_y*HUbB zF#TY`x!4?Fom@_8&9)h+Jh461)FrGd?-c`Iffb z@)(5!aRSIO$97F;T#-AddB5{MQq{RBhVq#0)oI0~U>o^&;a2>Fs-<*9@P zR4N)}xp82QcF2w=Nu9G2FSlu@oRGWfDFfFbL;(02;;2?GjCULBJ`fw1M?)$TXh4$K zuj>Eft%u>oVk`-*#oPxHSa}hoYFJ++QLG z?;#LAe*0Gh!pEGt{L||na+E+RpNuE~ZEe!1ni`pF` zG1qC@3UZ;*RW9B{tjasQoNcJqt!r@q+Qm-e>X|k`9f0Jl`~%--#AkI;Q1n9ehPj>O z(m#W5SyCf*M(>DCE>uT-HCX9l+Ts8+$&6G3t;{j3BUH&$9EgHv!DpU8zJptZc|4ng zvDEOFbFIN9o>K0qaHj(TNG(0etB3n6t0@U(1hM9VgpVONAP0iIEi59j`{}4D3}OP` z)vg!};ojD|+P&9~MV@ClSMleimIUnJd6)rO$SS>zM;{ywjOYQN)(#YALjq$5%T!k5 z08;V^u_VAyI)$&0O5ZMBa@x=}kTYqa-I`^2is-6hacOo{_RRu&sL|A$1Y1b@A+%H@ zw?pw0ehlA!0U`gdy6UMp!G2UrC_Irqs7nozWGkJdMGV^xoV<#W0h4Aw`Zl48ksvpY zWj&4#S>KR_Yrx`HDJwZ{0xBNh`gIJwfh)KeUuuZd^{3hX$$o56wem1l#+-QvYiiYi z-%RRw?r8Wpqe?Nn!C26YW%A8oSLLE+=)i@yv9YHW2ECDG=pgEZvWwe7Fnb4k0<4mXpqgYE)m;`pgN$ zNvUPhvumwB$ej(eYN-$om%bV#7*&F~^9D1Rf?Cy`95X9viAiCTUl=OIut8g`h`=sF z3Y2mq+Pdt|`WYJ7(n3odD`OlBqlNnP%6RjdJ*f+z9C6X%r2}|eM+oVq((dEG34irJ z<=Fn}?FSz!2b^BusQgn7(0vZ`TO@J)kp9%yU(~FTD+zh;;bY&PV(_m#s$PUmm0g7BvGdLtkiU`J(Tk9A&`bgt>HQDfeP6Yzg^ zCK-Vo%(`>wq*j(@ujKmcDp{$8NwU116OfE+Xvmyrn825flsv}n(8CaS$4w-tOr|0Yt2ykLaqy-9Q zI{j|%Ufk1SzMJs(Jl$%{Ez>ML-3v(JhRBl>Q;t5e|L&P(H&8izh)-m|NR@Nrh)wFk zclg78xtod*PcY?5$3z&cvKcV}l4RPASKKq5_xnp;S;>9i5I8wPbX9uQN0|GfW#?a2 zQnCO~VSQ`^DUcd_tvF&)sCT&`T$a^=5Q(O|pd1>dUy<4=DCN^`0ltG^p66m6h=M^< ztHd%EF}LWpu<}!Y0=uMQpP1*xWk{o(xd5Bg-~y$0Q5m!l;7kED0l5xxV==zYGtsu7TdW2(WQ;<&rNCh)rqC!*8mo-tET z$mDP=m_uQDg$wU{0Ik`p50aj<_WywEll$`loHM8=qU3m|Zeh|Z3=niP~tVSoztEV|IwgW?3#tkD7j;>)wSOLl`;Y(KaYyN5ZA%oU*BvziGYxs(U$tU#C#5i86{sG}L#sa|0v^ECn`^e=({3fVm4i2Sn9s4keJDOzL43Iyh?3O zB~(&Lt*Dgl&LinN;V<-~VI@9y(FS|qRxDphKaO&PP7)g3Ip;q zSyc?5ln4_Fd~7tuf~r);Uy^Duw-R_gq-mrf)%I8pUHVhYQw*D-=6bTCFi<`OW7vT7 zO2tdBKS8Qs2A*LmBPRS%YoNQd+~iGbKLqB{{CSne$)E0uy>-S6C$wcPwI0+67? zwJI_1E?WngcSEwBdtv@Av3;&GSy$az>a^y~TRphP?Yi#8Scu%jKDOI4|LUt(@@rocPxkfWx8DRl`1VKtchV%hnmNUP zMjMfw*|~Xr)Vhc7xHw$Fvl|O60LCM_b)r)?)zv*MmYA4IkL2cO+K?vqV_S zMNKY9K7(dLEmb3q*>@IdB-YQUP5`9dA{CE`xMGwp{ux>UZJ|lS(=VebuQJ1&X?66$kPtom_tXrvw7i3 zap9I|`10{2U<0bgi{r%FGznwMA@#J26UH8$u(M)oQhu3jr&F&%+i z09!Zt>=7-yl;RYPdk*t7$bAI7FCIvNw7L+cWBR0XHhWMt45|-x{WK+EH0%a32&V5AnMc>{C@q^R-QdPdQO$fIp%TxD?20%IR&)U`sZg zvL?;8CN5@1xjqFan1`%1u>ymH1Ig};yQ#rjPKN;BEpH*-?U4Dhqj^!$3mbo{Yx3%w zbj-HW89J?~Idq%T5&brV@e!^9~VX%;)XyfRST*RI2sK zwQF{pl6{v_@~%_%dw3F@P2+xs1;pAVX343G1#?}=D_eaz8Ii&y$hk#n**WcfmRiUrA*9M(mWJ+}mjP-AHtTHk?wg*wua+Gx=ImMtDem#!a@N=7j`d=Ch> zWqN2qJZ2?KNy1lbwoX_$=q&c~nSB?!PNGl~n8l%1RLsZVhD+t5N=cTDr#nPWEL4*z z!&58*wF6ry{oCLVz5 z518`s4r#vh5N>ZC)@3ijBK;P5>*z4@zAN6i-~yw)F-eCaR93IdEZZP_=bH2Y-+H0h<#@9Iui5QE?95|=If#KnI4hACEoz4s$vR-<=a(7NR0 zs7P!}gD}9`nH)PFxX{0GElcp{?AE7x-g!dZ*K?Ym(li^Wqh?a6>!*5hT%^=nvs^d3 z3$#Vcvz8Xkyn0&|eIy>Qtvk#*tRjHKQ%}sjcH$0oO)D=9jnM3?0|95K(!*tuPuR04 zuiv;$wJwt@i5)6@z~E_7vw`#RB06VF>p-4qW${ zSNi(o=X>8twtq(!I}GM<<`5|Y+h(_M$5d$HFCza)5?qCE63TtHKtjJ@0i!z}deb6) zEL+|H55QD85{Nbu(FA9A*YN5vqNt<$==hq1u(1WglQ-{ej+n$(_56aA`bg<6$ZfIH z!9KC)b#ZKX#7K(>GPInX!WN-$9Mx`~R){E*b)NbXd25sqc-eHiK-hPO-Wmxza zOowy8ezi$b_hp{i*cMRAg#kSJhu_;bVke%Br%3Go8pt!fftWLNOQ&ODLrvHP>OqXP z{D2xJs;IF&RhwPhp0}(|($o{qz`4yr&J9X`z{a439uG*4%h$bja>!hj;CqDUE)C1E zTd+3(R!dWr?ZV}X*wVGCXCRW#qIBq&m+bakCgUuabt~u<2O39v5@y8_^rMB2q|{5H z2;{hBVyT>a6A#=%nVAn$^Jyp7_6gDO7SM`b$o-EC20^u|Vffp{&Y63(Kk=0xvB~~X z{=6^WKKoYx@Y%N;jL$x7C_WFb-@m;7VR-!tjG167Yq*D8fNz9<p#9dWW-?J8hn$8se~=#R zYRaB-7wnN*!a|7M?M?>*x?@%KI*l^%I5%utHaT|2gyzFIgbjIpjE<9?u~Q}FJKS2( z%E1hzW>Ia6nyFBJ;>nl_?QO3Dw9YC+$YJo=cBekQ1V0PHo){W)==ALU=pYA={p8p{ zQ&XicNj|wvK#J5HfDf=}f0}SpmK935joZHs@@{Se*nmWQ$o)rJz4}x?7}&ZwPuwsj z7?p((debhmlqZ9fU$UzxEw(YiQM=LgoT7zP!Mv zg*}40tDVH@^eEUDsEaBoitg-SnS(NOV$86EC%nWAu)cWvI?z}32XCLK3HC?Q#FOEZ z{^tJ(ufGK&ld0(*QNN6reNL9AHjKfGRLM{U3f*w6y2iw^6{D>>k8ELoSry*(1FOBM z7%n~Bp#h#A#pf<>5;hnsJGKx=!s^JKzVZ(!(0_$lZCCRq!h!OV!=-jRn*!K7a$n|mc@or8R`c0sq-VHk7{?{cS1D0 zVOa_j9XmSEG7*zCp2xBf3Ww`gx*t%aUctg`raoLt(q|g4yw)}mGNRC|GiecdLEc*M z>*e=lJH7yT!jq~A?uG-*^P0Jr(>^L0nRS4Kb>AeDVXKxpm_w1!S#`{;m~|BsO|~lc zH7YRgr$&raKGH5UC#2z*WVU_v_VNGA&GU=buXRlk3`TOO#3%ks$B?}BaE4Qv7)6Fi z>b5QQU9M@`RkXWnM$3&5vez>*P&nNrb=H$O#$?Rs_W_J{7q<_F=~6}NXIH7h+CvYc z5|qy=CglV`4pm~6Ahvg>!BBE3QpK@Fm#9wD9d^}Bsi=dG1Bfh5+_Nfj4)n2{AmsuF zt^-6l9oxDX58UlnA8(=bm>oSr4d>fJKVc}Kge|8(Ii(Fx(^C1T0j-z=sXlnAb?srX zShiB3DG3W%^I>@Z&K`>g@jYD5sz*G>%1@fqPx|5IK6nn&-hANNs@ucUCQAUYz z&y}9ikL({`=T2;{;pM3Lc^qhO|&Oz{B4r^ zl+GZMBYDpo{FDQz0+tC(-9;_miF>ggtoz36gd3_$Rtb<6CWr~dkyB*;`t@JK|CXMb z?(0{H5JDjI0R0s^gjGG>)}qHS>txmL=Jnxc#kw!|I^0~u8Ct=v8Wvnc6o#pAeC@l- zycbwSK^)dgT&w>u1m{Fi6?aEn&+ipRj(z5U2lhriD5NVnIky;0dKXy40Rj*T_D!US$0i~?)p-`)Frb)TA)*H z0UjoBsv1@NsW#Ypjjvemlzr9Hw(JmP(%%dri4$4~Zn^eCSmii?6fPU zYF%}=qO$YMKrggU8<8fgi;TUNZRxSp-)&OR7%zVn{wyb@FW)}pfZ$Vq_4Q-2C4cey z2S{uFIK2Jo0uB?h*4OX<32e!ZxA^09i*PQm)i!HFan|l>Sgvl|7z{MKbO{^{NYfAJ z14($}WPFmucufx>%QdYODF92ZJ9$0J$yP>U(HG1VblGUdC(ucKTq#P}=~Mv9XBbIt zy4!>3w3JF1ePO`XtBg`6;>M?7GHghEoQ(m-MQ5QXCw$*!Il~gX%v;>AS7q@%)spmV zbp8}f5?f&jc69UP?yg>7bSg?=l#h0D5&K4=>~K}#A`nW)w(SF`GO;nQeKHAO8ObYl zUzN%lPIepA&n1Xdu4;&><&=T$&4I0doe4yj&dT0`3iZsmIe4=*wSk1K zhX};zRo@sZ==0fB#D^jU{MS?itTNRmNNJJGw7Jow>eE>tB0+ENGKnEQ$*+i8hvtEO zr%tPOXWZKK%&N%5ri=wOY9u&^ln%cu{{{J99)vS%+kuYmClavJNxqU*{x2^9T8f@9g28&q64e? z4$>-b207z&{{rB*6F18llk%D9IH@XHOq#j-fZiuYJ`&+i+7YIxJeFkS1^BxCYI66? zLW-0MXmo_wjh$^%UOMb0>bwxqp8VS7ppR(&519NnWf6WDc# zDm1VvgPqF>oOP>oQ5Uo1QYn3lF~B8V?o?s{0~-!nV~-kKsz8D>7FUg(>lIgS2`{l9 z*y=R=%>j5u;U-QGDP3DUQAEF{D=I)dkUx5}NYN{ooTL3lyIva^wbQz($}A{4#&No) zqbg%OLS^Hkr26C@HIRm?DJ!d_N-Qx6x#$~gM=t*^{H6StveXaWJ_d^DMQzIL$Oaaj z*I?7*n@%K9DzHatLNBdIxK311+4c$*k#EG4?3==7H3v0`V~!c(odwZ5%!$Yz+Z`M* zEsZt^ws zHnJdC@P!d*?dLs`Q@?{FKRE$>!`#QRoZ8fVARW8F0m~=g@Ai0trL1a?NthP)QACZ{ z3ysI7@^<7+sNd}>)4_b_nG)iNfL-jX4}Fk0Gvt>NeR4$xCcjDEa8Bg0u{$LsX}OwO z|5nao?wJlr4+Mg?yv}m&)jr$YeZmWTXvqCMDCMUJ21n^LvFZStH&cQT>_?5=j0&60oJ z6UFAGTb`WED!fVg!@7WfSW)u_p0-CY2;m5f2XWAc_WkK`;X*2y8{Fiu=CfeV88BBO zodn#q!e^^bFoaBB=c$&S4GKJmdTm=omyk#tD-5q9Mk_WRALhOPfN(MllYDEkrlgxA zp|ZyyXC+ZN?O@YcfK^H{nSPU8F6o zo%;*{sM<@SxTf%db=$#eQYjJ~9HWwq{Y9tckFH+jh;6A`5^B>ZIYPNzAm9rF>{0E; zUB4Kh*E2i3M+HpZWQZMFOM^0wZ)K~ZS}FsWQO+&4W~;X!Sux=%_r7JjHn7I42MaVT z!Ve#kt3eBPOcqy_i-1EC2RU!le09CZ)l?ZWyOK+ECOuBZ-fulS_2rbgcP>ncO?sc# zb*~@4{hAbwEPK4AL@O%6pbNfFuxh6$0fB> zdCiVkh^x{l5HciHpoF$zj~YTz%u7*HoO0q9^l@vvwb{`U=@lK6eL0X<6!vvYSK@y^ zF_W|pm(IU>{c(Qvm#<$3KHx`-_fgI5;dxwNUL0|9)Jh(odX`WRNu4mv3@%opY0weD z)LgKj*PSqOpQbyL`~XOp&QuV+BSs2{HPAaV@lIZYd|`!Z^^jA8a&r3ziX7`Spz6IE z^m?r^B5@P=2ne6uGtE7`Ow-WilOC#|Qup36zFZ2}yBgbju61W*P+I%T9Jm9(ou11h zy~nIv-3`7xw*3e8g{oT&n5}h(pgGrc(i$WZq12icV-XHs4X7*&YXN7uLk3^c^yUMz z8}#!Y9J?T6q{Dxbv!~-?Ny6KlH>X7J&0>;meMORT(^}l#eVy_2_2lNmYS;zsP6=l< z8ZA4oMU;KaITJX}NcmQu15jafco%Cx)WGg%aufJ1WD;(nvTsx?De^=a)O6dOzYB)1 z*W}-g*FFvdx?j3;!MoLIe-I|g+l4^6P^=Xw3;#d-|NIyD!0y0rzUSzV4^bfB3$I^8 zN@q(ADq3q|2P7%o)JxonW4KwKawSWN&tt$IPJKWe&opIW28eU4=Ib)pY<6Wyi}$sR zL^9Q;0JWZd>oHe#`kmYmcPzN}ar4zYwU8k{FYn?-Wo9{M>fEj>Ap)aY!(!^$*GZ<1 zj)A?(h~#Y6*Qy~5=8K~bZx7|ez&&>LVhZbi`BqSaSSBjhTjiAqU2gEGGkj^DW(V9a z4v@t3+)yALlEsGVt$D3-|?}~Q-1JM0T!>bv-gLyMOurLGt+Q^+z1qn^w&~y#6#Ksamz3jg?CF zP1IXb{M?8<3`fh&6@|AG!w8De5rRoA$M9g=0BA}U8dt8Gqy~e)CA$l^JeEx6qT5nU zSayYG*5G7Ps5a;})!u$=odG98{Sk|ua__a=OkB#1(iOx$lAUC`SY3jGVH%!nI4}9n z2t*^WZ`-2L)k>-}IMS_+s&>sZ+H)p9idZg)t_R#94bYj}B(V5-YoM1>MD`Cvx<=09&D!lrLl_tzncx=N2A| zH(PNIt@KmX(;hbJe(AOsDMB7im=?NA>W5NhKY#l?z54mvuivC@`TX^Vl0^GTg(g#` z-$%@yBpk}@)~G-xH8reVe=b4Zip~X-wSvIP)RH1Fkg6{N)~`i9#7c-o0DV)A%DgWK zJ=aqs+jxw~=9c|hE*jim9Ui@O_?+Nsy+uN;<;;gJ&Xa_C=Y8`itt*t}$%Th3DeePH zy3@FYr(HfKUZZ8=RbHzamsx^gFul^T0LBjCL&8&Jjf$#2032q|fD4lxcGLX;na~vV z0B)6gFDP8tO{1DF>1OD#{Ia2%Vv(W)64d0*XAckn2fk1_QfM#(@BW6#{i;M>qed*9 z@*5s(@TCS19CB)Z?5aChggjOhC1vg6bg{adg9PuA z&sc1H#?1d?dg6SQJ_2m|(W`okeD(U(f7Gv|s*$z|+V55gNG=?^Dr%!`FQA>CGO$+i z^|z6)<&{;OdiP=#09`-)!jAx=B3MbYG$KyYVDZttNwqLQYfp_xYs( z=mvWzmBQnMrkIpN#sP|Iv8o>we$I|}QFY|);Z06}-tHu~GLgH-f)85jm98tp4xu^LB*Mw-=C2eTdZIZ#EFnd%`$MuDVZLz)tF#@-0( z6)4>X4O-AANzMh`h>=l|%mUre%?U)1^dkspkP~HrU(V>(r4XqnOgm!zWgD3OfXZDP zm$VRup8t2hYo$&;B7PIze$PVaCq(@GgdfxA{ipEu=|!bd9(CdNM%z-qU|UL(s&WXk z_ky7Bq#UvlNQY)R6h)h_K zZ%9&+(_zT|Gtcjk0?o68VKO@gK81W>7Kt5jhr_wdo8l$ZtYNdwHq$@VLW4qSR>dNfa>vB|D zX2Xe?TOUj0~&;EdX3VqrZDXCuDVf0RS*D=~+5|p`W%|)i4J)3`x$l zR>qhrqD_yd0?Uuns>DdGE!!P=qofs6;po6s#6fWVJwU{I0nVq5PPa7SysLqaB=_Ag z+euGU02D%6a7(^o;j=Ia<{t~ghb;mH*0k_F-XJbvKM;2LTm^xXOQn^5>wxF-NZCOs zpjHrYt@@{gX4X%U#vJgKj>yOx0%33=6v#r9tacCF?~mwYefeh3mbSuEtZLIj#M+iP z{KC8rTg-uNtlVjNKol5A#}K{i-F85yWwsB#F4K!j0Ph?w`?#!v!nBVEq0FG2%`|YP zJUdMvIPZ}&KQ$~*Q@@kZkB#41jh%>CTK;VA%Ea$ED~$ zVEWhivd|8DqO!XJ!d$g9<~3ea8otj0p|t6q6%r=R9jE&rUjO)k;+4MiIX#x}i7d6g&y+3K0Q)Ef7S|}B@G?;d+I?1^mE%lP1;VcCyf|&3?T6f z9HP4(wlD;$SE9?IkJDN(%2|j1Qs6Bew6P34*eDv+av1U;dY@hwUk4u5$X}g1AAn@q zoYJx!o(*;xfN55k#l=nf@$4OBRE%fGa=z((RI1We?k6Fah>*A5>q1s zT@#PQ^c{2ck#gxHaN|?Y!2!4j(kOt*hi=~`Z!y>6PjXf3+bOH)ERNur&k0o*Bs*Fu zo(C=vXfXl+GzFyq_F;<`J8Hq2Hx>n!-?EM8>nGOgBe6>Z=s930TWXzMPR$HgJH-7zE%`;GvsMhRRkL%)kM&-_|{tJ(QF5f+;&Lx&f`FN`LCA z8qn%Wx*rUxR2yid?bnip+y*rj95N{$s25*z4bYg9b{fJw7Y2n|5#+r^<{?#2`ZyIs=K(vqP{&B%+_UTZyTv!$o4d;3N>tchR1 z(5*MlR^;%kYL!M??ve&B<>*qpkbaouw3Q#u`T66q2kh`{$%W&q*{7UOe;QuD&x7?} z-+r0?4Cf~jnlBNu9trQ8ViQhuRvAG~QqQB~qQ(=84)04F2mz2x46XEV7^W_8Gq6P2 z&1CYsME+#%8&2Ip5UyH^txK+hutx zR2np_|AjKdC;AC5wL82?E5moYAj|F1N~dSz-G@?SARrELk7#`5M`SMzo|PmhYg&M+ zu>1b5s#Vx5y2}+&-_|kUEXwEz^#Ns|v{DTYwX-V0f9|QU(qJ6~ zUdN_uG~_(P)!GWVD}jGY1}`1cU!>9X(EXCTz-{%YegNL*N!-z$u1v>u%uU1v=u!CPNDJ3)~$5nu&elXaEvkR&` zQKzm`IluxSj7`*!@>@{K7up(jYOCXPs2bfqb)y1Yd?JOr0ScwmVt?9k2XxYngP>h4 zXqV~}8Ih_(U?Mj8uAtmq0wJ*iU8u0uL~x7jK7kanGz1efbnVoL3JS~_g?6LlTf7n; zfp%OjzIH-jT2K1VD;KE5Wm}YIvAVY%eZCM(OmdrJ1v3PJ8$l8P}@_2t@GhluSd)|sqeI6_) zPpxk+0$XKAE%PYVX;Nfux4`#N-B9GCM2+2IQ@Mc%veb?f#|%}9IP}{)mq^3e6?TBX z%c3PHE7nM(>f7#Ne@leg3H%!@2APi^o^N-#6|en%y&jTZsk5HoaOsI|QB$FGRScfw z=xvo=eo}d8$mpn-1-vmV7Sfar1qw%@^{iW@+JvM5ea|b*9d`i9!R4X=$`|;S0Oqhj z)pV)PfQV9pFzn@}#IZ*?;$nY!N$@gSmLL?KENI=K9!e-uYvLoys*ApV+@AJ2)jBS* zg<k?J>6B!BaF;hVopufg{8cOOhmUkI7T z`00MRm%Old6z?h4aZj@3P+zl<{LBE)AjSw);xKz|my0?oCsl4?CqYRT*J8!i0&SpA zQ>T+UDb#?XSyhJC|B(c)G`os@@}&hv6mmLd@4*C}u~QTr*tp+pz^0;8JvDHqYC0>k zL&~N%6^CJ$tYAz@4H9zKN=P%2XfuNJFNqv+lp-8&O*kCL*w;s$dDNWr4Zv^soqBMu^Zp-SeIx(v0Yky6T|TJ5^AU;9up1hctVnB=e=6X&zDP?pOO(QvB%bc!joen5*! z2`MdQ-DcQKF%2JDEoD#ULuw)XXNkSHp7H@-$BSbavMv{vrPzK-BUU%sQM$?ChFsJ# zsGvbjxPanz3;`tddZ$9Z9Fo+2drIiQ3z`T5IOiNNyOVb*zR31TkLCYtCY@st{`v-(KwYfmgRCPjFzqS(_ zw?=a7etCv%&><}Om zjFECfCH**1U+RZfZ31L%usS?b5ToXwFK%Y6@q`SmMc8nO8rJrQ(u+f!RaJ ziC%wbA<-^SnJahc6^D};ucSz+gc>Q>3{V~iOtY|3r*HPNl+bh_z*&D+MD8Zw&I5)Df z1aF)uoiNr9q#IIQ7PV920^4z;tKJQJlR;c?Tag5~)4m;KmqzvcfK?}S>ePd1??c84 z!atf|s$(=tXy1XCcaVGscKS)x136jGB<+TT!%n@MdeYeG4tc0RK~98O=-5#)St>|~ zONL6N4P7(rLG<|umosEiL`JF^OEEoj1{Y_|>eIQ8Ia=>}VY~dQOO=wh9s;8lcFPZ# zcqIl;IQbYWuoYJA+Lg+^TNS(PyJG{CbK70Ku>@NFgzH+)&ULk%2qyUulei3QLL})e zAyBlhS?(B8`3|r}hiC9^W?b8p0;Ol5#F!A%tmm&TTGhWWp6Lv9T?#gk9<@gZX%29| z2B1PzpXBxTkVk%%>=$1WgZTZwy#6-4eGMVcPlB1k+#RF`2u>$8wW|+obS9OSml+!6q-G{p1@>-mE7zcsLDGT~e&#<7LdfZur}xq*tA%YN0`EIp9~ z`NbX$!Ft^QQrvAqqOvyV)6IQ&xy-?I@JHx)!R~UKjGrudU6Y$Sqk1gZm`5k5gCuh_ z!X9>IgZYL^jtPe*H<1{Qp)A#FmUErEBh-6I1Tk;7eJ2sW;YbO*5Do<~J%weKK6%>v ztU{%9dTonar71D$3awBu*39rrrEM>@*5UPL$ylw1*(^}29gXwN?Sl0jGn%oi{%gn4 zNr{0fRXun0!QzFI4J&DgEHBJ&PIP84JwJ4=JH3#CH^!CZamu>a7AQ}BH6XqysrH(B zF|Iqka~_BJ>8Ki}T$-{3`~#pg!3^4rZQOP%`fPbIQjMpK$*ffOPk<2o-%0iQ3^ofJSR^rQn+4Q9i z9OD4G^JE=}(?A_MJC!YlWELDY3SZznmJBZqgX@{Qv_7X;N+@V$flbQ7;A&F~k`K&RETe0l#* zuV2CO@TcM4dj0Wu!DMjUEh7XY4ekft!pQM}K?|P~IcU>Wrr9!3^%s0G%mP8NT$PW%l z7m1Pca+ST|KrVH8yD){@O!qM)&l9U~X;_rl+NFD;Xg-u^ATr5gSH|1G7AESbb;S2`oJszV!6 zK^7 zYrIbjIrhW8g5#2hSjxvg&Hg4R7x^%8fU^zGcr>}wD@c7&np@h39y1D}=zbp(^BPA7 zm)buj@kZX=E~kb2dajZAr#u-_qaEWI#IPH&1xhTwqFL6}N<4BqpdzbI$=2*7;wE89 z@X@hCTU`q)ok|QowgD*S3uL`M|tb3Y9!joMX$J4lCn*DSZBG< z-AeF?mI44W0Fg$3zNY3-g?YsH&ecI(QQM+1{c8VcRo-3d1dJ7deB{)-swXY{R*X8V z;@4`>NgxvQ;7uX7fo{7S!t;3cdjs4tJ%Z2J?uTg-hPQ3<2!v{{I|i#WgF&)u$y$`_ zoc#<|4B6~Nhk>W-f~a9Z^qt!7V?M(rwZF=b>#Bo@OkGzU5jBceUoUHQ(qdd_mX&!AK0KV9-EzwVP2;@BX5u(RNv3Rm03g>j?!483Z9tov7OIIgRi4zw z_g<^}GyQY|1lOA_5s}jFSk!g|&1xcykuh7fSi@c2N7Zt54mPdpcRN(LZU4%xG|ms4 z9)XNcvVd3ee=4aHDiB9*p1YV-1mUV^O!b`FJF%J1ka4Fir3gXWUQ&8so^erIdi?EmFT2G7&>41NOmx_gFxywNr^>L z#BYD3U?$LZ4<$+R_?st~`laE-B44Y{lf+StxU-KZzz(p4iogKeNg4{3#MPaaJK)W; z(+yB137{}ZMD#$6NiRs@KVOuDjHzdH57ZM?i)YKw8)c_Qa>qi^mo)mU@0y3&GFouJ z?cV$yYuq2%a(>)Z^~q}d^m07Vt&Jy2Fl1W!%_@uJsR$YAzEW>k$ew`92N8-AvvPo3 zGgu=^x(F!($(BG~G2W8wC_-q?ojKXL|Aq?QEy#N2-W$C-sBw+-MPY9ZyMro_ zq^-cU9-U0d^l1(^vstRD6U!5A#1n(#w)p4_E-IF?hg+Y6>Pc1t%qX8~fEpkPhXuLj z!7lJLDHJF@=_WPWzN$Tsfjf{la(7>|pEf$f`_?jpfF4ws$#pA^?A;BHLuQr9dHX^J z8Q|~$48w^c@o7P)r38d7rQZjVWIqdUpI#)KeT)Xx&(V_lufdA9|JBr_4$swrl7rV> z-z?MJD>NzWZ=JK&9>_ip2De94+pA|=ZkVE@#Sm^cq~tE1x$_W}S#$ga>~W+$@nrMk14yl zcrp*#GR*7Y`W*q>W!Q^`vSFn zn4aSPH1!!))SnWjqLw6v{{{J9+6+H_ z`vp<;hsra;Zq|5#K;u&}2j12cAT8A%RXfORJ^->z2q(sioDT1~1q<9J`5!Ahfr*k^ z!GGh?w@ild%gXnmm~EYv2}GdSwzSaDw+^dMKBordTv}xeW3r7=8?M=QW+=hO zvqcA}|HLE~UR!c(SxSK1cLN|ldRJ>B0i!Ow|Fvap9%QkIPAN6*x7ma=u|AU|(lIMX4-d1)D*d2U8G}$m0;ZYY!s=u-Q zAje?I)aouvHf^m{k^)@ylf;3XGW1y0fTkMuDfp*Xr%H`{tTr5Xp5UugOWCL(d5UwY zShz`$j>Ok}aPY?h3i6KF-jP1H)VVD^*L_@I9zoxsIpi1$#eRc20;14Ec(pNT4=9D~ zqiE%I61X1T1!}>QZ)JQz;tN{!#v#p7Z0S(alHo zzE&#=l2DXsfu6=Po+SUUU1W=Vz!j2cehV%wQs1))8BA%4 z8U{&$>iwfubS_1Y3o&$V%Luxjt!Wj6H=)cMnsqTklWMwq0VRpVh}jfw>`)#roHk%^%~e@L_p>XV0NA zbF|p0Zm%gqK$-i}E!wA-lHgXK&_4+jGz_c1H0nTyO@|{*g~qMxGm#1VHyW}-vJ#Bk zoRkeES&Z5jFq=2%0T~zoTPed;k#-aFgLY5jL`$&r%F{3ok+|I02(0QJ@UES}{fQiP zpp6vTmbCl4TU9&(o&n{9cJ)hQrQ7G!XZZhSXYD%ZI>mcC#buZGgRIkEyl{a++Uw`x z{pW8Vzb2&R{}z6bVs%YV*aspa(fx8V%_PHwrXfQMl$*Bh2QHFF*oKq|-;ZFq^&MLA zW$;Y~Yfutc?@)kqLZ=kvWs)T2b2)w4;(#G9jeanznIVYXjVI;Lbw&nkJ8;&-!$&u& z;&z5Fq8gNPTlb=DUo`w+K1;$(4FeG={Qw6vk^MErP7uG~XpqeyA&_oW$FfRpn~o#d ze5U~}NQUl8I9>q*O^(Gmyy~cS$K?Q5iX8f*<(e za!`uZmK|S78a1eaYt|M3U@5o)^Zx~X+~RbQm!-c9WV&gY}{bIOi564+k5v6l)NL>nhw_uhTJFv+aBO`E`Rg&K=k z?J!b`99Czic}0!-S+dFs!^z%7o|9EAIz1@9P98;j@DW)VrJ&&$OmeqdPm2+#Z`;WR zBuLF{Yz=D$sme2{raCXUpKVMEsm6MsRj{VbD%r*rZ%84*OULp05!h&59~c}@-X~Q2IL|5^E>>#U z0NwDy;gd-P#$1kmcB2n4tW-v0p9!3nz&_|SW91qL0eV*9#FIVU z93|zQT?!0i)`pfYQ-Pwh8!s>zj1WZ(^=tJcHzxSc*}0;RTDd!px6B7|;;C0elu%E1=g8 z4^*VaVWnBNc5`uoHc!MLkYH`e8&u+#eD-{8esJv2ViwF=!E!uJ92FC&L^s@Of4EN|kN zT-C6+BdVl+#>6bk;sf%+PK^{?oiZq$+Z!y+jwO0xLua|v>(3!_N#x0|&B)>XN8kSF z?aS0CKR*utqi;xtC)lf>B8peXh(n{gP_RBC|1R?b?5o*f)--T|IOzatnj zg`%hXm&6xLL3zHX*OmrKI}_^1ZbPpI^D`)ID>i0hb8A4-v2ai>7iuiqjCMl2gSlD1 z>!@S&1ARwMMM7fX5$^Utc)ZDG;V!t1c>sC~g}HsoX4+Gm^J$Xh0?_?VQRI*fGoSP* z(ueY*sVmYBwi_h<3G_;pO{r+=X_b?*10G6tg90d%ic+Qpn>f)DPiDJDuA?P{i52g`abU6ouO7w0&C}^ z$J2Bb!|rrbs|ec$a>(%3709uOm{INs_nZN!zM+=FH>h%dA8gD6h@Gq|P89`YYc(tp6up^id|~uYr%FM3h~O6b;t;eA&Y7u z9<<~}!Hk?EScz|H@XLvp{0O*fSn*PO77X=!j{a1-`ckd=NUM5M){&pZs^GhjkbFC_ zRi;rD*Ku~SngH9twmE>YT#?;Wb$1CEAR5}blxqVxDOK=L6OER70ph@VC((X?02Qu( z^PGULBR_rnV|e`&@LFHLeVru;{R#9GX6PQJYo0_1dsmt1v{{z8Bn9;Z(U8J)-b%q8 z1NJ2Mhb3Bb=F?7CFR(@j5ZMMIeqjLXjyfn#nJxHmN zbtji>DCA*mLwPJDTa|&bt6P>~kl0%z2L(kY9b1E>Wqs#L0nphi)e?sNcd1p39|N%i z_RfpYSSAYU-XigJ-C-luvmXwSs;nx^BH?lmkcaGTC~#V3-|j9=f%wM3s%&SLUXof( zP|F!~*Br##g9HcHM}Umd;+Es-Ze;MQ=J4>0vr|JZ=~U_Q&eh6X%HdE^d6gj{SZ!6J zURx>S3e4${xK!*k$<@7DRBfuLZ9p3XO%m=h@AWurC98wsMVVkU_gF&~>Oj!t>u3>p z<1FFBtO*GZo*O#pl(2)6=AW50B^Y77z#d|?_)&)jk!-+C=R`=QFF;){^cY{pjD41%a91IL)t&;}3GCax zY&y#1YFAJyBYuZ9b=`e;UMDKn$x%eN_|$Ei$XeiZY?JT@wK_yoPXXKvELNFMaoa z4oMB3vUf~7lD49x9zP3j$v))u^Y@>H*DocfKzB)}n)N{z#IIZppw&)Xv%W3i1p$$ zS49zA>Yj6;qS5Nh^ngD7g9~?LbMAv+X0XKXOcuCq*$JvMjm8 z-fw8x1-IOm%7m#Od-m8wypJ=H?kdx|WzAN!ZtVwEXOJ{<%ZAAGH5LkN-Z)E{5u0uo z`AMZVS`lR{^?yfir(1fL4Z#LnE_0yvnH(PBrJGFNX;jy3D02D!^Tma@S1*1xt4oP? zk)SbiJ7GFaD5URPx*Q;{iI1AedP@5ceRu-fS!+9~8z7=wWn~uHhP~HMC^{_h&O%?E zE5mnki*1Rj?ga4JC1 z9D9}IZ#hGRr?QK@qUw{~FSp%rn-bdVVQ^Xs*onymuOKWWTb6)iz!n33YE6ces#y{= zhaUNg?rgH)fbF>Av{erV6GGK`S#~z6T0aS4&}=Y}CoA3LoGj=#APaTax)gOUJtFJ*JupPL8aJ9mCAQ82MbQEAk6P(>_gdLwGJX#Y8 zNuYLHZy78R8unsv{CG#8tvh$EZ$WCNsfl#9lgA@!;3E^tPj%qnksuIcdS8BB9kV}Bwz(m81Vvt)7 zKA$Bq5&0G2D~O|Bf5?#|_uBzhI;J0GS>pXk#$jY=6d}en{lBm<|LOIo@*sJ1KU8wv zf&^4+Ib6e>6>^#P4z7iib%$(omiXC{b)_BIq}FBQO*ye7NesW}L5!CZq%>`r0oRZ@1B>6ZOPVTz(nU9vf3 zF8WpF~&|bs5-T@EuDn%&bW;J=~6CTGe=(AbHyqfL+TuH=BqX)?4K@ zmg)>kj*qx(iGoD(onuv~X|Y}QoF%NT*!|uP8zFwf)|mWmxjL;@lJ;87iJ#K7B(q$( zrHH;td@`geZYM0P+uXT& zR$GAu$Oc$;&@n;Bb=fx8(Wo=cq$VJeZ|0;6J&mR&rU?^M!V;?B7=)Fz&8?3vV|~*% zwCUK=)S7EYS3XUwmL&i|W{3XvqsC;VLvlir`pi;L1Dj>}bwj7`?ko-tx^7z6*biM9 zK$Gb`F_9c)r5qYsX6_?!oknK_*SJUN)4(-EW#23{hhYO8VUscMx}A2RTnzNbz)8bu zHB1UnI2^h?ra&_WOy6vhdxV<3FdUj}g+U>r@9PsPZvmBRIaJfl(vxb+LK5E%-~Z2P zC4v{`jxnRr!c{->g?0-OSDac{po3&@LA9a*w=X@L>kq|YZiK?5w}6wyKPU*= zJ?#NkdZ9j>s$%sjBWlYQYMbf1Pk^l0V%t{q4j{eU*N{fF-=xN*7Gd{F=>s%sM~ZS| z!xn_xdQ_uPhG2IgX|g;${32JX;ar0Y(Ltf*P~mb;CUB@Rj6OvmnX;<_6+DzXcH<;# z3y<#EsyUTya}T3c_NJMxLPIdqB?|yPnhQ!pw?K?{iYy&x-5(pk*`kNpQ~V(%!7?fV<>4 zn+Y{yHZ#<&M(zwr$h3N^*5+m3dvNH{!j<~}fXuA5iI5vpDS1*L`>7?y>5oLo)sovz z`L5j!!Z6dQos`xVQ_`zQ*)OgcvkDzrb4=ghHxp|-$%U}>wJTDN_?J;ZtDEGzlFf!^ zr;L>0fj^`iA>d_~NRFOr*-5q*n?eI+PUzn=x zEfn3$Wt&Le1ocdov*D&yW{M2dk)8N;K;IK>3C72@Q{}we<=qFM6gQ$LXStXc1(;U{ zvIaNqcpw011wAazG!N%Y{PB8XtwgHo_*=$gH`-ueqZSSVT#j!v?}GnN`6+ z(3N`HQ->=^`A{Bcq{@f7I-ac4Ig{@hmiVPkNesCIdILt_>Qv_nhNE+YCEY=NLbF{d zNt9r335DEyH~k#7A!*J}oG(0bv7)OS!EveO@eo|G5V(6;m}{--oz|gN@!ewQ5DnPj z4mqye*yk*+j|(UVWfB@#B9OtF%o<@@77qda5@eAG*^ZMOdXB*NmU3_8x_8vd2S}o( z24_F5a`WEj#(eoJ7Jq9Nkdkv3c((sjK=2D2*XB|xB;!LQHfX* zo8gseOspF0h?{;cwnv^OcdPG4IM1R)?K7IbYC@tV+JaIi-y=UOyOryzQf2FoJm?$R zGb4w)rKYkgW!rp@m3;*GK8ab=s56eK&xlwIY$ZT17syJe*JWB80RCsSX!ToR7kFX( zmWzw=7sLm3S_^(i%T`+#mfFQ=B7`*@nhuz2IG9a1u;lOlF8tl!Ov*`{Uae zA7b=RFEE^c!EkOqWj}uVIK2HNnJ#~01LBk}zrgOzY-MR341lOOHvw{5(yAWxU(#Q6<|_&H-OoWZ_%LJ} zP!i7)FqqRcCpX!0+L!IfMzxZ5 zR5htyX!c5ONWMZL#nl~<0aFe@E#VX0PPy@t08$YK>!p{xuVfAmC%Wat zb4DK}E$gEDh@(E{Ua)-&oKATC=<@!*e)|u#Zz@SbV&$;hLGF$ za9wfMUQ|u^Y1i)Y6mHZRoP!oUwt)9s&B44H$krtj^;by%P8KgRA(&2;uWfa0-?U6N@k z6v0l;f>;ZcMh;2tvS%!VfCof+gp~mN!pqA6<0&5psnOH}Ut*=a2?vs8n@GqJv^!@Q zg|>@;t%;T{BE$k@mlTVirh;t*Rba6=`R$Kblwor5_IrH&jEY`3^V5;9LRXf;Vr=$8 zy>2Amc6{zH@`kG2y0jpPs?cRy_J{39Sx?6qS-6LGptgXUc59!aSvXsMK}WR`vuJvR%b<3p1CxwO!YG!MhRCEh`uXj}6J zSIgICa_c>mvO|{X>Z&|0k@XEAP2W$NiAW%476G$lw~_=M^g*6~AEDH@SruwSK`7J& zs4ZD?J+&&6FgN74A_hx9=Q{1i5=38H{ z?Xa}dgVDcicO9jot;PTjLBP(*+L&=xso}xNABtS%Xsb3q+i8{Cj>biqoS6wkenn#g z_8)}5OLfrUqq5hsRcErK2kyW&@M8?I28or4k$tGEEJpxCm90VpR1HVjsT=NAV;&3?$L)bcPB;4v+8=Ts9_DU!Efm`zmRv@>25djXi- zsHp5&9b{LPqQVflE8Nrpu5FV#TcxKG%B+_&W4T|Zs~i2uMe2GAngYG$YkWV^$=Vf%xA2_~bq^6qAfThWKtYkm%HBTNA2M6*<1B?zv)9QNI~hpY zcjSCyp^IhDZKSk5qCe%9Xt{+}mYk)~)XlUKw^F$#f{dhr+&R;v+v)(_ZF zB@YjZ5S$lcC|&jK?=ZqH(= z<>=XohYpkgE|QG5S4%}J8Isgu4>heb;kW`Hs0Wk*vM)=>L#3!#MQ``Z8Fie`oImp< zI#tL2`t~RL`VCK{Kibzn1G@5Qc>AertFklMavVrI*7hc8VgXOHwEB{YX{M0^dgF$} zlA4(Ez>EyaYtzo@v9dNL@tN779xFNf_Zt(hQBL8GHU#iMl^keD4RgQ*YvA`PALoL5 zx18uwP%p8E%ZaTQsqliaFr}Sj9ZAf^P+c8I?)62<@QNha;FsrNqJbv)J`9ur!&80g5|KyCrU7WIK1wO$^)&K;`&OBcSx!{O&C?@(*Sr9 zR&FWG7wtqVJs!%UD+a|vRqCH(>#zPmo4tU%7rY&0{b6ElK=J6JO%gtAnjBr8PMd-s zzkU5d)8+g^`dg}h7t+Y*Io><#I_K8-9GcQ%yo8RG1j>B|9wdMI4fPNQI~i*)+b?!w zLRDwXp1f*AYi-VaAo98?->sAsr&1C;dZ8R^ZfH|;OoDze(Ip9X!b1XzIXeVC*Vyk4 zk3|oCu##b^ZKqsKzXtda*~uUnmbP=?Y`9H@>krVE3~X!b@J?F|HaHO^QXy2V-A6TY zk56Q&;ymC=kdHfMIp_g`(u6Rf=*2KWp|BLbMvBI|7h$w6ZKQv-c6GHrs#HA^5<|wBs3;Ty{&j!#bSH zdfCUaRXN;Jsop$_q(IK?m|PK(W+EcZ{cSbY9R) z!|;g36(j{x z`P0X&ahQ8_@ZlV~=gTxG*f1@2nB!Gcpo4Hm(#?>4 z&xHyLybjm`uH|VeTck5oj|RG`;=*;kY3;hp>aoFr7O+5^p|P%n6u@KP&}~v?vN4RX zcwky7dC5l7ln(MeQ^(zx?>7ML-Q=*+c~8Tu58?rvT$;Jh>;cs(i*k`bm42gKrdzF6 z6VT3ue(eqbogD*kwK}zG%V}_?qh#&eA-#@uCLFGXrCcgD;DAMCxx(eda}{~l(Uo@l z9uA9R1318n__h&9i{?pys3Em=>8uTkm zmZ6K^*P*sbU~aJ-qgQ}HVU=w4kLP<*K($*btG0cl+yxcDzy({2@t(Jk z1}N0))a%ecIc!B{2KTmeK(Id%|9dhhB905*;fKGN)kAa4iisnB+Id7se)$6nljAIN$0=r9crg~+!E!{rM z?b(8E8YS?@hsn^(8buQjNc&l8Lxm|k`R?gmI1tGpSz9ZV%xOOtRaHk;9YmjS;$-jy z2r}rFq-H#7>mZ9+w%F=o-#B(CuZ$_Yy=^pB+$9Ddots4R>>9`5+SX2^kobI{;?PF$ zgIy$v5DH8f9a)C=SRy}|B`rMz9MMir8#0|iXob&&t919{Jlg1blK#~Ovb!{ekKC`G zL&2A6Asz;rm?#qmV#J}r9;*ALL_gy}HB7ZxiO%>%J|~B_+l@#)v4*FUfK1{q=)yev z&%J&5YNOOI34v7sG!~cgK$lx5*GCtYD?I~Wp8NO@DJ*t-RAD^Lo%}#5Kr+Ov>b}5j z#!TT!RtFi}B%w^gs`sie&#%*+72XilmmV%`qLfHm%| zw6-dz%arLZx7yaPq>kqdhwkU4iHW5Db)r-V^HEX4+n58B7d8TGFZ%? zRF+K&zHA+#05*<*1L07ksu(YgU$L?=EWP(Xdi{cB#WRQ-w)PioAr*3mUaVk1 zEm62(fm{%X=hPcWq3pB*OxUo#7zsxhq8n|=PI-3G;~L)feZ`{O7QjuR&gr3EU*jQ# z;R?;dULq*@^YYPbIQ~RMQdmXXgr_0+;EExRA5B*!|5!r^G$FUQL;JgI=|v!KPOrWm zCKewGh>F|{^k8DU=HIKuzf6;D z_ZK;`fzFkMXj<@h7@x};znKv;iO^AK8OC3({48&OW5lMyvYeZ8?n{OPoytoK1c0K!&`V;r(1vojD9C^y zUs$-ON71XiYnOWlFyGZ_dX(G;ClYB6b(YDldmV>dsx8bQQXs}>5h$17tDp+|K=zbO zeQjyOo6nZHWNpT6Z#zk|@+24>t!coLKUOg0_Q6#FCDiTx<^9hjMS*nXCm+d+1+i-beBIcf{A$Pi%H*^PU4SYDhZT&wCT6FBuy0ho8J z$!vQtCn?eM!j!KB+^D{kRnQEZGETtnM(Tw^JYY{6A4DG}7g$t_s}t0I`SxY__8;}J zj(y5~%XAn7l5J6<`rdmPj6PpPzj9RDIDG_3iLImgkt?ii5pq4&2GL>LyiDe42|ZvG zaBTD~cj|7YtTQE@f%AK{JM_l|rUe-nKzL2DdvXfsf%SOb?cN2~n#djwDt6da>ZWB; zPUXpQ2=(2P9W8s9Z+eE)LrXXDbn9BBevgybMpI|UAJoT<8vPhVHIz#_9qpWq?i+gT z!aEZkx@z-mA&Tu9(Wx3IN2u0NZ!)IWoWznPA|3oC$!SYsDJF_eGp}l>?V)qP_lgO? zII^aL!l~SwYA?5$wDF|1AiwTXblSFgl4_B2{Si1VJEi3ku2ewMjNdMNgj9IZo`Bu| z`uZz=4S)H9|1GJte#N5eS5jUDQ(J$*uY_&g!}``LC9lSZ5^jd8cSF9cu?#2c zL7=FX1Z#0Quc&9GJ87k!!`)V`Y?oqs2GgbkiJ?Q|Oksku3}?rGNfowx)dS(2`XU?G z!qk)wj}`gfvlLQtva+feI%ubm&4rj*y6n-)nc0v$i6CSodtE9_=zg6Ufwvn+BR5oo zvN~0yFs(@?#ZPk!R3Kc*mJ@#nL$ra)2u-J02xIML6;~YTdB$Rl1ZHh=l!vmOJ&8lZ zj7wLW$6-~F^yWPPi0(zO4OoH{Q#K()qZlDhReu0ub?Q@uF=`Rov^L-WAK~q@WT9e; z758bYp8!1y*Ln6^UB^m&qe`2lO2m4SymL6zD9m1p;|&Ih@;MWG`?Or-x!l@X0-U+uYeD1T>vFH*JIzfBo18_XBB*unaop;RFXLtsWCyTimbmwv>bXujQ z(n69qF>ZSQY>Q1ehE?+=J(VE&tOfRq+N=RRU&J1>PPcU60@b28r!;gH)xnLk2826I0e?NTFGC6R;1(t7RMD3 z<43cy5Gl}{4;ImL;2LV6cX;yiT^0P&x*hjy?2h6^b&IOSGHDo7Ak+eGrqV+Tfr zt96;8`5*a}o)R|J`)3J?Uj_a0>-5S$L1Pw;DDeGc&ytA>wiSUE%KvAveD9e20YleB zXJ}(_IxdJ!4HGIvb=ulr)q_HI{j)vml8<0Y`sn&F7^Dt$og^!mx!%@Joix#8O^cCq zZ%D>L!D!F|`RB`JXaWrYpCHHQ>Ecj3l`z`}qSYqvuDm%??j_XLHI+g|!Ou2FMx($W zPI5+5S)i&Q~wb-Bh{D*dsg;o_Dw*)fb zX;cPo0O+B!w5Ik%q>_l$OfAKDswcGyL3M%1!ZRB`-}? zqERe00bdBQM*hGt#R60^XYEdH19w}1P$m;Yo0#qWggruOR#H17?hG*KV+(MH+(2l*^Z7CM9);!M?4 zrM586A0Y$nO#DM1PMApmdnEg%lofwj!CfqP_;XOU&g~J#=gSi2hlT0nzAXzL%9o7^ zc-ycDB~!s8J$@W?|FA#Z?iUu7< zGOIvKGWZ*+f%d2tZ`#=c?WywIg26nhJ)}LC^pisaKsRcJUW^2CQKS|0iZm0;m{G1q zZ;d}n!a=il-q*p~>g(N|fV>UbLrPC>LKD+%Dr?odr;hwkE2_7Ccqo;%2(l+l9s#9BwLC3WBL5TJ1@?c{%|o{}9EGUjR9&Q5fa zYnG3TT#Bouma+VY=W zEwx?_l^SsE9863bd3QK3Y8VL&67zbuUImV(@MNh{L5T%ghNa>%l@3V3LOGQ~gVPzH zY&3A@47DsFx>BfZ6oE3b7U}bV%?+bUjp9DypXDXU>Gr4L=C7DH{t6tt&t88VUVnxl z_ouf{!>P-C>~~2FpWsNtczO@fB<|$46*~-Y=>4wQfGoCWWUoBMA!}$;mq!w+u>PUs zA?PM#L`(w|^X7JxQoBzJ1ymrnsak~@nz^FGI%RaPk~*y=F6B4CXOjsAuPP_gOr%0Z z3WLX} z0t6ddxw5qnR}5AQp1eRo+xYAJ^o#KJJIJgGJ=If&aeEd+3 zzudY<>rz^^)6XzfunTkFu}9eB-W`Svo0ttIkW3assgf1Ymf>36G&Ntn1quKTwSk{M za8+7rg-Qc(SZbb6IC^N)n|rrs-4sbAq4QzE6`Bz%2j6q2NEQRZPa039#6%rJg3e?z zwX&<`NEXJvWogL~^u+YYOSeHgpq5o0fb#jEPM-3b^d0{kD7AtOW$Noy ztus@M_PVcy8|12B69w8F)Luv)0pSX&ML1aU>w^>fl!hUfn#bX&I&09 zAd!$oJ|Kk3>5$5M14Snfn{GQFjc}YXG`4&;dF!-s*8pKDGpyL70dq{YiWKw2;d?mg zS8)v#$C3bp!4zROh0?)PC=n)S+Sf|zf^1~9Aw%2aO`gW%15EDc9}L!!i2N=|C~LoE zsP!YIAC|229vC4a2cb$P3@L9wWZJY+E3d0XYEX)kMy#ruoq_0AWGZ2d$#(Kqr^PtW z)EulbSZ#(0yv1XyXHvsEJ%j*D#S#^ERqX4HPqL#o=DUxumbte(+`~Ynm2n4+Jv{+t zmxvA=)AXF|bzDl`Cnif0Z#QbQsZ5(yY)|O#vwsCV)-rj|YD=OeX^9?{8f4tm%7CB7 zqOg>aT*#f0JsSAtY;{JZV~tlqHJ zfZ7pi)u6VF7!A?$3KD|UBa#rlsofUm1(LBtSj)7Crmco_a3IT~4|I0NO0J_z4l3Q+ z6gihhk@&mS=D66Fn3UP|HWoWN#6`yz>=$gkevyVu4~kB12Kclmz{t4%#15h$wI`MG z4`Crjz^;~q4;QX%mF*nZwNo!7kRl`_u>HNl=-l!dN#AG$!lDdxwscXSJ<*kAg6S zpx)Pv$Rq37M%z)=PRKMpNnol9tnQAw0GiUYm@q(55Vo|D^0crZskiuSOSx9$xzvC| zp`G$fr=Z4g1*w-0<2j{%%3~-{-B4?DRROE4&UHgT+o?ZZ;_@=%STKsNCU1|`COld6 znBIG+rPiOB=JVdJOK+E=5986MOW49ta9Wtj9t=;*t`QI@zc|IV~;*bjISNR$+8{F z$;vWs?*a$3Uvvyi8SFJh!&@I6)~bT8CgsNC$p6nr8nE^z*5{My)T0+)eH- z6&s%vyJX!F$;@W-)vlM0sM;abE_I+23%j| z+FY){a#02b$i2lUZScgIx#*|fVNrt%2+3J=kG%~Y!M>6|ZazY$3jkUMt_uuT5IHzW z*#i+Us7sn!$=|(Sw_t4E$A@tci{w~eNaB>$ZRMHL>$w9q6{<+{A!@E-%N-i;l9~M={HIg>`t{qdgZ7Yrc{aGg31`_&RD*(B#|3hSmQZ>W;#GSs z(}Rr`c*q({VhC+cY918hLcPkP2(!$Qwe=QnlI5qIew8SL)Rs^m-4wsHYr!|2Vfn+haG zsrFmyC1!6M@aD2_aq>*bri9p@Bl!Dr%$lmp(1%g^&r+v5by#UWhI_r5>g(h_S<}g- z4Ipc*L0FOjxJ`cBzOtdA4HKum?Lb5jAq_ZQivG92lJjX&Exr}*j*`JNAXZz{j`zBP zQ7o+6x_7GbmSm>)oBvGp&*2mf_HCBS$OT;htsO=K);5rs>CG~<0prKlNK+%d+v(pY zMdEk_v)iymyd1C-yOD7KfKPRl98ZH72-RhPd|ihWk|(Y{+Bh_|E>9j-)eh^Vk&n3= zDwQ6!IF2Kk-NeN|V3~kp4B==b+d|#_s4L*pKAUxO)hdbCi6$4#HB8(>Una1vl^C4S?f-9B8l3CTG)$8 zjxy(|(f{zSB|u>eA>y;D^&KX;Ji^PhwJsg z7bi@kR8TUqMS9g&ii6VNFba`FjCNLihxg9EC-?0RtMz0fnB{oCWB-Nk_ zFDOqg=eB!WV%Vvqqe8gjwG9L5is%?=>{jBK3Yc z6}Xj;ZXuzSAJlLVVcQ50S38zA09yca?ksAnvAISR>cyZI(OQnp%PXsaYJwfi#v|nJ z?IlzUlvCa3#1*xt3;Gw`nxOEIr5?yMjVGL+RL9DC%0f!A_o5^~ckUl3L;_Zno(^H= z(HDW{X1O0#-tGh4Y8N_9;Jg={7za2+ro?ct&!vhpTpA|n8c_@!b_(trWd@-MLs-cs z=V6OBC}t&#)u*W|x=JZTOiJ%zEm>JqYG@1(xsmBuVFe;8B9-+^GNs)(UwSUCd4 zIrs_Nss%aV@GKq{OyFi)(dQfs=s7A9r1D;1J?ajm6 zIDuWrVnUC%1#qct-8ni!YfACC=~)r34^-V#o@(?eTjB5-?6%#3N2$i9Im{OPD)nJ0 zKr)dyRAw^>BGoYOGZe+X`XEs$O?H5?tk@fk&z>|0uPAK^)Zf?cvg?cqV0N zwJQu$0*B24WF6YN?^bo$%^Z?@-A@X)2A01|w$N^$jXPTKL&4k#@X8`X3<0#hMSs|| zlI=%X+IFO@EhoLnU2O4K91CTaf-h90RsZYo`l%cTCq0h`oa6>@v>pk$c;6Eg?gD{; zih!2j9f@rkF`4TYx?_xL4Qb5Yvijz?{|jkc9*kSm_xOhZ3%M1pi5rqt0!UYgb74Ujc|`D+o+zlL>=-q>~14 zd_%p$o>Z1OR?}W=xlf7dz+w*8fHf-RXIQP76td?W@k!0cAzjS;M=$pRZ3eH5e! zJrL^(jqpHsc}t+`4=P&L&+1dFUSCFzi@1Q7*r0sxrEaxpu?uOa75MMnL)jmP^ON*9 z|0TSsuFcPb!NFf7d2GTqAU63QH5=x(GLDD-QuXTC^*p92>S`q5U^rhH}hgzniS9+s@iU z{TD~B{HG@<>oaEp$J6NNT^HIx8?AW91A({GcthQ7A+eFgxfX})pFK1%F2c;x-7qD% zOFeHDLMfj_mh+Y6!2|`NftwPtOU~^qlndrY9ZR=usP<)7+HqPy(SQ?2_%MbmVcJN% zSWIgZ(KT3;4vR^{{49MX3G1PHd<2W3?%)o*12Qs63YL@k4!z79InOQqLM`jSP~x2h zW(14LwC)h5CnCGhh~6btQ-|M`FNWgjvSwj+P!t(H7(LM4-_XBeI<9$Rr8c0J&&=(C z*0HT5TxEiCXQ}L;opvw{lLJo136Lo%CT$1|NwjKO3=lhk%L4c``_s1_)F!J&(Y~@r z;r6H{Vi$5X9+wUQ2rlF%;59&$ObQjCX=J_nzzV0%#zxVCDye4RZsBVY?TBga_Inx( z-JC-M{LZ>5ayEKC?xY+E--*a<{r75VI0+sj5VMNur?!QHDIz6*K?cZ5 z6Ui@TGt83p-mN(Wn;XQKGNaE5c-}$mXz3h9gZ9Bjk{o>e>_;O>+1P50J$^P2ia8Pd zP$2k^jG4(DG(G;&>%U;?kuJQHks~ErkPknQ`_|T!g=7%Uv8IOUw)xwd^G{me&nS!K zy>?#9ZEkpk**Zlu;!VBO?O%n#x;ZKt?Q`R(>dUpm#uZ6Jc+JZTmn|*<`I;I+B&Cr; zQ}U`6PylNA0v)n*p)Uj`BFP@mbxO}lPYx%ys2qWRsJar?8lZnFo&oh+fDI;l60$!U z4vlZvvXTwj34fDHceY1~;x9p-IWu^T|7hVXorU{9Dv50N3|Xu0Mum7iQ;+^R=49T6lA zxP4%qB}c=%y^{<8?`Lh5LAeotmpTFq#qE~V%_m(Fi1N!??BQ9~W7)2%U_KHoIkIi2 zI7txWKhQI!2$!U&>>+{+sqEM3&cRZNuHxvqyoBJVZoG^o6BM^5huo3_!$8KYdkJCy zhh~bS3J)k2hxMQQAcN>m@N&@rrq2OZ7|`K2abHl&QX9#cTAij-ws5^0Ez53(T3zZK zN?l@Iq~-&GQ+1$gV`W*uHMHq)tkWE=!g2_m`gy{&Y zj=s)8TVk1^BI|H!$rt;mLsXmhLD#XGHlV-Za<(A9{S>^G`9%DVpGRkW=y|t=7 zff55;GW>6Vlq3NzEoE;t%*s`guzPn^X*SHH^eoxUJ3>JXgOq8 zg)6!)!2sa8n>zNg{2tyw>K$cslX|3(K+0Wuo49vw?QXsBr^(yGs;W@{i|3F!$@7e0 z-bw_ncuq8%iR8dUqq4#ez3``t`V2P^31hzkWS~1$E+m%K%SoTNM9o$n@-?b}bd!BG z_GO3=(;%B{(%@P43bA0dtu}UWv4f!r`{GM(kvBRpW5*ROZ-kr05VxGgxx<2X^T-L2 zPI4f+4-DZ`AV5cGtxHKNqnd}<%EeNQ`%OoCT&+QF8SHp`brR*HEOfL9s+JS{>q$Ge zhNrdMB?-C%db^Yh0@1Yg$G}8eEf(msH|*dN3^k1CE|7C>c5|^EN(?^lH90<8>q@^` zQk4+yH-PO___6;amyCGU&KrIT5$ zO6_Qfv0H4Flp*9&PuFk$RPtu$T7DwSk!Llp(nMEf21@&omSz>J^(acUDNx6X3a7pcRU z!6N;TbPoPQI~VD|_1YnD1-E}z8zPQ-!7L{h7l09YUzc8e$|W=P>O{pd?NC?0@a()2 z>gP7@7x@6TG;39|7#*W1$E{2IHYmXcH$o1TS!(Sg@CD8vkd&b4P`?GpE7qKkuoDX+ z)+AM;qD+9tNUIa(^+aGvHF}^m-t}P3E;g&Kpd{~YWcjcIbJ}4lmk$g}R3O3hkdw-% zBo$ByWk<4@j#B45>k=(RDFDB|E$p>b^8ausYuFl;q|yNK-^VQeqqjer9m{vZ556P+ zmsj_1UVp~G{0+R~-hO4++`t@n^g`;P6Jhcv6=%El)&ROI^G8B5ybyQUo2FnZ6=RnJ z2vCkESShA1N?GuR*g*B_-90Qf70{6UkA<6ZeeH35y@vWs{0*{{FUn11zZ&*hFsHCH z05Y-gp@GcpgVp^?SpsyzMW>Q59Re0Kb)=99aTrZ_nv0v_1)U~9gmj3Kv0_whk zfiY=&rtko>^$*a$P%N;fZODpxzbr{$ zCoU?NxZf@jE%#qtz8AieH(@rc_|soHSR|tSOSqw7(vtiEKEwo79jI z%<%@>io9$bsSn$#0ON1T*&8TFWu{Yl86|6<1Uc!H)Il7ht#2I@Cv=)lxEJ-HhiHAs z;?hdMmnFOLsRX5t+WVvYM5#=mtUDkP9Jp*{Ij16|cY*jD_!-7&)X{azhed7Zw5LfK zQG_`n5pL~qX-WhV9xMrImGN)O8Fa}+FtVjQCIb|nNgyCFds-&$JBWIs`k~UP+L`8;8R`++tSxV+)Db?+~%J zH{ueg<)*mX#}p@aB`r!4VI`|v7FD$>6okta(QA;Fbty6D*_NmTevazVnd+uZlcWh| z#LSWmrwXlqvJunx(UtP95IIfj?0!<(s?alDbD$;i98>^!rcZJLTLVOXwx#LQ2Yg|S z9l@W>;BZt_nD=a%Nr#4=q3eY<2W`X*v}awqA&-|Apx<@!BcHtMLBs9}Th)?^)zG3} zn7_c5W*P|40?R`_$?Vc8QoY-{Q9L__-81yPGmvFO3#CKJQPmDOgFnpXC$wz&R%HU< zkApdpbtNbIDfTE&vpCh*Wt!UE>{? z&ZCJ za{Vzp%pzEJw48~k%0s*pcMm(&Ow`6ei2?<1fQEBwDgVkc9wc`$*V;`RYP8x1HqzS& zrTC44LDPb3Jk8dQYP>wScF$n`k_mK$o{LADYt&)?C0TSKznQGBPqs{$q05O`k2s3cXQ7&~G3m7_W8NrP%#+H|^IjTU^eVO*zp|_L!7R)F(YVf@a z^pko(f(=|7D9SR7gq`)1j+JWKn(C;)9s_As6U!x+{usgb-e=VKQiMLq&EE)2AG4L% z6S{HyiJDFW82N@%iWonA@#B#`97^qp1Xz<|9>KKGwS zjQy7Qg8GzXR<&NR)Kq)*Bo<~xAGt=}!4+CvWgsC? z%4y<$+QaqX5pP?8|K1>`M(HfMWQ>C=WXh;V)Jighm8qmBo=kHxqRS)A0mdqwi7d|m z?%arZm1}@JpzPdfw9jxishHBg8R5jeNm4P^c;o7ipb{6gPc^0LGPN>bn@+yFuBj{4 z;siccT7zhGrbivz2cc$7yRN8yAspOK*YMn#sxZta29AsZX%~f@X_Cm_LTSgXEGaha zVdmh-5UV1K%Tah+XGPA07<|!qv@pl{J`b&+9|}+o)p1H`}K=!7S$uj z+7kr2B%rg(0q1Uv9+)3CM4Bk-ilKr!J%)nJyXt|Ct;@eXyq8yiuOaV>83cyW@d}5p zQxp!5ya@pAJ@s`9rI~c-jRwcp6bfa_ke9P&+xO(Z@V)Puanb9SbSnDj+rNMP7sCer z=M=R8Gponc4Rxy%D3y&El+M6UWE;D-Zgd`PTL8sYD0aJVtE81SySUPF0wR8D!pm|L z)L%aA&r`Tn6cC<=jf1Z>!UXTGx3!h}A`RTBUu66RGPsD;WG!3Mb?ss%ntZnFR zxZ#k+B^kK7#tIW5Kx-WE=0Q{o;} zj3s>=MwhuAz(SY$h9P!Q!eRPhhRz0{0|8r&+Gu}Ub)gw4)&YG&3O&c5o7+(%41<~zFGV!*~RtOnSCkk4rhg3G`DUx`u|+%wXSym- znh6k8;VVEnENx3v1Ed4?z(U~LpTg@O(z;VAn*(iR_B2|R)L%ixr#;&jXI&!yO43 zCFVljnkb>w&jAtK2kh^KXw7rgC2AmrRdJY|EX1!iltCWK9v`HT`9-V=nsk>JGv(Msw;@7Qm9SYkMYv$!)6!~ty%;3wM7@erhBp$bN)FTX~1>aljA9nOJ zoV!11?qQT0Ioo)&A#HA%FAh>nWqGd1^c}_y1QGa0MvQf&R2qAdG2P__mp@0B+$=YQsrkXakcfQ?}vjGEd#eCA_E`_D)8a{MyP2G!SVz zkMdb+qE^B6o`HVpq>gk6O^MP2L`pbbM2nUIxrJIQ(A*OL4k!qL0K#bqW{DMK4j_?& zBRQ?u1wG8OD|AGxawb^?dxCQ~|M}}zY+?TN{ZyNoUIB##T~hTS2VI@z|1(s|hPGRr<;;a8OT9h`Iqhc^+rbUnfI~cXj_a4*)7E7#(CP*QV9guB1QtOCpp&gUEPG(JLRTlx z&GKePMX_hIH`$BoPh#t44mZ-&(78r6qUeH^dj`XF`?vCL<(FLhy`u>)l8UaJ)VG#= zODIWlnErtApyeY{D6X>k$)Bk=Oxij7>y|7t+)n-WBA>-(Wq`*3f-K>-zS;&s;ci+c zH9#-psdCZJfN`z5YpFPM?K%ar7a;1msG@iq4u?Gbka}gn-qrl*!@DcA_g6eK^LC@(7lD)ZR_3%j9L)GNt z9CC2wy%gJrY~FcAE|H}tpfSnG)?&KmwS)tt+xO%GnUU~r$eu0c2XSRW>Au(l?-b7X@7Z?`T@2<%%Sdo z!5UYO^vV0VL+x&q$oG$4_kq12@7QD=(I!fdrqt*x{W$Dl$1Pckr6fHXAk?@8p)|gb zDFpkY^f2rz9Xb6U>iC{V3KsRm(LI1kNw1<#JBWZ#_zC;a16cFB&hwU9#q*i=)tQ)* z8YaV~$}S^vGXa?*Evm!}%DR%0SuGPL#Mwio#583pC+>iZudHqRvORi!s;3aOC7a*b|>r%NnkGhhh z)&=+h5qPnO^1;}y*(H^gL}YjJ)wW+{OFE&=<(?E5iCtr0-kC4AeYg!_9S}g#*5M+)aLpl32ruKDwW+;u& zcX`f-Ls;xxXV>$~Sd3Em`9)< zx|f&U8;Z0XtueP;VCv{rNm$zxr?NF{ghzfPC_P$9-Mfc*RfB@hvZ9A8>fYl~rbw$# zGQAsBmls+h-pWz4k`;=lp06c;UIGK!72!uB$}!tb`2Kf;X8FJMJs`EhpFix*y#McS zABFe-=j)&4!H+NR|6BO>AEajP-OC-?Ee@$j;Fe*B&mJBQn)miAU3TwN4?Od9x#Mtm zN7TCx?+j}^0*f`PsJ>z-glE(<89kOP4s45QR#{b}B^Ed)bsVC*u#Co6V8_aGRSh6vF`jTL;J zHs@XtpKr>QXx}}4y?*29xauA#=Q?9V z)1aEI>Ufp1xMPi_7P>BH3FL9-e5zV`c3n>{dr_~L3Ui#RLsfem<+pM!`*=Ju^)PPX zHa*BaL6ya81dpw!lK{quw@1Dji+}VZ$Lrt^myX zVY32nZbvqpY^AuGm`~y~uv~S)Z{N@|uV`7VfX#LqI&3=lImA&77%fwV(reL8?*0om zcn_y+yPy+QPSjf}Anj*cVb|TV()R=8tn6wGA&S^c*gtB3$yX6k*3}K{N}mfO4|Iw_ zG7lW1z0n(Ru-4Fk*CPosja*O6xM?QQs^Dg+lHQg^Di7w-)@Pq<8aP}d4DWgu=x74P zMI{F;YD?NxyqkRq_Xh${GrBt#6y{H2X(i@Z-iIqBdKOt1zlcd^G(E{kF^w$jXTAMv zTCQLTev}$jpI%-j?-agB;<(%K6m_7pW%uYifLSNI*ID+8l_Ohy%lybqGJigD`yDws zR-JPYTmTpWXUDRjlJT-d^4UcnwOImVxOxGJ`3ezKqpOUNrU5%O%1R6rsU4>E_JMdX z@(n7f4<$<`R2frA?RdcCP{Mkhs}Py`#9%4n9SAYY`TB@%LF=+4H{AqMPu>(#LP>ae z$3}0>0^3QQzw$`i*!AudsIn6iwz!IJinlH#BgICbRqz$$VgN)rvUpb0H$63MUCE-R zaT0U|X=2dHPDI?!Ls-ZFr!F~RH7z8M!dhKQNm8>7TnTAwR|rPCIXX{2O=njlLE9?b zp3Z_`Ey^qE0|#rdsfg8)E`$p2cnm&&ny8z>7WI-v-r}_f^nASh@Q2}tHoiqq>sP6@ zmD*n~d$76G3v6c(TdSCz#X|!0HT`z&%I?bhL=~cX#Oo~YIm0e#VyM1B#Kp+nO9C3cEDK^k&EYhkpIG0WXpvo~Fu)uvG`q=dJYwG+w(tro~yMht}D6Ba2Vge^%G z(1f9ZMDA;^rWtbo%_QYXdHlVX%So)aia95cBX?ibF%twdxwZ`%)_}bYb!2@kf1y4# zjoX^sKv24B`qQbrjp_j|%sQ`tY-90e>)8+dit2`Q<<`f6tW|YTMZWYdRdVwD@TM# zMi5QB#9fhAx|0pI4z)=nISyp0%Ka@uMwKjeH@dTp!cg3X0!ElAp=@%MDhJvU^>zO+tpm1Lj%F_8KE512*tucazDaYw+mB5CV#7gM_SQ>51hK^GUEw?$P`G@Hc;BAh%E6{*3X)CvRUF3G$Ad!+`+%Dw!t# z89+g6*I%F;m|pOX-g;jp=nM{&TGb@Q4`hUF$Pi|(*xK(OI2Npu8V{VuNhwc>jAaN9 z8_q?_%%(F|idY~-7P!jKEMws*%Z|>hc6j}L65f2Wy*Xd$R$S;s`*&`y1kd`a$f1SE5sYuHheeZGvaY%^mMTzav<~(7Lf)3StoHQArdgWGGipPL!k0xkz*Y_)^veM%?lP zHs}8MDH7rhG(np&#FpNoTBV$-P3^j7vXmq;Kb2GB|JOgm`HB9P*UwZq#CD4s^8i_y zo}m)pXOuJLb_B2Z@AS2mfO|t-&`ftKGXN8`Y4s_Y?~qoaH;aw~!l<(I*r{LtAI9FS zNtWa~6MN5J;TV}@Lo*S4AI^w>L^8-@$%x2|?Z%Q>Q4cZ=Aw5YCdL-Y-?nW=f)>sKN z0K%-g@V|7vf4~!*DAit8U#~+>f8-Tkhy#g6HbT#TcMjJ=(DkXM&KRL^NDm zo>WMk)OA#n&?*-a@o|F2CGOu0w~~!Xy1GjPkNg4}8elbPOW^>xOxShXq@SW4DrLFP znoIRb5;;8@qz=A}5I5>8c&|r?PXeyyV-B@~?$hpwR-*LN!x@~ARAtons{jmwK zG-UlhVb#P=Z4D4i=liLu;fI-aM3QZg;;qQXx5`abr~!E9LNEvdWp_<(qnyAWY->DH zJjGVU!aV99DzdBdX5DT~wEXB?;o&_u_>*6XOiw1OGWSlO+S!4 z^!SR`mIAnxUw70}ly|y=SmG!FO>a~gkVcA5dKr+Fy!*`e(ydwXO=^fi z;k_h$)hC#kWV9EvY48YF#hlZ~ zCtP@|buA&jkbSK|GOziuVXj~-kI4o8mO9}g@QW@3x8=+#-E1?V2FCF;F1YAG#dIi9A*4+42Jp7D^?{)%FZ z?g+hPrxFJt*6g!q2~s`&OLq!%w%x&J^6fwT<%i$? z+8mr;K}}@tVdzt37^ya)8g!%NrAq$2?1P*-wU_GZUl=d4V=bq`SO+%r?tU=F`#vkQ zdm{;;9^@QYA@B+bd(U*R<1lsYZL=y1#rQGt2$h2~B$v1YCqs!erQIKAccNRkrKi)4 zNTHaVwD5WFD&u;#+V-{YbUx7pFpxt@IV3v=q+h{hadgH5I4%2*f`Dar*_#56^Q3g3 zqzms^f9+Oqs6eyH7y2u7-%)`89yZgmWc^RfR$s#{s){vEu_O1&^n-C=4_Y8guae!l!M8M zGGHP6Xxk>lZU9k0uD?ZRXqdGPZ_9o=;9r*Mr>jc0bMOnyunjuad+^+GP2w~(|CKMcQwKNIzle+X2~zo+)XhT*(G{}Z-yf!z+$O5NkR`( z3s(7QgB{5+BBfpe9ksx^N>p`Ro;IlJ1)vH#|K21ZM=1ipf?u)(8(#innwFMR)egLq z5(${QVRqwHl?XgRL0c9LS^5u-qt8j&qflhP$zi^k`YQ2hw_1(9>rA4RfD0hEY%U2K z+z&8BA!=6hhP?d150hiSG+jUsgLb0sjdGefxmL+fsg@ClCUrbwnGjA`n+h;GE##Q7 zsbYbFYGV`VGNQhQksc-`W-xLl+45f?P62@U5bn|N#%S3NJe#2Nqhv2js}5PcL{mnL zf>a@H?8vahey30SbvP}gQvi$m=O z!65l07gzj*y)kSvoZ{1j+$!C?c@9X_6au zQp=vS&mwXjdAaE)zW?t~MPIXc{o1%Uhva>`BsD;fTKH0IssiEUY3?IOc8@Mw)GLcT zLwx8E=&MOWUUO0JNVfo-Rh)z{Vqmx&%mboL!RHJ(f#R-gMM?29U)I9$V~K2(>#+sC zr4=%$h250}?(~*IFO=#2z!U%gf~(Zvo3}oZJ1k&~nO+{Wd53O{X{DQ&tI;o+T-Hlk6p`tk%T-Wlw8a7*M8FjlHjg+%=2pOp`oI*?UNSEfN={ zDoRc`Jkuj?V5f>5&dMvoQwrWWLTe2P^WF9Z1|*JDivVV(C-67nf680ooA=+b(UZ1< zd6S=Ex{#$J%AKE)O^%pu+;oJ^*r_&=+mdU0=YC4Qnf{4+44|>x~ zj{%`_Q$8#b2~|&r-b^R^V!ZG|m6K?bQ=l}q%rHJ3{f8s_DnBhr%q+(;(khSI5=PxN zTPImB#@L9cxv#ECi=u)G#wd3z33+wM>#L-sR)@;FEoHY>A)DjO)QOF~I!R@AbpwIo zjT0RKm>faDC!082H!C`iFh;U!IJ1?iw5)Tsw}OjGz8O;F$%2>EfS~@e#o3sQZTCph zXOMxgo@hz-;k--n_z@UjPJ)3a0YHh-uAYH}D=nwAjJNhf538_eF&%7#V%?p~JhVWq zt_8Y>1ns_?ygCAfz}jVD1Y>rUdxY7Ob` zlZX{H|Bhr&w>>l`Ya94xZ6~K)2!A`0TWxbBe6dUn_1!mxqRr?m8~5hpMsbATHdzC4 z@j-AbI-U60O@Pe!<*&|q%bK?QDbTMWF*3gjcJXzR!vC@2)BZWZ)V}&}K!JYsZs0X_ zp-v%Q3Ni^+P*+7oWuX~r6zVZ~XLcva)`pn@JCndy!v2_y$r0T$D%v2D`&1ES!qEpP zx%j>8=eBcxnJl2OM&fU5EZLAmp?=s^UVO4HkNVk{I_k5n09OUW@=Pc&D0F$pG{xfk zzV-4?q;zuZ;0R?&%GlMtYucm4>}3Zlrap6EHfN&tDxhLXeGQ%r6^mt=0CWa1O;D-o z(ur3+`dNqRMwsgKaJl6i zAOTknO2zJVqDYvJI5%|@3DLerz?CHw=-z72Jmf2VEMffaVm&HYLIYv!uc7E-2Ue!q zz`>q?`hgP3K42cO*r1@m30y&7L!NMt-YBz{L{>`Bj)kHoTYyg^i^ zDpnBV)QA5|_?xsTegYGdl;wQ;MR@<|&(kmKd2e?iBUf-AQW>I&g!hO_Yi(f;1C0%6|$LjQly8&SzKU?EFAm}<-M*`Tin)q zu4DSF8-z6FkeAl%2Pe4zH;o1=0Mllm7MoPjw$%3p+!r||VN+a$7VBMJ=iOJi)dtZK zQa6Q-pK#3(D#+HOCK#4q{pftEdc^ADB3v>QAN2Wp`M1XCyV%M8_Vkwnj!l2|D? zRge)z=2)GSLbYy^F~D)sW@LyO26AYn;*pBQwr~MgA~b+vc(K52D8;J1#VfM>`k^X4Zk1owVUp-fN+={6+ODU=3xw#s;Pv%BH z5$wJuk`U@gNm6m(8G_@FBtYz!dxusJ1emNl2#jI$8mKA>OHx=QxB@DsAE8RO*O+9A)x{xv<%e-@5 z?>b=yYv;s=-POldRsTzui4tQlfA%}{XWg4Y!J8a6q=%%;YIZq!@;%(_FR9a*cGLtQ z94kr~jo6}2X%4|;d%vM|x;TG-h?Ne3R$D!Ae^Q|c3T8H0B_H6M284%k(-y5oba|U? z^a|Y%#4;)SNu=&J6=1T!4QQB3rH~9Ts>nVLGL+V78+D5$X>CEnpcr1QD7b>FyO1c~ z13R8`_^Zu3(kAQYR;BGY>#F5;RoTJLfjxmLub5a+Dja=WdB5Piwo*4}su4o91;o)R zcpNUcf?gLNZ%FtDsE3rnhosyb!NJ;QtuN6<)g@g2&a8qz3-7U>ivBlf!WBtq*^VXL8(CB@PWfCQo^A zXNR>!qjO-pK%U0_qVGj!d7(JN?k<*cZy(6jKL??d;8N**GxD@s4|;@)`Db%dB1# z0b1#CR_Al(Uvqi<{^$4Kzx^?!3w73R_?El|>b-ADEC6N7jtI~)=>fYeQPq-iBU855 zIN__Sr>HPXv-kO9(kyh`X}Aey7+Y)Wc(5ZW;j~bLXN~|`r%6H)oQ-|pQY;gyrMzZ4 zXqoYrMZ%2{NI;S!9b}H&6mo2ADh_XD{dk~LWE9z}S~L!vIiWIe;rcyP4n}y?DTPfE zoJ9>mM4~vA`I8wUikg(S6zE}-umx|by0rU{Jqab0q>b1jt*|BvEdRi(%3A~f=Q(0FRs1yjLr<(0X`iQ-Gp{oTAI$? zNoO9Sq8-Wpat{LmZ|*2EdQA9YNOikTTq$S3me=XmZ(ndC`&(O*(MBaljk@3|;o1)W zXHt<|xBW_d=B_%|PpoN6yPr-tdtl98cBf7Qu4~2a1ha9x0{PG^b?V%mMiOQ~`F3TW z5DvMjtK=!^m9qi7zp;avY4(a>sVqm>;1#ZNxMMpgS92#v5e-)6oPZx*rm=^dR*fOm z@Ey(6QIQwp9R;i{pJ55+4vWcax6mn$(nm;=ymzD`$<8J1q4E%Xaom9?v1(LV{+7Me zFK8mEUZXt#lK0Zh)HNAh_4qc)-!z9gv?hz`s2lRHwp?N+l5W}WDX>eqI+YRJNVva1 zbxZy&w@St|NHd@*IG-v!Ra6leiF)?XFCWZ!Np$&DB}AcZG4y?X!AjTNQzcj3a);r#7;SO)Oi+F^tQ8;4vDypxtNNMD~sfzOXnm^ zh1Q38Ls~Sm6zM9FX)wi67~Pi(mp(ieYl$nvE^pJd`(TOcu&m(oRd$>Win+uSgB_0% zt?I*DLIX7gdif1N0&J6GY@Wx7p9U%qB@%XvB`6^J`UF72MzTT@G_C4D|L3(+&t}^< zH#EkK*S@WoG1Ut3ze`D=Bov}QnqbCSO>(n;Mml1Fu2t~-)6sC63^P9B&6+bU1{{%{ zrdf&FWjAUx?r9ZN%p4SJsMVkt& z!(S2?$l9=w`J(LP7Vb82+ms{Dy(q`blEGwXPqi*X>Y#T>i%M>y&>!u}4ITYGXQ^!^ zu9ZFYjq!kQJoKE7i`pZ~&g>c9$KZ6@c?8O)UM`LHYK@+bZRyF1RLJPncptH>vGCP> z$<`SFm1-607`8e(qgS~oX+=vBM>tuxV$L-x9R<^um9o!p&u(#OAcnh+l@z<(oQK>6 zTFLMebC#tp!6&=>MIpw zJ*Sfl%M)*MmM~U`Jt)X(bw%*yQ<=zVt*SDVg^@=WZWqZ!Z?c?TEJFu71*}n9TQRso z5c-0|OK&Pkw^j`?X^Oos^ZCAZy}F=eQRsRDsMQ^>MpZgqjvcTGrsL3Z$?q+kK}W<= zHYc&t54zySEzW_ekBJpnxxIMN`FII*2{qfX=3|=Q7$$yFR}L}&7fJCSQbkY>8mFv_ zLrWyulb%hR4Mhg?lC+yfr?gk%D|$IRPD(K9x@koWtS}QRTTtI@;Q4Z@s`Ll zhFV*wQhM+~WJjz~Wl?K120DP&TXGyZ`v>V20+TiBe@Y4H|Lgsm@KJF>g9f%iGMvG6{Yp}8n>WrI>Q^k#{=mkMKw4pvKAx@Vt>ZbhJB zmef)N1CDl71A+~Oca3x8p+*22De6jrn8KgZ2imhjiO|QxL1wwg^BnwPz$PdUVN4 z*4BFcNNVWG!`Wg#r?!ArP6U@-16_V5lz^2ra5zxXo{g)UC@z8BoIWcumKd;4$q@+1 zn%+}nXuq)-#w37X1@-;fK{y<0`QeY`b)y_uM_eY19Eo54SlrN^fb{0=UpNx@d4BY( zw{Pt0@4kB<{=a_UyZ7n0X7UR06hD0X+@{_SZGY4a zI3g;MC~^MA3i??pzY`AZm8#ml*bV|LT;4I@;;2arvSiCGgR-}0A7+LBPra=qvOtEJ zG7xQS-Sn*pROFR{e5ucFZ#}qt6BN|0^1{%d%hO5>=|iICrA@a%sAP!Li9oJsed)QL zAlD0$OkWd=1iQ1eH9coml$7nt`jG`kccrA;Ce^v~BwyjFK{7wU?DfVI2t&ze%?b_u zfo=$T97!R5X5!o?h^q2$cMvnjFu}UB+EfO1+HU*)Be5dDOe5h)vaC@jNF7^~w+?VM zpUvW7Ox=vMZ$N-XwH}fPCmyASG0rgfknYDdS$aR4|=4(o@z4&>;)3jp2_?-%fdFd9?qQK;mAipRou z!R)Qh%$8Z+wJkF0&S0$DYKQbCCTD)c4*Q)N!vkU?M+(5TIZ6iXfC2g1l5EMjNuhqF zvJ_P7TvQb=IIFjxAd0|#Y$%zt_exo}UGb_eY`{{iK6}G#L&bNkwFMmlTl5G&oojB& z*|d*v?!_q5s%M~~nw_O{+yR%)@<-Sf_zb7VsZEQmGP_6lRmIjB0%-LCo5XICqPZZt z8u$Ze9-v+X9@Fk5vBcg{Xe3aiEoWx(yZhQYNi#&&qLeWErl zU?y;SQhqxjL8FQ?8rMY=eIlCyS>d9PPqxf+eDHTu!_jrBbS#`h(>hJzwsUMSgv~mo z+HmhmSK*Yt zxq>pg%Sx`8=3gr{IR3321DDn0oG^kc~-#n5yh)Z1siswqWecDf=bfG@=_M^ z(MnOT70KwmHeu#E5$AIC7f+x6}dXMgR4{O$xM%12EL5RHrm*J=QXr0e%8q6lJ>;TrmPL zZsmK}TtqQLm|;;yM~u9W>X91jHH?~>T;5%${0HEC4v=Y-|EWxvwc~JM0MAa2U_UoYRgQBg5`^8Y9knlT7n&_( zEBipJk^{I#qV)^N7TO*I7tGdg(AW-TA+THSU`Qg%A^c={QGM$E^pkMoM&-#3m07)(PEal4&Az z>NYYBCI!4D0Y5DeAPu#|oFm;1G@1*#dT0ix2E5REctIP*sEkvB`Q|471aU-D8LHZN z$B=QOe%Xr=~n+kL>fWKg|`j>Bv8;@~bj=kQ5F;Z;0rD-{6a zx`vaBnYU=FTclsq$-!z~MILdifJ0x~4%6VolqQL<%V{u#dS%*!H{7QK*K2s;WZ^n3 z<=#6SywW~px&(ZvOh3U={6JS4eO!pmuojRt0+iGeDXan*x>fjvMt_9kY-NoX(09si zmmmo43MIfUcDA%O>gMF zKZNf-@ZJ0Tx4wEaYs#TcrTINp7itsofx1z?L=Vrh^EO>50SIc9E2IW)TwD?;5%dN~EY1BpV}f8kme4Qc4S- z=>25vfl+;=+T$%8o*`+I*>;KgbV{OZk*d40uZP6Q>*ac#F+gO=j6G#}R2ZI@By~i9 zqMSSO6v;a{DQh<2SdlnkI%qRCsTV2?&K#BZ5{Ph`!H#F#N zA>!JGX%^LF<$eI^Gt=ysS*Ju?8fC;-y^swo&r6O&n`ZACJ6p9`>#1xib@;tjq?qi} zwEFi-DUy~R#1Fx_n#buSDpLAVKl`tl^-?zQ8cms zHA$~zXTbO0s>UL{1b+DT8-9XMK+Q0{#rWh^D{mFp&U|E9rJ6`hXdBv5b4Y>@=}0T1 zfyySBdm4{~^@J>^VIfyihtr+p%>Wvv8#{wfJhQdNTrKkLLMPjkkrnu85bvz;A2C;3xC(yX}m4?7{K#j!!QqNCa$zq~j!>uEg= zy?MB_;XVVbLDgV?=X5mV7?wK(1uT109&W_(r4G@)wQ&BhJ3MR4OJ$IT&T=D3`^M3i z;|fNKGgM=a^{dL8*%sP3KY-^=soKdpJ!iOr`ZZe*=xE*L3+8RMXC6w1sZPih&&4JH zd9%!mw;!&u)s>AwqQ`()Yo7kgA=A_!CC)=EPQD#3Omk1Jwyt%h=u*2$V>8{o<4&=Q7r0ee}EbX{~zq=Xb z*aMlQ3&_lfrd@^KSNGSfc}as#$zzGc5dZ?xv(*!Q5GDB$@e@d}gncfPqIw5lbbyR=jc#iG)#t;3&1eCt|AO=5iIW-+*Dz zIDe-UCb%e6z6Dzmq2V5~Db;@p|Isi9|M2z&&^n(bhsCWkO@+sF;u@e}^r-#N-FJC} zhr@2lP{#@am-UuVmvT*XohsKD?W11db!0oB$K-UDy>IP{@$fn77&r7;xwSaqjijK#%a`Y?}<;A+NfGs1K!ncq2Y-79!Q+nO!TA&wA{vg-ay_f^=q9sv{uW#a*AW3H+dvI#v*Odh6= zXUNbs&X%YaNxD=8&~Bk$6V_#K3PN8_rl6gq1kP8-L}hjv{CVEc>1M4pgeIpGL$t+a|#)+|X+w{E;clPF3qMd!;Hm3S?c7=|b(jKDYV zUx%}3LH^D!-VG=4i}x@6QJ9AQ3d#qcP#Z7FQ+~ti&wx3QFQ)AZ9s?J{vmOpYNRqZ$ zTF~+{NNQAESQ1)r#akD4UBdpr5mZvQepQiP>YxCsvM4fy&=`)IBwx|;8sb}p=OH(M&fDFAF~2JG3vATR7$P0UAwWn*zZR}C`wem+_*qVfLMtJr7UsN`bt5tY34&)r=vZz+Sqyd>EMaa5_3E5<4;(3Y z6x1t#9`XffCIT?z)7_>*_HE~?eD~amy@RdNm>xj~!-xj51;9~`@LaQYnj+geNqB8U zC@GtnhNz$`0Y92k83qJ6b*b%Av)HDPP0ap%P?P`~u46h~zszU)9x5H8e>FpN=}15v zIpZxBHP&e($%i1KEE%*dB?P!^UOOlsf`08-(fgg;?^5FQv9B$r6KP_YBKE%RgO1;6 z{0!h4ba`7eU;Gg_FaVVS^o3-{WN|jiQE3Cf(vK;*l#?O7`Tr^W^o3}4m(_fa>8jz1xgN+Wsmea#=?01 zULUGR!2PN2lojeJ=GV$?wE+Hbb+%b5T3&W#nK)w|?*UizZ4n!2PsW-Z;#heqne3&| zMp)&#L%m+^J+wXQ<)L{4pT!7GpW2w-`m1czCiCeq}N;omJ<#~X zbgXURbr5)##9cK}Nc3|(0L5#A;FnlSS6H7(9xl)Cgc~VMTMFHPTJs!mTTjBiw+`kf z^l^ihuM6qf1ip%k9Ed9U=uqCoL6!HsJTiw9*fu5m+SWjduYC(uCo@nH`WhIGmw7RV zOdCW1pyL`Stg%whDEVOG$x!D@ju5}JeB-qnhC_M1cJRGQs!BZJJ?sNPw=jPsBSOU@ zT|EV+%7Z&dL2l8i;iG?Gl)co)$VTA`Li*VSO=x13{p7f1 zxt+X)B(F_bpOz01rY^thMwyurjq!Eo-l$!t7l6V>iJsJH!T@t90S=(cro8)Cm+Hd0 zuq?k=A)@b+AUF-u6`BHGWhdi%+3e6P+sKTSH=Xk#SW8Q6l4{R(*P`nk_4E6I*9~IctQeTJIJR5Ty)cil9-6 z<7x6ObN5gnSuEtE4GO=*f7;z3WFKMZ=A=5wvP*yy$C`veSv(uuus~C^Wa<{$o?Ax} z#bMG?)6(*x_cmz_{b8rfR%Bi$tyeW$c9jKeJ3tR6M|<6Zd6D#St>_^N?-{VfsZMbp zL3$y>7JfYsbbr!oQIycA^(5yMXiU-RbAk*O_%28EmMf(k>PNz2))0X;m?5lmcy>Tc z0OtmJB1LT^Dwxk~?)s^tgb3gtb!3bE0B?LF2)j@K+B96^D~7jSxl?#5?kWxFFfU1- zu63S@S4?k^-^hn!1C_t~UiiE3;eUGfH{pNG$H-T2pQo?E@J`QmN~$F3PF6B3ig?$! zP#o0lpyJ0MC<$5^+m_-MB|%V~eRpn5stT%jx?Ish zjA>h5nP&b=oEv6RjiRr3gBMq#k;JAyCPv1hI6<>K#IV2X>+)B zR}!0n!Zv~wL)x`h+9gZzs|p@jiVnK%(_OC61xpuL8TPr=AA+f+)o77lDoCfME`LNB ztC*9Ljn+~r!Y)>>+8`lX2?TUUv0Tb9voEN?=1k*Ta9(#P)M1`t>OvB8F-cTKVf_j! z?$RM=u|)1QG8cU5&?b(f4XU6jSQEir>ge7UAcqnAcnx#JpkUXAAk;z#xF4eCA#rD<7Y)r zsDHP6r=oRYXYjqo++&E%DDm4~@-4d--9YOmYaq$V21gNS0~=(=n)p#rc8vLkLAw-* z@N{-5g=z=8#-^l;wkh)IZw7wA{LlT_LZX0PsEB(7=m5 zU}V$7KD7w96(Rx)sYOZKQt{NEyKJf?A5ws7D>0Ru2WFf6;Y@CSs5T9d;}7|+J@b8w zaw4Y}tDbBd|j7n;|1}3zt#mS`QY7H}JU%$T6X%io3x>{sKEL z5*0S6#xXm*;?&Cnu5MT3C>wC00l;DaHRIsNYdMnU2XnWQXAq=KU26<`-(M73#9{s3?2mz!k6%JiC4T`7u7?TQ!xvAVwK+`Sx2Pkl(2{lI^rzDl%D} z6Em}EnSq|Rp6=i?S3Ds3!@e|>ZgXLYMFPg?r3j|G2V@APV4L^QxM1K6QN^xQVU62P zg~F%@C#)3Q%WMQh0gj4lU22=LQoBDlN*L4w*hPwmti`LbZCL)a#|zS%Ktv55x3GZ9d{-DIo(YzYAv+i!)B#{8p+7)aF-~7l{pw zMxt%cD%|4ir!B@DSII9{CJOS9(x=mn(=rP+Joc?zAk`+?Nkip!=4RLQt2I|$CK@D;4)#)qp{p7Uxv)rIQwtstkP#iPu1vFwEWzB>8QGDNCA((F zb&wc_p?3BU^>KR(9-S;yDd91Gvx=k{d34r_Xpm~SK*yZ9-yVD@Jh4F_XY5eqg{0O< zs4PN4^D$sI`!IMIzC(cMBhsp#dAF%3`?p`beNIu4 zSBR}57NaLQK?M_0ck!_qtnJvzh2SnVBv4b2k~aI~X?r2mZU>#8f;32|s;-eArA+aj zctp&1JFAbSjTQv-}BmRc0pcJPcx!~Ch%rdJizW% zAQ<9+@l0$$f_N-hY7pwm z+ARSa`kQr?U3n0*F-8ZuLm{uD+mm+#TdpH&2D=`(@BsUCr*JvUkEgX6qzvlMPSsVtiM?5ZJA9W2(+{DC|b&KhzQ0StiSoh$N@bp_#=2%P9yGMeo_xM z;31u8Frp(2^F?04Ab*s$NY`g@L1y%$x&^>J5GgY&L)H`IDtv_)nIZIwppef@Pej`+ zWhb>{P&2G2J2TT#xWE$n%mgF%U7QfWv^EtSb)8E%>qNVsHncHajAc)p^ar<~q zIgC)828P5k3V@%u%~a_pC1%{(0NedB5DtNHg-cSP(wIB)y;E=YN;)0T>e~g69rEss zY|^56hHj7Fs=QD`e7Ry_1|mVmL-wy>8EREUQxy~)ajL+f{n|>0TS?UrL&<7-LXC)x z5T~vn{XHYA;8h`SzbUNuJ0uOUo*vT?JeV5BNq)CI%hL7Sirt5)g~}J3F8GU;kGXZvzwr^m$O3S%bQhdo|+(!EjN}rd0 z_qg*=zF}do2u;A!p?)mVPQMlKMVtR|zv61`0E+XCacbw&{Gi%292}z^Z(L1A~lBqB2t8jnZdY zVJouEQg|F{&U^?jlK;y>TIWQ#DOvdf0R_p%R|kTtu%?s?Po69lAQ{_*-A$k^EHj$` zn$C!Tkw7geq#ts^Ad4jg5I6_5{e7}6iM zFz#*)e6Nw|ByroTe1X_NeMbTYF>E8+jt@|$9n@XFv{CyW?%RT~Jrv`Xq$HiTpfWDf z#+yRX$5&>+xa}JFr?XWKVwFw07c~;2O_98sF0%ouq^v4&M~>cBb~pm;*U;18?_fBTAG123?L z|24e*O!jXTb~aoeXim@6Swq{ZqIx1&bTN?xpTI9HdI{Z1D|9!t=s7laoe#_^y4=x{ z^JE2c4w%DfK~q6CAJ7`jKHEPJ#petNL@?WuLXaIYYF0<<-})Mez>s=$_j$95*g>s| z&MC^ZjW4LXdv`cbpwQ{6BDxq8sVan>Ne=Upzi8H{$Rb7@N-L#)N;I{7G7g;=**I7P zX%D5&RkRAEpR^*EFA*p}0CrC!p!*Wxel)Q-S_w~r$|B504Zx1fPPXD5t|vVuW7WCqnYR0+}0)e&F&IMn6jz))ZCjb0ea|q>oT^*rS@G zjuL%6c`sGviU@c4WLk8Uu^ku3V#sG?$<)W4sb9T+kskf=+t;Ab{^b47Z@ICgoBcHK)q+2y|r^DhMF%IQ9Fu$V* z=ynR#n;b1J(~1%ZKy3)cg&Va}mK96W#$ENes>mYAf3Stsb_ca>>p>DfZ6!FmSAq|X z0jloxm7i;k=V(3Eyj_SrOLj0QRuMazT*O0lSjAigy2WmhX8nPl*9$F@rh*I z%6QZ13`>)WO9YMB0?uE_e?k8L-`Kq0y#F{oDjDhf7wONCzSvG2z!;>m*E8TlAoI4% zyxK>w>U&>-EVoDZ5p95k9X_}xB~zmn%GP11u}~ltMLboA%kK=e(8KW23EGIzGC0^? zR;gU(uET)k;MB&xM(cQy#Px+7+*MVuALvFyw5skdi|QWM#A=qUtYY~cA9g~L!8(M` z{WPPeM8U2($?3w_0v%}dFr<`8pOWGyEM4s6GrHmQLwhoxdOcOw`UwqPaA0g>K9I-v zaJ8jL8Wxijbg3lUoYpm zZp1Yz)TUD@VDA(_lcH0DScN>&AU%yRfg(z`l7rUlSr=$-*$%-_;X&7s5tCn@b%0Y~ z9KTDsLgjfheXb5?D7ury$gjfNznIy``yWC&!{8+X(qbOCJ*QA5=O}yI^}3iAZ`C|Q zHQTm9eoYOaofPkV^8;qvVdys=vOgY3m~69{8MuxtX<{#j41JPmCa&raOTD@5HZVXB zJFKJzguvfZ&ZCR!7nhRj;Y!!l4Cp~_0WR<}t4Pu92A})jID>wdy8zG1dcp}cJG*)6 zUCC~0Rg?2@kUex<6yrgVv0G~!q9O|u-gd9x zk(S4~@CQMA6{V0Y8D;_vOm$L91{c@XI@^>2(upiHv1^Z0kSpw}U`pE=+j>B)dUM7J zhB^>skSf?Uv+*Le?{2wS4WCJLG)q5`%Wf)BT@lR#iG~k*T`B?}u4xz@%YJ|{I0Rf} z2bcyOB8*K!t!$B)Gn^jKNV_z5Kb_t<;%%G7U%y3x^-cBUhdFL zk=oW&8tZz7rC-+rdVbb)K@qf)f^^%}0ySOB;( z56&PZ_4cld9BG?T-{hu|6|-;bM8k?vs*qH#Y4&kwo1w{gyCym?4?%sOy|^tA)4-#J zVvZdOJ6OL2w1FAHkXD@B)KH)x?@mtQZAZh=*l*Zl!%mi(^0zDP)qz5L%Vs*?3x9V? zjs6(kf0V9%6W;!0@m}wLNfoYNn%b7m|4rC>^n@cRq}G?GHgD7717~oe0|7Aoqi?(w zelNh%%R9?4X;;eeJuj)--$B`lKu;JkDe4%SO~lOiui3e44Y$es1(zpMf!NVd5QB>8 zi3vOsWR@>I(B&S-!6;Fqv#hMOE5paC{(F)cWLTHC-o}N=CDuh1sL3*{_ozgW!Zyh( zI;`oshWycjW#+YsI__CYq*AFcu^}J=hBb9<#r0C7UYS;cxg@~bB29Xtlp8@AJ+P>T z!rYEdVwCl936RVzn9sm zW|=hQkvBe%3FLu0_!KSENi62wK>@NOlwzo6KU~%iOhY)X+~7=YkgQ%2il8rA%i(Xs z4}S22zfBAKN0QaQeW}@e#nBbUjd!9t9w=vyd|BH&@#qkzn#Q2$JETN8SCv{xK$XB8nNMHrlc*bQAKj-;;dF=x`G}R7lT4Roxs&Q`}sj7=-m4$G_z)_+mnioEB z#7P0%BY>Tq@29Op4g_VKtax42yQ`-c5e}-6*EFPsEO=C#oRZga8K%=Av0tLIonKY< zDV@o%t%2tCorvUEh4z5z)Cz2y#ra)5Hx0+6+ro8d6>2DT(h6kK7B8z>+CCV>VMR(z zvAoZ|dZ9x&HcX{e{R6wJ^wq7lES}O~Hb7EgXr;0Z!)kH8WU!coN$RUdl#cgZ7 zU}#8D-vnZwc1R*7&^`o==IE8JnvpFoR64{~Y3=peJ|jih(MB;yFM1*#X!{+_{DHy0 zp&kH)tT9mFn0}EQEIzX`<9&ioPLv#Hn9ume8(QSDe9lerTZC~#9J#W)V9EfU>pHa$ z*m>Cw@uWj*YILH;uDstC-vcPP?bKPagJy$vI4pQjJ)GR}t`qu$yzcM4>gw9aUy6%r zFD%|%YlXC>YoycLq}FL22Bi;T2r7B1PQcnRNLv;17~QJ`c86k`rWZ+i=lYH$u|tCwsx)i1IN5QTY<@9 zfGUIE)~dM;=+Wso$wF>57B;&0HBCgcm+ps;Z27GIljMFSXw8b*dbP;E@caNyCK$01 zh!_KYPCD9%1i%19W02gjmIPphhu_LQXH5yPP6OkJ>KNXVV-veWv+D)i_b|=2jqa1A z3#DWn-qUTe`tM!6plpDG65FNU@A8?FuwvlJ(c*S;`)z=PHpqF?(cbzh ze}lyIY1d)S*fLO7p1`YN4|4zJQk~vvHEL9?Yp`dU2-zoXz!CreaTOc{3Ios{)Rq2h z9sGW;HN^=Jkk*n&-+Efg@~i5SX%*-t%T{N7LL(M}$MVOZtd_LGzx}7Tp9h0^sSUz+ zJg=WRHcpo<+L>v!q8;Ya#Sg_+dPB77k5c_qeNchoas3ELOJO*~x7Bkle1LYy$cm=& zTdRbvk1;DSx^grmL=DSM*ZwF+6+tT~L1~Z!=_ET(PQ4hoTRF=XlOfBh!fYKQY&MlP zoYswp^*q39j7A`+Xba5zXHVF4zQ~4Z9X{+6?cNq;mh!boRS_{JB=TiU2!j&utDQZE zHo(2-Ce?@HCB|@HYO+#LG@xl{NP4_zc5nu@6ypix%~=oyZGzb5<^nW3B{u-PGHJ1% z(Urz-fKK+x9TeQrwb=&lKyY_?o*;@4tTkBfp04K9GLuC*kc6 zm}7kM_Idg{)BNW_@%?WrGvs@6@7P0qx+iBhMvqe&ra5T_LNGV?!xCopmUm5;)AX=9QuXo5P(9 zcQu_>)C#q6G2ENg5=WV%#1sy)`D>%!O9G};RQKn^N$~Jd)Lmr+T|`%Qip|U=r)nwY zBc}`v-$sS}0J5l#0YtI{q$3y%)+NlFP-j4m5=5)kjnZrbAmia-f33CSjY6LyZjFbw z>cJP_OM@@}ob0 z`zm?dR{me)}2F{HK8Pglz<`SlZX_3`JFEv^E>7_Aup@ z_{%XP!jIXoLEqhiDL%fwmh<0r(4imScV>gMp#imDw#?t&l$~pv0n3;2hLY=}`)LOh ze#)~OW$jtY)gFPL44|`CjmszOR>w1xL(_(t8PBGX`Y)5D!88_;Z2PWXsOr!up37>M zQtcI~4-c*gC6s%3>^vxpB0sgBdI+GvNS&VcOY%ijd&IX-B^#?;Bl_Oc?LyHiZ0rVh z$ZuWtq`#rx`-FXu>&AzQnHL~lEbAI2({soXRUW`5>@b(gsO77Y^XdT~UfQ{J59=$) zB7%psSc{^Xw8>t{Pi~5>f0fIQ_KBwvy0%uH?#2f$HMlJ^sT z^zBD)-vnNyM}PG8tMK;Qv}Ja+A-od~`6O)l2~zHO5uCvms{Nzri{*eitDZf+1>GDoJQ?7ON|g=vGN$7i4B zq26G{0=)5d^cfeXHYC3J(0&=9e2O-19){mJ7+0mnZas|+J7*8hbpvmB$95+f>pGew zo!-J#?bK`DcV5lZw^kUH?d}n5KjiO2ZcIEK$DB}R4L7hlM^LX|V=w>!X1X)W+X431 zW;1axpl><^GdQBA*~6*zyp}QZh*hnUn=Za!Coz~`PHcW&G zuU2%jZ|oR@VCti*v>Q$2Wu-{@D?z7Ktz&=L9M%G?>H@B3 zSOwYDqCQhZXzq>k$|VUzI!ExHoOeZ|Ge$$cp~Db3CsJM3Ok#Zd498NkDM`87G2N%| zy0b|z!Ss;jkere)zQU&=L6>DC_=xW*&#|rD-w%hi3tmXx<&85rjl-2IZ*8I3aw3!| ziHrktDQ?rhX(fGCkDb+-3xt2H;DO3W-RBw=l69w%6S~Q)B;ZA2i3gj{G0sI#o3UjXQP#MLd>r!8B5%ymRzsxEU3 z^(tUwH|Xqeu7Z7+%?i+Go4MvIjzA=s9~|0#@Z(kmrvqX6ii0mG(=D}q<3d}q;&Ggj z+>XWV5p~wyT9+5TJDW+uj$$DcwzJ^lW1DblG<{|(T0Ytom4QcDLC=Hx*VW*PyP-ufZ z(*9cB9UK~mwSdh7!F_ucS!xoeWQQyrz=)VG@@-ceP-If;oo%!oza6p&%p9v4TwNmh z%_$>0BL+wZkoXRyLjz<%TI(2@eAsIxsXsYmyj~U5#x8K>+t5U}zNF~ZuXVgAiy?Qv ztR3)-2r4G00`@n^grl$7O?ALziORq9bT4O#iqm#k>lcXlwNf41I}7LxCnK75x;8%g z*dKOTj(Y}=%056>y(HJ9Mqho1_Y7RxFhJ9)4DO=^Jm*}A@{kID@mJEfYJ2nJ~60&7=p=5T*6YB%0ZIKJt zZIfe^I^{pA>s(r6N2Tl=m*H>2JX-+XLJ1QN9H+r3i0K>pm?gG4!_YpWWib$_9VrD; zOG>*d1laDiiN0l_yBhRDTW(KRQ-qO$7Yy;)pPq0jTNTqxiCm-u!*b7sfH7Bfm$coj zYR7Psm<|js=M4%&d%eI_T>{#1Dx<%8`-y%1;=A|ZyAPzl^^+hc17f$;2CzER@4V;~ zZy(brLsB??4%?#5Pjya2wmx;q#nam<@|iOFD;EW?r+tHPQDFB4K1@UB z+0LL$Q>zyT^hqEWjzKh@k}YMh%Ivhbw~-=8@=2yBecRC&whr1268u-Tc5Xlnaa&@| zU)nB^;m=&1lp&ccZR-U^w^)x%?>AK&2sa(;;mbIb?*tlGP{DAb~7_J5> z2Xit(S)rE&^GyirCfj9OvuE9+QvTJZomQ9qf=!x9B#x3D$Lm70IcTzl^-D^OzFq2b zU!l;NnXd*c=>}32d)trjMsuSI(J2VC19pxQ7* z*{c3Ld_Uj*F1-Ib-+lf5WBdAPunTKKee(W?w;zT7kZ%47{sEs|;CiFhH{>R6?(6|F ziNPDeiJBPrc?tvkABIB`cxCZHl{@VR5W22DDv;yg2p(cpy}9GJ$}UmT_&1Bdi73oa z(`SSB28XeeQm3o>GD6biZv8Q24)Vrdb7aRM0}f^Sq-1;6Wi5+)V)}Ehz5KYvoYmh@ zh{$(LUQAVUq!xB(v6wSO*db(Hx>mMpSjVa8IKgVL^n7nL6Ha8DKk2q3K?hB9DFQCF za;2vEQdQTpQxJGTEYVbfeYkGe|grh*SC9TA) ztSGf$mPJ%MWaVh4GNK(Fj!{Y#Th<*4qmAHNwrG@#@Rp1!o)8&7p{wQifRLhwTdRj% z+w2jxv<&2(17|CGe`9YsKz<31qTluv(bJ}Ei$z6KlA2KY>K93ltT7{R2vQ*q?8ZZ< zaL{~a)-E}xtZFE7E*Awu5!{#6Lcs}KX*i!ax6X!u&1^x@z$6~>q)^RT!n{p#zRf_U zI_d}H+iF(K5+aN=l|MMI8JLTynYqe@@QV+ord9SXg9x1vO9d9J|a}1{>B3jN!f`v*q0c2n>Z;6j2 zAW~GY@>T$`9HELOEl+;rGZR7=I4IP`2SPs?xhvtc6 zgC(!woNUbXTa?4@@cML4PZb)L2JfXaEVK1A%|3L|JtjgdpYG(M^Mn3?E5O33Fm@fR zl;8n~j&YtSyFI#I!jMGl*|1eVaZ*JkPt(z)seH&k9@*AI z`y6_JioPApr>9k9el z*PI#^Doj&nu^5QyAveFXKW+LWPOp-EK8Q zOuKLL1wD>u7TCK@^&oMtSD)pI9Z7j&)!yGDhdCXUT2;0dQr7fH+RVlB(k5$bO`)`b z1FZybj3k4?;{d(Y@EFG+n>f`2x*{a|$Y;>>E@q0{&OWB5B`A(+?{E)v|~kBOD` z_2s3*fI0<&XDi9o<}y>5va1BTjiMfb%WenP|FSESu}aol*;adtPdP0=_lc0 zJRHOJOWlHclxM@L-FNH4EKvd3=>{gcR;0#Y-YApgH1-!Imx5Pi$QZ!{^qG*0yT-(* zzh$Ek`54u9^4ur_3E>$BPKHo5*_xMfw6#8ZXt!dm1L}q|i%9}_+yHbBNlqE+F9(Nkp^o@g60K(uPmf7=p+=?TF*$7rJrq>uI-mgy;r z_Yu7VqjfA90(xw_{LZZHk_(WLm@8P~9HjP(vTD~lvn@u@0-wm7rzver~+fYCua&SDj+G>{@kptu&R7*VzEap@Sgj z_gw3UwN*|&{kY;dwr_@eO0en|opGS8CYL>y^N_+#t^LbOYTj}(1WfQr86E>*Iac6* z3-ypHIwD#=WO;FWhMQu>4N`&Bx9HaE6eWG9S8}L0)X+qQ?JDaDp{ zu#T^&wTFUYRPqQ?=;Ur(uZ`5NrXdA3Q4{@!;TG6c^urx}4J${9riQ4L17@HIRfK?@ z4}8`-`*+u+x?I?FOeIj{-|sKWLq#7f_1fV|lrH5L`FvLg4B4*wP+xR(|WaIDxF zH(jBjAO{hJ3C^P!Z2`^^(uJMLG~j7ud?6B9s3=#E**7AKC}}h z9=sg5O;G-d8_J}jxODM)RRo-*tSS1UuJ+?hsuPvYaU)A$R;}-=q|&uqAYh#~_G3D` zu}fwDG$H83tu_}w)YJxZkoN%fkYie52ukF7q3{vQWDA7m@-9`wv0fz$gI9QZ;Rj$kwlv|l zmjbnEy%8L){NhZ6Zl>y*MPN4&wTasU1Bv2L5$Y1MVDE8sCmZBxN|;Z1T2E7^Sr$B0 zMO{xrNk6-_j8V%>3r+k&*H1bfj=O|zvLfIbW%~skYwnQOS7`hJrMC{Us%r@nsw9@q zMW|ES328+aw38?r^-3vhDSdHr%fI{J0}C_8Q9kxv3K+%dE(hwA5lx1u4g=LrxhSz* z?U08QWOg{oerG4DfW$H-){3qIG}67nz9;{M?|qMD%{MG-z9Gc*8$w)($$S5Ec>gSI z9&}{Ng|N~m3@Ry7BQcBSC)&HGM2$*W_UIl|>g-NXo}42STfL4{(L@pOquz#4df1;F za1uPJ=EMR@cqdapFmVa`hRZItVB8pTmR7|AU|rmzyI|N<(4#Iuli0G~vgHi;Zw=e4 zi*kQRx0C&ib9eM2zB#F>-gj42yUU7_rQddN4l=+gz$3=UxudkQsYNBl)-5cQcv@AS zW0-O`NL40ziJb9j*OGlL!=)vRqS4MYTBZj3xpGoaB?)&a(IEwp(pF!qJy_XJEWmA` zP-9VWAGP9Ay-;r1wia0JJAU^nfZsx?D1s0a)8fq27jd z_yoEDNpJr(5CXe9mv=iB?{aL<1Qty_?QpCF8gg;JWCAzKI-Ew+l}j`v)nJX9VxG{-7VB#3F?fi)HHC;nK>m-v4Z4`e`0L*!IZjFam=X`~J zz=~!NuWO&|xsEg>Q_(uIRgY<`nb1c|!)}3)txi6n1O}{kd+)mnz?HOQ(JzzjdYzev z)}>Z?276Y?WZJADG&hqrgQO5nYreuj-vRF_OlS8PccaF9*==AF+?Dnef%`xOqF6{I zi>BVK;d=>HmgC5ifO6%dOXX=5$r4uwGYX)?zSg4kkVG($Go|%SYK^Iy|I^!-bkTc_ z!PUm^s{KDeza@I>1vJqHBd$=l-HMA^{oqQNCZT&9O9-{h9aN=czw6X?cMO{R^^+3_ z&^>MD?JL0ggv*(CWrNW1E_4s_#-z03!0BUqc%T}#^gcB9u1pf2OwJ$5mc40807L_< zp&G8RAYZj9?CTfCKP=oZyPABCKv~O}H^1bPcZiVR<*0vN?%QaS$9rGTACYNQav7Rh z=JALb;aEwMEpHyM6}92PZ{bFwjjR}&$v0zC7*g^6cmc;!7o1#GP4c0_`>Eq^QE5*V1-7Fb|9<-p%UT}5d^uMpC7srKDzoonhxH;gruP8NXIbtxhA z=C(0v2*3HILER(tG~7<0bP*Ef*j4t#&xNAhS5nHhM<_FbE^kO1cgQDjN#e%o9s+do=QiB^NGt{)`uZXGhixXar}9S3+E`iUkXuGk!3! z&7?FHyanhqJ`r{3axDd1~2tyykw?F*L4?Qe2>`TirR>g{^*a!55=!^!EI7rr66u}Lr`@PU^ zKi?G{me(kO(rsLr+}we1vQtjd6E-O^LMg!&MO9=W0$g1Oek%S1?7N-;B(xoS(Jq95 z+4y#W_zEx~m$s8EFj58=&{3&qc8O~8Ijqr8iH(kFQ#3)gGbrhS=Vkpe!f7`3LL3+$Wt&>Ii2Jj)1Imu9fRV#$Qad8(De@n*e>uS z-76`Z5$Dxw#lb4@-5p8g(~-MZIbZ`n$6E zTTvxq+205M!d*XgMyqTB;_NI1gc=E{~+3m$irGK&ffI`4DklO)uv0+>+o zftsA_Ks1Z;@~MozK$?MiCRa3E_}*M=e**B9P3$)yd0%rSJq*Z>Q>z%5AI|?Ik(Mys zvDuSKlIUo^%EiD7>u1-PhOdTm#L7s#avA`C#dwP zIaEk|UPr^WXNm4~(sYv>JmH+j;C$K_Ck!#vWe$%;B2sKm?fc` zewX+7l`S=N*XG!xyKqMvA<79ebj{+-fp%9ZM$9=CAWnW<3luFL?>2LLCtbFU-iDV$ zSPogG=ncfxaZhNG1-=6+XWP^DtqSqp zdZt$dX0@AZYemLPe)8?Jx6hs02Qb3>&w&hnKhKY(nEbs27q|ew{}y)=Xui69`;W+x|KaURx%l$( z3M@%^xB3CfbO1s!_XPx}ll(vd3|BbX=rs%|wkh*RSV4MD3?r+Iet zD}Yq{#wNP_PyI#NhAHLaAORQYE1NcOF=ABe1IynPKt<*P+WAB9#1)(a8KKm{&tk|V zS=v0I)NQEbx4?lz+p)5=?U1gkr7H?qM}SEHyr{A;+2L&}A&fR+0#~|L;h=v(D*f4Z zbj)O_KEn0Vw$Z&??&|r8%?m^eHG-5jo-XD0S}$CR)q8!pNfDP33PqI72aSQW54+v1 z9hx?iZqj~t1 z_B{BP3|GZ$kK?65p>LGmE!4%?Hfs;`6b%mnBU{jd{N3B1{@3tVf5Tn%dHBnJ)$2ng zU^dtHd8&uiViV~nW|YtZN71h8~`IbFHZ2|2$X~;oJ~6Q(zUWpZL{p5EH792bsxh6t`J1LtG=ST z$Xq+9cW*XJPfohtNta-G#C}s*!v))=iU!=SfVRC#J&Q?`iuY#iUZ5y?I(=7hd3ITt zPHOuVIZ|rxEJW)w^N~IA&PIL93$9 z&7&QLBytcnJAs4y9Fmc6+Dy+7tIFlAA%W0z`QTY5Z~PB=IJ559C-5;HIaOP8cDQ2c zD$$o2uS8q2*)ds;5Y8$2K<~DyP)qfbs?>s^(fJc_1#`sJEXN=D?T1dUux=wy9yAM1 z8Rb$p3H3yL{=E0{dLj6(FfHq1!ZCQg6BwlyH<8qWEJiq@R>(3XgKXO%HJ#lo%*luD zG`AmW#L&n(X;6(B3Li!E1lggL*Z7#0ns*qg0wo03LfBys_p~uj9`}8x#!F~_B|{XW zYV~k|rWsM&x@SrR`nY2=Wz|Ga;!c=ED9Q$G@2z_#BC%sN>9AO8nB;GA_uwDn)Jq7=BQtR9+@O$bVLqF@xHD* ztiiekX2!c`z*4kO-$m+G$+af!v()g3m0%((dB{eOnvoDd6(L1gqSXsQF^&h35K*|Z z)Md-cUpu{s2E?i#C))i4T!GX$B|lkJz6bLfvSN_{_G!=B)i9vfkO&}B+u_YM zlq(W0(H?Qo%X;ssj7sWyJWCe_dju-rtq_pxN|iv)ohk$MP`pBdaXs&ayjP|Hf@BiM zE~h9U1G7Sv?rlP@yiz&Y9lC?v(JbT|icK|IkrB zXInYPiGec!Er!pDEe(}|qIbel1|@+hI%v<;_aJZG71%a;dM%CyYMnuoml=8wx2f1y zS&*$yLQ~e6uN%dJsf*QT09BOTc)4TrZG}}UhmCyiE3V%3!E_@sHfqy!5=QJyC?yxA zb4mWpCD|Qy1ZM#po=OuHk*?wBljYT=mih|4@x|wJ)f|qg@#2LPGaC3BfC3TXL@tVp zvJD}{weg_=x?BXIs=Z?mh9PBE(D5zn5{0_O^RV`*n^CqHNpl>eBQ$7`=b8ud&?e`*hSm z(mq}M^Vt!!p*cG>i1wwJO#XnNyF20<(@QN|;K9TyX!|H4PY~=W=nMpzyCN^96~arI z&m0jvWleRLWtRhRCX=n%jW4R+DVYp817t=K7IaQO@*SSl(TQAtdDYibKQ?*vSVH#y za`rB}vK&{I;5@##(T1x0R zsztbsyXZ4)d_J%%z*0^RO_%fbT0+0Ny*+^b4~U3z!WG=v0eW_hLzSQ53T=FGuX;+xzVJBkoJHrn9a;@&;R`O;KJw>lL5=73lyNjE2qG4@v> zwh}6j-1-oG4sP5Np%?@?S4dZKdmn_Aub?!5{AfMQAN}Y@;UCOg<-f7*_)Pt-vigwH z&^DvgEfki$H|qUTAriv#mdFBiL!Ye6az~; z+3GGxO)^8117y|qICXnQa0lU?mtVQt2*%airgfNrgiXr2rR$?4E7tpOT6qqW<5Q3j zxH}OtGLoU>@p3MwSUIT=(I1JBJwD4RXoJ9;`l}n*D)j74U6T^-8hJo!#sxB=?po zUYqxTs?SKiU~N*_PVd&n2O07*GX$wv37sA7X#i#j=j`b=+$CSJmcHC(b3xLRJsdn= zfCcCqwKXyLS18VkGPpxX;J#(6@28a7RPS*a5fpN`&3z#EXav?>uX^wn*8p~yQaral9 z0mizLXaQvzM8Yam>=de{la1AGVMq95bmtNt@VocJOy&0NU$ie|mzUkINY$cqz0=Te z5Fo~e^EHE-O1!?uN~c{gmcqx{PW}%0*$3eIDRW8glCK#Q2^&!vw~?je4FsI0T~^AJ zytRNvtj=+zMsh@pDW5h_vB|MSo$e?)fRm%dBx-@c{>&%_gVH4xr*bHuu-&UW${;)S zsI;NlGzYWNuuzsmp4d6kjJrM!Ht;nx;EKDX zBWS`leN^?$JhKO1__k_>7h;At_!7o2=y!PmXUpub2zL5#fA>o|YX9c-yF5P1z`fLDX|#$@l=;MH%4B5?z;PSy|`+dE2d1RAP6z?%D1Pr{kJW0}hH$ZIIbg zE76)IHVHDe!~ny4o)ck-HOd3JnIF(Qz#(aIGv;oW&v@~|%vI19n}(K669X+7xE69r z*7F7zKy_x+7O+M()>QQw#V&@XphyJM#!@ySduFj~4q_jj@+NFycG)7Em5>}#mqt=3 zh$yq4lW9YJcGs3e(7NTabf$8xoCDh)C8%!k8AyOtt1pJC>#)m~$>Dv%`Qt)ZP?Z`b z3L%_>43RfRa*s|acrqNUVE};oi0p|Ax@Kr=XAKC}M-UdYTbxu19LJjEkfUPmDP2>m z)S~SQbt!IeL8|tYUgVbqrOl3V*?ULS^%(;b`1)cPZ597rTVR`SEAUEN@G&hR0{@R) z)Bj1`v7dz3pXRF{L*)Bk-+rbFsccl&;roBVTha5uRfW^?Wp|zwa@!5}9W}dvu?)Iq zay9Q7X>D_GDH=`KYkp*hIol0@>NMp*$p~m&8pdwYSWn8`IOrd~8-(VgWw=4UWZ1~s z8b&DUhv$Lbh~`0QL!{xdJEltpYt1sL{4a*C1W6d8Tm|5+T`HTkL({N}EdATCd+R#h z$bfgJ_Ryeil^HNvMb~Dlz1mJesZb<(I^G=J=Bi$H>f9{>CoC1`!a3^=oj?%B>sW2n zg&LiEazh6Oe<-y5bV^^k-YP~jdHo~215Hsy9iT`-=_jUsQa&IRiPsr1IK(Rn4YSS=!E>uADRu1$VCH{)0hXW}xB4Z5IIMbYJgf=J! zPg3;1J9GEIXeV*+l-oh1MIBk7ts&)D!Oeta>U1abxm$*48JZj`)I656ZiL3!?z2m{e7CB9AmLme;m=Y2!|imr~oGFQj%Ka&9TF?{SlfBo?LU&?>~ zz%cZOx1Z<0^jm$AKmVaU!ewGs`+&PVZR@*XXDCevRMJDK^BjKK235^IRxMrDV;Hpd zX9F2%JeN9dl~3hVG|8$Yr^SbcBUy}|_~{u2b>Y4abVYr@-gdDF2Ul^4ZfB<$?tTb% z0LV>$!QQv%CWrh@>JyI9h9}}iQ?PwEL|1n1A9R`O(J9JTuzkj)sg_NyY6g$Mj9k+bWRRC#`i?xeksZ~Qp89f)E#xcZ`VXM_5y zk_q#uS4nlOh5>rEUIGkV8qXqX=<3)pfTktFD*pKdjpmRT?pl{Ws3gZGM&gFwrCe>P zUvL~VSy6d@?_Pm-1&SIV`3eh>oZ%*^kjW4ZN`vz*0NfDTM$wDIZdQtzcry<=ph%9| zsBjG#**1{J^t8QPx$x*YEe}|Vb4z0-Lzy9&< z!~ee@!~f_X_V51t@cP02>Z`X8_%ZzO4aYxyeN=IV9jT3;)u!8vC&1rwa)v`oN(`IZ zERZj_Ko`qFknl~$ zSnSA)ZC1H*ITeZ<^IHiH@@bff+c#4e_^jG&GA;eEu^->pK%3v0vU-D1?uq2ThC1tc zC_~1PLtcm(p1Pq1;GNhEB!a&6C0bV%+xhJd&1&Iq1VwHiAa#gPJ4)jww{P9eYasg+ zH|DK3;93n%m|oDN>WLeMh^jUAFk^x`aY3p~5$Z*D;XSapQb9-$g$X8k5Tnpe3>z^j zB#OQ)BX|iB0LIcMyUu{Er)uw?6*#GOk$Tm}Vw(-*E)ZhR2dnwKF=w~wvdAx8VtXC`%c2%$Kmzc)A#@K`Wx#AZBaFkW>YwL2?h{( zG~my~12gKrceB<&7}AnuZmp@_(92HJO;c3v&)#mBsHiiqD#)T5`17)Ah0qQ@V7)bR zsL0kR<<@9Q)k@4H5)bMQ)o@36yEXd+QO(E{kYdTH1RzK3jB=Xg3yDGmGod@4)$4}J zZHz`GJP$&Y z4dF^9#Z;qOvRzVOsdLB3qi|KOwQ!K%pv@KE9rE{BcMZP7ayZ-$V-Km`V7+8#MCQdy zNU(^OP)h9*&vi=tI*CWKBq?TQ21tWi{gvJek7~o9q7Nm7@;dgw)TV~|EvWKl4n-x; zh{*YNFy9M04Ef7aqhrb?Stu`G*h~k8-oa858s8H=Mc(QoEqP#yC7!VF;2(|%2ytQR zyP&~vRy*k&)YJ*PP1^qhelov1K$wFZ5+JG2#w?AnIZCAnR*AllYr85;?F2x**ls<- zqDeNYaB%O_Ow~Mc!9}?Ng?;5&>azTM!654Y0lMKg;q`OboMmzp@I&s!7)KTVF$B`2 z0M&^(XEhMnm;D6GY&ftRWuQk8xpgE4ai9tHHt&_!80nNlwda}ueYhz>@t$Tv4p`G* zxl_iz0!_JkiG>Wa(Y-HUYh9J0-RwsLLr?FFq&zVTNx)J+ zO3teM&9D0@03nIeS1Jl-boS^->)2aGoIyW-r$|(T#2Y6GRBTc~q1((Z`Bn~h_-za`Wlm9BN)cK2bD`o_&8!9H z;4R-mtrv01XoVS?`=M=FIUZ0#$$7XPX8T2Qw`QP!D)q~CU@dCZBmChEJJ-oeB%tj* zABAZQ0Co~bO&0MSF)~H|%S2V3@sfVrZ5Lx(td8qKb1@J?5LMeuFaKjO39{eo%kO^< z3G6J$m$Ss&Ri3?ZhH-baB@P3-J5@^7>Qm zd!{1Ll(7xo_>`-G{VxSQy8%j?h63mp^ib%sO^7}DZX2LXC3ikY#^ta$`lY4zoF8RTQi~j*f|sy|Wi$c~#@e z{d3Ffu$o|P-j2Da`Z4v6Kl68AKXgY$7>54x?T_K@J9K@1{rYox_0ikMk{*8wnWwi; zmrJQ2e|vgJU9rvsq4zDwu^Y;~4rO6#2_S~h>YTh&3|)*I z&eqDtL~E$))3PQ+tze|Oym<$RqA}R2!O@O}o$*Kug>5BnN4bl#?=T+C`*47?I3MCv zH%}L3mjtDkqd~G7WXbeSfQ13fh8rS7`!HJMEC3WDNK{gnqu^e950m+dCL~%8(!ITx ztYJ>jB@&VE$v_&q1#lk7>d!njj{TntCzBYF>y5U1Y^ZF`v8Gnaif|Xt= zTuo!OoDE-BA~9$GgzH%z7A40pQ3=!{DOLoect@{f4*h!I6xXr6D1g29{y%K^2*izj z282?(3*$Ux+yJT?_)(5_j_HBm;DW9ovM#kvb6n1Dw)3mJ+Jc=yz(s&SPK^KxMY-B?3qfN@}h+GI8P>z!Pt)a$gQO!>dM1H(;m-gL$RTiK&b>>=k{ zts@!8Nsd5Ok>oPV@B%&rbIJ z*Mk`##{W!;JCv_b`aURo$e*UQhx;DMPmfwlv6=s#E85LXS(-W!pIZ_rmg6pgd;>a^IE;uj^*8>lp zKwcBk-1B--PeY`0VD2C%O5bK|Y{_yFx=T<)ook7!lF3M}ax(w}z^4&t zg}ZE!y&*iSqlAyj=IDkD>Qb1+3C5LLF;Hb1EgMJk20SY^&O>E%iB;|u+&JDajP)joz}g$|1Bz;_))c{(V&?7J*N zQiEULLepEDPxewC+9I_Ql{aH`h1wk&0@ZgwY9sdC#_*{9H}LKQUXgfLAD#PuD_mr&d3bF|&3 zNwVxbN5`KvPkT7g0lDbZP}lVnI`e#-rCom)@`sG1_yCit@cL8mpgsZN_80R1Z%*I; zm@<`*Bu|jTW#n)YwJr|BbKd2mP$Lu(BdJ3Ru>5Bp_W%bqE&vPA1xk8ay<%$>s@~xb zdhRG|wokAmk{V3CQ3cak;-k9)DyPy3vv*aG%P-;$*{)tgxdj9?w*rvumWPW+^%j+m z*>mf$3B>0P<2cM&Psz5Js^3$1HFVZ~OJ!gMD?e{h%Lyox%}FAtQNPf6ddOY?V~8U5 z{XML$TB4UpepjPTHKnq|^J?D4?2_x9#d>u?9?6W(+IY40rS{w8V3qYtR4G(ZFyBEr zphe@mm7}B?je%W`yi{)`YfxjR*EZOakAX2u@+2OHa_Rgw5F-KR--JK@OtKxGPx$H`Y6$orMhCE}G`um0 zfHASF9x_3cc9N2h>p0@>jPoY-EC)83IM06u>};YspiUdOJZ*wx)c7yoezm{*+t;r- zaQY&@Dpv^q{q-*x8h`kna^<>Y{nw6JW;T9h>aZ#X!!3)zKen>IM$@g@@vAk+ z2ulW|!kont8s)SVzOhi^cP?o?XF`c0^e72?+xCtU)CBuNA{c(dS)m+xpE*xTGdBzh zHJWu^!Y{x`552>iRx}ojVHC5hQhpK6?FqhghEWG^mwgq8yS6~=0im;aI;LFllI5L* zq^pWTVep&0Y7gaLGD!x(zgVL_@Jrge4| z*X-yQ23fII%H#zseX3)JA6{bVc~ z)vUB#*;LK$qF2W02CZ3FovAaIoHixrtO$S6>9p;jwQbSBJJ{C4H98R*)%aLk0(~fb z+yoGf6)MnjcA<$-vzm-jH>wMkA5fGee_xvX@Wu~6=CAtv?VGpX8U{nvmS4YAiJI46 zpEhK@&wVdRQDqQ|+GYTc^Z+KF)|2v}RXg3#PFWFomsV9lo6avU>JsqSN95RCI_Nyj z_dzmzYAfFw^(>%TA&4DXnAhvF`|ZX_DYv^Cz#PMEmQXf1^W7E~HvF{fLF_EyDIT1N zMtI1X1>@=!T?er^%WBm^ps%PD(^}&PI&vyn3n^#2==v~nSn9xR zp$3*L-)gWnRW^UO%Nyj7Bm+3z;4@4$n5Nt<=p|pU7I{M&hFrxb`1c*5D*Jw@*V*wS zIecq2aJt}#K$}YrA?tEOA#I?Pp<0!l(ppHp#7RQ_CkY+-7cZu!YcQ{dC1vA;)KH776Hpi4lzR|eD{Nh^Ru@PBsRIm|2N?+Q(eFRX^_-#L)0{<3a%_r?AoU3!K0(z>|g2v6Y<49>^wcB}gsB zEh|jSfTQjT6YP+ng-pYlaAS!i@p#j!2mpD%7dy|jeySn*rMDPnv-899bMQcbuHRPTQ3%O z8ucQx?^|{a^1F@kMUf1){M`{r>gb0;!|bR7LE9tV8NL2z@;!ha(d=^jhAoqXV4f}E zi;k@Zdoz}FA(I{7TW?Q-!FL(7@JAx@Brb%vZy`|&{B>S6kLD#R#&NVT-;$EzibD!GIkqsl=ng(h!3%{oBt zaZIj9+ec4Nb*gIXQwg6^pI%7l>jP6MIdMYGkw`&(QY~n_VnbXEP*Lm)min-MJxO7V z-j~yK+NfAf+VDc1ie+`T%PgoLv-h%K%Q3}@%`6N~25_?50rSQZPOb`*QH29rM=%;< zH@r+2jEtNm4)H(A9Gh{(xO;q&*Em$!K`R0h{gBW}>E5CLdroneD1jCM zlbWoQ<>Lqtch1Ohl;m@kLeQIFlMZ%f9K2k!7gTQfy3Jaxch@Edq)ZN7k8rb^BikkY z<)COFTdUoH=D|^}a;FwL`{?x`x+8Nm@I{=tR58@UP>!UT86-;n~u--&?Dv&{Er{l#M z9(Ypy`1lh=gh6u#IdYPcp+RPi%jr5m4VYrM*GTP1s7(&`EoBiS9t{>KI&d^j@WokO z{vPAQxruuRdcl^hs!c^&(N$E6MS4lfm^S^^QlSt`Zs4;3GeFG0nx0fwkg5UwEwqW) z(=SzobFO6{+uKzU0m?8wV9!8w+7FZ+70sDZLD8}($L0~1IVd2Bety~aHDBWt z^~ubjDWP)So$`(oHDWV%T7nW0-Wu_vag6xw2g)N6>in~}1|Tkmyw0NjO)|ExfzQf| z0ABGc^R~y13kN==IW_W~=xfw5)2QJz+w>n6h#i$OQWeDIKH+Idlx_~bWVTuMnYM!*(v8;|8kHgKp#6?Aa>QM zxjk<(0<;k}Zeb-kw!n5g{nI~%e>iN$*FSJGIw|AB@Ynwg%uKZ#!#`4T?!ZG!HB0;2 zy?n-fs%cbTvQ-e`m}e&$d05LHgueiOl<6q_ zi+RiF`xLr%)~be%R<#d5lZk;~ab9v|b6`5$jDsZKTw;PVbI-%BYYizMTX{n!O6C{x ztHV`JAxx)paJ@KyWBF@Iu67`B{OCvjhCh&(o0{XjuZ_AP*yiu}5^8T#KcMpg=cvs( z>>#WTXhJ^lFw4|Xld z3~+JO+M1qukXgCOdm0zByO%enB$}-X<;puiDf6wn6Uzz!Jm1)G z_?FQ@1?komQUO~$vS3Qh3-e;cObd#T)$c>Z}dDJFzZPg84QU z&@^|AuX%%+O3u{pY6DoI2j7OVg>Ypl$5@1f81>2hCS(e6|dxZB+6Lls%iNJ6f#5JkqkwGYkpX z2$R3_Fn0tVb8d-&rkg+ha$pY(E{Wb34 zY5?O)xSy6eyxbXYWT$VkPsd1}IFv6X=p;OHHyOh0YE8o>sCTHHxe|foFwXn}Zr+H2 z6EtyTJ&QMkN1{%UvY>BXg5c=m# z+PYItvdwK;I||LErU?ozKU}ZDP zY>k8sFc=!VK*)`c3OcKKx2~w+9$NUtxWjYsLFXnbtXKVCC-g|&wYMU&S+f-> z5@4{mllg|)C70tl^-n#Eo~rUNH(j@@plAh{RZkQgbwc0L{XnB?tJua4?61L@HStsa zefZx!I=_Ar-u{ej`rYfNYoSs*DtkVuA86kQMGp<3hYBf7c1h z)pjYngzyu|e#}RPGM57+LfBIPP=2;jSLK(bNbK&E+d@lik*Cu^JXo>}$OfY>S<*=n zz-n}Wq*8vGA#?yY%vVXlDg^EvK$f!LD>njdm0jj&kK6Xpv;W|W45i|py3UB0u{(2b zEudK2ZONfeoCzgTs8ci;~9cFy6CP zeNuIT9RXQjnxT$fZf%GriD@SlgDQpuuURtsO-l&ad4_nQz{Cp8zlOX|uzb#&n$mho zjt;_;t-XVyI}piU;RPa#p${PeEZ!O?$%2q42b9gB`)&2Ayn<_n7R1L7M$nkUx+8(sMvfhvryS}UZ_V7qtn#(|z^a5Mz z2PL=~D97zEQ%Q->wpC{Jom%oU!ZO1d8yqu)DS^&^F0i z3(#q9O~HJMRlPdu55~v~g}0z^;q0$bT?=eGtBE6~=sAMIhZcGdNA-$sgOHQ$+<8{k zys3Bq#;P8qG*VN<%z};|{t64Fia%x$UEx<@oCI0-u%qlH|KRut_G;6EyeVK9JQB7V zKZsfFZ`)ZaHd%aR%|Xy6V2sC6CqNHuqe!gnp^pTGV5J1QhOyc^R`!A$`nro@YkLL! z#Wt?qVi~;AxZ3GoCv7D$y{#4B?_CxywoJm6d~TC;S0Xt~vzaJ^dV6lv2WKKIP#FsD z{D@_;oRZQ8t^7`5C6_|}Ng^_>e$egr`JUW|4Q+oL-xr(u+vaO+CRA}(qv&Tv%MhZA z47_1w49TTE%!B{MK{E8Y9n+O@7Z1!2;E!UB|6y%C!b$kw{i-$M%gyi{UgiDl_)zYP zUH8jA4$VotjsA42xdP2gqt+@G?_ulk_Pg-*-SGtZj()1|i&Fgczwl%J*N@N zrm#7l0@+AfE@~BDC))N2t0#%Z`A~l+VUm~&JW_XOZ8y1Fmbo9GfrQm|IQnO1)#;(1 zEcvvK-WIp?$U94$^(~#~Zm8!0=R@Dbe12E;la~5aqEE}!eg(0J+OId#V;aRJD{u@z zM#f?|s9xmPuv1qRAuStjDi{GR1dyu(>ds2aP*tQE++z)ZhPE%Uy$%{gm)1NpFKPhX z$;UQO_w)i6Os%o=o&s!yqOh~tTKc>@BN!?jiGha{lv`&T13aUo{ZP!(oWD_SyR+X} z;vXRy&{RdxXVB~@fF4^|tWuH*V|f~$I{x5?f-6Rj`~3A22&sJj_6tJ#Fth$V53oPy zTK_7%W{to{LothomdAE^b7eEhB5VufU^qc~MndMQ-iJg#%kwt$Z# zYQnKh%nX#;G#r&4W>qMTW1k513nr~UH!W=F;#rEI86t~pV9kYF8iN#4;_PK z%N5kKlfT~`*VzELA5;=0FjDRR9@HLnf!j}<)fF{PvOO<8QiHg@d`{PBTIxuGF1f`~ zr;F58nJ}Um;^Z(ZWd(Y53RE|uo{rVwerQlAh&hcE#;sxgQ}QNhv*5utX(dNvto@Nx z>s7vo?W;+v+oer_04|dr7L|i||H5D~# z)CA#yWwl)cy`;IAl7|;Lk*J;o?Q0Im&wxNdDnj-gyx;As(fgnVr&E<7A*)!EU=t?f zc1UO~*RA?30^Jtxk=7~^fj@PSL}S}S)zBYG=Cl2BPwfD6Cl+P*h-$@-XvtwZ`MJZU z=&0qCsg0129l8Vk8c<|Fg$8#ChTw~wbT>+yX{&qQLdR@&J@^95&5KJM)pEuUEJJ&s zc$*moDWvF$R0ntceTw?nObzwSFkD+(Ekg^k5QD1j6wF$|Qkw6x64VGQyeRC;kRH7< zVId?jK;614G|aeBJ%&H@l^RsC%;2!YEnwvLaQij*k;<3=1~0dKMQpyZ9k1o1l)}shr#3 zY(kih0dtb47zJ9Btl`$Mdj-f*HjGl7x?lIm+UE=y8I%0;x<|Fl`qu8WDvir0fvsw> zXNtSAp8CT$(5j$!Dn<+IDWb^>!l2nkmK?MtS+*B-AEhD=L_8-*o0>ns9ablnHcAe; z66f04h+Co@9kR0u3WpE)%UMqK>g1aMxj-o9!c_FAw-upE)Vtbicv5g5_GSDTF#TlZ z+PTeew}y4iM!9)CK)4qjZdMoSD-b)_O~AmtC%zi-vbQCFi;}7lv2=wPwXKvZDkyd) zHaWj~6=BU@-BMW^52?%j`(tw)-cVb(>c{BPZ?#&h*n|!6^?}&QdY9Qk0cxBFlg{&F z_kzDx{@x21#E-_NJ(5Wc>i2A`quiy@;77FUY(vh@`r7~o&U-jNuZpn@Pm1;cO5`O2 za9i9Q22xd{O;2p@O%{)pj7q+*ZES0?e?WBg=da&}w+~KFuSqv}KiQ-$DQ&PvUu5Qi zEyr<;Jog{9DhXTGeh*b%jmo?`ig2Us^CWXo7acz(bvo|iYx9a3_zp4!c7oi~8Mc>k zH^bHGzbz>Yb%~goz!PhEC{GAegxw{HZ3hh41SqKW_vEf`SQB<|u5#dR9dOx!Mf8X^ z`VuK@59SycHN#S0R;oxw%`NbG3aq|q^FrH2b>`+Sg(}SlGrJEHoMO8u2V+p z-YJe-N=5nRgL?s9WJ&d>C^2gclCjz1hlOr40ed@xy!0NE@Au*L*GHS$Lzgc%`GWF} zzR2vO{5c=IefRbWXYHW)z5VvIL4aeT!3=OQh6jB}{b+qob)63Mo|2q*WbBe>FGm#B zxh+Qifxk;F!k8OiogVO&K+>etN zIe;pi#s*3^5Q-k5YGxC2Vt`GSAzuR|Y|4`INU>X~{G41~Qj!KBl3n(E4p+sNgo;CR z(6G_Pwk{ux;9P_m6YoX|y6902Eh-TgEz*bdOe6C=-yQR_Ef(D|iWe7%JmQP<)BX`QGm3FDll3O4WFyJ%)G-k);mk#J zJYa~hiL4`7mGW#T)qimaZ$`UIC@!el(2bKCLZjg}pmCYEQSQ31k5k4D-|^x`9!KF` z#Jsh4+cjXv)HTtII3nIU`~Hj^ZU-^$ed-uEGCc#A!jl_&YCwMg=ziENO`8)q zM6?L zCYdt+QVca$&z=>{L~8u7wn(27w6lOJppX_?uNDZCt>_ul139N$Slw@{I&-SPKz<2+ zs07a!DsdHne*5o^3EKz;=|n5UwW@&iw}>_kQrrPw=$Ww;^77wX+M8!%Y`Y8;H?&x0 zQIXmTpoqo4&3)bbK`CWB&bp5o3e~Jg=^qW@dK$a8ZFfkbGMO zm~#4XX?pw?Ht?3M4BVUK0gf(A@6>%+?qHd+^-CMGOk_u6W6Ln8uu7_uGa;aEQ?fU#TnT$enBK3Ci((2fRGyz3y2PH zCcvKVfDl9#ST)0GDxFL(F@8AdEnYmnsDSI8E;i_=t=5hh6vq*UhsiSZ68UXa*1@nh zUDkgk6sJRWc8TkY#fDBw%7LAEXt1LF@q*E@7Z0~a4oL-Xw9R5uRv<`$6!W?*p^Jgk zwej(;JksWdHk+lFw}9~H-c4p)HZPuvW4p7-0qR)=YiHLK*VbYuE41BV!YIDHZ``Hn zxhqc>xbsK^IL(CO7Y0E2B?xp$g?{FRmf(^~IUqG6WNjSTq(CiO$sqD4{8RY%|J&(5 zgunlHd3B+r`B>o#xs3TbbQ-hhj4|`jXIc|# z1_S@08mR+f5}!hlN^H zpwU1s>VlTj!Ab2ROY1mw3`GKXj?}%lD0INWqTfOUZa36|?LjKxKyPQ!WH zu`rdaf>uWa(%HD*}~z)-}XL<~_>K%PIw$ z>2JyzQZ;nF?0pj0XWF0YEy%6~38)b!kJW@Q#3_lEXD#l^lnI4r63i0eS-Ve~DVT~?~d z;}aJ~8>FtW>#I%qiaU zuit(zpZfc^KjOcyU**Gi1}+nY>C+y@*4gY@cE3*!Ho{IHT29ZNhe}b3*pOW6<$)z@ z=QoYH#I+=Hm1gbjdFS0|Dk|FmJ=Z(TS&Ux{BxBcMhtJ6SkY528EeI-%w*;DlK2X+3k@60$Tn zN$90o!Yr1JX>^Wzl{}RqQpK&D=>hbV(tPZwIFuur!xMjZc5x&rtbm|irIvGUmhu=B z=l}_8AmsBuXu~eww0{@A|7Y9WdQ5y9jz`E>M&tSl`VK#M;}{{yLw|Ey%x}WmXDa+a z=)Y8LqtRP?za3IX_s~Zv>W0EO3$QB%u)sd%Q;G*0U{KJ^dvOcp9lO+NFml}#)Tx?p zOytma;k*}Z5)!toWS(8~2MUs7_7yu1FmgTmkdLypp+6yu=f*cw!In#5?C3}iu4g>V zhp5++^^zu#E>i!_-<0r0Je>kmxI1A|H9QDV?jriX)VbPvmT?jgt_?K@TX<0Vm>*Kz zL$4sxO%l?jVR3N}Y%ojKfn|cz;|dFgd$J@$`BUzk)UVU5+TZ!#@>qySEO|Of{-@Sr zlyK1cz;;}gdbE*fT4e{RYwTenk4a9w;RCG)lZx2GN^o~=CY8xHkx+71cm;90&-L6B}bC7?I8MY8|-{On3Dq#fvn^(;J~al zUI%p=KM2fys}k;+82+b_iBU&Kh0V>TkN6hw;P_^m!oN!5w6!T|mc9&Nyc=y4AR% z$G~3fcUmIqIH~X0o(l8ob6TwCi^`!c&ElkQl}*|~We^azYbj7sLAM!=T{kp88Qn8R zY9O$c){<=`AS!G=0=CU?>Q@Lo5NrUVEpZ2Oqo2=pvU9DMUwdV+D}nM-jYwd@SFZHg zW`{TRwDlqA*tF{MB9$qJGuL5OAtOR!fh&@V1S-{Z=>sbTG_+~QVJ^F0M?Jto^gxwR zegoiniTnltScolQv`d#r}Dfn#z+3+-Bw zo-Sc9%NfD8Jimvig|Qii#6BXOTy_(2Y(%+{&=aC2uw&%2Ef__&aL);=?ix&R8Sf^w zO#zhp#%PDlENPv5t8L^AHA=?I(o5C2UTjC98M-+&VqUINY9zNv0kVePCJQiD7O-~T zSG6jajJh7i9NGE?n6tRjElDcLo-RUCR@%Lr zF}sG^QKu9F0?|~!mrBQwOet;|X{Iqrc8&ciG20kY3;L31(*>n3T8$Xg%)B?Zl>u2#h#O!^EdD@5?4unFtDLho z<$|g=RoNRQi(80`?E+I7%|^$@l98$jXYS`owS`CtRs-kDs=}oCAO<%oKpWZ;=u290 zB%LmDTRp_7c@WNP3wSN$e_K1eOF(~j2Tkbz%1#@?qs;i}rsKdB0z%C7uwNRm1gBsF zh%72>a*_F+jw%f5soF}mSn720eb18Lz5bpsqn!5rnvD@-{eJ$}e|DO|Pu@PEq&LPe z8BF|aN)|K^RJp0WG?bu_TBDHC~pie!vRT-%n?C* zxF`jI4HPV8t|a(c+Eu@cQRJ_)9X}1Ajb#q6zVU8F?}GY6*b_Ivb}_G>QPYE+Gd!#WCuti zf1i=#G3RvoyrEOFKZi^;I=?3GU9EDe-Rx|w)-X_IZ_=4Qd#@FAdH9=F(51AB41RZ> z>|Y=X#>V*NA{ipwE1OA`E_Kpobv`D#Eu$%frWky%dX`hEO*|tomg(XWhamJh=|~<) z$7rOZPD=}Gh@O(pW4biZWFcC5xVo95S6n!bz4AOO_nV9O~~p1S2{Y>!mr5?8ft`*;M2RZC!N0BnT}yvz?49S1_}vLM;6!LQUGEqMi8pV4aR*$kuCLJw*}DeObMoh%aldFGRf{l zPlf7!iU*d!rp7a+%0;+mpGqU|wBe$~T}{ELD?9|q3@o(mq-K5`E2#d!nYbg+qDX`o zlqO>PJ35dshx>dfL3!a->N#D_EsVSDCL4rltIz(?57_6>z&Duf(WZr{>`KvatpTE~ zYXn8tv%eoyxMeq8xk<9A8^aGaO+j=ElzRG}dq%RJQ|5k1^=9WGh&|@L9yM#w*arQL zp#!-`KcK6iTll2qxWWhX7ASz$I`z+iiH4?xlDt79@erXgX^k|5kpm`Cj|s@PylvKI zI;eDk&T~$+9QnP+#W>s3>+1eg$|$H$cN;3F$@h zMu3ADFSVHSPWJ_m&zdN$=XWI%d?MCBttWN>te@D@^h5zc6;<>gfntSr(GCa|YpTW!oeFUc9%W1i+J=8|YR) z>ChT4B!VLJS%{*#%y09s_?ygi|3ZV{Fh;wZFRUJ3q;fWNs}wnAAOj-`&L$tbFq-6- z?@sGEuyT_c7Is?RTLQqx6y+7$z?OhETkdYGep5#*7|kvNkQs~<3-0bXk}Z!$E@oa9 z{nn}3;zf->Tk`>(r!ZO|8+4K|_eu4Upc-b|y4`Jbp=wXC5GXezWI{m$K_{`f_@99a z(~7%w8V49b;vm(tTf#NxF_1O7KJowqhO^O)r-2N51Gmw$S zCdu2iRljYE7pcF>#wXMfYS(9}vLLOBSV)0d)XvEZPQHQ5Mnf5gX+1G(sj*69y_N|vd)2gOh3+oU4W zbY`#??UFku+}NSd-chhxIAv2?2c1u0b$MG^p(o37R+$Gp)g?CmtR@`Y0|LvaPCSg@FrFm{B z%eJ`W`oI)j;w6>`^`GKPcp)HNvf*tY(Nz*UxV3u1+A2yDlW%*YL<@AC3d**1fp{7@ z%u5Uc#@g+opL@iI7=(EYRLc%C(khbB;7YCJ&@O67ZI}GeovaWHF?KJVFeqPGs0moP z7WO}uI+ipOt`;@XovSoo31nB}EY>BYEEu0%u zk1*bZHcg-hJ@}m8xca~j5xtEjZV7y>oVo98Q>nikn=dF${Q4|OWC5mszWaX{{&wFb zU%k=Q>GgyB?*IGxsr>(U^8ep_|C6`R_nylJPdOXbOKN6E(1zye+MXU{<^suRqb3D4 za!#NQVRENWm@I}D>wMlcgSR>{OJDf>9j!GBZ|9{2P}v3BhcPThU7A}JbfB+O3%3#W zXQY&QG(-eS1?rOPYDzEh-mYV|W45q_fexFlaHcuu{W1=U6y&zUFsfq4t6NVsek@~M zsdd*6_W`Aen@X6x;SP93w^DxX7uz};!jD5%0Yz+AH8mrC3j%}`a%q!oQcw)z%?Xo$ zkl9q@I`k3TF1gQ~K~Mu*s0<3fbD?1HW#T5z2f*k_UM*cX7;N~zQCfOD=5C?{EflKgXx+#Ew+(ufvm zXC%i3Gr4{jK_XYmr+V?4W%TDmNTA8!XWR(iSo85WkU{#yG2olxAM_wsntfjDI8w;O zmFKtE+J%Gzo_Cpu=?W&Og+)9U1LYDVZZw|VtKo*6r)ylOlea(~*|vi+y%6~&0e8!J zuplix?6uVZ*^_-M$WEh5lH5wVmk$86b(qBE*O;pmJSn79yA8Ya(R{!UsXjBt>-2OS zrCQ?NC?KtW0?U^Xp-+#TAwnREx}Up6eTR7}v5{!W8-Agc#a9!Z)v3Vg#XboRLa5r8m8@O)ohPS>++-IlF+)%T3s>56*Av;twtz*epqM=TEn9K$PWh1b}g z!XS&{4b`9`d!YZyLs_5~KrAa@vfZf0O-!>dl1oW0uC~r6(13fUW`k=rmbErTxCbzH zKkt~aI*iJzC}?Fi^v~ob##uzle z0H+Y$i8Lw2({31Erm$}{?O3RE5737*+B}rLTqJLb$*~qHn`76=7(>>oqIeH_d3z+l zc!~2P`90PiYqd#I?R4uj*~xVcx8>A8ET9J3uR)%af893Ep7W}NUBiPZ5wPd3G7EAk z(=BZc9ONV}3UP6RX8AX5sK-^6_IFvv)Pnu0R;L@6?~ub}8FzR?3B@Zr0*c{DQLqBj zH6C?Ely9s(8Zh+~X#@q%n_77u95G$oK%Ul$1vyEAV3Nvcu6P^o+)Vl_TN#4Ch*?t) z+R@^>pao*tuF>CtS#m+NB;=~8)2|9y5kerS_bq~yE>Zk9e`9!z{OaH6s=u$V4u#B* z933Uw=nto7M0ahI-%d`D!FJWV(*ubTe@N!n-cuDJudc4*mT<`f#Q17zY-+B!D2hIG zoL)c*2S;}8My3cdZitB&py9HW56J>oJ4KHlusjPtQuC6OJ+Ga+$V=T01ns03aXN7I zM<1JH!)Xgxm_Ev(YFXE|+k8op-8DFAKDBQ>UM}Q_1NYI{@eZwdylkr00@@&-IJrD( zzfuRIPcNABTDXCFyDR+67zCm}k-!>K{rdO5Wfv>?KDLGcU!>NFWS&yJ!|B1U(ImfG z7eS|Y(}7o@zOa(a*BlCiR9rc*qq$;B7`9$EJasZJml1=Tm1;mhFp#M$r>aZd^^${K zZBwte)jAPi+de}x->6k9n+C{V=jO^`@MP9lBJ3qeeK`?3#4U6VyrUpF>P5NlJ@kQF zWA@_&(u&jeb$CL}@_mM{&X+X_@XdLRbX!9Tdw@XM{taaT?D7ycf;h$&m zE}U^FB+K?`A#tE`c~^KT#ltN6k8j^nqxSdvyWfP@FTIWMm(v5}ZrMmDIo&(mD&U27 z>PrhtONqHGO&(#fVHFyCw&tb!G?@M1Sm0a8*q!_ea{waoAy~ljqfrN`e4QW#B)6fD11H zxOhm)fS`unkm*x4fPxScixfB#9oV||bRH&NQ-K|zW2V-rSzy&stXU3_nUH!67u@Th zN(Y+zYpw zC6#Q3c;&<$mI*fLy{pzBp%^73xvrS`P9-7!AyFCYZ2XTOy)VH_vFzGhcWvn92s0<^YOa;0IE6{OXplnG>7aE%MUw?$HR>KD`(tR`+Y(^A z08qchhAiS>JEB&u{kFgGtYS_DEMg!qIBmNo_yi0NN{+bWEubN$<$Qh(A@drI>v{EI z%qXjlzv!rVZEKmKnGLJl!@vpOuWJ^Jm?BTco*n<}{E-`Q7C4@iD{1ur@qz2jl@v}l zi6|zTI)rP!NPXXECN{{~!V0dDZ?+vwHPt?x!jJW=j_Ks-ZBZ4xYT{};ltedWr&2{3 zF#Fx936LNiDV0*t)`}to-wLOw(yZ2Y&~dA5*aSTBV4cIFS(;~pN0`f06q-6o70J>h z&vNooMhLtSAThu=B;8Q6RJ(C=24Hcqvv3D=0pK?W5=C`^8tjaSXBEG)qv!9!|Mhpr z6aMRe3zvODG{xwEU@qAH*jiiH56tmF4qWz5I^;WhPHXQBu`58{yUUcEsiP5dv?mOi zm~{t8^pKHnW{n{!((6k0f$SqW!tDHz3Llh>n**CcIwpJ%!(q>q0OD)+SLuS;*zUX; zgPe(yXF!J6DcYbBxDMQ;bQ`;d?D$wi?FIg1z9rm5K~;=;T7QsK2GK0D$9N#JwX zQh1*7SwP?mWX?(B!epM(aTpA#m8X%j63*&|`dfhMwh1OVvJAk7v3-QDqKoR>q-dgI z@p+%(fFwKtgx3{gZQT@L;3*0L8S{3Q4=^G_>A{2M8WM;VR|p6>oOc@B#=) z6&O*;HUV0D9Zjl!BbV?I8SQ=;Ep2Q^Xy83XJz1~1-%IX94}1|CK&5}tU~D1V7eO;8l7+#A;?I$(2WHKN~p61$7XQ3!5{6uZ`nINqtwHp zJMs3_U;h(7h9ACR>M7y%7e`^SAHV)u{X%nWmE{Wb-Nd3l8~DyO26OgKVMEPF1eLcK z;=;WssacuKk_W2%c7~xiv7NJOo+YsY5E*%i>fI<>5X$ks1H|#HV_rZrxA4K}j5giT zn0NIrLf7GESq^+A&f$zcv`%;I4g4((0;7%wOIQ3Iv2q95vpNxCk}1W11!)@%SPRQx ziH~*AHXD_6|h zlXF+XJNWC$Nm{F-MRTgd-E@ZGZ*-YVnN|`j#5gA(t4E|!93>})q`L7y6cH{lw6GL7 z!4{}zNC{33N`=(XaKxq{K6J_>e8$}EdMIL%+sOG`t8!4%A4y4>9S!w z`0;`XBfs*J8pwA)!sEex(+vv$>!a;2v^#9dx*m<@(JFGrlkB_P7PdQyE>;bFAg~1U ze$x7L$fwc`g%Ff1`$fBtAU1Ml-SiM4qFR7dTT)HY3FktipQdbvdF$2t72*wqBUWg* z-3d!rC}g3r4GsLl74$pIKxeyO`g_{9P>2Bcq68(|uaF&Zg-Z_05Wh;fV>aa}bWqz8 zyE=s3Un0`|;0#f+;CkB+7f_08xS!$zH4f;1I@3O0$sdxFXBZHaws>%$`Q7U`;Xmlh z%{5N%p?CY*X@xsz!F+29zPbS{1>$nPCw62Z3VTzV_6y~1l?JXx1f22DuiY! z@Nb7+#_X@uRaA~!yH@~55>BfQ>`KfZTHVBC98}2tr@QyqKnh5tM7h zRmw(5jW_bNzB=S~7@*rL^>fGgdYxR)IlZX2F_rEi;_s6vXX+G~x_hXRlV3t7$q@3i z>w(i%Wum!d=|$m-m`F*UyrL7Qz8Jg3D<-Ad#IOKUA8b{e{%hgmH*bcp`RVJ|;PO7B z$Kq}1v~x9Bz6ZVkeMonQ^J@Vjpq<(4PU4r8^AcGvEkIz|Mn@k4uvmF|h>AsI=tw#V zSGonukF`H49D~SPKwT~I5zUG=on&JmPiS0>ULw+I8URe_50us^Z9O_kyIO~uoriv1 zAooofad;j;F8$Drt{`w{LPpr2>U(2neu7jkeiG_nf4jv4@@bF3#3AuNqESRQrQr@P zRN`n2uClgfOeC&Ux2M7u7?)`WVtRgcX`qF2*{zuiN9W&06#R8rn(~jj7>< zJkcq~7f>gvP1qj-js(D^{cxq#;f%MkOYtaoMbty8xBF+GS5%;Dra6qJo-m!0Acm zGz^kmCVlci{Nh_%Fbbw2r@ub_@LUciN`Jr+Kf{*N4D#Tgpb?1uqdLY;A z1S4q*wf!NT1}vQ&x86wEWHq>0b6EDnBx|%&tEW|GWp01yE_Ww+UiRtNVUyizQKZq9 z!+KK9aE!yI#S4OZJwpoZRIQ!VTO5?F>eFXiyB?6Gt4e82gpAaF)=0&+F1p9c@)5Wh>76rccZ+~p-r){Q44w}IUbn2dN+TGFL>_8(^%zHgYe!- zZJs3aUX5QfJ0Vr!O5_|6HlRRbTh^UUVDdGHRaw>CLTeGu=BorTChJ;6KM6)2=#WO0 z<>RB60m_XoHv=Q2^3fFaZf~DG3~w~g(!o$qkQrj+=<4f8R-1Uwd_`^FR@&3IJ93k? zO6_vs`7Wev-S&hE87XO&%B__gP?9=>Pe`pha-TpdsyV^!+11b_V#4TY_w%3&bcIRw zbgEF;(0Qx^m~?Q7VpXYpK&aXBP-Hh~J;`s`JQec7IqXID_9OK!P`KE!bqRyPmD7v* z)9$e{NgRD9qGweqE;Eyj%LuIEU?g7PsR-77@VGEt>2ZA{eO62& zhBaI2wW=I=g5fqpD$*Ren=G&A4GxtoO!Kg>X}vK$cTqJ&>s*FHPHG2=$iZvhM3rH9 zKy2tMZit8#3p!I0RYXH}C2?DfQ47tMsFhJ}#2n($P)%+mbcyT$>zhoaukFl`bk7bA z82kYyLTJ^{%y1xa$wc%oC7FhW+D@!e1PPik%4Oww0g+V3t4=aTTi7u0;*1baaf}Xy zKPMlYwBcq$J8UTUHOw?8@$o*aLDT`+HRR-U$AL@aJC5_(atlDC2HjCP?;)TT)7msCVI ziY@ld&hu_lIsa~5d@hHMikvU-1dxN`yw3X^sf(+7$Y%YGSvMu1b_zVqD;RVDTi7@r z>{`mmc*RDpoZp9Nd9GI=T~whX(%=&*RnK&>RC1)h%otn7b`X{brD%3-_F7KO8{NPF zxeCs_YFibO;|7Ilm0eKYIRmvG0R2-~5t0>6FB=OG-}cbdp{~Luyu3i9jnKkDAFo4# zN&+*0Ka?j01BS{t7GO%TK3g&C&8WmKqVy_iFR`RpmpB5Glgg)+z-|qv2`(5;G?L>| zjksWCQ$cHphFM{YIkQH)6Nx7?Qn-=x3KQ#jc4*Gn+b$Wb%R13|Ovh4=F`TJoBh?ht z*RKZE4V5)U5&4R}BJa``)Vj?!5;nOvRJ?p`dNuZRlTTVVkEF1ZAh878369@~GQ_2C8 zuo=v$w!K89%iIpV)CI$807WBw;@5unfKIOIjEs%GTJpPHh|7r=)d0``@Q?p!rp*tX zL(8ukC$2$>^A1yc)TXnZc^aqn0p1$qKB%Ci4nhTbxqjH?L`fl0w1!)TZE!Id3=qZ> zxcaQ(=MlJn&v5GD(V094MzisG%J~ty{5$mq0@ZQXr2xCz8bSDmwFHLQAaxT|J1n4q zz@15x@7A0%&wNFA+&dn7@08m(VsO2LTTjs;vjdpDk+8C=S|Nh~E;?~CaJxwAlp-gH z&8b4xIJdBY4rW7idB2}T?eGlVQIRmPs7(gEl~^FJUq~vWA!TU^33dt_XeL)+ZDC8S@S4P;#e+V1yQ*cFH zxw+_{c83X9y6sb;4E58QH@4b1ZzwdL^}r|tLo^OdHAxGOJWxrGIzH6Xd9#g{y-RHa z9(%(QX<+_C5hhld$^OSLHjq#-xd}tLkqN;qZB}k~~J}ZrA$!O9TD9 ze+qnQtVBBnzW4#Te9pq0_sKMW9@ZUYepI;`P;O46ka6N;;bK2Imm!2iG^Pg zn;W=(Qm5iluP{Wm!y@UO$E1AG78fO*AR@7sC=jBckfG8D518UEW1l>~LyfG>c>+Yb zu&uX~{;`rSO;BdvZES&rlq|>Ma)J{Yn{X3A^q?$S!&9~fbSSHYJaeqA8k>eOR{LrI zV!1f_I!WCZhM5Qq9VB)kF>;Km%p{qovTAp~Rrw9=1X1rOyjZONi9(VF$&Fev*>wq- zT05g!=vK%Z&S3|l`9=uCwFq~1O}7m0>T3@6aoB+43`@R~0&Q}-mJc&TAuHw7Dlea5 znx#O)rfqcaRqlzn<_EoO6m_STvt`+V1{Zi?@+^}R6Zm7PfK~qY?roS7?QHZXnK=yW z4tJKvat7~$ni(nuZzr!B)uTh|rLj_j50+LX>fV-!V;GUT6TCVtx?t=19G08}!JWPV z53l(I|vGp)n6u9eV=%>wBt z7swwy@rLnH-k>`B&r20%U1>bQVHb~wlfT+&1eQ8)Cz<+6~G)LrH~RXWd%6-D`y)UNMydo&d@-TUA&6cYWtIR=@13-dk9!j~!(7uz;yYTD8O z2FFpzn`8k7eu4G*Ea@ZvNjsZ6i8k}~ZF*tz^4ozZ3bW=J$$v*-*IDfssbmUWKEm4M zAzNfdW45IwnZoH0spXXLEaU<3(1-a1OnI_ZOnwWNr_Ay>l~SX7y^@VRK@zqD*f~6b z)07kc%(1}`e5x4c$zm-0Bu9t8)p5ysvAaA@3o)_iQ5u;$kLGqoTzW9 zYFv_th=T%ldBA`1jvT-FZS z#XC60q)z9Ze9sgsm2j%)7zI^qr?~0XWHbb*{elVlqzpe?_2?n%_b1!Eh)SorSnhpR zC_cub%+67_oiLMtDgc^B1B6#6dK9-RZgk*G7sHCDw@X9BbBPW@Jb_~a4aJ`^5B~!{ zh9ADcj~?a}1(Q2b-+%De|MdD(n@8k8xZ!Are8{FKA;!9q?NekOs}Cf=rpY(+?ig}t zV9fI1T1@7q`M?@rL{ldDCPzl14)_ck);pnh$b~sE1c^YNzwIbl5)v;Tj!>x^4ov1K z#cP|Y#_{q~<9hUyB4o`wH6!7C5es&*I9ef4FKyTQb? zXb@T_Gx6vWYNZR;b(hd}VyO;5I&%Gikd{sziyo@508%wivvw^uNMezGq^hUZAyemA zoBv@iOserSOObVgG9u3><h( zivPCx?(fMILk8QV6?;fyyobn_uRQ>lpu%b;#E-)NsUQDWlY{#k*3Umb?9cG}ZNB<~ zowP3y9rMLUeCMN_w0<1$Z~y%IYsIgy8fcU5#@AOCtDcK7NQ0UZD4Xhw% z_C4fw+iuRzo69y_f*F{s2l?hTa4v+XTdnNBnKI*fHBE!%B6r9PDv-M}QOCeYkI8j} zC?Hk+FZi|?!-HfwE3S-V`g%W@W@X0u(J;1qb$m%db*Y>p(O^IWA32(2wAL?BU9otX zn9Kn6ipr>3Z5WApx2f@GSPrBjHB?S+c(G^AD6X4IS+)agK7ki^uUOgTb$hy{2MRsg zX<$|4%p?~QlKieG7!6vG18^mQEws5RYqeh02{Qpm!=88cH+Iwt8k_wq9&j;es#W$FQbR5)A`>THWg4M>>N|=I^c7a4goK_U&Euyi-=K;cSBiKRM<4MhuS5VwQMw2&6?-xVs$lIlWS`?L(YKR`ql6x3Z$O1 z5(HTz6$BbEOk5$xJY%@nWzD6vCH@)J1myssCL+55(WBlZoGiQcj%vT`5?ejY7Zqe8 z@m&uEBy|=>B&Vg186^JUaq8v=pkzsjXT#d_fLcV&$k+%Oy!wR0l99L?mnCU;Z_IP( zjCl{!j(#uEx&}feidQ}aPh0}@_;cl!S0x6i`cFQqPf z`}FNk-+%J<-CzH+y!X}XuaJHI4B00>sQL5HK)I825*es|$lvQ<5uG+jTGap`G-O`L z8FN0pNS;M~@2EYLwxO=jBktn~49(r293&RoSlgs+v8l5pQrjmMRSrf~DqOm)>~zmS z#dR9hI4Ygd<>T(3Z-|K0gs6uRK}2rvUJ2ICT~=dhv(@?BHq`KzQ~+JahQ-6n)9i*^3avJAuZvsYqD7p2D;cwgsKx@Lle8WIu)%qO@r2WULlU{i-=`BFPicaJ-z1m||^#-?x~ zsB?n{WNDq6&yUR6k0gn{h?D9w+Ugo0q@OPn zc=O;HKpm7LEigIFwidkic*%!5&UPEiqmjNRF@+=u`SZJ6>>I^x4VU7SWe9l|-iBaA z1G#GMkipf?bY4DCaL0iD)JzwJ5iWE&l57V?>${4V#LbnNdiDeayG{Pc(d~q4#SOd5 zYzs+WIX;arJ*5f-xKrE^`EA_y5(;D0w1ev2{n_ZDdx|KyfstzEt^p8DwHFv(jgw!_8FV0*|Y&2*+1V zZ38BYw%q&iQq!~qqHw44Gm5{EhA*8mb9u#fw{e8uhbht~s+;H%ePur(Nd_(uM$ zPt+OkzlOJ8oN&W}r%BI!^r3FklBAi^=>wP{qGg)GI8p9`*Nw@BDw zKU1Ead&Bp^F9S3^PfO~?mQ+Bwxh_^83C^0e+PDIK=$#Mf(kF(dy@8*A5^y^BvQ9_+ z1)Q;7*_gK&6V7*mu65%Yu7(;?`!mxF93|*b6GDZD25n@=ac^$aN;MtHrk(3Wa#YZ= zx;S|SHF16ms^9njVl^zX`K7mS56SR#K7lagS*5ZbK@C@CKtGd~Blm8QpuGb-OHv7o z8>U8mLtw#6P;(x8Rc`P_nh`$pF$8(C6_Y#o*B|ESH`I~1d-ClXN;q8M%V(c(mBY2w z_-F0;1`t;WpY2rh3v4FjTb}al67~YFOmq#MR6zuCg8Z=GSRPpoPs<8Ob{9UA47IYe zs<}2kC`vDQwpN<~Fv%lHYD{)I6jNB*;Z*pkRYny8<~f80&^|1Hx|o~Y%Tmgw)#%n# ztS6Cb#^=n)I3@VpH!jt>?vgIql2A^njg-d-b5zsL3&TzJtL)L&KWe@R%m6+pyYAEQ z_N5w5zkMM8{X=-mh@of3G+E0+R;%FzRQFQCf=aP2HSb1Nj)tB|eu?%3AaP~bWrL!u zX0{*TA!L1d=;9Fr*X-c98i@bh)kP97*P2u|g+*O;7DVAq(%e+2t*OfZO)AxBm&nId z?0Dypju7STA~u|)SEunn7l(jZR#vItIY*WNSi&ZM-@5_2O1I||v=+Ey? zLx|pM99qxyk4Q|8@z^2h)FJfdBzcJ2ark74L>E}VP#PSPwzElFUW)CXlLPZ0Y}qPGNh_@2BwS~=Fcq$RcS4lscKKCgwxdlc2&wA-666# zzM)7{9=Hf#9u^Vm=?79wVYqXP@sc3zl%gpMZk};+zO3vOpA*0z1ubFJ^Fcm9)vrP+ z7`SJlU$Mj8BK*+-7_>hFh)4`rVmy;%q@#9=>g~Rp;u(6xC6Bd#2>*xt?}Xmuhp*q{ z82H{Mv~{JRD>0+8Xirly0@-pjybOa1@8%&^VHl( z1%g{5a~kE?1N0>o1qqf5Dir(Yf=^Ns%PotUTLhj!xSL1h?K{{tp8YJqeYDvCx!HN= zL*V-ks2Y^cOEi3~RXnBRMn>mFKfz@yR;ntE0Qek4#`-?P$DoC--E0rQ3fPhJp+Dmc zAau3gLUortoebpKEup=ix|`}}NeLif*9Db}y@4awN*q3^%Msf9#nAQ+XKn#iAUHP8 zNzWX6)mJNcWK5lIjia(*KS=cdb(qsw?{fha|L^2(4Gg18HkK@yX(=YUJASSi?n#e|e2pT>G6J|>vJQpyXX6qSQUpYGD3wxFcG0)B6aXosi0F8j$9<;yk`%CQ zrZrjL(l_7b|0C_)dSuD2GqLyl6}x4RC5>h3eLN%jfB3=J5wSBeG9zL~$0f6(UBb)=g*wOth^Yr+17^vh=Dhvygoo=FPEv#}UKcEw{JV`j$Dh>W* zcnB&Nj|-p;Q1D~H3&T;HEmTBoVRk#ctN7;A8^GcXGmL>9`&^1NVvRabTz-L7_<3oAOGJwHLRO&2*I19@izgUK4 z_BLVmI)(?;&lQUyH)(Y77$Csf!xR|I7dIs}G`db{(E>@LZ^PhoN9DQK)C5$V%BES~ zaW6}}DO`1iIWa#$HKk?&0`hE@dujz3otRyTTBsuTx|pZamt@=l8v=kgR`4dM(otJV|?Yjxgc1i-k=l?<_h+u$P)7s zJD<9>o9-Q2>}rTP+XCHcpni8)CxWb7W1YQGTm@nEl+)4+TB9zU9fB`Mq_mdK1`zH5eo1nGAWC12s|QW+cYDk_dq~ zjBi~q=siP`%W*Q$<)mb944)cocPF$YVv{x1$}TS;X&@vnxL8yXoF*`j`Pl< zwe+7QTS^tW!^FX>)vMGhXG%+twJM3xbD(=Nl_|*fI&zQssD5_P*Dwu zeluDFbFJ}a^l(hU_Gy5+UGvjC4o6#-2=t*RM2wk|=;7L`hsv~gwaFCleCRkvH^ zj>&F>RD(;q2b+#SKTT@c^nzpGMCoH4^5m?S+C|Y&0PM^9P_ZFb@HD-4W50aOzsk_? zoDu(%KD*0rpKP$PEBu=4%N;0#&>1D;fnah$5NzhJkh@qGR%2!-0<{TCg{l>BEYq=! zLoK__6ot{{Vw@$6veUMKRZEqGkT&rOfngy4w3uB1!%aECyi$99lHOJBHRO`{kY1Yu z*DI>#UQ4CAn2d79GOa`mS`vqiL40D4)&~z$s3mloVs~>G2g`9UcL(%yDX}%Adj#Wz z12piwHcO2oeA9@!=(pvmi_p-vFr;Ue0z4M#gIurj67(Ocm>`=&uDx3i6n~qQ7+9{u zWGN9Uc!al~(Rdxw7Uw`VC142tLz86Z{iNiNJNbwzMs4*|BcG3bD;9RD*7!tKEK70E zNAepgfS>TQy!&{d!l(caD_rqZoh}5}JxboLeN-&Dv8xZYFL?&5bgLxqzWj-Dvb{S0 z5lDUvgek_Pf|l@yE$`ANpFHhQBtE{N^Jn<_6UTRb`TjX$>uEInWqA8G+Q(mncWE^L zHvI9g8DSul*zWL!{$Y>ITVBi6tVkHUKkm6v+bpbUy0h<3@1ZdrTmVAjz{s16j*50h~QWO`5DHZ@+AuX^H#rtbIxPYU2a?9w-USEkCmD}w?O`7^5x2r@hN|!@4x5NE# z0t06xULek@nT*$z$Qjmc9wBTE)65Kc$(pmM0aRP#U#cExNF2FL(3Y^l(x}zl(~w$H zT^i_1I-_)2JVG1EVTVG|ppq31{w|ewkJSXa8Vmg%dn^2DKl3VW-KeBpC#76r;f8Wf zy02f_z6cmznwE4JZA#wc>E59*Gk4=SUhJu18V%3Aw-3^w@%lAp*Y`14K2afRhc za=SST4b0V*XNmn$=aTJHs-I2JP(oVcHg4g3CKmgGw*Wt&mfIMs!7x5-OpEe_Oep7^ zO$zw2OGt^N&89OLc>sWFaImIt&8*kIy=Ey@MtKY{u}z-J~fV= zuypDAm@!Z^VQMWV{U*d1^lWgljmE_1ycwWQ<={c4jK{7Pn^wZS z6(nj12@E{uoAbt`!-HSLddyZp+{ZGZfrxId=cu)HiIQ1bXFD%yV2P2N=#vn^{_uTA zaw=Gj`K&y?S>p!#$d9;|fZ|l9aDcqY;=RI}+X$MeKm1AJBdJrO9R*mz+Ojk*j=K9d z;ZOdgGp88 zk3x2le}aM=CB`lSLET1JQ&B@S|`mj`y7|PHs}f5)%A1zxqFX-N612Uw?f3S6{vTf`8Km>=(yZe?h9WT$E?Oc>9j7 zL_d4~EWG^!;D&DpY7my`BPr8Ge6&e-K9lA~#VQgzn)@xh7)4;+aR68@oy zh-(uRn(7R7!nppA-?IF?xqhsXl_j_*V&p(#wZm8XRFFuHyyqg<2JD&!GzVZ9sHA&Me34SA}~v;*d{bo4>y#E5&$!cL51QO5O0iU^SB*$qPT{r zsv*RD3?Po93c{$!sxc|#msX`JSTLUfo5IKIEX7`$NBeDhEDl~@jV76K46?ypEhpdT zmv)sq>N~2ZU2r4iN!X@5EAqaAT#%`Ao$eSUDU~Y~b8CPUB ztF`Ok2lA2-#^B^hhefGiNMNy|gucn1yg~@IW8ra<&)r1T%em-+Q`ZF#uP!&7oP6@> zCbd7b(K~C*i+}-&z2KlGXb>#`b(~OqO|1UAbv-876YQN!>?SZ9Gv`_*$X&ZjO=~y5 zl+yo%-6e_(6GOrJ)!9ra5b-S_HDGL3stiIQF(h_*#Zel!Csbpf9?B(p5PE@4mmL!> zjv!YRB@KcVUedaixdOmb#N9*w5b*n`#sTvC&9NrWM2cGH6SM$vS+uj~h4Uw}j*pBL zEKk!JM1M3$(K&OEah9f}+T_-F%|pe8@f>fYydzGp9iUCserk4_jY*P-z~WPRynavw zQ7LxmP(@YI@g|=5trY@x`6a3L4{$~-8v3U)rXOiOPmeJWTsg%Kma7$ zjWS@qtn+Bl&ehO{tV(&m2W&Jg(lW#-E&Kr1p=Lqhx@FrpUvp6hAM!o9(#tgt2boiG znDW9YD7Gn`$>C4kadKVaYkG3Il4?Fto6}^4_c+gKQrt+a6KL79A7%>SR zy+{De5sMI4D*)<=3JOi4EsuRoN)m%I$iHR1Y`wDDGTP;oGVe&Wr^XOdlK+D=_7L~M<1c*}ZS8v5Xt+YM7k6&{l|9z;&x zoTv#fwrbYvqks4B!e9NBUVYD$J++#^nMbXtWV>23m2D%Uk9 z2WwP(0*B_YhjL{0!r*+sUf|^s>&_jQ;dF&k8HdGdcS0HNiCZ<#Sj+-;zO%hHdG)p^`=!XRnKz4O=m2k<;SUF_h!YXP$$y zfpQh~s?H8@P?>|q8lYa9fn5Gq9v8g7UDqtBi?w|(h5Sk@`?Z*&dgtAFQ{T>oM$l@5 zMxEtZJ=RR^_N=uN^Dz!GBmAbCQaO!8;;4A(Mn0|*CR>H3*!p&ej8GtGQ%a&em@RB- zh~W}Gfd)x|ck>M;e5ri#g21M&$aSB2BT=@WwZ2(s%vI&C(OfBe1*(G(j)jlJ6*U@c|<9KvFVC~T%Ua( z_JAiwi5akx&8B#>)u-h0*(J?k`iJwYyTMdWnypx`XuO}$MJUZ5xp&WQbU_!Yi^&Z~ z3oU?BwiBeQv3GK-tRpdp)&#s@rMhb1*a4&37eW4QqnE+HCL6sJB{87^MIFBc#+3vF z6r`5-uq9IIG8DNs`yA@jUlcEFWAeIIMDNZ~IA*?}ak~upO`2+O>bjcBBMv+r0{b1+ zeUA>t@1-UKME9I~T8|Z>!G?YOt=L@If_EF89Mmndl&?}%m0Pci7fDlQdeg~UT3NQ0 z1JkJA7x^up@D&)ZU8Fcf_O1v#SDsKU@dOP~>eGT&2_3Y zb)fo4JaSeOyMC7-pk7n0I+1D7K&pWyM&hAi2C|u@vUvmW&axF~=$wuL$X)y1cAs%$ zE@@;B{2-DtY99$*YzwdtUxc?`pFaHW;r+L#{~7e2-<)=6YpU9(eR{YZ-!s0spxjB<;N$Ps1d4d!)e&T z<&?uLIRh4?0^@*6QETh3yvaKS*w0dvP(E@g1@djQLC;Oz;d7DhqGmsU#h@M7qp+9; zyL6ax4;iQiv;Bi)ScE&XKQ1CW8|Ur)!DG2VSLyK8yla9tN0K@UNQeifFIWDv8bk@!jk_SCdqe z=8y@mKsr77TNyD8w-T{?m4CpN$<0;mgA9Ev&A^!^K(Guxy@CZn65p{o-V=2a_9qvC zJ;Gq?1PkEj^W%Y?{}Z|69_wRcb(j2h!pi^5v!stz>JQl>3nX>Z^gVT$Y%i=LDUg+a zl6p|{SC{)o3+>F#C8OeVpDhO&BAN#nS&mqo_}w$hAq+4I=2r3+?!ni3lCsys^4dzkx4Ckxl7^iC4a1U*-4o6>_X(;X%10`M(a0y@BX{XrD{#*^LuF z*9+tgT4;sZLm>4R_Asq#4faq(!Jw;^8;m{dGU15lj!Y*y(#Jkwy^9G@at%H(NV|Kc z03Pz~wB3sE!w4=B*^AhFrMd13>e<3>hH}#5N%#aDB}RaLc=SSscz@mv32 z{|^6ue}FBf=z1r8K$hWGEAJS~zmO{TY0VJdYDp=Z!>i>Y zWmg`2Q{GN3WOR86Z5Gr`?Tk=s_5LbfQswvA#;0-=)o`xD+^CtKOBc8$%BkjKu_oz6 z#RVod4qg1#uTictx>mGYKu|yjnmt>kAd^G%HLp;oX^9yG4aRqns28Qv8n%-HRd$?QN0sWBmQ%ES5JhX1-m3=+rh!ut=7N56Xi3I7gXf1-TX6D8%pVl~GOiET=Ph?@$Ri?NF7mn+bV3+*pCEIxdw?=1B@-n6x5<_^n=$7Ky#fWaD3e z9(=vp1mCCuh!bj853|Z~Lazvg6A8Veth@{xH+u`FX~bfwANCA0kkoT@0*T=Tf06`H z<~pt)W2h=QA`aJdzXl}+V0!Gt-P8VcAh1ri@vqn^gsFw>RQS=GblpyXjYpM&e~ zA-oa8y|Z9+YsJRC$Mgetd$+KJE0*Y{D1$BC%`W9%V<)Yy8jT8ttL4YBgPfP=)? z#3Ub7XBBoU6YWSx~tA5v^~i;gjQH-J@stXTlXpZ&~GmYatE zoC&*@k9w$pm#}S~a>lPV$HbW8*exqX9D2@DrV{9Q|WL8343A6MJsC+s?L2Tv& zq>KeJ=aDLIQstD1oUtrY#yDhBzNtBZP)#WcouS*Myw@%xk)SMXM}T@SpoBibk|C|9 zEH}v2d`>_aJh?cH^iXATId0)aidU#JS|OX}COFqjKFF*GgB6)$9U9+Ytmp$thkzRL z&8N2A=w#I%vLl|s6*Ozf9N3?_^Ntld<=vdo6Iu)0jkw3rNXlXB_c=gEP4~nAzwGim z+a=IE7Q1*sj!No~T&b<%if<6((M{#;5O)fk>ZO;YlM5~}(P<{S);Ayw4vrHmLIg^5 zI;8*lCsK|=9WlVmlhaLmWDamP6#W>9TYx%BsOR`_q$$7yhi_bc*`Br~c&FK8VR5P6 zbFd=2s0Ir`n3qE2FAq{-)jKo*cuM(Y+Uz5wj4f^EK~$;6j-3lFhPEWHs-c-8M=RWN zeX)gd&E5Eb{*3X(=k66FHYpphIZCvH1g`qf!)?^%4d@IxAU&trsqlNsQ5Q<;KZUQW zM16VC?0)ny-R_I`-@SeL;fuG=-+mY5!4KYl`r*g#-=_iR59MdQ{|cpmlYi+4P)V=!mjxbou}zG2Mx60TucTUZ~n9D!{H`LG-Nl0 zYU>VPNIAS6RdGq%5H(xKIsYVqf}3zVT1$murbCQLD&#vEcyRSTN#p9GF)Qe?RD$c9 z#oZq=ZnBv$CY;MqfFToCz68P-ldIg0S9s>kjCtwnZ=NWNP3%E1uGk_ zpi`;%N;!9kL+pQ!k@xpf(|;9BVudd|5D zxB&xP-x9Z>HhSK?0R#6e>3~e$?~=$>Vc1SGsgr8MQ#RcM2X7L7?$VE8eQak+I^*=i zhovG>b}kh8hw%xpkbUM@)}w>`Yi)O4C7I6_ni=%Vtn}N=2EJ1 zDBjYcVS!M-QthcH{%Vy1Kt+5fms#vP409)l#;y*JGDOrf+Z$9O?%!t|>NjUCKwekk zjD+bqUqE_bFhl1bC{2`Wz1uEHy*tseFk=o@;;z^lQlhRA_NSGoHrTeF2`^^1@@%(uma^UDM#nintIPm#ZmAxo#HXgA)OVew z3WVZA@A0d8p2?*h!7%4Kqv$x!nviP>H|W%)UJpDG5O{pq05d#kEz3I<9?>^j#_fem z+o0eg2xbp4_`XGD#>hFkIh`g}l}3b}o~0P4($as1i15YRFT?vUEc|X(c)zHI+6zDv z00@Nxpz=_x(|A%OS_v_!vafl$6q`}2ym3^R$Z2$l*$P$k!F8CBY^;X9QMvcx%_*Ai zkL*^Iy9Fk*+_W%gm%?~(3E$|_*~^pd?p%hLMr#3OrFXnxz9t~j;w*vo@M*?`Hl4`- zQ46e+D$nUfx-C>&HB0J;B-#U=ZO{mX_BbCl4;(s`$9)BqPVKz+!f`hr2kdt@@-3jf zg$mINL^Rd4q$&d?sh||$6Lp#o;yf1m3T`5VI0l~|-!@>L#<=fR0!VF=zz1@xMwpV6 zs{)#_+&xC@Yo>`SRz=TcUz`Gl7}gg?xHQTjOSgHxT~vyEo~90p!Bgx{jS6{Gk(lx(_Yg>?*8{jPmY*fn>9FgXxj%2>#|}lN z#&*apNm|W?nFPlOz>$mAwAJ0xvS(ko);B$DkbfUx1Z*iRJOet&ixVYS$>&!NFcsA` z>VXU1-=viT8>D>qtGxX7^a9m?f+eVcganyXT|*8Cn2g<|w2}TZxK1Eu&I)#b1}Y^` zi<6?F7I3S2Cry1H$)^Weesw&qj;-r_jEnzgn(|Zv> z+PU?ah$J2#0MAG~s~Tb`PK4zv)dILd!|YmPuv@O-5fKUXcZteDXB1Wv@4>_o0r&$! z+g*k+{Gw&jvD}3Nnu3f7*Y61=yM?KHvB;AEt&@u;&rcXgxf7&t=05`QJ2{jA<%bIl zhSYFliR#Tk&j{rOCJDwyZi97^?pV8BvZNab22SJ(&aoZRfv#%QNu4$;f%17xXl4_S zuH}SA?cjjk(8l9h@w-f*K#ug9KbM84B_Om+zjDbPPn8tMi>e2T6!gzhaS98iUR|bW z!!6zHp>z3-@LYH5Q=b%d;%|TS)SvwMku<+%Z2aZh(~SFP;qCjU4?q6nUt>%3#rr?K znbj%OX%=ZEdm;yQKaOSs2!q)*o#o?z!=uzTmM*acf(UGRq>?*O39dVaPA0)_l&1Yo zZE*SLB%GQuykxq2*2kW6rD#q-fK1Ybl&VsL$_-+Xaie5QuFe}wFAfEy#rOatgdi@5 zK*V$*u6A~}n?Zv%sCw}s>ypV#Soj#Th8K*QIz$CaS$Qb$gXPw`4S8#s`T!rq%_qOb znZ0Tq_CT4GZacePVGl7vc5bZ-!Ao#TT}&yNS#cRA z8gR}p&=GS$&{;8;?dcr$zDW=M@KR)8F`+z=L`ohm?bs4V?TcJ@Z&K-PMj?-0Iy zmV>Fc=HR~9DrgR-3=sx^(LER?YeG#Vxwl2O zX+cy7S4Wq$LuI@h@sr9GxV0N7ZOO=nDHg>U_hja)H^ZWEm&mWt7rvKCce&Uoh@_o*v1Y zBrgf-8*Y|X#uA$(Rn_5Qr6BKXs1Kg4qw)a^ZdMVv&Dp2HLS^_!v%{M@(pj?5##%Bj+S(t%ZUy51xaZf2a z6Tk+aB`N<^qm}OktS_^bxttBxtzB?liOZ5YEpI)eO) zQ&~JLyjlosCbs{ofFZZ&N>W?};?2Z)J>)Hn{eWq=#ek9*II4v$L+I?c0b8or4qkK8 ztqv9Q8mKQhYGQK2jCArVurh_TpxhXB`IUnCAl^@?U;_cVaxh5$IVKw^Yul!f;4?wi z@aBD`@I?n(1YNzWf^hAmi%R$QR7b;HiAtes0rpItgM!gA5SBlnM7`ZkuYj5GSAx2r zLHLrAyBdixLzUdYC$#zLT?Jw~BI<$ADoY>LVfLkgyd$PWvcg7Ze!}3csul9&X}x5X zhqhfzC+8iMW#xQbAcLoj7#3nnd8)asoSYASD37*9&h&|YKFfFAs&|l*TfSq791={7y zQv^47gV@GFF^PMLCN1dX_Dt0?5D};qCBINSHBX-D@=>W>);9R#8ko}|9yv;fsjyFA zbBBSu1Dz^N=%^$S8f2w|?I3SJe!*RS{EKn}1qx*AF^bG7bq(gCa=V?dgo4N@aeYmZ z+UQ9u{GaT9Dw18YkwNVK{^UAnPh-c&#&i2{d4+7{` zThqMm^3em#>B^jQyn{&}5f{X_V`WOsYb4n;l~{nj0^tX`$djy1LcXMq1BZp?gG%?( zd4aE`8j&PxW7F5>r_ls-S@S4W-NqK=(@ha=W5vP7G^-dFnY7q!Oola+4`SXmLpij0 ziW7F?Ju{$0Y2DIR(Mc98I{fTYtKJPs3D}Yu zX=S!a@SJXv%=5zvmYa7Zm^WMwNNoY1<2`CSf|9#of=J7g5)2K`;teggi@m%$3r5eJ zS(O*8Q3M3R%b2q!K+AZr`@1kN4e`ZN5k!QKWDaF&wrJQW&;g*%Do-u-p}W~EZd4P& z_hxejU?U<12&4%Nqn?(ylaD5Al~s`=tAc)Mm0y@qwx*+nZd^eHSlw58;V>k6CX^om z?{)ThSsN^Zl~mOeAyTU#KzSCvl_N~x<=-)>3ZRAFzjr{2zIy-eQ}6ehd|A9pp*0`* zDp<9EPaB2Z0GBnYc3V}IF)3V>2yA1_iCTYq)OZUww82v-9QBb(<&3ub$yb~zH|UX!oHE!X4mUFoqD*^Zmo9& zGUkp~ zphyJ!Hfa)xF)9wW1`fo9v6Q82&VB2nfCuJlTmsf;qdV(ew}u7N3M;)1_5{ud8yBt1 zQ*3ba9^*^Epbxtwm6OODfa)&Y4l9^U8I&Ylgd`^j;$D1Z$B>b7{RIMK-6|E?hi|?8 zEO4@)6|6Qu7M+`UWyAv;guAzPpUWXmDCwMAC^uj?>&CtzCm5k?Yxh8Rl0vdz$}xe7 zTc{0&bd6IHbEHOS2OHb?l!=rpRBlkIR-s1?B(P&{igT*3;kkRlJU>5byVk|BHANft zdM&ayYVCB^f90nY9qQ2NnsCqSTVc;cNKiA1z4&y&`Ol;remxeT6Y*m46*=)XVXt$qG z@AfgS9A2f;|fX_r`Q&g&zwKz1WyFUp_Z6l0DC%bV~$QhcFmT`be zaXx;hN)C&IRV6hqT;za~2|Qq;5D&okGo}T}?bB=5nS?5|lebu>1rMHER>sj*3c!*Mu@QakQ zma-jTm^HpK#Wxh#v#KpK@EQ#r#iZjn9R2hNmmBSbr8f>I*xE{GiosyiCHc4!po05A zYO`n-MHh%|C4_`)nY4S@)b)}=(Ab;Va8D8?AtrfSPv`SN&W5;woe)VHDcdxn0+SrW za~Gm~R`NDjGb^|0p4^YBA=9uyO=6d!SQM2zUg^Gm|6_9=JLeUqGdi=pIq*#0mt3a0 zHS8iRobmT8@oC!!DG?@y zq4Y1$s?6)G=GE0ku(->Uuf@T!T*tl7db5*CiwSAf5f-*p^DzzVmQU?REa}rNbdzIN zm!y&q#i-8#L`@Q00X8Xqp*em9Pk+y^KSpBgcMBpTD@#b}~d5@?-hHm#E1SzE~=b|wOJ$26YdC^fd^mOJc0X46h;Hcd5-wQf2T2vSJf zG1w$YFgIR96_}robV942eho;iE{S=U)P+Nbt_SfIu7hh&J?0t(fbGLj@u}}PHeEYO zxOL2-gA>>Q2a%o=T-;vRfLvUQT^n&)ggpBURdP4(uz_YC>u-=S0WlYM0@wEN_VoRJ z?2Bl$s?JoWKM7C6iC@3};-8@~-K+Cg@4x30<*VO$`wIRduf90|PcUFQMqaLd*s124 z;{i(+i#vFbnzrI2w$#fA*Mt%dbm`nN;YBcuE#FB#zPPGg*A|q((Tiy-#+}X@eN3UE z?(DWQvDalRcenTh=?@UDMZLM$n_Yaa3r8?U3vk-jg~|0m0h&1-aLi7VM(M6*q8O*J z55Q>hBpUMuc-1D26xjYeC?Ua@mXg+tmy0%ogk9j=E^!!+A%;9tiaC(lW@Ql^s%1kh zopHI6ccdI^CC0jAsnetDmdq>Jv^Tvti2c|^BP<(*skVX&3zDn}1CeIJipNgV*1iPR`ONkk_chR5?j(QZaJv`d@_)fBp8kUVidP_~e`aVuCa-RQcNH@85m< zA^fP{zJu#P1NOgr`y!YN$twmhCT9Z)D9i`P%o^(fX2@pRf!jE{at%16mfG|_u#ihH zSR>16y0z^={E=Q&(re#YpS*mk_&}S;<3D$;*f3H7HrKigS;qZoJbzQO#G5~ewZx}o z%3dv&0Ts5GF7ta&nDcg1>}?6OUJ)+#b0=^cRw}l`Lmh*_&3>uz_0Gd_%*rl7EcPH$ z#Njkb*LUTLYD7*pVQ4_i3`0GDe9Qs-F{M=9$LzB3Gt_z{C%iHi(Z$+L(SzU*4VBKd z9bdRLzRlh1E3nX=wI2YM$H^j6erN>G;_`&xx_8dlxv9iiiDJpN?5(e1C_|x6Gf%l3 z;5^?Rv>CWF#deblIPZiQLzsMGV56yrSy;Y@f~9{-!s*n4148lXEvzLOC%7}6;WBMb zjFNEW9)-0658b5tb3Vhx=ZulA)z3h95G>e~_QzHT*~QkHRPZd3h)?Viq)o-3Q);$z zJRo2h@(1zYTr`*gSbj$Tgx>_7bU0Qm1wUD=pcs2d5v-(3J@6})#Bc(+27w^9hMz4C^ZgTHg^&{Oot$T~28;es(w&$P{mnEPV zLnVO=(tBarQj&kUClw@?tSC3CB9*)$T`p=3BE1B+Y)!Zq%LO+8T6D6`K}xYNDPbw^ z?tc0-^jxFMCo@H*mrDMHa=cux^q!c;NjkE*!TgUzWa%xzWSrs(@y9y!TQRuhfPE}8 zmoYt5i3qnu?zcmg5b9B+E}}f{czIw>!Yz}qpFo(h4RveUX18t7oLC-=UbHGyYv;{# z!%1sE>2`F&?j;3R%f@tNaOk2seCdSH0L~b!AfD9gOKRyRXJ;K_iLYA@KK3a9RxSBh zqifO6Ms!*5hiwIdX(LE{L+TF8f!RvbMD%Dnz{yQ1?}4K=uotN1hnqAQH4+yaaUF+nIzN;DL=wMZda*6cFIDnm`}rIyH#Iz%;3OL!Vo3a5Mfn&DVu9p*0r-}ec&y%#vD=DP*}8;f5kXHZEgrEXfbUXsAkhDLVCT>krv#eCmYR0%Ch}* zt}Dq8^GF3d>;ZHQ0JS$h2YRO23`qf3IqIUBmBxvAQ3GBO+S!4z40xp5qwHv7I2ek- zx_L=-D7`#ek8UXT=_w+D-QN`{r!$=576j}K1Hf| z8R2KuLo#Z^>K(osz@3$Q?Y{}%D0#66uzzk3cNd9&sq)J)bSvVg`V$84kh}(#wiWr# z#cjYRUsks$dKA9qp%5Td!Eq9=1>S0hhqP(-sjPA;4TnzHvQ;2{n0*3IujM8g;2?z; zY-e?yEbRilVZtN|D{LZRp931O)R6m7%kk&Pl~r9cdN;COf+_`oQ0&J8#sgRPI_R`7 zGB~wPg-RH!dSoJb__2J9o*!`F5T-t)3oJ#3Mt&Gru}_lRSjzzezOL!{iC(_#Rj$t+ zNn1d34%tOKKOFC84jKj@-!8#t3EN(w~*ri?qTsqBp1lMqZ zh$HsZlHY8clz}FAVQL*fWwwyjnkq4VuXF^fN9aDP0}xy2^Bn5aS!oY^MsZnn@kTlb z59f&Vb5Kam$nDZk^M*W!b*JN4(~S@plRGX>4s^i*-7S*nX@dk(D5cV!Enn+z-r_EC zVUWY97SJMFh4dK;Z3c3yR9UegbOO{&u>5c(D zW)H82GEdYB#F4MCcr4%fN%-dJgY>iisAHzLuR{3?9q(svU)qrB^x;3feIHU)^7k+0 z|9=DdWBL1MDqSTPWgz?Ee|!736nG7XRGf7yn_&rZR+~6GD(2xJ2R`J)Cmv)QyL&#D zQ(<=NCAfH>Bs)KLE)`KBK~fUC7&%fX=u-tffl5Gr_}1I64>c@+`>bl7VD-x)0v?98 zDU{fsl2q4hqc6wSMgk20^Jbf=sU~f)x`Ea@qOl_YVyd)rf-e(o7Y1P8MogQmK*qgq zhs?C~50KB`piH$`g%y-bX$g{x>`l@fcgvv7i&yFO+N@* z@!3G`Qs4LS0ns)`MUFeAE=HvD16JN*TXC0)gbKAy z!?Ju}azqcO9-#VC^DhqA2TWkPk+CsKP0`V{4c6%-Y&iZ)!`*YrC5#LDWYu$~p=bmp z+iLRjmS-LJkt}oWHq{E11m7;UGZ4#GT>(cQm$ZkA{Mc?aHxsX8LxE$;lvYMmNyBCu> zi*59lj#rn|0W!?WmBK`6?i5E@>q&Ow*@4D6^Vb%6$qI9OSBc z1MHo15uU3$cm#R4DPJt{v1*}H9{@d!1D5o)Y#v>Jclu{2f9dnD&iZ}nIPHAQT?@O6qcMI!c@o92Q8I$TmZdtq z>}{7uJ6;SLQLd%>XUbV~n^cHOLfV&3tB*0)%e)=@$KtI~{sVhP-Umu?ffv^#n@De3 z;%fO`o&a@86&Fy)OA9UOQZ7L;pRI0O+=f#^8j@P>_j|*J1nw$Ta^e;oGt(R!aJY2# z4cG2mdO7_TL($rQ0DgyxEVUlUQ=0r9nxcxa4b>y9U&S4EkoB!{wZ#9 zrII1hO9dcQ6jSbKHgZg=Hl@E5HHo zoVYcvPbwofDU{B!Itu*JyL*;gighBmME6<{bh5^#8-N^HINJfD&n9wPI7HwNp|FPY zj6;<6bUD9BQI(g3(Sps!G4I~xuR*=_;I^db(G0!#Q}K~3$Bp;8@~VvQ452`Ioj9}Y z^K8&$SJAzZB-ErW1_LO|hZr%HPJNh&RRX}B2^c$5?|`bTj=AL;bQB8J$^mLPzZ9e_ zhCE0a*OcJi(Wjo!E~8yj-{5*ve>5mZDh(47mc4<+z?PPeQodtQ<+VAIhuJ)d?8Gk6 zRx)aH#nR-zdtOBQ3G%D=Cs)N^+7|2yIsX~7e(aF>Pj5dD=m_}e2l@z4BYT(ReK`C) zYT6da0S)n_gV1%yTHgSaE!vE*m z;d|P|rkkaDk6(%0X(?~eubQ1wT`QV(J*jaCP<2o{I8I`?V;c`tZ_N_d$frC8Uer?0 z_tS=t>*5P#lDi(o){CA)@UgQ(!a@*^cauG#yTg-KolN6kPExI11v!fp z0T3@MHcFpbu%XjKP+aR-0KeA4#7%`61mrOL>AHu>7tTC zTVL=&JXGy=0l6smavvUbnPsSg=He&FO~ridQo6kL=4J|o_hTF4bf~mTpT5`*`HJeV z-2sum#7OT2uu)Lw$bF0HIr{gdV~3#Hg$+nVe2gXmw3m5RY@nR|zzv@_7)81uR~SqO z=-gqZOxGrP2cWDeIVip0ClnD;U6YlsE4dvoDGNxzNaaP3#yA_mc81;w4}Tp9sGuuY zn8fTfskYTv=g{NLO^wiE5Q1DQ2{at41~_T8*m#mPuN4+=n-uUsUo4UVR)Ncz(NYwN z>A*_4=PJMq?Ki3R1{l*SZLZ#`s<$c)lqb*<9=1$B ze*3;Fk(@sK=VHI-P4|-ByS(t%N|}& z4;7z>LN;N&Ywn+%an_NyX3U$r`~K5PJ$Bf~io zURyVv204UiUo=7oX|p>9*jd&@z*0Wx=Yi0Z$=!q&=8WCpU~fkcxkzrMTu|fCaDX?q zoB|U6nQG*HLt~Y2$tz^J`b;vK>)c!=Pi_WMxXK+GULggUmN8NvI3#qw1ekN2=Gl1%uj8pntXYE$9l(mm^MDmKH)hLd}EphxR)t% z?~tVd-~@v@DN&$k=g&F~6|l`E&LpAAXW!|cb;qO&%l9~VeHe^ zgRe$d=1{U$zalSqN5wp3NrY0Zr z9M$WY*K+b%=b4paZP7U2p4Ou}YF-9_G3Ce1G^~J{n;irrBmr0Xv>wS_jAmd{3SD%` zGmXfkB&c?&0CVenQmL#$Pt4;Gs7ha=Zu1fKZOn2<+|ps4c#8l5kq>#r=w>2tb@;Jn>@uuWTTG@T5p8PlJd_GGH zQIn`$V;ctXbrK;Gy_T!FYvCqQcCeN);htxM>mGF{Jcp=ki~66Y;}}HsT~Q(dTVmJ6 zawfJ5QVb~O;6+8~NgZ0djR4ZCp14Opd@JJ8KMZfbDbIfP{`+T^xKqYUUz!O_X^-Rvd{w}Y|+p%kFXA>dk>`%+b2r_rWsTY7PwsclX5F9 z>Ly^v|X5`4eUZbrTMOv`eHoB2e&tt_)%drd4pT3eY6ZaxmqJ#`N$5<_|QFF6((6DB;5JB=FT`U!n$deoF&Ekchk8YI?}r5j>4RFS%4oMc4n8gR&~8CbWd)2Vx@Z)WK)7{!hgHSp} z+8IDMER9YbDnJL^Vtz-gSQCzz#cdDm8$dYam#HqDfw3wm14kWE9SxcsnOH2nUHY8a}FwId_U`Z|t=Mz4cOP-#_ zPCkEJk_wu*1jwQzb=J`}^l;0i>VeKr;6NyJ&aD(*%faZMz;0WgCbj7GUo)grc)LlF zt*jOfr{F3e%v}_~iy!V89qh@O;Hv|a^5vao_^p*Uo6@bH? zd)s&L&FOo~%h%YVlXo&gm8^{E);r?}*=an%GqgdVS(~mTDLG&q2zlTj5$kk?kk6;9 z238&+~hTnx&k zUMeioK|hF{vzLPJ3##HyW!HUyTr?aT-=!~Kt?N{Y{9bC7PT`yVZr~Hl1tg!TJ+Pd* zoGjPijFSsBC^mTs?Q~?@-@W}RJdx!;Baq9ak$w+0p{1l9gE=BF(GE#0-o37rI8=lN zSO`9!+Msp=+W50|Fs5@DN7~!34o{VZ{T*-9n)++Gqhq^ypD^MQ>~Xx^wJBj@DJ5E(2PbCaBeENOUc zX;2li+qmW`>gie)dO03S*asQ{8m^U8ib;NAONE;V6CE-Pkn~C1Of5E>4FOJy$q2yevr2pyky7gy}s>?^eC*Py&b!e7~VcjT3$)X(g zh_@q7F~gKXamBXYM!5)5z;uYsh|)gA8*N$SV>qLADi0--5Lbz&S$?4fqFWrugZ|I} ztD!#I##PD^gP~%UQUnG77?h!r`^_DF5vj5EPZ?)0$$Th4LEkCyw)Ify^)D8qHusXA z0KRpF=t&(!964E|MIxagzntY!Ti&|jUu0|x$h-$zA45I2lx_Wn6^zfCGV%SWGdpWd zr21UdvW2BN%$g&kuL_q<|GogPA;sH92boT3Z}eDf_Mm5gp&(E(Niv8CR!= zU5eHpAGTeiWxNwfr1Hh9g4Xz1iBOhXCE3f_N%R!cEcq`fxOm24zSZbZT#A`SsWBlo zcgDOtb6CgMQ1pkFBz38A_(T3l6EBAr@MX#5fx*?UPY)fJTLrv@>o!zuQL0&u@;G!- z*-I<1tE?WY>J{M!r#_l6vv%*b*_F`nmM#RX#!Fc8>3=LS`1b@^6?=zYvNHbMo|Ojn zH?S@J@ZI(AdUY z$*&#6zUM24LBO5A!CY1+P)M7B7a+=i;+5D4=;{c2&Vr;vTT_*3jCUnYa{r zm?i}~Ni-9FER6*i#mVk=2nf9D;$u1Z3$Q#iVqi&WDmfuP2rw>Eb~}0PkPQLN9?h)s z8qz`Ty-Mwcym)scQ%%rvpUeLo&!pQ5J8o_&nv68HIeBn~>>G+>LaxEj3WO-B>s-e| z=AxJoVi(|`yF)e_wu7i)`V^PVSqFV5?}!xfE)EEXKg!d}%NR;}vYJ(Dcd}{2tgOT76NfsvS!KnijIEyRB=@Xdq(3+Fa%w?A@=t1th z^Hs#x3rh^MAFgI0w+PWhI;nr^&m<#c_?7}L{}dJ!lKJiXPYpu!yXUWd5k4sov8(Lu z9C?N1CctBMa=)T*D!;`Z9wn+Dzy(JfqPT>Zz1>KU(G+^*m;}HXj=y=MDXzlYv|f~) zmQb+*omE3W!`%MTb?AR?OS*S{1D3)SXnJ8g3ASbEti*PG-Tc-_HB}G^bx=(V@PX_8x z35;VVshYvcGPOB-o{F0bED-Rz&1|9d{ur;E*WpgQUIshfjM%d^pG2@jGSB~ z?^-Mbp&0|*tjX8X9hRa+PMFZen~L+;A&r3y3Ily36yq>dgeP>+Gqy{NjSBsp3Z9U` zF8Gr!hH`;Js|@%_1fC^bfC9+JQp29vv0nfkYtSKEKRBrJ*9=ogbvZ`*0y=3_` zg0DoAGHDm+z}jOBa)~Eg$|h%**fqCdq(o*)IlDWpOE=^P@R3t+iQ1@gYvmW-an_>Ihq=+MOX{hjtpS6zzp;{f;0&?lN?y};v$z3C+CKH| zl>xo2F#QD)5*)xg)d(*gKB;spPF3dAkAPNHmC$LryZf?R#+SDGyg5Hxjmkn=It-S` z7DOA;yIz|Lr`w_hg`f462`kz)az=|Pq>WD^573oV%5SFSpj@|v2Tq)9sMsN|J80|_ zHeq>YjB?P-n^v+G!Bc|tr=&b$mof+r7O|b4XOSqu6+*gpjmZS(wVz7#TMFyZhFHKt zZKSAd*%P@YTXd>P>@q#HP7QdYwJ z>oYfB^4@=B-uXMJD0$(}N^NPnYkc&Rlf>aaz5TxY8J-^iu<$cL5PovZaN*Y}oudjQ z+Kv2Bl>@heh7^2q7=qk1w`f%jraA-UQc21M#46vo8d31Ht0tz|x2s@7IbTt4N*j(Ew zvx5$mH?$Clr(%s#!%~9-(x_9Y@wK)bWHR-K7jf>1A8cydk} zxv6e9AdirBjavxN*m`j9fQ7i{5n3BNPJ8*V-LD!6*p{-&^L?JJoI~B8&{l@D&#q@v zXUvG9nay)!h84K{l5($Aras$TfajKTqzVbctN+K-s#LU@e-(s|z zB#EaZAF3M;-&gvW46Q$=o8yHo}W0g*Dy(SywQ-iNxDhpjRpWQ zIluA}&fDTMq}Ar#Fcp>WsfZUWnt@i8OWRYBe5;FdX#qUBL~6X3&65NhIz8W(UODiJ znDW8Jm&*jzjA!OX(a)Rt&%(c#z>*t!Img}bML3eccrl!SRI;Y%aZYn<{{qlI4_lPT ziAjkI+}V)C$MI@YRr#`2ibK`% zLuS)3g-9_S1l92-%V$;~w{F|g-IPTa;nur`#hVf-ggYZ}s!I!O1Fr6NGc7wh90(t9 zf;7XobyEtRg%fTWyMlr22<0ij{kTr)E@(@cL2*#nP)QEjhA#Es$T$QCgKhWXg)fIq zl3Za`qGj2rXam}ZF;8!O^ptiB=W?F`3;3c;e~QjY0jl=ol&e?YK&P#M8beed@SYZS zI#i#5Ork?CdItG?ROk)ORL>v-tSSJ}U@dEc&}MTXRCEOx8I4nH0u9e)~Q;+aJCEu$0Ggoyku7X<@NIin^D)%&nlB5-M<2n;* zT=H3NWU{?&nuO03BaAaJTN` za>8zZ-y4fBUii`EC8a z*90MXX?{rElv{@KrTCO#^Ih-WFVcx9dDgf_@7z;=z7rVM(vGyFmI(R zBnY=JGqA%FQ0|o0nP|i0gGZdBlHr|W@-zv>%U^AbA=S+a+*0XFEyIC~ci_#i^_6ht z19!lFV9jD_Px0%$+kZZT6^2dPH4bEFYzGccvUEGnPIbeOf@^XpI0E*7?r0ZJU#?!o zwd@+Ln+aNX5NOi0wknVja!a7Z~9-!~?+$4wau_1dOB< zgPC!`zOC5A1ZY(+}(Jl&nU`e%twOl_L89ks|NgX076%I`;+uC^>roDDjm6Vb?AL1>a!uTrP(5-Muxr5dP zp}R_7fbw1eFWpYrmv(M-pV4Cw!aR0IQiY$p+;>_k_Sqx>h9PjBXeucOg&uOm!?Sob zxFeDpM)p)?*(l}3Q4h{LAs;~t;hlm&g9ID+C-M%Mf)OEi^7;Tqm*f3HRE?Zf@@DOa zL<=32hgfaF`bjx-&goQep_V0Mv%?+E6Ja(!W|u8tLRE$v$uaE!+4v!a(dDuA2OGtq ztpfxE+6aSP+GU^yH| z%Vww=QibRIg4aSfP3Y6n`<<-8!sVp!i5y0_Ip*u;JV+NPE4~Ia(nJ)%$xL!r>~~HF zA!EJx(0J;AQkM74W+E5Z(+y%7lQg5qix<47)sr1D5V2$CDbAeD~B|B!}bvUmXjV<(+vH^?S|_&Jfgz>sFt*L z=%sTwZ>Lm)OGC%wrjS!h9Bo4t=IEHgA?l zrjDQ1l-$%bPu($ymeL_pGei;ZQV>fo<1SBL>JO;f?u55x3~}7yVpP(Ft7_bwT6>$q z*$}9>J7ZHshFq8Ws!76h5dcJ>qa|ReV_xTE7#%76PO2K!VZ$HpF22<2#5B)5h|W=o zkmqDYY*N|QL;;ZG4XU(Lme@7`bQiXT0N7xT+$3q}u|2LFbs9-|h1bj>f?P_89mS}; z?==H(R;dj#TI#Y!wjkQULg8W_3L*x%fEcJ0>P5>aR=N+C&)-WM5w6;uL>JNOjGs?XYVar@RwxyIN7NQ?NHY5U0L0&%#lI(FGD--EItw*{wI4O}uZyZ@$}fNZ{D zQaPE!R08*TF3}08$`V+>u9wfXJkE#^ceD=Bb+VvUojyyKQX*n?5DE5&O-#}4x=^g^*mA@( z*e~@dx?tA73V(XUu4C6K0$kD{+@d{}pZz6j0U)FuPX$f?bG(tRW>gB9e%Hx;8PWVRUjL?u|CeLtuI zV@d*{QZ=C1$Qd^3k;CbvF!_af`9X!<0pHsB3Dh9uja3b3UdJ{{r9Y*oaJ)KBgV;M9 zXuNm#F1Rbrc!;;*K@GwoI|evHN_h>j*dxnJMk?$u{#PjTY}^E)>KVgc1GiKc!f}Da zkW{|aH64HJBDLi64fuj~39Jy5?1Vx|k^q0-qYflyvPZx9&G5}n3ZC|p@aKR2d@}sR zPln^!pX0nR8rYA+`%m9L)2}^Th6k1tYiPDAdgr^%zUSzwP*J-awQzdLbItsKinvdT zu~lPI%y#X2mxt6pKH6Ef@Y*G{?vUdedT`$Sx-f$Dge_P4s_g~Bv)hm>xI7$1^GHn< zWoCsm+$}R}xo**|=7P|~F%e!x)j`rOt5}K6qqwi1jmJN3x;Nx}USfUdAi=AgeGZbw z;DFfGt&|4s1@UL3dLL@vX@Vl})5x|57&LjXVt8{?BkL#ddLj0^?&e~PQ<$%W9a|Bc zSOC~uHYGp9*JrY5gq6m*PcNOE4VJmf4m^7r*JH&VjX}B_^~dDC7RE}us(Ve8(L$1z z*SaaMsVUQcfRHBdPoa}9z3&P0PGVwUyrpnSM zB8!#_5>tQ+NZC9&>_^r-bV2t08|l3rF=w2({;Fwh{G zGCoPnDE~_S3k$EU!U4e%wDKpZmbI!$K)GJRK1$_f&1`|W`UYdsjXQa?MzHLC0=J|p z!g>xiqp4!5t>rrm9JFAlfbF7H%xcBd(l3k9ST0YJ;{QzRMTgC|F0oPv12c@AG6P^Q zFTL{ZfvUkhqEoFW`sbhxv2t6NCp>U+9oEzM8m!foBO6__#RgxG~4_z!}70+Zu`2RLM z**|{&$@1d!_wNJ=qk4%iAu@WPgNk2-$o=1m}H{@O;Hj%VOt6ml;1?`Ry)|@?9jkU z0wW^TEH+ogJ=-O4(G}4n%N|~L%i!tQk>Vh~A6VY*$yjnN?x-D)Bg}+O3yNVZsjz{9 zFz*H2n3XABf{BL;#zG^Hlt68FxdG@JJ#D?txHrpL(vhQ#@7bRN+-m?`Py)=?U<$(( zs3Nx*R#Bu9@)^np{kT zX=J;}XXUx{lD#3gME%7UPEk}JFw=Bg`i{Kys_LJ5`a|fL&4skin4MUkU+2Po0p$Dc z*4IVq2*4o93|1LHZtJjd>Jj0(`>-36e~S0@)h1O`zWW9z`NBNbDi})z&N?jCkxI32 zyTn(mn`=r=J-5bRzW=y9_aDRiZ$JD;Xz1?6u||HzULTAVt#B6|liic9dMVm|KS(pk zo14A;DpJ7Vid1K{;^S}d#gVsa$FO{rb3iJDXGSF^V=bJfJ)+de1yM6Zs@}gm70wz; zU9qv?PJIEYp)!!$a$qPYDU?dKK*CS(dKs@u-#iZcG10eYte{VN7>G(@gsuwV5yP@b zaSFqvt#=55VuC)3P;|PEPFHDHE&sS2|s%ma_X*`Oai2Ukr8 zOn(y(tqu9rA=&XHh0uf3ZyCABgZcm&Y_mG{OwXHR_{{pNu7ZCWRcgUD0)MKfDI_Ss zzSY8a$|tCqyae2+{v6cwYjT;3`YIFjBDTkW8vgWu(2GyPpO(SatDJGKs!_MkiFR z)Cn`ZW~)fy62%?ovOveja?BaS&vF^sQEE@M!j!*T`2w`xS7$It&W4|gTR*@vtjKJE zmQTSD5IKQN;LP|{zGi~dowQ#H|Bjv>)C~Z8EFa^;1n-te^zc*#KUKriU*&8I4Ul%Q zR5P+Ps8>g?Rx=%@m6+(BLMDeE%rUu!}miFmRa2eT20m zMa0^UcP2Qy)&R%BJxjF!bfF?x< z4M7rFdIPow7%W{lik2g~O(cupRqUatuh=t%&?zM)QCt;jhk-Pq3SPK!m|3=z&u+>e zGd(2_e&l%mGiccU0|v!E)g95d!dsaa?F!qooEQLx!mYPnwpLZRpimCjqJD$Chx$5n z8(yACFF@7KlCU0NGPq*Fs0P{Q!8pwdq_hfi0{(5@#-jkmh;7A8b*8S~{K78EB3d_h zFzzsHM7)P@+; zmAXuDy(4eLa8ei}SF^g-p=Wihx`to*I!qT$=RbR@d?$7`pA|jnAMu&Lmv}7Ke+!o< zvt}&mQ~IRkw5RmCgQLT4Qtpsi!ZgyI3ydvrX)V3ZB)Y-qN%IE34-21R$Rqh(5(BLC zR=jO5jPiN-Na9{?S?G76H#pGqYf0QBKP^)INO^zZ$0Y}!%5^T%0$~pu20Cd--#Ez| z>u#;V2wh`)i2g+#L=by1LpW!QOx;u2=$@t(VqHsQGpRIGmw+lHK=@8sC7frN1>aml zXoNao#QN5nzfn!cKC<2{5e|~34J}6LX$_EscV(pgd4H^@)b!l;Nl?o>pV(-HTON3a(Jp^}8XFBAIh637O+LQ-))Y&fqHd{blz1$C6+EYa`qixE_W zpiQf!dpX4O-Qs>$g-@sxTV4j#C@{?fE+Sc23Pw2*9tJ|x|3->d`5ZT!x!f0H~R4r3CH_=`TQ56fFUgUR*^88uXjJ zZ;;(xx>}_c)JM)jrviT6mbuvbd2FNa^^sGHNsf}Ym#1WEJK7Se-;of0|H%m&uH$LN z5F@q}E6DQ`R|qxX;&x>Z_bFL6D(I=8U8tj%y6BMX637P&i183{hbA>f2LxXXxJ$^* zk@K%R>|3Ci2w?@ECxdxL#->{95Gn~PH8L;dSFZ^hOf0;WeP>AE2>E(UX;n*@rf6p# z1$n}!R4$u^%eip}EPb$$E~2ww>&e|>OH|yITXg26oKA7F>oAym-B9rbNi`(pFIm*^ zLjf|Ek+U(O_nG3!x1E&^;7khx>Jj;M`MoV^f+Rw?VAlIjBkI*uZ5x~XtB(tT6H;W` zYQ~2%SoF<2O4N{)Z$7}So7B_tj6_zLE_PsmGseL&x>2iCFY!=DyAZ+;xAgc*XXU|y zOl|58bu8&j-#wOiS=X+Rqy@de`&)HqK z%MA8;Q~{wfn>0h4uOR#E3H@Xw=r=n6u&b*%m2`X7Zl}pNAcF1odt7p(P)`3; z%B*U{4j21C_@}B)l^s7xp2+BEmW?~wITY}k#XS~IauW98rML0XqMP0uJxv$jCz2A@ zIKGwY)4eCUNpEaBL}1vcmxV_DWZ_b-urwWbd8J7*it(iclF$mBNGx^!wBhY9V3 z;|gnC;unEPV4jf-wDp+kk|uyQ;Mnhi_1$_j4M6aQxQ)sC~QQ%-TVce1-jq9UhV@j&<|}>V{^PTa3~; zD@#7ry#Vgh4SreH0cot;h_b z*e^^ZVMR{h8OF?)P6bQJeoaFSS9ALeQitD@P6Kv_7iB@EfL6M5nO+raJcgD~1cU_IysO7Mi0FvXjw8O* zo}{=~@xO8|WgVB*d6vrwP}%>7vNu_lCb`bU_W2Y}ZknPsp*-_+$jFST zV#vIC7qo6t(n1@tcTKGbR29ZTVJ-p%0x-M(#e3;|$Io{>{vz9CDg*u-nRm<#_v2^y zhW?xdoM^WMSsDms5?LZIWif@AzRQxM(4&yD`9Z$y=-y$T-cVo=(FCw;04u|8L)K4r z7%fss3b{?Un0_=`2n?u+_(=v_0 zu#2~Gg2M-_A3JrZTMU&bY0Us5$3^a)Ewan5KXU`yW~6V@MGj!dLg{gDX}&hS3NTbQWLSSvr_ z>JPM&^vVs1by^e`7Yt(z`cm~OX3OTdl1I->l&a#XQ^A%5^*+I0as)v*a!sm7?<>dIBMh&V}rxu|z2RlJhSfJOCh z^QF8McOzRR_%hE$lV{p~gf z$Z87_#(1{H67*@Hoh=3a7OuO4*b|Q6l?VX|VdugL!^o9iyu!(M@LQ~)=bo?7SGh1);eM_d;N~ZQH?*Gy2R}7;ho*0k9KdUr=-_Y0mNHz!+LyrM8rTj! zFz2y=h@EB#oJ*41js}ESZ=n2<@3g8P=1$c5^dOQ)&Ae#8_d;+rxJgu-g*n`q1$3OJ zDtVua3t+-;Oa?U1ke-yKJ5N&G6k*v}w)RFq91N63=rHA7AG^593y}({V>&U%(||gg zB6G0S;6|_HJK1B&^Zng1F7o~o_Ku-kJmUf%!|t#Z2|g#hMZb{+G+yGJ8nNTH*Kqct zm0nV{4p~?CMBWA1&0T+j?t={jT}lT));9K#X&cz&wRG!7{)Qe1PvIbJLcxdO2{M&Hy!7U?Pz_XMy&tX-2TtUxcerK-TbCo@wE zV#_u_H6!+-!hB)NLv?8U`i>4`g?aX5D|PyJiIsMweTpelbjxEBWqZ3^y!0V4D&?`vTl^!w|L?XR2|KwSF9CD zg?$4l!F=R60^zYa;k+guba(JUuU@y3+YPV&xTqn*{gt55Cdi6HU(%(SZXMF}*ihnp zg^T0nuf7YFH8>@^u_hp-aU*ds_u%dXt-OmJl8q2&$Av<2VcJh;%mYoQ6}h)%M9JOB z8cAKf`@ZZ*M4+dbmP$QG`Ucv`c_a8&0rl<0zXk1N1dF4ztu5eOUG zW~L1vnt@^NX2;QKXO_vgY6Ndi@Wj|3vp{r^jO@0c_0XtYwm}M#V-3RDsMW~4Yz0FL zfwlUKvnRF?u7fi|K40}GyV^kp zK)|iA?=}D<;1rA2f5ESq@wdZ(Fu+TI`MK=uMGDzbgJ(5a|E1OG4f}SJ%3jhqw3TQE zFcLP5J(F}Yyhjv6-pkcts1hW@Us>6KW`pt;jP%h~hRBVcCR-D_hTc&B(o=yf4jge0`}Ah4Oh$_&`EE1M*%^?4Y>~Gw!sjwjr++Sw^CZG zr_dAnMvLL^Rz>(bEi}2e?iy=CpJ%XQfC7fPw;kIBn725Se1anig&{}f5-fX-#d~Ip z7ejxzPv-~eIRO(f`!IEoB?bo<@;ZS;8!ZVKU8@G_<%iN4?FIRw)S;Vc5dai+yM(u< zt8_KmGv8MUBX&~;PN}j40}uaUlG?cq>?7YGEo~D?$#$$RuEW!=P_#|HyRn53rku_1JvW7j;`X>N{VDCy^L+OV1XLiJrtU-(5a+J6xdjNN{EC) z72H*{3q6%9gqW)dxdHGTw#zX9)SX3-(R!M0T~bL-#+VutUC$U)t*^eR4pFd?dL6Hz zf2tAuZlfd=)^TOU2&>HjQtyNVXva^2EB9KZULIg`1|xP#8YM*$Mu`y?^zh~@)j!x3 za`p_W2uCrw%-DYanSHb}`O8C^{`MIR7xKmL56`}NTmJX|p4Z<&`8_A~FZ#AVD%$xx zqFbFmoKSWL-LyaL@?Vhudl-=8#)mDt)P$<8{SBv|O=&ENX));F4i`#F!Yr+K6^oZM z*lP3WMx2nGEI3}Lk)jc|oRpXaHNpscvV0ta-q7lsoQH>$PnoO>H&4N^05kkiAvG(R z@!bngsgEm+i4Yjj7q@-C^g-2C4Y@b5zo+``?6E_uv#9Yo$9(AgmBZw`^Cp|@8K$5E zY7@Hrg$FOrHrj*oR&S7-+amFKRQ88Su+!yeWuNqRW9@#6$X1OdwyTb8z8)=rVl*f_ zr=Q?f-x1^+FOn`>Qib_2YF5j)vaXOF^_Pp)MVF-DL632lB(KzD^^3gy zo&dd4Fc!k4BP>om5mdbf$x5WQ1|qr)J!#{G**utKHS+OygnjSM7TraxXt|UuCZBxS8xXTIK?wB)MOB><= z2Cwo_KFDxA;Nn(&}s$iner zTqiI`HG*l~gSyHAe{VPBJnCb^8;`rnoi?ySj5rP#HD`%mGS6!vbp5 zwv}=pbM^)4ERXj-&o(I=(J3~uff|cFk@W~`chbZWe|cuj&hT9A=!DiF`vQ1x^KOJf zve8~|suqG>ZsQgy3<_Nm#;NRw_a>eQkK0*^U&P_}cP0Ol(bC(S*7oW&G!lQ*_AZ*B z&^>_nk(uB`fyAJlspmx!fuZ<;f|k{kYV@4QDo8H?>0^Ug>aW^;ylir$!XO9}LlVm} zw-X?~xG(DQLsTD_P3ehbUn!9zCL0 zC2H?B5{lHzO_OR2LN1`cD~~>Zs#^-x7Dtaaj$(D|pjxw>{wDly=KCaR$X_v({pS65 z8G`(?@{DQ6{6Zgm%IAL(-o8A2`1`j%2K=MX-a~IWL$dQU2PwQO)4)_9L1AtnBFWj& zxMWX04YQr+D>`q1@I_@_M+zkZ4oAxKdiKfyYeg~#exeEEOgETW4YOUv4^8F#Rmwz{ zWpVlhq2EH$J&<<_gug{A$!QTsUOg%yL{oKThKP9agvk0u?*C9rzV7BPX~c-%&Nb{U zM$-P^o&x!Ly7559Wuc=Q*p(}2;8J+Fs1X9upwzd9<1k?TER$EO=}<@7Zw-1wBJi)4;~Y5vXT}il!(F{3J&YQmYLP)4fnlHb`aw7|_!!RDNk4AgGnm?L{L7>BeDWh8asFVg&nW?7pn5w z;(UPx@-H;&Ru_^4Qr=uRgiCrB3_iwXm~7ImWl;kG%PaP(cbTQ^269*FCknbvYmHH0 z^dfXrg)nO{srzB%3mr6ZU`uRJ>sDvo575&^)Qu*{IMfL5#bRyqIoU{v%@Ap$g?>sn zkSNt%P(sXPs2pJQ@|Ci~*HcDT=~IyCuBh&E!#kt>trSV`zonrHK5rj_1zmYH6DR9{ zQn2?gj{vcg_>ir9xv)V{{%Mc@RaEC4!)s54gYEX}HH9eE!AEPczQ%_N-{(^44Bn9ctDPW_yfb}23 zeaf8#S4frU0zn!!21DB>WdiN;OaQf}Y%bj?*6P@iqlkj)fn`<%9_|MdO?`TvhHE9k$! z{US#gaMpK7F42Vk0qd#FS$vhU3ChG^u^jLoZAMxo-$2Bb#8%#$r%IJ;>vb&cRN3X{ zJ{4)y+1^cPO!#!YC?lYLxpy4q^+)ah6~pZU1KJkbKx-ZnIfqEfTNEM)O7=&L51>R!51_BeE8Rh_5WMg4WWAnzc&%VQ79b0i=g8qM0G zu*_MuwFES4Ni3i*C;*Cg5l#2{=lN6-9x6C2#!Q>+d(21ju3x>km!jzxg z9E=abI@D^0QyfDOaHzj5C9=}ca*&{t^FbJ>S};(8RiINJ(gR8m5;(xLR@Hi!Rf1An z^Bkk+j}c;j97_UrF?eV(_{Lv{|0TzX|2w?@5WdT*l*AF}%Zru5FQGYhEr95dwdeB% z`1hbODj$tdtiV7ioR|?mx&+0fwZ4qq_G&ls0Z<@hpsZHCcXAI~IOIuw(x;QI!X3&r zbmz$CI{kF8K0x-SW;@zE-a^*;^}t|ze#3mwr~ZJR6~ylZV(@C(l zjuPagIU-Qg6?&GP^rv?OW5v@d9kn-%JohvrY$gN$fAb|YeWm9odxFiBh;v+mr3HVEsSfst^$CN}`a z<}gzCCazQ(KnXayR`&05ke@?^9(|AxWhhyFqt56dxy0ZM|D_?G7LBqrAxU)MkQ>Af z%T(FWQquj~HAtODTz%(k-LcZjv{aVh7kY~?Dd}tQhcG6x;}oVR;iHJqw{rP)ZyB7 zl5jS##TmEgu!A)% zO+ha;+QT$FT~b+=O=V|bX5FH#UnCZ4d96y$d*NXT{azOA&>@5D)+$C%Db2*$>2AV6xAW!j$axQXKA?y9Xx?k z3kS+^tTq+Yp@^OQC+TWDefVzx0{!FL*QX~;(ydF7B!T1Et9s;;kAqdnso4{UJbP$6 zR3Z517YN5&o*mQ=7RGasUdfJfD4<*<676vBt(BJ6 zlDamyN)Ekn0GDA$jgqXBDj=P~-h(pDX}(Np>|O}#k;AZ4wz0idl_`48t8@1nY*?R| zjG8JDQsAPFM92>NtK12c0u^N(Ax9x+pw#9!iBLW4VHCrPjU1#l*r@+9fK8DdS18Dw z)GSuLAq~{23T)JzDiX*r)|*g8V@24+s8a<~8>VRjOu{a?$rAqH>p^oU9E{Zzx$PEr zF41l0B?`o#@s?t8CZ~_>!NOBVI^r{|28FEUq8hzx5YOf4XY~t*97n9exsU$G7~Bos zA*(jWluwZ72Jh?D5qBW3+iu*`dPuSr^2Lpe_zS%-K>7Cq-9t`_e*KO?VKcZ6Fd4;KCYpBvkdyy*rCY-1 z7;dU6v%}W3b>{PdOVYydw!6k>(>*NrLdUCHv+7O1vx4m* z4m8Ssh93fy)Z_wvtE#fLd5a1Ma2W&d10m-T598mIEaU+XBYFL~mzP`taBO94w^%iT z7&Nh#Wp7!I8mXusc3mgUXl&1V1G?F>Un^|5!Z7Noxwu6Xs#Z72gH7wrwHazy(}Dzf z5Tt5SIihqxiq{PrlST#I`5B<#>e4WWXtfK4)jqwG^Esgj)RL{zLzJU>mR6avUqOC# zpf!NmI$f`(5ou#bLhFRV1ux?rLPq(K%DO^JMG7O5^FT~sIa_6)T7Y%&VsbXm2xSc-Lm=0jJ*?LD`c~+}Nn2R>YR4#LT zu`$P}AtmuR86@L}HmlMiIZRVMF@VOY4w40e=#MsZii}}qu;`q*^`)gLf@TOvxY@*i z7OzcswVD0O)WX*yU#t3$ChCBActWAoTOvB>rkq&2oF#6aZc5m*xd*5=jdgnotl4o2FOZ-nBF6Ya4M-2>|)MXYn6R1KCz0>)O&zOYPJ z6YTZymV<{Qrw02dXPOC~`@MyNk-bu=2p*kp&X95|Ug2j@A|+uN=}Cx^iG*NP1D0LH z?q0y+V#f}K+o1-nK+fOMBchaRQYqNj1o%PETJQkfni^@fq*ljxmq`TB;DZSo@q-sM z7~x@P4+HZNB@Bm!F7pk)LshLU$W-VGQR1gUiU~m~H-B2PDue{Qs+LtHMTSMMO^O*{ zl3+cNpIIucrw$`(&eODr{>j_g8-NvB=co5iDjm~Y*1%tbV*pwZB} z&k<9d;Auy;uMXuPU6G))e$ZvuQW36K6{xuPnQGTF*+tt9B7^88FvDG|k0pIqHEdvF z)jeHhLQdP+e!((rfN~P5u4?tv(#7=VtnJ##dJP?5s_C$CXIYW>^Kc=j1PX0f{!;sK zF3N)%W05S&Rh>-{DcA~$j~dLnX@r*AodN7dMB?S_?l$fb3mrU6j|=)>FKo+N0hr!YjK%snZRI`EzCt1f1DOgSt^$ ztPW9J)Go|5cRM+nr7m<@QOW!N(bw*I) zNWLFY>Zp|ph#!6g(ZTTHi?{E;e^0@U!6>`0(*b$^8sNBkQfmsT5XtEPlP5`UMw+WW z6z4YBHMr0Drrl90f@TB+Ob!e%Vx%{?S`J~hgLu(Z${4^DyfpG9L%Fd*2(@wa*E`G! zb!gA#BjgFTf}2<;wQ+o&);@43*o{Zusg!h7Z5gxNBDHsaMg?`jl3%Pj1^pqo>01=!0@wYhIBTH!R9b zN`wuJu%_uaa*@YSP2eDL**rB!yN5@Oj?=>7;0|2Dww;=7MpMe2y`VoDKO!eA&Xj9p zGk;>mWCIaJ3j&gdFVq670iIfT*&!;_Y7YBDR#qy%?E&S|O&;wGO(^lw5+yii%xrk} ztwaZF?pBb%lM<*>n{`eNv1(Ni7YbZ=QSv1tUSwtg>DU z`dw0=TkG;_oyQp2+|vx?U*3NGZ>@4Z`v%t-mDF!eAAb1uUFH0L4(|W2PA`&|Niq0x zm{+`@TMf3qQyhVz$k*9zo$19RQ|4UL`!44%8UT&S!GM`#&BA-AS9mwioXT(eQ0&lv zc{-mt1MH*Zu=v5+C$=bYdn%jU9t2lDlebw>!W=Jl>iLRZLhA(oC6eGj$R517-`WBh z=%+;g8zYLUZ#iJPlVx*&H<^+#8exeOX0R49YxPqYJ*A>ilXS_f0UZ0m;7B##5=#()G#B%m7J~()L{~mJzl~^j=gWgg!mYCt?{*{Mo@GV=TDEYS}uyP)8w@BE!UdP=sF5dQOKx~mKHX)l7sk4|3R zrpJrZ4&l)bAtjDYQhgbx;u*GLWU>0l4mN}Jv3i(nJiEG7pIQlcfSNBZr<*GQ@3v10 zGuSJ@7%J|c4zi9)8QzLB?2a-N{V#+6CeRrMr~PQWaHOAivv2CUQ9K2%ii>VqPxEgX zy5Ff%G6D8-T6YyJ2Nt#xv>j#}K=K)XE5HGmUmPJY-)%i(M#hgz32$SD}v^# z(#V!R$IQ%#J@vgnc&J={8k!cbukfQ7VMygCqbkyno;%EHRqop=%%isF1ZteTp6p0rGtd!k4Y@GbW~S1PJ&Dc=%TM&&NglyKgwkWI>F#uTFQg zf(%lpQ|KH>0C+)7XAc7DjcDa?6tF$AWQ~g)Z7abh>OnAod0WW%S$P}jav%m*jZ}SX zw}Dau4UA8A80nQ-c*YC!LB|S|IVrd*2aGfAmJWktiD2^_{ASHyMC2~jEdkCV-*&cO zr6V46C2gJWDrAy&C{#JU4!mxg^j(nX&47$KBHG7$*~?hjIq2t%%wC}vOVlogD!{&M z-ou2-rp=NERGvLyy!{?7PjYPTDtHDnbJ(h`+o9U%@h12x#0H0mzwGYG?L(nZ-Zkpu zh#N-O@GabJ5+Qkj4d*v>U-px(IJq0^N!=ofqFdJlPI52%T12PhKsrl)cIn!PA>c{# z$=^WWcT?k;j%uGMhgD!~X8GL9SAIt#Tg&~b5DQbjxg&|7*&BL&HV1R#IRJY)j`2rO z3LtkiL7l%=ds45FAA2a9b$Q|rbO!~_&^R=%>l;;+Dw0=F++Epyufw>@b_SS3XNgV< zsL*(zU`~XOddE8V5gt_XRY+M5(HtYn@?|<0!LF0MDqyeK3jS93_Fqz~>U-ai@0N22 z<3xPOXOAA^w~5fU$s|MX&^&nh?k+6)d#vT;@GMQ`b4R+7tx}`8)-I-ycc^+x$^}=Z z;J~|8*7!6Nb^o%k>Pcd3o*?)_!m|1gIHr!SG$qFhVvqGc^1~Jg2Oe(fWIF==;h5IZxvmnj1~qy2V|GA@+FYv% zqfXvo}Q6){wGED$f|X$C5ASOE)0t21$=9u4QCOwtqLm8!k!ZJ*>C27&9(E z0(Zccbc;oKf)J|*=d-4aR^s;EJbPc^tdg{OUtXlvvt*-D*n{FzyE3{3aqFdpjvRSCX#O$}g^T#t5w)p3lNYiuYor7&p}aTeqI#JSlXeXb_?u^|UYR)R%~p zrf-2O_9?g7AKyM>DVaCm*Z=ObKb2B2Nd)?a@INAWgBoD+d7k$s2?YunN>Y+dKdHIKDtih0`<; zoGfY0OdOm+tIDg`&(&BU!5y7)kF-nLi={c@gyAQYn#`44SanNOg%+vuU_`ikJ~68x zVK-#HJdmjXTXzS!7-)OnQgfPC+1IAUH>m_YSK$PV?D+)fSkVKWDz&kqztwmJ1%}7< zF0qqN7#LAr$%v^DWn5k^5G$9V8WjWmO`E~;VeStmEE3-v3Hn!zN0X(!6B2w=F@P}t zB)fMHue<7Dhe84aDa?lZ_n%AkIFWXL1S=rgpm40iJ}AFyQUe6Z4m zI2NYz0Ht5$=t2LgNLDwUyzT3niUmyrl0D_JkdzT1hq=7r2kW##-U6_6qUWB4)PgB& zBv8AK-Af=fZhh!vYEuamiwD5(R7yhGNhHwAX|HPA3xwn0Ddb~VeKhi18(l!oOcxV>`g0s*( zNb4h7SK@xq$=gSj-6@tfm_qpOy`*fYuEta){Z;lw7z+e-0|w#PCzhHmoYj8}ZaPu!)^QcY&v8z6y;sak^rw(P}lDp?BxSI{fFw-zp5b zr#?cFa)J270x+)~&uBt0;T}g=>-NB&V{WNsn{4oXgV$}b%77N^z9mmpKsg~ER~aYN zw~3~&TFX(menio$7HAk+b`KnE2Nfn1u%oI_A@gGI2FDliBLHDoz7=H)&1+PzR5zUZ z?{H21e<1ewzrTNKQ{orEHfhNGfMywat&Pk4-UDR`^ND+ug+Qn4a`E`Op24C_ z?K8YFvZk{iwrJ6i+@(reBLl~b9ACm7UCDQVjU~7CzR5HPD-c;9j%y5L8jKkHT5K2- z2V+CF-C;kdho~*IL1`r{X`fvwy28sZFhivVAP!Ep2K;Y`;J-qV@(fbO#nWDGRnjhX zJgdP2GujchE>adKbA|RmcvcDKH^YCRPjb>8GhVnCv3w75=l4K)GSn^Rq4s#5f%_fi zNE7pM!LY>&+YHd)^&nX~^XV?6a~7(jU}e`+l3ZTNShC(sD`l%SJe}IEB%S;~H?Gvb zPZCbsq6`98Wfk7Gj6r?giY7^;r*Gbwd!>$kH*Vxk)qW`_1)}j-rdKr(#{k+c6E-Lt zUR#9eH8nAT2T{xK4ICwQ!DbVDuATJ-b-JWnZ7@?PAOUPxj&usw$~Bu@%f>%&p3rfe zCn*pr}FS;AGzNA^!>YZy@7$m+xJc%{!hw1KQvss z;w#wCrZTF`V(6#roD+xM2-+J`@r%7;C~7q(cL(<98r;uDib(dqG{tu-6rSaa?n-LP zLG$#G3}6bdEE5nWJM36Do$mllKyMK+q);-d(1XY6Pk3G!c%NQlaQ1#bOLZ@P7g5uaVV~(qr6^1@t6cz zT=HvGci$BT)#JQfQf`RJADjDT#*|yE#fvOTn;?T#e>a_j`@1$>4&lAo>^ zGj9D<;DK@iPbaOEApLbwp}2kUBXNMHfdemUPkiM>z6Dq6tJPW(_7Jdkb?v0A29?E} z+>Dh|Gw)lOqe6ag3&en>GQ_O{n~=UUOGCK^xSn7TfUALk1%cdlUe7wLQsbgxBAIXi z7q%?6C|6OGgiiR*9?#Dr}LplFdDE+kK;y{y8nB z&=+c~bbFP$+8`Z>&sbztU*Ar5iGb<=y0@3n?!jGc6Hs)^ane&nQa9$=kMvP>M!2~F z2Uzr@Y#2EU+m7P_+3MpKo}*XMaGnCV_zW5JuGgNdR98|Cca2oV?o6lV@4lT;V%Nmd z&#CTIQJr)&$x0+XNO)M>-yRr{ak}_kwScX{6oo9bz*VNs1K8mDE-GB%ssgfqpXr2v zeUm*kUnE0)l|3ez^#r{m2vW)`I2?cq6M;aI?{0Zvw>%$`xE^c5I;R0fuZw{}YR^u` zt)Sju15xcYeIH~s4E#iZ*n;f$7a)1v76vkvmrf2&9P87uohrdmyF$(t?}&GclV#enQ*S^xUfcpg_Eo&00ysJ~USlsAH?=aZ&{I~Le1*~z)BkGTgex_ zJ0sU$Xyn@8A;k zoUBhQwJOG|2g}x7lapgq-W(_coQo{WodnkN6kKTnEG5Z>J1a~jjJsuh*2}q@fFf*V z%-S|TzI9Y+gaPJuaKNk>5IU6`Z4d^^>5TRo#$F7{Dj)@bdAa={i9=;KKcLk1j6=~U z$`XDr`7d!;#x=63Ji(IK?%eo#mt)2H>)j0s2L)MC0bgpn`r&P>enJx(lrSzfXy_(q zaBEjE`77u#ROl1@F0A5)tivg5aWWou;F6+3bdoN>8q=V@m9Sd4KnszXS4*!AP~N;% zu5PP@LZAb4`1w|0+qi0|z(*l28}Lts5za+;L3Y9p_}Y2Sw1lX5Ui?AnWx&n(Bkpg^(Kd1@6PW1AEO;gi%kNU?DI zvs~ovvyc zf?MVtf>D?LqBxN4NuPL(if=9()f)MrS3SXAwzqE1)o0b~h;H}BapM*J`K})n2GVh0 zg|zx4aWHq0GQQtV!qoVn_JUFUqMWy4dE8DjL1!KF#s=we8iRBwwMq1Rwi zv#87Cpi~fT+2tBDZ(xZDq$5jw=EmipT(j{gn@_PC_Q02G9j?2&ws(c0D#3GdUUY?a zH^ZQWK9=SY9b<}uL$eNETq!HNe)nVAsNAP#;DPw)S{0SB9gzys;sM{MEW7VEtdJ98 zs=EU%-*kp*@UD+$8tvFgoU?{C$gr+BqppY*vtEZi*STX29wE(!kPf$MNQIbvLsR*G#1)ja%%GT(BGIVCw)Yt0!>?fVGBOXfAAC0F9V}nbvTxk3p zff&jvw*}CU(nAK7bfWkABCB@ODU@?M&wM7sVt{AUWXg3hx!o&q<06+pstx?GRnMGuko) zBHCCPH*b@Dh@#tCUl`YV&-ff`#YuLCW`;Oq&#`5?OCFH0KP!r@H9o1p$?EbeDNEI| z7Z%0^*{l+($vw?3TCx)eTSUZD9F3y&^G01@qj|7=)*hg{(^X5n48Z2e#^vb>@SLfX zLyhAOiWqBdRX#1Aj?kDSzX*-66$30uxY+WEY7e%{;d%o}V(8qX<$L+Sgu~JMXZiZ? z-+qAq2VUfZ)ALD|(5Rq8JyaG8o>CJ-ubSlZG0Um2@G=^d(mmH56p`-Wy|->9z~(`d zx2}rg+d54S+QI0Sf@mGIzaZeSIE%c6Ydb+kYTUub3`{9^o_#8pbCLwRE7b99sG+$l zx@ts&B{WklC5MfjJr6Cp13hYt>d>~Ya)mi)7{Fy>l))QtvuO@We|#&$=XF=EU@N=h z%J$~vsY=n=!v4;>`LauPa7mt6U-mGWSTTHr$bE!_%h47Y;&8pYBs~u#1fF+j2Qb>V zio>@32V0hd zc!Wtpm?pkp4h)4#8+lcVW3{AEjW&vwDa@VZJ?S4jIAf*C0yy%p(0}*-C4spAk{7v( z0*Cj1p*P77KE^t}PA*uGHN#*BxD~}P%1u9ROQ46Ja({iUyFd?_4I{}ZDL!#W6Y>_@ zBbZfPixz5$0wfNA;ytTIl|1>Ga|wgn7Q)+=9i*Q&ZH-IBT{v6WAi3dI3}3uNH(?Xw(W?` z-m|GTezW1JLW8y+G3El<;?WgIhiT>+)7tSPLtGDb>DNFMmjrWft^&Qeo>UXoPS@_W zaCdJ#e6?*f1LQvR9MEJnk+L+QXte>9{$=2#(ZGBk=1W*;D40}Oo~f;DTK;J*c(0SA z`z0~b161zosqI~yP%T%AX?ZFFJZRk<4pYfcYZTOZ&ljSp;{JTc%UvVxtBH3xQ*Ux) zJ~*|mCubR{nX&w-_K8Y@m4csO2q64iIhXe?gs$6dX&_&C0l?X*oWSUgKkJoll2 zTX)Y*43V8oJ5zkS;Ox_&BKt%s|< z=d687js=w5F}YC|Q2KQBKvPyetPBZPIqL>?urRxIN#1T*vY(XWiIs99rRUmJFef+) z1>6DE_Gf@)kkgaR)kc1)m0{2WuH%gdq0VhPYmHGgzz41^)Ptx>*kaw-Rj5yGTZ{yT zKuUQVwaQs=K0+0;!A|jcN3$f5z0e`4JJP3=`!DwiZE1p<6y@Q5xk}=aT2n1U#=r=T z4Pj_GxL+|z(%Fk0n2^l1vvMC5Bhk;203{#BNQGQz?D7X-UK++HD@Z67J!&M9sYPS` z6eFEdW3YAh?eOQhru?%%Bd+nYvYCGO{#oD!VaY$?*Zt(1AM^Kp`u^FU{vpVR&)+^p zlKQ>y{%h<$2`Io-jq=u$9jPjw2E>6WqpbdsCBK}nx6A3H)-?3`Y3U6&7}{znnNVKZ zaxXGuaOTOQn^03YAET^(e?c({h_~_RW?7c$v|b+aZo)6m&d-Hn^()+BfIuB7wxl{5 ztYwexd|G1U%h;(x)SB)*J0s+ZLAtfPwR1SF{E=sr$18U}+C>&J0@LkD3V!CY>KlBT zoE-s7VczKI^KcWR)mSCknMirWLBW7CB9PfVz)gzeHn5KE5=B_SWDnr-#5?&5z(rYJ zH^{jLa3s+vy+RKXDcim8tQ;5VTO0uhqrr-!QeezNWk4jEc}qm)%Rw(KJ;U>v|Cppo_91JA=Vu@p z+rZm%!U+lq9oz3uoM@84_>>nSRGf~$Xj~El304RUDnboII*Sy*9AV7C2`=&Y)lT?! z1yX*?A}Nk_hj$a{0>M)#rzJUKh>T#%*f02V-{AjtqkoMpt7qw-{!4ilsvg#@bxVOi z!lhR~=rb?QJVtE9it84Nb*c`~W9fL1Y>*#v80ZG?CWX{WjRmK7dsdFM)q>%MlH7Kw z3gQ@UUGb6|?~bUVwsoo?CopTwWkV@Zz+0l}KFE%JdXEtW;zIEs2}RvZ(6Z!< z*8)^N2Op0}6?+D0inFb)8I~Cko>S&9g?!}(vj5)kzSSf z&+>1!TXDM|+=Z)bz5NAFK32T{So2+c%+W!kKte>Dmg7lWx;)ys zt1q1oQ2<1;epol?kl=RSd*>La-jDTLHM8&uZwpwB6HO-w8=g0ZMj)M~h6a8Ffm4`( z>;&&2C5WChoD)*>6{3nHr&fSu9FC7OJP5~=gkQK^9(+;KU8j2J_lBXa0m88yE{$i^ z^J!F=16e>1>kA_d0!d*>au*>iEvYhXZJN{{G2rz**f23aRG}Sr4;k??ZHxCxZsZ(w znyr44UH&XMYPE8T-{EMZS9F=_U3cBD|u#s5xPB*W*a3#w6ylYF( zScj|Q7O;ehZy=&obNbux*M|V{Ztj1-IGS_+5?Vibwqq1p$qC+miA##l{KMPN zWih@&zEBc__Vkb-GM*kvv!c1*DmMpQdGJ4SEC2_;$!b2{uGpseBRfARpeV*qE*mnR zHZ)8Sz)5GkK;^42g_O(b>SI`EuEqieMIi6?S+s%WPT9K)Y5zf4QJXg$*URoUzi3$B z9FaAKo3rqPnpT{aEW5YNvR7TSTaqG)Ca}|iAgmz>@S*|! z0j}NukQ2VkGKlsw&^znYV!$yoSE=hUhj8rZb)p^VH7beEA`xa=`-;xlt91g%m%F(Fr@ zG+`PPgCY?wwp0)UC+1mdZFPABbjcp$v@UWspiEV#dK{13q#B~lnfx|;P`Jp?q4z?K z(a4^qhUe7mwqPpgM><9E8pHKeWvV9l5^_#YS~mGqcZGfVC?B&4o&^9oS0r_6_r8?A zU@T8^Y+dA)JUVL?#Zlt=v-Zpchwkamf&nq!Kg}LpnK^%WkORiQhIi{}|C2*8<;T6S zdELv3g)vcnn8Mjo<+~il_YRgq`C$TGz&x#8 zD6!h#RwKuKhH{P^{M_*v?K;xNj0q_&w_pw%^K(;(&)2e>c5zNFexd`k%(dImKPhM4ZTOxJ>e zx$2NE87z|b_f*%~TOhpZo~UdgE8Y{Jo9f`$-j(&#S}))_RV&0MC2CpUK#uRo&Wwso zBcaYxXJ4W#q1I`F*!H1>Yu<--T~b8U021G#f@A7GKdW*QR8WEZhR{oA} z^CNK=sG=ysC+XtOJx357!~^bxBHSmy5y@)8@!OpCmeSx4BuGac{0(e-bRsCQg~1lu zl(r4434NKd>`Sos(%}@}c}Sye4}i7YGal5C^(_oX4B#5KAXT$IU#6?7#ui27o+O90 z4unL5Ilb0Y*g;Rv96(mvhrpcMO`gF-Y$wX1XdkYty{|u~q0*H}95u=!0x9NbtZg~N zxp$x+*%5g#OxoU1R*^k%lmi8pg1$QdUPjUu`*4%eT+Rh(?>TL0UDc=!(i{013KrZH z@zJx-*N5kv_wadnN~kDjt3e9pMA(YlVdFd~ot{T6(woMLZD?*IqyZ_Fk$sJiSu_zh zNxA$)@8sV`0tVzdaD%uLwc&SxpppE{KfiqsR$Z?cpUcg(jN=Ia zrg?AVw!C%bbj_{9^8~d**(#g*(vz_JU|@bo9%5R0_@T1imc={DYN^9n*CNT3mH4|F zd8>WLO!vUt!CN1a^uF?`0O_!`q(`fQuly0LnK498{aJzptZWvy15nx&<`r7j6FZ%d z#UNv#jqM`$k)q9+Tq&mqxg0ucwp|L^9jjY8X6A&MTs}R~qFbK1FP8DqsP1ibjGdHq zy&MANgczP-wyuT>aoxRLr%Wfi_EtRL(Nf~IqgUn`J8fhUBEZqQ+vSkX6bfZf`1HS5 z5&%bDk78oc!!IT|vJz2hb1_hG9BCBQBjOSngF!E8I5)YkJNb;0RFq~9EaB@01_tg+ z(;W0GVGaykO3M<$N@E@yon7Fo5vdEWLcvm5VCQ1tF3i*~X=g+Vyzq;{mM_77he=@83KO}*1h2q0;jx*HE!=jD+SlAo zuVqDG{&_^N)nKi3MX?WTN*ypXjqyAvHU!C~+X?zvvN+j3l;6-%Pw#6M@xNzG`6`&r zE-Xb2o%)=7lnHYv3{WIp_y+9k4$XNg3nB2@IlZk@JD~`)d;sPF1eqOj`E62>p+He~ zWcJp_%j#9LIt0?G#fZ|8$^@(Y7w`|Pc`+joUbxDu2mf$XUImEz3&w36-1Ua3T+$ht z?a2BZ-N#+x!<_I^bVnv&jMmWvc-X)tmCCQtiwqnOJB8U{54esWQshMoevp2*wUq3Y$`zeasGVu_I z9HT7=mk=^DYN=S%z*W&FJM3o<3@X$LCleRPA+0(B)8KU|WKqL7kxd&PX+>=2R*bm` zQS4=8Q$$G$lXjZ|PSWX70cMaG?C(^Zk>En@>gNQ{y2_48iJY*r+%Qh$oU01w zexj+z%*G{3)!V_&QcG3pd#H1vQ?8@W8xSfl9}RP*$~u#|F9!7r4ol=FZt9%CGYno*%sSN+OJ0>dQZrB{*tn*L z9YVf!r~30#ilRGtN6lW};MTZqPnx(llaiO5R$Pa>Y`@*LxND3FZ2Do2bAT71Rp*o+ zml>^9Sz&dW@V!`RZK(wW&)e`I3ENCdepHYYd&1dDkyWjVIiUkO@=StMTwoLbDqFCF zS&_W}UqGP0;j#yzKl2gbAXm1misj<;;fwblynp%O$M4^l-1v+4pS=I!!;i!Jm+#*_ zX>a=NOCEH8kgswvS$}Z6&d1=#sq{^q-yW);Q?r-zkXj<_vr5P|$*VX#1c20XO$mD# z5ZkN2yJoM^_A~rsV*`o(Is9Wu-i9p)&0@l3Oeu)Y`}Py54m|3cEPZV@Ug5 zv3FhJ1ZN~}F{47>L0P@*U1?WK z(wd{|Ex5?Q7JLu}5U3pyouf56he0a>w5xYcqI=Te<)t=P+u3LXBKYYsOL#N@jL(V9 z=q9}6uRbG{tOKnV&e)z49WxZ=RZu}T2`hBCl;MK~`h|>j0!>L0*OSs6@z-{!yXEBm zzC?scO-gplYW;;tf-{4Je?*S4qt>LNQq)LLwF`=_Lu6oJQ@O?|1Am&>c;YDw96DiS zDIGlT<>j<6E9fkqRyae<_1T`N)qs-vwp9C%80=qJ^NsWKuZ@E!9~ojkd;22%&-uYW zOTJ|2nI{r!Ij21bdAiKt17@c1h#^}0rr6_$lD;wef-WTmI!%VaLPKTA7SaZWDzOIx7Ap@z)l zXZe&!A+fe8YeaZ zh?guFfnmwiyB%Xm+0Z{cOzAN7e)$+R0M%dDnu0WLT-H;n6mnJOX^5>ByznPIB6*jR zNO}GxDPAs#8aW{_F-Q+`y(R@-1jyBqi-~5ckMg%gDI;AOK}*U^d9o_5y&Y z)d8#HD4*q6rC{tP)gDF>tb#Tglu;5$(^Mk~Wl?7ZZ;N6O!J%_w72897Qo+uC2}5OO zKG;tSC5W4Id%1>N56U%1I)*D!g&O}#n4}tI0VB|L*CkHOfPCrBVD_8vo|}>nBnDDb ztLTn5Umw{L)oPMQ>a{FI&2!ojhzv51zBT{=k@#FWF(sqqbaM;CCZXweV;>@?4j$3u zG>J@KKyYW%FsW<2g87ttOZy72NSs3^8FRl!Pu9UJQD24mz>`+4BTTX(I1Vh)w6FYQ zCr}7oq#N{Isj3ehys7F{f1(6gEJp3j%Qk74?<|FEGXNqEd}4V$ zpNz3Sdw+FkRMAn1dbZ0qtyi?oP=uP)0GPtJnB+O=7u|a^;EDBw`m}hIDSOiHEKW)T z7Y$PFsOdTDonh`ZEph%ewU#8omDR*P#84D))Y5EI zH8!Yq@P`G5Z$h@nvx{@s9wz|yyj2&j-lwZQGi`w00v2^Lm>L`-!gE!V!~B`PZTssiSZ748eUW=+vftf~mR8&3FPOk=xVuAsK$zXWSLu+fR!M|M1?ieH33&-)z@ ze;eL@aGW)Kqk#H&zVQG^$7lKS&OOW`JcdtlgBH~6ygGJyWj6D}YUs^!)}V!G`fyAz zozV)hzg2@p3ltELv=T$DjTl3bYg?c7bdV2S_dLi~9Zbmy=AF;WB6bWSP(Jw@BCpQ% zPVnL8ME|ZJz^T3<%3M3Cr`ISa&rL#1I*6SwAe$R`Tcu$nxuVQHnu$8i$4gd~zXCcsyKJQ@_76%9n8V6~|;2FBHPm7R&7 zM;6V9!Mz)h$4)yh5(Fu>0;dm8Kf=uE!4jq#LxGC>@s?h+sBOtdmDDTE-Rvcp{NSff zs^kxC7<}Xnf?`fp8uFTyWl1Oo#_k$6q6skUIc4n(slOf)5r z{_Q2eS`|qq#I%4{M6);!%Bb1cTgebW`x{boOj(uD)OV*wvX`?bea#r|CT847tPBq} zX)y3vR|ynF%}s|^j7urdHb~(DbDXHS9IEkDtA~9KFp_wq4ZnHLhxFx6p}*Rpht)F$ zU@B{uV10u3YS%BE%~U;*GljXMb_*Mjt%O~Jy}&|h>nLOwGmOrJBkbT;TTALiw4__c zssV&OTFGf}!XNu20xcZLFRZ2d>HBBl{SRQj{wkPoYntc4PQ_E|gpT~JP4%ls_x;=? z>CG3HWR^o%CDeY1DYPCn{JyS_gQu|U*iK!`*i#2@cc+B4f2JG5wuP0O0(Bsy#L z<9f8K0*C-pC8eNo#00Qp;M}@0!wjD)$x~e_z0)n~O;xw*d9sc3ZuUW`GA`~^ z9~6*#cuCt*px*KUFV_Q{2E>%5EM1lrW()x+$SqAF9zVLv(G~R991^nqde=cX%{ETg zatPiv*3|9%#JogGDYcN>zmPTnMkfGGOg4HbF|FE{oeYn8R#x-~DuHFG`3xuHIst=h zKtbwvG?PZ&QmA+=Z`3S<40aX$WFdm?2Lveq7B1!mKt#toF;Ad+5oxR*Jq7k~ftEd! zlC20q)atoz!GaT+YFq73g|NlNJtnG(wS9b%yFwC^vfNEDE}{&eDC3|0UY~rOWPO=n zgskI*hFW8%Zs>mM-J#fVi?8${Ue%>)qYuf0cW^_8@McLvH>8h1>|6E^Wl4cDkbTy$ z`Pg(rGt2JFdeCphAp&eR-5xVVn$gx3b)2AugU0oCr&;bOTd^b4(I`*qNRc#+$^VRbn43=K!^9N43HJ_BOVvxmG6;h>+Y!!jP* zUD9k<>Q+Yx#wA|D745|}dp9`?9@)6hsg^iHJdp-k3d2^i*=YvT=H{Zymlrk=M)~&3 zNFf*Y{e zsIfFAcdt`@H#sQ>9L!iA%&_6Da+$bLRExY=cqL~Gz{sGL<8r*mj|2}jqfQ|8J7K6| zZ6PNn`+)L#&paMqRFi$XoYV|5_!wVpaHEIi2Fmgz)Za*j|B~dkc2Bu;aipHC~p|_By-uCsC9PqTVQ`?ftqhFo5WgFY8 zTH}X^gII3LE9=Z!xtf(MvqMuGXDCitHNj5(IU{uJe3c(+ew^X7`w!nt z_VtHvhEx7rV#@m;t!-cv*VA(c=ho5!0?!{(76L9L_m0!mj5{?wk5~qFc>p4D{Kv;EZIn z-ANH`5B3~K2lx#s(R^o6`_hpWy&94YY)bbX+N?X>#^6WE=|VyhsXbwP92XTsW$V0e zXnQGNXuzWzw8tkhf?m*|(J_qcukOtgZfkzlTx%pNanG*@v>*$7>@F))Xr&%OVD^Bl zka!G?L_%}03|H&UPHC1pxv=sXUDPM&tQV-MXTnm|B_bm(dN}d-wo_SGn8SnJ%6t$V zQoAqe-=MZZMWw^tg`sv;lpE9RdWwk!WwX!dCf`4T5_T(z2|x{&=|nbN_W>;CKpzJ; zxev-qMdCoEPjZwc9Sz2nu8-2t=#I0KD3K7FV(X9`hgnIandrfxAdZ^GvvC-ec5ky& zIdj$81en9ggb>sYE?|!(@ST>mtPeTWAPm=c0~O)c zC47=EKH1~r7V6PlvsXZy=ACKCCFk|PUllPK*m^EeNrIJw5hcePSQ~2&5C)GHkkOk6 zMVvt);e+rrN$KgurxWX?1OIrkf??7m0j;*cM584r) zl`}Z1>se)8nnq&s&T2u)MH~ipvzG$e?hMW<3KkJ6Nw7%7RgkG$JXFY+;?uT1P8Kiu zq}H2N25jyD=E~2dR6rB%kYo?x1JF=b1XGA2FoL+YzHLT=%VpU3| zYUC%~$v14((%XWFokDAXdZ@zdNxODfL9(Sz567pgP-_v{-BI!DEEDBa-n<~1E{fAa z2yGS~i5t4zah#z2y8Ad)g}Ee{#Ub+`{YiuIy?YNkvXC+c8Qm@#(kk;=Iu~B zse+d+oK?~8Nq$7CqK@JYkS(oq&1Pw;puPc616w^y_xcL2_KsrmiyTwX$yktjs1nAS z&7tyVF|Ix<-@xStKOrOwo~Ipb2o8pf(DZ05kYLGypFptA+$o_uZj3pydnRQ_Kh=Cj z^?`tn?pn4pTF_+c+Qbot(CU9V(!4^>m|ny^l|e?#sYo;!!CGe50RWkXxUwcF*uW>G zXd09tm2N1e#s*CY_)qw)%M>ZjEegA@hn>Y(tBFn3$GxVR_h7&YXqQL?M|*L*NSL?k zXkB;LoB-%^(0qeJ36PB3c02NNzQM^vS6o(O)d5r^cj>ZY?m|gG$QY}j0{!7AM|uW6 zu5}wN3>u+3+5p%Efg+4w2hKSmePGdQEW9sml!X$mTw_BY)MQFF_97dLQN2k$MZRO3VF~WgfkE{u-aFP$uyRg1ZR4t%o4)y)_AHV-7eE8nmzr6ii3Xsp<|M20{_fOxxlu!KOPyhA9 z=kGs$`xMW-fAQh_Z@+%~^@s1tkNvqmV?3_t?FlRrTYGde}ZM}KfV9(^x+?9 z82$u`wLQHcrM83vqMO@emaCa1A0X~s4Qctje(kNjt2C97rocwp@~&j}UfwRkf>yLK zUIIjvJcGgL67HfatC>M|lf~DyE7}0iGl~w6urBXf1B}R-=0X!h$XC7OnMUlE4~E`pp`eP+QMeiR43IPiF^VsTNY{00L=Yg1reTm)t(~UT&Bx>(zCK z#cpS#lGAm%j6to6-88F%!uZzZOI(G=l6N>n`$o&9CDQ`9(J{hknMzz+-TXwo$a+6J zwZ>UJJRuKb8x+6>S+kHBM?Y-Aj4_iX2+;Dg9ex$)vdV(+EUFLFu7WR;6uBh#P%wmN z2_f|fjqQ%(9tBUA>bjA83*V6Z0Eg`Bt944Dl-4~gziHClw@JPCz+X|ArPl-3nw}El zR-M{jfY(4FYVmEos5_$j+NEq7LkMt$E0yvi<*r&v1-%hoRZ<9&-Q9%eAcc?$WYGib z<_CL(#oq!4O919zoAo#0KX_Ps`<^*MgRHh;AOZp7q{R=V52Y~b57ev( z&!D$o56?Iw#f=x;30Nq`-S6+*L%piQ!G2j&r~doY5Ph2)c?R(F5THS`H%zWg8K z%Q`W~mIqQ_H1ejs6wFaib!YI1ml#!pjD$mH9^jUU!rJ>EFW(LOA{C(iL&g@86~LRGrejW5f_1puCnbD|cEjf1KR;81y211?%k%|T+NNROYT6z`zVly5z9Zi=l{uvWBdP7|T5 zl1|O}fx89nPkt7t0{5LoM%`QpSWpInDg*K{gh1e8m>)}t>{eN*cG;GwBG^WGi*Arm zqkaW0DqWLvPHwKWW&NdA<6vG}?L9<>{a0&l?qQ2{%2LvMn=wgEte8z>R8 zW81V_ASK3{q)`E8I~f{P3G#udyc5x+WN9>7(xG}Rp!=6F~DDp zwmC74V>4G(IL9JCgLWlSWVC^N{#f<9l34;8fUIl*_1yN2@a|9ODOF)jq~+C2HjSE+ zNv_`Z&smN|Y84-D?0){I@U3qhdOU|=&riy;zjW8Ww?AglR!Kw~C9f{Tz1)?v5UJvV z>cPSdut%h*q0cou|+xBSAYK5-X9J`iM@$+6C@lz9Q8WP7c=tVsedf3+Z@J^LZS;muU zva>BR^~JlolI7WUgr3S*(QII^r!^D`YhxU&0XY}Oyo(}o$PfeSiZE|G#Rp?&zU$e>l{Owoa{b#2qn9z_^80p^kNZzDHT>`?+ zMX^$#TBy1GjUv+$l`T1xVrf7V0Tti@e*#HXJjp$&BIrKjfNDho-A&D{17TCRQ?Gzy z%rH6jgf_rzs}~ zZ3%4530HC{Sj~sBdwuohU%X}f!m~FMK#XK(av&Z+b3Nz;`B1I)yKTgg9cjJ9G%?9$Koj3QI1PL@{I#$e=C73ep4V*24qXh)YdWp^SFyOnSzcimqnB>Ug z2b4Nr?T}C{WWQoA4In7XfmJn9?6RUp+Ad*^*ux+e-S2TU%<3WMZv$9+AY50;yh@SDHUFdJD9=8Nk1!FFr8uT^S zie&Ldb_>PSvd)t71*+62s1T4txLH!rK$yBh3^6zz+F$se*QB>P14 zp^o4q7FC2hQfH8~(sD00oA+)7p7v%OnjQL`{eiHtBfV)to|sV#c^{S7wOc!V*EgBo zt+L1Q&Tz+e+IW}Hw_#CRdaCpSAK@y0$o5*l2Ptan#c^*^fJwA;I*@vGkA4@I4&2xL zr=p+U*?^85043UuWI@1q#_}%JLdUrV$@PC@&~7J`92XB@gW7PLXx%#EM^?7MT13{J zC7Y>{L8sh>#O~PSht5u~DSeoEEXua)pQsU_$PiOO?vQ680VM7u6>jL;jp_rz#G->( z{%8|4h&kHO3_3NGoly6uVh5R7=7|PeS@a>E+C~lil8Oq(t`W6Eq5GAK8{5fs z6XawMUjv1M`~aD%L-R91p_k1Y7W|i=J*&RU;(nAV?otjziM`vRV+%3uv-b6fMv%Ni znHsYi$go9HEAP9!cX`YHhU(uRdAR=i?Q4VMeE30l`)T&C{Hm}4{lN*1gn{l{*__*~ z1RyY7oERSJDZQZsWE&hhPqtw1=UzVBpG%P29$+`rlef6m8_T2(aNdT>NRrgTWC9St zHb`y>Y7Iqx=L8NH&s%h`b$kWC<<8GMYwZC1@2cBUyc6^%M@tQ-y0c`R*3?AGWxwJh zDPC5BW2=?p2rBI~%%?GJ=e~P6fQ?w4+D)1%Cn11(x((5-d|BlYQBX zjz8Q!ImezB%2c&5h1pqbHm}O^8KygR$>Ke`tn=ZP;IuODBYRj1vO@<2Gw}(&U3<&w z{)`ZA73T}|M3?kDrK}HU`mL%|D|JuK5~!RKrgFCR3EJpk+a?Uh zS0|5EfSI@%I~qGjdPFAIl_W}yv5Ms~8klwpBjlfLT23q#T(>Cf2b6<5>P_&avj<=% z4XnszBR7$_b{gvak3NR~uP;ymrMF+IjFQ>$sZVo)C?MuH!!uiv*$YB_WhQ;q#7%B^ z!$-WubB_W~{(j0Mg?M_%?J%v;4sTulNxS@nyqh~Ip&*zf?~d==XA$2&s$fEiUsg#? z=78d(oEi{b_Y-UmnQ}sn<_UdJlvouhW@vJ9kPW%BKrr6kt2nXJd?blCiq8aA>WzbM z^97q)(LK3zhs0VhbS^eV0llf#}HUgIjwe(Q&wS(CwA`?dTNQNaN{m!(V(m zuTP{m){@axy;a3`aw?OcEFx1VeY?IXc4|Rx@<}5LP}6O2(&*F^R*}JOBk0bM$5wsBLvqw@nDvo^Ij8|MC7) zUH9^ao~}1}Z4ZZQUnQ-*owAGIKIH6lE#_U_nB9m<&!8L6NE_|*isf3+GY;$NvRE;u z>a{tMCi-iE67}^XO+(->;>}FZlTTh&z%HnYgI?a@Y@9~PvD#CsvNn6yc9OMjl8a-s z$-yPWbI^NGm`*QnBB%CRCeSvPpPC)q`#3ehjCaJo;mjVF%>Z7s=di?Mf zwqs03P#8VJ8vUS}2raRJrUDYT9Gt z-LT_tp;p!0(wcx)=f(~xj1v1Edpp;oQ2PV_pz2<24`-@dh;ELB)j7htBKQ9;lS=dz zejN%-)tdFgvfY>cW0BH!+R!Xd6;j^Dv|;QsW#pXOtP+FN>a}x?EDTR9OIFc8c$4Sd z_kt5LouuGw?EF3WE^E?v=)YqCy<_gl87D;iWi?G_$xo;~hrS>{QBoplktsXf3h4@T zd{^6*P4#pPdT)H6Dz}+AK~dMY-~koW8~LfF)elYKhkH?VVW><1v_Hkky)hw?gXK%f zszC=i`Mb;x<0s(&{xk&|dc^*Q9e1N!4^=i8%`W#2m+j~FO%wnP3~g} z#PH~DR0+%9@ysfr>#Wx$E8Z`jLr9R7-N|U7bXk{ao4YVkcLJu;eYg6fo@ny4d3KVZ zsi^$kGJ~BKJ^$`bU0DcTo?zr@du^(K5y+Vh1_+*vjBFEk;pxEeE2n!ylr!o^_A)SA zfbvu}VwI&xG_LF*Nfe+|(pBuB+(tr?01s%^=?^u?O-sR=;T!#e5 zE3Z*D5@>!O-havI($9~oSU-FJv3>jzjp{!;e)dy7`)PUh z%lDs!48eHqsH^x$)kn$UJ{NKvV5fH4Z5{Z@w&=Gk7Rqtb1!`}xa;=M4@AGMWD$r@| zD20l4=K%z!sy#EcFQ(p;o)rob2TAbab_YMrR)@0~6ET`VJG0Sx`IXY&+X@9GyDz9V zkfhbUOM@d@u){6a%GKnDBM2tYTb(bZCkhEF$!bT5)T1^_uD0i&=<3}Fsn~qzGE6|Y zTLl7F88zBiXTXSDd|&Z74~20SInK7z($tm4V+&tQ#*gBs(x*pg7OT5c7YYLW9*D`8 zIC92x(@o~bDco+19>7fzvviFPZ389=^IQNfZTGJ{JTGa+kgHpL8ql_Z=GH0@plvZI zHG?{BJNb@iS-jzE$nfL`Jv`9KPmxFA<&=s5m=dQ7UaNt#cGLBTVzarRkt|!&;seTL zigRisjbQ+YtP34F>g}!-+^HVc&>DZR#tO+-%7fo7&OkYWgCrq&b?M+hDrzVdDNRF50Lb$S24bZ~owru{HW9_)TzKtfv_Spn1^ z5852D*G@*P552co&k%)!8^K3HS6^B?{a;C*GnDAB(MA8)@cz~5?MLD52d4*8DA}jh za_BS};PeWaV`fRna(5^PC~=c&TrE^{+~9SvIEQtGxHf0PIJoagKC;8R?h-!NOE$~i z@<__Xe>(@r$gg$?=14`16&9uW>Lz7lA_t{7J*^oS!CIz4$Y>EdfXpab92H>F_7|hT z3yXUz&QibBlXl%;4c==u@}$GIeBW*9)NI#8I`V||J?Vu=&dY2ufeuyo{&dgnzS$UnjRGm5x4g-+h9AW5p%@Aw0@GR5-KXo4dtJZFv2z@tv2aoszwTps@YILcHP|b#Ly^zb z2x5B`tSIZ?8D$j!wLwAslKwjoBl0p`{}L0*?8{*jt zk5Q#EI8`7GkOhZiMH9w-LC$uzOzo>#0KO%C(?kF)WrpKg0)@83`B6)RTCGEq2r0Ze zr9&AGHk!Ts@r!&&M}G)|uS1DYwc~2vdrvylW0e959>tRL^d!fhsCylYl~Pl59Kzox z-ln={^D8Mv4?mr0gu?H!f-iel2iA#`e1{e*RtnR>JGVJDmV(%ICK@ zwHaPo^ZGF?RbGWHr9)(CFFn)DwKOP%c8RLZ2w#%DX4EIo6UalpqqYvbpFJjM}h`pBM&dw6sc>m7W~wlLnX>f467vjE0WsD=a~uNb3=&KwT{bB5pLI*fEZ^Q z>}20WXQKwP`rc9(xDl$5x0NbxMSfgCBF-MCOCX!F&_7NVH%+2k06 z25YR)I;|%)r8rO0_&&pIAH2>SV;L*V3`uV-(0%4lF5_Un{&wI+e)h}o_I+SqetqCx zUYNljQSvbhdbz`Et`+a-&G~Zgaql;cxp1)br-C;RcNLqglVV(+Dm044I)!r=Xy98b zj`F|mBbE^zo2Fbo6q1Udu`7u|UX+REDJk1J2e<&9q8t=RdHmK%WvHOmWn)s5ORLYz z*S5k)in6>-3-7R2y^F%I*KV_mJ#x6W(;@z_ro=CKjT=C3;bH%RD(+C?PVPWX0d;Rj zWava>Nz5^oG$vCT|A>9v+urDqzAZFPz`e(Dof>zWG7v zY7C_nq_E)zMsB38-qM9fYx4;8|0;^GBSa2~idPX)fs_51lMBF8=K9N}9^T*!@>|b5{Ak<%} zlIGsYF9TXxD?qZ4x(!Ri74uGQbgnt=pA-c2;GycoGV$2;RG6kfW7*w|;8?<EY0Rk9&<9c7tT@2Jxl#5}{Fb>Kqi;`sw>WzJ2};irL4? zUEh@AHmQ!^{I}ThJ}~{+`)?4Ce)|50_pkJCy@uQ62^0cJJdd_({jBR6BrU4e!A0AB zze`s}+#)c&$LxN4N~-CO?TA!rD%-uYG11!*TCKgp%fnJS9TXf9@<)M7!3K-LKmx}h z(A@@K{G(O0iOB+T2*~EWO_3LskfaTO{2rK=n0VgNo)(McLliaUu`Lx~wM|8m#($&` zgM#sZ+PuKpP;PnZ9iHB)x&eD`Ddk`MB+Ip>7azvM?l3W)W)YUu`1ii zVg~%^B_o(Po7O3-|rP~61jnHg(FSPN>im%|pQ7ZtXnceXGsaYTEj&r;?qD|YmbW34I}!;#|Z zJ4c8Xf^-vW?n%KRl=N;L3j%JEo^lK)`npmn`uI}&nrpDZ1js{)ig1P!0FS#X>N zvmn|C$RB;F0scEQeeKb7ELEWJvJoIKN7we9q@L}C+&BJ3TeJER8V z&NGe!koyvSGWWJONxQ^e^sU}TV1wSNF9=Q4r^k?Kz?N3cW;&lM-m*<^WvYIA=sHr_ zR~nNr_(~_#$l)#<#s8uKH_~0bB)Bace(B?_m!^!aas(V zTjC3pLV&ZxQoWYah^0tF0UpT4@Mt&Dg@X$f!t(1t7HEMR=}_&fxZi+oF;XrVEQ$V$ zeLanz>#NDQ|ws2*4Qo&=K9b2V4FuG^&p;uXggUD{M*uPrm? z43IMn4{dg$I?Oqe<^8Xs-RO~iHF%HQHtUSF&m36#jFTJY=7JU`;YVew^Ual$jCxV5 z5F??(Cu=RtsbUH*8Q!GSo0YZb72%TODk9B4GGeWR!Yw~+5?1-% znyx;>T~%9{bY^faPsV84!@ArWblvyU8(!LN2f+BU$Qv+9N_ufA;U%GTbf4uV!PPF7 zPTj>5U{15!T;g563qzShgDy;k$=iBn`XWirhSdz6>wT+=UIxU~&G5IIp2 zrR-YmN|+vYZH}um^K*m^B_!HdiN?B8{R;H6tCb)9^a}d{0s|ez*zGy%=>sV!>n94H z#xl?i&fX)7%2AqWYa->7ld5b!q57!JUc)GbI2$yqCg&VpOq=8dZm0Mlqth~>ghWzb zwd{j(a3mNGzJ4iTxDI^deDZb}^Tf35!y{)Fooz1DegFsX2Rs45Z7R5F4zgiTBvyKv zCk8X9`dE{AFuJqy)=iQLeeQLKYS&$_x>&1E2Qk}jXp~zZJxCl2-;)37Q?ID=E%LqM zCdzN|IoLn^3>+B&I?Br6q3UI5`Jm*yT)F3}w-N4bk~v?<5~B;H)@SaED|g$h3M7EH zPN!B-tz2qOov7TfsiL5&lo-kfC;yqO>4ScY9q(-SkRNo4ES0(sbZfGw8|ZSOx3ZJp zgjl!<<

p;h0vKEhXpGSKyBfF!Kn-^P=N`qf5vJGtRJ1m9`#4=&3@0#4<>R*h$5k zg?q)E2Mhj#W^9Y=C$(Eqs4JpIZV|)rZmudafuADfm36Em+8SGdspV5#+(kxWY3o|@ z2UP{l_e)+uXMazu@hE9AwHii7d+dt(e&e!2z`VBkdy}{EKMXGREpXB2SAizdHZk6tcJ?x&S z0<8>eeA$V(0P)oMfxu5SQPWjYvt`w zrcfPgiznrW!p&3_BrPNp$XK@%U{ zEw1d-T~Y9%nzquwNQ&nNWhCWM5y5=0kLu=2#*1^ zEnl{BR{+PE2h481Q=o+CpIDxkTps|S*|`9ce0Nc6dij$UW12vkj>?1CjVHCmzdORq zNuBIZ`Pnakko)09_h8@8{|)B{`M)`KNLYQM2~mQY4~AhEcU>aiw;U~~;A5_FS)X#^ z75EA9cn=R?*N&y5XxJ`GDbVSM9q+f6dxI6x%NN_Kn1_ntR4^b8H|^a^@mU>4Pqny< zD7RyoqUx^GYeAw2)-{CUXQL{Pe|umu37=K$4NT?MV=_6LQmH*a)qQMSfUK7ji#y!v zg3SJ#FB3_x;HiSyaZK4I4Bc!VIi^R5Popnm>UtTrdmlBB)Dx{`r88*cUhfljCM~DK z-C=5=PPQ$_C_b+Q)R>~fx2aO>5Afv_MO9iVL9_!$GB>%QFRenfZ1J=#;mVFnqUL;Q z!(*3F)2cQPrR{XB)UKC$IUJ=CJdQ129o5^Lp@e#9(jzFg!~%;P5tg>smW29i+7GU1 zQXLQ0A*rEBeS0!)?33HdA7CW_Wxbz>D)*%h)G&_W2POHY0H45uNIW)8C53tmZCvee z%YiOAe8EIHe~3CaRth4|y2^)4{s<5Nr`T<(AF*Oz#;4>KZFro28Ej&45{3B(dPV)3 zLye!j{SxEfpS=A&1X6#ffSFIf{(r*T-{*s^Tjvu_M!Eng!kOXn*x`x7;41eL?H-51 zt2ecdhRab~0R)Tmn$IRWhExH{0z*k9JK9mlcAEN1s4M9}wI+Ej!_-eTAD7`E)!egN zy*AufRToDGF12Vmoy_5v2=~?!G+2cTceGLmvLc5V8I%O?#~ zn5fuldZxp~B4`E>*BoQ8%)F=@g3W37knWRu+Fh*;fZQ21kF{IZ&zFzWq6&ysjP!*< zeCvi3oKfFE4@$8e_xAO*%|_tH&=$xVk|0%kO7^M;P$dL`c$+x~`lCHY!g zNhbqR+SOVDY{nQR2ww|UlVoigb3tAOewdnhf7cmr3bZx!Bmj5BZxTV z6H@8Q-{LA7K8lhr68kEt>tNz6=Wvo#k6R1&+DE`IrP6~(qyKZL^Ru!Y9a=Gwpnzd> zIJ^P}fw@cBro*{OA=Z~dZb(dP8;S%L>JaYvT7KS6CZ2R+rWeW+yJGD_C~Mt-O~btq zK=3^?V6^{HbvpaII1KjD;!~xN8nzr(eB6=QB&u}sPHDUfxrdFmD?4a-#*ANf7xb|^ zD||$?m5ML*hs$#{vHO?8&`Lx!NSF%SZ^);8%=wgQcgWwZd#-ME6o5`N^YH1mFm2Ku zTS$nMFE6pTI|g?U3AZT&nmL1^OzV2K3zu&gTL28=>A#}OT%utCx@DqP;xoWPRBr;% zzdMLR1upB*T9tV^i87V5p0%;;OPem~UG zkgEqWs#+-VwK;YA@JK-!$PW2YyXpkSel{>v(35@GqYA{4+LWcSu_&2%(DR2QLIq3ACwl<^jx6Zzq>lv?uHv-$n-BPouF&-nEHkKygh%M(K=JDyJnTpR+LS=6HJ_u~Ap znV`P0rNf{pC{NM=grVa|#LTcdI3)3e~7h^+xHTJT`%AmYK3gmLF6r($|a17M63sY+82c)F(nj6M$6C?VoZrOdl!gLnQ-Bxr^&0wgZ-| z`^LBi<+kTVwZ!BTKiSnnY*w1geUmGoj%MW7$ghhUe*1ZTIN20pg+88?M_tM-p4|Hj6~1xe z{Z`hE2fOE5Rjo-+{j>1re=c?N`=8!__x@GL7cdd{!P`#*elg9{SBy@Xm4V=MZI8zc zaQ@(<_&kkSt;c&PUke_y8S#n5xFI^%!$eWq04r7iNv-Jm1QIcjx^w25WM_h)C8e@m0(D5O*%+u>MPXNohXoj3qsmZ7SRV5r3Dnj+y zlY+i&Jw#_zJGy(3w{w@1-$_xL96kLOiQB zosuQqTjZo6yDRy5uZ>h5OmTa3qY3o z$fOvsW4CehQ!9wns-G*sKRj;B zu?7Poo}_>hcY#?FUt?ig>?s_I*HCWju-w^vKD`-R9n+~2^?DhGfv_Dc1$>kM;sriD zCSS!cOQV5(*6xCC613#D8(4k-)+HbM-0)!yG%>c6FhV7U2R11bjgg%C(LU?9;q7Lqc00jVa|^HSP{hJI5s-%B%K>dUzB#tIz+AiCUqJ~6m~8Ev z57IU`3X?B^KE@G+K$xgtL4JHlh-W!O?zJ$8#wx-#5=VBm1>@3Q!*#kK5c!y@pYR>Y zS-MaCehjM;it%={X*FMbK7p(ExPZ?{dt`+o002IV#)BuT?wDIepi-45|&V^1MO=IA5a@RkaonDs3qZb3%)> zptlDEdTog7y|n;QNn0J;#T)x7b#h<}aIH}S45dU1E5R#*XCOBPl@OMj z>nfY<3YDp%CNq2lJQXUim@t{Fr$5p?a16JGST``zEn4jb%%v*%G45Qds98+r){^4t z=rUOB_hGORN8Vhc?uY!uMDI99GdFwfI?Vg^y2HzB<49f76EZCj%rJ%=KqRdoH<8e4 zlaAcMtCdm*(2z+5`{k~$HF8Xr20JJdX9H1bM5S_NUwH!_`eSNVI3H^%cO=?2p_>{u z=BTfr6cH#{rF(TrSah<$-#W(c0139 zD3%WHg!3rIOarw?;KWT_iX)`a6&Y*Fr>a4GBGIqBWCb@@cX{S88MvH;?26_Z%NWkEzBuH~rApVWem+c+-2dRNMa%BG3=5Qf*WVgw7hHd zOr$HJdR}qJx+MZY(yN{eScwq^=I|*2VO0|J2yOUd_FbTMyQn@rV>KYkQcBpLI5wT{ ze+qAwy)hX3m7J){hyO3U|5%@Ug;47!`@~!2HO;D)hG{(mRGU?_IjHi0 zZMdEQj^s<-a|MKm!!lDM)ViIDy(76q?CY|P63U3-``bGHG}O}iQ;C9ZkaeK-pN zPTGI-v9fs6wppK{xhi5sXK9cc;LR#bT(fA&(Rn>A*LT+)Fdt z+(%k+2D%E$-63y%+&5ey5Lu9dzY#5fpOOzL_M)mVLxNLQenN@a%c|~~d`}S|sjt7A zujd8Z{)LrDRy?uww^RrF;(Zo0GD3vBQ)>$fs778bLfyHtr#|F2bt3%I{;DQi5^Joq!GK$mX|T!-WjkSG3F3H*1^Xs}8y|FadeY&%`P9Qq6VRF7L5# zvFnzvjP6AE^bgrTBz+Txgon-J5Sc9xy0juleP&nEU=u)gm8z2$&b{TVN-8#lhY>S; z?;|;CGc-&b&hlK@uuB7^i0DH@N^&`d3V(N*Hf-yxbWq_yRusMa3P3T|XAMLtj0FHZ zDh5uv{Zh2%mA zELb>_uZ#TY454>xKnU2mYoOAdAV9osDfD0JWYb5G^JYv8 z%poh{a)3X0?yPRe>9_ zke4kpYlKLqFKljC1KF88RTi-a&D$R9P8@ggRn2%@@eU%{L`$f-upD7aL)YlPqjiR% za3PCc5@C%Pz7?=BTo1ao#KtBnUfBM| z1EBebsjuXu8%xV|%L0=Z%yGH-n^xKwH=}T$wj>u21o|>vQ||RXVrjglJCD|H$WQ9GD%S#p1y`i0H<)L zfLN=D3DF?yaal;5Gyr)%6g5(A2H+SHhImIL7{b>+g?j87`ai~gvOV0A5S z{+HDw=k}7cL%Z#}5Mgl${;q0fJ4*y@>JrEXJrA;;UIONmaQYVRb zUN2?u()#KdyaB~vYXyJ|3Jm?^gB|u|iL?dBKt>MoPKmtoIF);@NTuRKE6$@+Ogmn} z*q&gsukNy3Bv(KN$ese25!-Pd)oqhha?-{Ij)hE`xORtY>L>2sF8#QD5t-T_Ob6u& z6F__AkEgsyw@F)D?ix28DcVJcbs>;>`kPX|qp4BdqNy?CrmUxsFU!DYA%iO;+}bzI zJ2vK@K8DuX5Mq}|_9CsMJ)C`xrA13;FdyAED&Pxg+eI16!%R3;o_t;GM{PnR+Xh++ zg7KnSbCaEtS+b(^m1H$QhYhk#^jB-4*S8YuG=qv0SIBrwT+Pj~2$biOH(Qb9rPTD6 zeK!jDcJYKu!}dX9_$vpY(rL@jnkIHC7+<{FRcH)PFoZ{M2Ol4&SxZ1S{%Hkz%g?V% zP~D`^BUT-DhM`9fppMaEv-ey+x=Ta~EWt5lu0u^it_eJwEpc4&O<;7L57%h&KN8oo zN9E9#B{e*d>SJ}97y{NSdP8{RUjc>L|OTd#`H{ ze&r68d;4KALpvl(B{o9*`n#78U&8V5m-*RG-~agbBPtgCQ$CV%Gdl$aVHjFh2Tt0kv=SF`t~9+*L|5T3kkUlf$m-R10ERSy{sI;NqwH zjFd^MyK|RvwpWdvHb7PX6~@6Hx<-@+!}h*l{KYK)B%Y!MP(Gb+(>-uBpC0YW-l$K> zESePN)gQ2}UV`hxhZxd*cjnuJOS^&r#(c@cU7FM0zz>u@epBFQy4sUfUIM6W2vCmp z?pnwfpC}zo?10FR$xuLo9Jf{$_mLvjVk6 z7DS1`tO_HNK%Z*Y*^vtWkWq<)wtFQ3w({9-CZCF;>GB`L|Mee_jQZu<@AI$W?N_?i z|N1-s{J$aplK<9!{`%Wtu>k%WuYm>%^0iqD3hjxH%q;K0GSaRXJ7ij%*+VdFKWc3S zy)s-#P@v6AkT>MIgbHS>0hhy{4cj#J#MvXrNqAvC*0rfgSsaIFg*rU&7xqXCQtY=} zgn5fwI0OxygSAe+>0E)WBCkbGEpH#4sy^UfNa8eNLW`|?tvV*uoRst}uS%j|vA`GB zi}Zy!KREcP3=V0jklz}jD_PDe0L@{aw!5L$me#BH`J>`;8l{Mq-!7Ps#`LnuYqb&e zScZbbx(W!-t3#m%^?r5xhY=ol3^x#XsU%5qH_>AZLzlTRudpm_!-v|9DT8Vqah*^B zAbM=iZt7;_9QWs}@ce^>HmN8dAHcSQbom5k8Me%P7=h~APqHobE-x7Qrg!u$UoW!8 z!WoS8ybDb>6a3YvT%+7o0))U)3T${G_#S+B3q8n&DBJNscFWh(V@bWj$+@F{i_EAkb+Nz-bwN{uc)A-S~aO0yBjQo7XoTK6XB2|Y15j(Mr!aBjVFx2 zho6E%`qK|Tktpzgo9n{kHEibb245TaUrblrK3KHn=P?qS9{5#$aRaG`QW<8efiPQ< zuhzh{>l|7K`$?87MoGXPEF|u&P`6;tp3|5BQ=DvmqGbPAU_q zE+<=ZU7^`EOj#{w)EJ?S*vmmLDP?elokaK&&_n?!CEVzb$mvqGWF22SP+$wSqb|K% zEM{;G8N~y;ekcTtAAT+&2NaH@wP?YhYd>J!i@kE5Is}a^Ru;Ni;sU?5F-_5`6GK3y zVhOy!-V4eS=w2iIR~6Dkm`i%eUK$(ov;0&qu(7Se;k2?f$`Jug9@+bU5C6xJwtt^> zWB$3C`TOs}+wa{r=~wyrFW-N!>HWKJUvlsCibg4)NoDC32O&n@O*QqiIXa>)V-RS! zjS#vyTup^06Na~8BA`#Y!^22*sSG$o2(eD;M%0BaPgVlS}Y`h3YV^7eAZ?2?Yw)UEp(+es-js2WTq+%zjV(*;;!29j zOhBbD>_9PbpEbpo&|e;;j&Uvwrn{0WkD%~xj!5w9_dnRqiKvE5wEI2W<$w9Q-IQ+1Pyt2k#3KM|tP96&@Y-sx2PqaKaJw#5d#9)J?-M|nYE>h~ zG2WwbDdy=>srjCPFrdDv$Uz^Df3hDsF>(}ol`fPlo^N&qWS*~ZOJHpSNDeC3r6mqey|vcNadlbq9?7@C?y4n2 z7XC}O(v4B5$#|P^Hj$=o6Yh1XzJ(MoOOjqQi_fhCj;1! z8702)cDX?NDbcL)*-$Y#=M03otywOnC=_(8qS6!%2N6X$1W}<2I%KCNo9sbJb->V| zU{e5#Z$Pjy16+40J22TKQ#2Nsw&nNsm-4^xm-@dWYJ3GN=ySnA>8YPyKK#Go?KhXF zlzzFMd;+s)EP92VuMMTq@1Yo=PRsnSOO(}la!*CG=PyZJnAicx`#7+BfZLk~8`}HX z7pv>u$xTD@JG_>yeTRrGaF8@q0TX@hC+kDkuAQaEdAc~NWP(GaWldzHz!0wNoN*sr zT}n6UetlI{H!6Dot>VIpT1(p5UZy8v=-nPj3b8?DJAvJ6_rWJStlN*ohAGC~S`74l zyp-3%{&!Y*w_$@Jd%=%~0&-Gd*m}ZY?jS^f_%fiJkomU_9Zx1w8I|6pgJvdJ#*OUFbOoPgT1O# zko&nZQ7d5i*UL>lq_#wPvO_7882p=q?UjUD18QS;60ED%cu^H(h>1%abV`4njWY;x zsGZgaotxD(UEm9sD27>n19Jd*%+Xi1X;fp}JK^rBlLp0t4L;sTv*~h~KH2lqP8G*t z5aWMKU0x-x7)}X5{kX7ffWm=)Wd(pckn?cusf}lSZ36E?6{6cMLO{g>*s!B32D0MG z+TxEq@+W_SFDXy;C4J<7_Wom?BdC|#4=x}6=KYKC;jh2`E-pU&wRs!BgmiKx4ejzc z>j%t+nk)c8*AT=RVO<-mSdUyc-WB7lmkMc5>>e5w3aFlknLD0R(=IcCjGI4QmHXHp za6xplyL%?dBLw(x^&t%KqtlploFNacVXH6e0JI!e{!oOKRJtnkix8Fd8eSB2!}291 zfC++UD(wFQnL2H$3S!HILBoq-0U+TmE$RXbqqb(P@d+ef^Pva0&KLL(wQJ)%F@ldz zQzxMKt!e={X@on|QD#BJPP!SiCnxnSq&hB6hXia42M|lE+Byn3#%$mK9N&prjyJVt z%4ZmuY}?>Lw#j6zQrO4UD*q0GKFjmcfp}pR3M9+%AC=j#wA?(a1136BG^i4Qn!$pZmmn*O`D~<+Hb7%=xc*t4^ zSl8XL*lHVD>{d?z*~|Go%-5cZlk2HffP!N68X+Y%+GU)fu?U<^SZ`3HY!0kxkEI)SilnFAc4!LQtgYX^#iAqpZwOh z!pHLbzkf5=qu(1?_`^@%zIgvM=r2Fa&w#x5RsL@{KY-=qFC=aR)8~srm*9^B#&!i`S0p%(Ay`h%+?${MkoR+OqU#FISzKA zjA#!Q*Tq8A`e;=L3n8Kg_?{6117<+p7%nh|u8FWy4JA$@q-AKY&m1SlSYUH`jVg-b zsUGS*?W$aVHIHA_BGQ%|%d|c)E_dg>rJYrY1DV_fJ;2x1X`@LDE%Cv*)(n&BqXMg$j6@Lxie1ZZAzs|q&^Y@=J;GOUg`Df(;>%A?{ zEbAu_XB0}k%Xg=uzZSYAeP&w_c}HNYaVCPBmPmG>jJc89uj@Lt&48E>LI*6EZ z0DGY$n@35&6=)=dT}QCP@_iL0HOvy3*_l(h%8%A+IktPgW&cA*8?c1;L z-|+TDjw-vqzXxRVC9I0vf?4l6DHK*;QiDyg)kMWs9a+ceMEd zI-F@d<{#ioNru<@h2GW}k9L-lps!NwZSSi~c)}~1tSM;|G*u4u9FoG`sX&&EMWp$` z20ds*a7h)piKRdXju|6*3RJu%|Z-^7xEbv21jl7)%lW8OPnZE zB*z0*^MQiBT8lO@3j*h(*n^>U7`Wa+n0cjdPXbB2cZF{Bf0hNV%GfaASXvI!nB@Ih zK7vH;-WXnAxdp1)tRaFEY3CCy3RkZUaOjvu(u6}L>+A&1THz_WAuTkS_O(;dP6HI_ zc}fbb0oQYqmwRjCLB-E7umglqD&pZ(cz-r|qZObDiLI|3hQQ#!&br@DNZ)*$Jwr?3=$lIQp_lV?>-ND~Yn4ahOhXkQE^ECI@Uj+!P(y2UJFI)w$QkPL zoGAGK0WTVK>D15uL|X;I&85elpyCe&O1%#IMtxue2P}-DbB};frULje6`R#s6+lxC zNd3N(l*q<;1f(+;;{&){+`J}9OFQNr0FobMbd?t}jCTJ-$r z)~w!{s@qhkkg&bmN=mesIJnMjc@JKpmYLUBPSKYzz@ag=U@LaqSWq^Z^~E{)Aw&~* zD@!R>)c|O;6?Li7B&109B}fm2>!(Tarwg3Ceyt`4PU-8Z-Pje=v-oN^h=Nt8g{{Wb zN$&qH{GUf$`O-aCfAaOW!`m;VO9)?o`|{!Y;r;iQSI|o>ojj9-DQ=v$M~l(AJ2=CJ z4Eb=}xE5&=^eyE?;Ic+aLw@&QV3g4o)p&jmP-I_6fg#pS`KDi$c9$EG zS&V?a`auu@qQX5LFt~pt)EVw!OcAF*!-bFU(piAK0tJy`1Twmn8Q! z&S$}yMx)9n1Y4n%4$8I4k2Qm;3h0s87sYDOu0pSkbkkl+0fBrxpK*d;!>zoa5gFTSdj%$$jey~VxQ*> z{|hUy-@fECKgD43_uOXu;O(En`>)W)Lqhm}J!N_?!(97&ARg!e5x(VepF?#f9p2le zZnQ~J`H`qRS zZeK#b@F0)sKx6%oJeF>6cTQqDd9I;)CrC(DG2lAe~`t`Q19{t_(N$_95)u z;$fkUi3b225CX4vOOL#H0ElWG8ztX1P)~P-RX3V}Cyh(Yz^Hu+o_kb|q#^d{q)mI3 zX5wa&;F$YJ@s?j}$|N-;`o!&|Diho(6Ot+rIFU|PQYCWbDK8lQ0tv1iV-@`ybah(9fxB0=B>7ESY_#Q>PMq;< z_K4sIv<7?0?FZJt){djDp(vEJjR`V-j4(LDaVYdH7E|vM#VF#Er228~q5q6OrC!oo zjv&8z`#ooeCbsmm_aB9?zjOKUJxCCI@9mHB|6faY@ZmqdexatFKq zd1QL{lr7X3MqqHB6ePQcrz#EBE-Q!|CCf^X-+;+~aVX$p+V_cFMUYk@TLoCWvHNgw3QpdjvU4ab+u-`0t9m_Pn=M1e))mPq#%PjX@1#izzca+M2WnmBy z?e8a~bqP2^>1xKxM3xW0f`?QR5Z$JPs%|poCMnH%v#r+LLQe-8LLO9(j(l3$jk}3y zIWiZd$R)KVBg2h2R1fPI2Kd>;%P^9>G$@MaRpFKrFCj%fCMy*_}LTsBBOdtsUq}3d-CNHf&Z0=No{#)uG#-k{~C+>_o3>!#x*gQVvQDQIh?S zFOz?!-njb*^=fR#fFfzJk`(Ufh)&+gRhaS7!W|Yu+5nPcVG9bmn=L2-l_#$&atBtxxSMeb zg9iqkk3>&^Vt?lPT5ToDv(*ja5Lgv*F+78EgtJ4S1*V9JiVAD7FzRpdHLTK4Nxhl) z9H|?z#f-`jFtJieDo!~*eg8+rX#DNlZ@>O-9vpstd4()nf*e5pI$v9tS9tDSXa{PB z0mGnB5h@casG(Zuy75Tio|GbD((F>;<(nFRj5DxZ8Rb^l;0K(5a~txlD>7Bo?O*pw z*@P_${|PlHWh_Z$iR z#M)9COuiC%qL6-OC(PjHVjb;brOXBMPL$#jr}75Z;t^MGAZ9`RX7t(=toTk-SkMl#M?y2BWTlCafVuCfN6s7J73H??4q6qR{6At zt)NdkaR4j6_fkIcK9vgK<{?!~#z&5<1-5!*p2J^wbiV_oYf0#bsklV|=s!x+)nczO z=>T;F9onlM2vm9%%8Lw*5(u zIL^f=$B2ltxfe*TZ=|fT@#tsL9sPaKUw$Y5{XCnl{1&is{RJ`PetCWp zmdiskuK6<@i0+59zJ>Sh>N*IYvAbFU<~XsrSkVsSP4(q28|jANgn2)xVPy&8?@7s0 zeH6xWi3S8EfL5BJdvIjk+F?Xi<~oMp9>6kGejfTQdl-&3DcTfC2OFu!P?Nj)RY#BZ zM`1*pLkjL>lqP^(DH#OikH2LoYtGz`Ld3xUS^Po)c}cik6S4zZ&xtlr1$B8{lsL!V?6Mw??VS z_-zH0AI(_}U$K0mPz6)Z6d;JDmG+vP2cY{}t4AyOP+-7m573#kcbt`>WhE{-4*v0XpqKBY~-_r z3EVeKuKy8Ipx=A@hw$OQzJGRkIr;QSK7YvHzSdJ+hd_V)W zhyei4CH-~{?t|N_0$XC8y~SIQYLT>{^$7~kN}mxhZ70ezu2{F%u5CPnqj1*1Sog5+ zNI5q&$#WwqCAp3xqPC8t7^K6s|m*LelmXD*ThTP*T)ZXwb}%FI7%Z$2p4R-u6KJ zjghV*Qr^xji2#xq@ZUI6O5lna6C_@2ZG*e)g?D#1YWh zH^uz9gkd|j4h6t2oc3?1KxxL8KoZ6flf`NEfKaLAz^r|+QOVfh!WfM&MB!ziFc(*# zUSA2TON+t)>>$G95sDoWLAh_L5*l&tq|wc$lElPPa}kr5zguZef0sP#)kG3o0cJdZqO=wl2rtSv za{(S>P;p>~c;Q3auxA9&E^!qkNT9@dM?htJ=C^!|?@zIgxR*Wdo| z!}njm{anh-&)z-@`pXYddA|P)HRo5sY_g&EVh!Sxb~BG`Uq6!m@zBMEL0o2_Z!7N7 zR>^)>8W3UC2H6?s8!xB;4)Z_k-QfvbqGq;;q7c)q4u{Gx%Lj-TtZmQ9oMecgKQKR@ zAP1$-=Eq7^YO$%~x_)wRc&zSiycVlQ>NdMBNMS$@NYoI7T&TqIlSqMd(8|SR&)c`^ zJ8X|sR3%?$AEQN=b+)dD2olovjl_$2>YNxb-HGa%vU@JJ)C@dv^Jab0;{^?pTFuF3 zX6y#=9*5sSL5qNN^Sd#-Zv6{NBuX6s zd8Z3_M-ZnT21C-dK7A|oTeOH+Vrch!U~)0J3DBS7%1;`QS6&j#B&G8RZ?`d0T}uK9 zn7R~*DAb{EsW6`}rAhcm2n9Ql_yCS~oVbIh3{Skmy@-s*>($}H|0(>Z%!~dH;lp>{ zKG(}{VbS-8w}1MEe!|=5Z@&z@P&yO5Lx24CtM{LS)TEF3Fuecb{j2;p|MuL92@v3t z{+jsV8A6>1?CY$f5688v>UZZOoE4@$7Wcp^wpf<5e6W898ZJ`WNGN+?Za|LIm=&}a zmpYw+8gh9XP;qyz>gGlY`3uxSkI*?jT2-I11UOE(shr2)15cPq&xf}f43(@ehbYr! zC<8kAzMY++;E*6pUm|o*q-yG)W1vR)7#meYvIae6c{L=Aj?TwjMi@eR6Rbuo8pl|< z*KkrHv6T-1E%W|J-qE0arMsr>D&zzlfR#1U=^kWDHB|$2-fAGVg*~?9*rr*87-j;R zC5-42%5;%>iA+S`RBf$mK7cX~oM)xZIve5%0d}Qg3tet)@fJ+ogr)S+0X=C0Q8lwI zrpP^HLv<8~1|KWJ^$9azskJbU`W$B#nDM~E zFYUf6VGtrphXU7{xTWYx`^mJQFJ)Jf+Jwc9-v&k1!!) zyN-=&L(SzSx>~NB{zZv~>?pu8Oyt&qeI&QeY!6VgI?_$o_e*PqwWbIw0N~GHJGUpI zhAn2LT|jMU=MjCh<@ZraEt~V2*5Wj7i+U~F5tJUainRF{qEsl8R{^iDyjopdM5pM( z)3scC9p2nqiX5va_u{x844^M^gO`v-T$?chOSv^Bv7m3;%7RXs2WwJW`Cn*l3InA| z<0E6`Yv&H|98^OR9vrC$)DC9@xIToI3N$8*)CAb|qVzYFh2-kf3Dt_+5DD^bmh(p( z&68IY7%<$Xsj#z?-lfK`eGgy38$5m7!z5VD6p@un1wvGWDDfJ01H@L)KZf9Gb&5V} zJ~nc!0>DpR6%Y@sCaDn!g7)lDvOdT%DliZ(JI>h^EZ0UG%<7tlBfF_t7<-0|Rn_zeB04}hST9W!mF)F=2 zc~w;xr6uWDeMYql6EjQw5OuSVRJIs$OeH&(38QsR@ut~CQm4Ya^qBPTz`Yxg5V}~# zeLkDVs^U)zuW7b~gT80)KM=`VIuWR>zr`NV_K;&u!la*$zlBDSomwAn*l*|SaE)sG z>s|w)%Cjp_E!u8c8!8|6ETb@~7}6^`j6>BDaxxF)7hY5xaJ;bq!NO@#_N!b*>h-}~ zrsh8BiUp{77@l2PHSVayIaOFBJ|}dFBY?raQo{T@ayJimLW(Puu0LIYlXQsw!7NvO z_c(u&I3Vw4htg}g?l1Cp$!Cz$NyP#9s>nxj3hEHX(lkke!;E=N?9Y)z{V-2|1sVXW!ITeIL4TCgo5pq4X^Uba=@+m4fDKg-|8!#k|YCmjBN7IQ^9k3hZvu z6x`t)3Xg$wNJ$x;G)I(j;VK`5JDT<)nae+7z@*G^x4$e+w92s9_b-=Mn`oel<+EWP zXn6_^Gj6?Moukz?dI~3c%t^rqdg z@$^hF+P!caV%(qvQ!D?-csGRdD|2ogz=E@&fLZeI3}hIOgdP>VzBtm^XwrCK#*^5P!9R z2xMW3>k}U~Rb+RyxU)Q?7#eIw2Gx_D6!_FK>dE1EeL0k))~l6I0H&qeEH|k_HL{t@ zJWM+$PRi^l^$Bk{&2e+9GE%`$zWf!{*RB=~tiGm>%HSFc0a3D;B}2uKM!*H_)K^ z@WuNNgG8hc^4~vZSi%p`4TkrhTwY7pTgUQsRc&}nT91d^XMH=I5RzG`Zp;nC9co;0 zOis0~Ytmn~_SmUxl0Vcxrq)UcBOH4k)Sb1ttPjXHxdb&ZGz-?mz*L^f;5-DLjf)|7 z^$0&+$uopwN?y3L!$bexv!c`4Z#4mBDSgS@a10DGKLK*KS!$8@unaF+7GApXyz>zx z#OXT`U0iCJY6vK{SckHVpOecm%nFNM-JDR`O1YCieE0497WpuQseQ{J_kS67r%<=f zK*?Pdm8jH@gbMq;ge(?W&{xKw9gs|^k*Jjye7q&sc36A7iXSloVP?Y1K#XCB<5W@C zA%KivQ{7-OZaBa080tJyxg&Mlj1B!5!4{>Sk4 zqkMfVZ@&IEbmM2@eo!^rH4`(GL>iw#x|UErVbVJ2sMFRgQCnQX1flk>S~+%XuuCav z#{xW!N)1o|p^2{qKdtJ@bK^BYLPSMNlARBS^?SDksQ48OKpeOa zq|tn+5FjGUD{oI)P3Tl+io=GY;jp764pC|*loiqmVCspx#r03FlCpPK|0tyGT6($n z4#lE~dpnXkh0Tq5NA!w3gJ%2{<*YKa^6w;{dq+rCJh{;NGn~{R`f7+YD^v$3#w7TZEPuX#+5NZ@?e0bGyg~HkOzK_yiTI z)s%j#BYY+?+(Z{FQN>v4M>oEb^?M=8$106yA#7|+;N zVjpH(Lo_u#R-{gsubgFi9J{`so>h1pLrjflm6w=OhU+52Rgr);VWVF?u}m0B`4fX% zpQE_tVmfG_5YKkcRN6&CmKp!)^smYyw)R@JAZUsZBI{i-A zwo82IjAdr0j}&0XS*j5Vih$&Q05h#c|NLM2HT?Jfz(+sD&iO~`(F)2?t)t)NXTS6I z8!T0S1MO(yi5|LksIUxiS;D(Cr3thNgq`47RELuE<@gA(r6rqu%@4AkvqC?=4iwKezRM9>6|Es7 z9p(PQA}CS4HL3-R?-D-=jTOQw7>uJs3IV2>MoPl$|G;U<)2dSdCQOJvpp+V*nw&a*nvPs3Bo3aGGLrJ#(qZyVZ|;PPyh`VqPi zY{Hfrl8QbhNb3;166i5f2D)Nr4C)Yh{7aE)`_>S;^$hW9EGVZF+@y-iaI=&9%MD}% zR@w6Xd30(U^?a77*h=z;GNP3g7#;RWT8jLRn)b$RK%EnySFQS(lK|ChS^4GFs)jOO zYHeUJ|CHO#O2lguuC@Su1x!$meOl*{s#0(oxS(WK%YsX#vaQrklhiiTUTRm_1`tL1 zzO7wk5<~Iav0LDoAYXhkZ~^=a6^X~9*`|(V1!1Z~!WGgguaN-kGHeCKrZe@skRp(T zAk>K`&BQ`IH;aAqssqj^@ql&u8aYbo3elZO4#Z-E3Vbme_AQ6$45k4~I=Y9!r+u*j z#Fq5#>>sAr{}w&Or*Ebo`8|*;zh^j$$1@m8O4|3k??`llE*J6zs02$IE_XnVqx$p? zvEeT2epdC_u_JaH$ZQ%!owX+0+_UdcyWwm-MTo(=cWBWE))s}+OY}}VTTQ{Fy zX-1coW8~bjxKOMbPh~0(h0uwPVHS>R`Ygwea&ULouHDQr$Y? zhL_x8HEVfMgQ>JaX#vf1MzIh2B_h=zjk=W`u)W!wZ>**_ZexYp+OpKN9WsIAB-sik zcWkM~k+4>~=S8V%aSAMLTnxkL)3>Tu*jK)ciUDE!A3Jza!!ydp zms0g54OFcoJfxoL@j)-Cr7l?qC2)))$ZqTsaKQkfLUsS9Q_b-FhzfLz>Q1_}_P%aF z)nM#*7$4k%*#|dIY-AS94FD)KNi(Z^0Je3;g@odv1?Yz0(}Wg<*K*_79ib8sjcxpO zePiQPbJvylr`p1rpelU$FYmtqq7}E|-tU)kD-Ll;Y0;zyzo%CxW-cyRJZTZVguxCJyCm)ol5=C0TZ%~BXOXs1mUOaLru)ut27cOBSvoqBZ9WZ+3B=Yc#Tph15w4aU;_U{}XWI2}{{SWwx*6Lz`B@*a zDs%{!9M1vcjJmzrsG`Q8IYAsEC412|$bHw{vdL9Nda1kEtCFw^S7)Kc&Q5s2s^}W( z!Y&FaTrh*b^ZNnw)_|IF-}n2=MJuh2w9U$f-V{B*^A&!ID)0EOB8j(P|ReJ10qi79l(SEoYrV6 z=Q7Ag&?%~WO_JyvLrP50+Bk7c=c#nCG?tisIuL?0!fb_IF@)V``uZjaEhU3(uxF% zcb#~(^N#(X#lE=dfNpZ;EjDeE4Y(3ibrO#N-lwmb-noS!~S?p(N>y zw@g?i^4Nl%bW3G^34a;>;_~O=-(CKdYpQWI|(ks%w#i z#D0yVn?`Q(G1D_!X)9ON{+6W;qgsC+0Ckgq}tx? zJpp{0y!Brph3Z*+_sw^bIuos_T0SHjSVI{Xzrhk>k!ps>+5vb{iObxYvieNq}LabHx$r7!GPkFv!o}5W*y@_V9U~0=LqEm4L}FJQStsz4K*bsY%&6u$)`hr-QRz?^Kav^iOni! zu4RcYVF&6KC3l{fUMxnnRv|RK`YXal|2_v3JotyV-+Uzh`1UJS_P@A%_^AY*&jQ?c zO%zfgHy}+A3k@Gk6mBY~(qB|6!qfXbsU67EqeQz7F2^ikOUh@I4pGYmmP#8uB0}0Y zc`$EmIf^O_btAYQM438x5~SlZYG8j8+QWzg!=QLpxbL{^=OT_zljSta8d{F zj5*zIs}1;GP4=mEm}_8H`>=+hU0?t-9==#E)X`y4W-x`oETUqtAkh$X)GAh=-kd}a z15Z`&EGl$2;r4x@J}g=5UGe)pQ@C0bTH~_WdC z*dz(0E<6n)QgK?BtXX>^KY<>eJ^MWccVL)Z=Wm7Pk(8Gsal*^AW%BEwr0zB{;Pe1RAW*IARCNk?lhfg?10vAUp5^00-p~XF!sCrS?fbpQNZ47 zdYSb-`b$g-h$S9UYAzoy;PW>qxVmj--ZB@mnO%nYp${Xa)gRIPV)T_T$Fne?@V-OC z3mmdUOZPHsthw|{A~LXqow?ks3?>pN^NT6A^+mFkjT5J$c*3Hm;(QTvaEg`{+6rtc zPEQCM*1NHWH8?EpITYLh564gvN&xs4sp*7iQQSFsohYK02ab_1g0}~kFFDWPhcy% zdIj`PvD;8@tvMzn)i^zH3@_Zf zsx)v=;cCifWGvNdAYL~wWRA#$SuGU}yQy<-ayQy>msB8kvNfQc0$Nt@9#qjbJa!C9 zs3f5vBea9|Q0a8G^TrYuN)uf{U8QEPPSm?bMQWzaiZCqQN(le>R4(=A=!IoxB$tv&}=}=G+4=y zmBZ*UVFqL+1bB-UC9rK7uSu7y@)Nj51q76;$r2Vy2(?EEb@EwhnE1rvftsaA-6OH8 zd&)V7g!zKCX}A$4oggNfLgVa%SRG4DrLBMQ^|!-`fA)hjP8!VE9|!%#uv>rq_Qi+4 zdH*52_kN5WgXR8L`6i+@!4IGe%xbUer^(DO^l_1nu?1_YN6`7VkH7a7JLR2$LaRkw zP#Xs|UMavBvV79N$3C8$w($kDGp)ff$$kqh&`p!?N8B}4=yLzes zL}sOpiSDROYZVt>rYDtmuL)~Y=wQ;k8=+sG^bQ}yKqx-}*Y5K*a^B zztc9I;1X3E0k;?i=dj|7rfM#PMNS}Q>EjF}4RTPi=WT|ka}@yR@dmlx&iW*=7j^bg zAA^uyLL!4GE*$)|bByL8=AnvN4bHh#U(~h0AR4tIwhg{nTvU0W!g7-)BTpehHpNBb;Ykj=Ayp+8oP_jhyNl$VKsn~s@1I+n-I!{ z(a0DtJ9@jr#SVhu9B`@!1?o#5cB>Dse5YF)X7!(Xs_BHs2^GcxYL>@N5@V?X)xmi? z>m+frg3Adp-HC!V(-XWZ*T6tIxX9gGxkF5io^hZBBT6WE-nCwo&gj#b*LCTY(Uc^( z1J4aCX4#=P@^olup$D}hnCXG07YEd2gJW}tdSdHCsRUoLa29-0g?(m zFeW+f14HH64n@6>`37>TR#r{50sv)fzLM9tGyTgCatyQt6jn37C?YJftobz zGkQ4Cfg8u-0s0YXATZ(Y2;nAw<0FILUr?dz7w?~e&hcq@{}ZU7e+Xvp`x>tK$3Eqs zFeZB(;g%|2y{k7v8$=P5`4QkeL3ywe9TkLm=7l|y&X(jpl@g<>(pqI#daKm$AHMtc z10AfWS2*o_vg99tiq>Q3cv_n3O|9w~Z#ET_mwN+yk15QK991gi*_<+xzuv0)+uote zsHF+^Wh_i@xkgb4+s->1YOuw-(#+QEDy><}Kv6)s|V=i!M zGcZ1F8$q3cRFFm`R$G_2XTzC~3YluKV6TDR zue$JBeBsw*IO_%PPC9u=6mTTb=*r~UbDY?yz%IxBm9``RAGDj2Zx_R&n<<<;dwMdj z0$Uy^`Oa2;+@N7dc1gq@>c2u@;o88y&Jt#Ns!t6y6Y!AYZ)nqJyOO|uC!P?9cfu1? zuA+C`g}ednM!nciI$e6IDQr7py(s?_80bCErjG0Eqbs-j*>pffZ?op@0oyHgPuSAY zScPgv4hc7yRqxm9q#`;FMnsoa%=mX#2T)HFRQM0&kU~s9RU6XKpN6;JUnEO@6MfCbM%ezg4Bng8J>0`?P#u2qz#odi8|uILN?5tT;*!U z%+X%R6xe}IhquM}4C{*jMhq5!F0!f|I@acK1vDS!;W6tY7H!08n(|B7P00DjGGaB5 z%CI|?3wskMREJT4jzIlzi3u<{mF%QHCe#mT>HOlMezidxFFvg2k&o3#FkOScpF?#Q ziUkQ@hwqT8dB7*)1^u7zE3QyO!w6E<>HslUIh6xL1&x!}sYk|ldZ*fNNxrVt_HSrS zEPHxAlv}a8u$4y@48Kzs#RP;Bg>h_8Fbx(AQszWf3zriMqF7?&K{2giu4&gp-wdYb zAa&5Hv(gg6;}P8M+btV6*)vdeP_;R$4%C){52EKBmCKqE#b`#zAwjYg@^~LfDVFM3 zih!f&?;J>$^#2p~X3Mf1*OlOVeub-AZGvPH>s@W#RUguAYL5udjK~-fL*|Kml9Byb zW?gzyy-5%Tf&f8^07(EGWOnYsfAwD5_u7${C0T>Udm{4QGiA7M-@_WJ!%0<*Bjg9o zOQFDc*#An6BL-V&MebJmbwOB9A*b4OfaM`uv!Y^NoWy|=*ZCZ>^QE+^OdKox@RJ;T z6zTBpi`QQTN@srb_HVCNS$uE*>LF{lqZFn}ujUxELsZIgiKKH`%2?(?&duzR0p4BK zPy%YW1EXNzlMmOH~!$d=45oue+`Z?G89NX&L<>{X~}(Llz@q@zx|lrZP+wHS0CIAt4IHUvva)s5IY3@24g zaEU#OVq@h5=v)#|j|S)}cfLhS%Ey?UAtMn&*;enBnF|P~ylaG6Dok3^3Rh>z+UfZ+ z!WTYYhWp(VtwK?r+I=L2p#?6N(hERSkxHSt*lIU$&@qD7(xvfy*Xr=hW4W0j>q!mp z{1P5jggG?_6e#lZWqdlRz-xjt*vv@=yi5%YdV%<;3N}Jb##-^0Ay@~rmdgG-kC!96 zKhLmIm;D!87h99eR`#_vk@CHw-mUowiV!jOsk#^q)`q9b8%8^7oca8e+n&yzg1{R^ zV}NENSxe{%^|T#2nfRGNdAFD#vF!v85FE~f+RzYSUEqD9a3n;n2G%BW1R6F1rh#YM z?=jRi?36HJS>JyOKg!}Qk0_x^&MGsc0QOfh2)U5Zd$naEYr%%~cWA)jG$y#~K2i(v zuFfO*5-qyQCV-efsHcQG>FLWi%%G)ERcMrDshhS{)JYpWiX1*B_X3dBavr@zQKT0V ziG>7oICDsVk;A8PAs6^4JuCj`wj_T%1tzhJWCdm&j!vz7S*lXW7loOf3%p2}v$|!I zilAvXbPO;Q#(SEwjwG5}e-e)Ma%R6+3>Xw7b7PmFaEF*7 z<#CRIqh#Ig1a}7ys(n|$5Y~C(ZJ_E%-;h_MgwQ1hsA;>HHn1V>@aZ{5aq8Agnz<@;Hy zUS7gvrZ8WQ#${s~_3z7Mh2hWdmN-)}h-#ZO(ge6ndosw&vo2n#l6T3jQMR726W`rj=?j=_;x5Q$8Yf zFOn+%vL%Fa4r|{r5CK~zD00;{W-U_(n&(41cFpZ-NMhwE?lT;%oyVVU}!wvSJcu3kHmBQ!R?Ph9Zw!Y{yP1 zJi}44AUR}AsnIOA#75S$^+b?c9FCguk373rc0BngdC|_H_ax~rY6Z(MAYQVnu}P5=a{@=bu_>^ZN1|j%rBS6-4~ilcNJ|Q-+*O+9D0~2%$?;;lN<6hu z>Bg3mk_n`GrGH79k6*Dbi3EmQLf$Oes{|I9@M`b8Va5eiNJ6P2G0l<_1X!4GT{pBe z=;$MXRtpt2Rls~B8w-+L&r8tX%(gw&H8aBVw2-pQw2q3`N%Gp zQ)nf1ys(7_48Sh`=#tRi*p*TeV0h@(-a0t6Awik@-o!mX;Ii*k9#gUWmPN>^vVbps zQ>>2RuJY>_QXFC6Mr@QSJeuY5^^%F|zkzdW&|2)V>Chb-K@eU<+V`GbDi z1ET!r6U>S%r+@_idAyrLor;`UCJKyvC0Rvt15bJ-Z@lT@Ui{?2x6XD5UC53?W-yJk zqkvISToEgDHm<*eFd8Z?l5WG7d^{e-cxq7H3kDF_^ZQglqTwxM=H~3^8nE9ZU5V8k@3Y=r>y-08b zZqx=%vRRDj41yV_$5k$+_A$1R_)FxT<4#i$DQ=X>#;GX8!_C7Y8-FDDOGCG16MKcnjJUZumr$7kWd1QRerifr`D~9sR&4JJ~M%3VQ5{v zPJ0?UEm0t9e=4AFXhG$Y@P_M>TWtPFyS4`$Yop^uq9ysf_r$^I=n^aN`8-9e*lC;OO zdL*i=iv(P2o=6s$Uw>)hD4DrV*K!b31ee+$#ydVx`DnMzntIH)U2*r~3EKtpOk|I|~dbgDgo4Hd=I3l;L37j`igFos{*s`sgW5_gx}?-e8$0d`i!=#ca4=L@B5Kdq)*!q;?FSvu zs%RMEw4Fb|0HKbu=Gzn*2YS@ImVftU3DHO}faIqeo*CL0ZTKWgiPB--Al-#S+{-Qn zR>hrPJ9A3X>bX*_B1DcZH_Nd+AL>SGC&@Nfwn*k_wH}(b*mjG&a7zq8DKK50qk1wVxoMW!=>2R71ffBx398s3af% z<54eDv7P z_d%J7N5^D_CNekij;_ct>eYrtz5zvYD`1~E_K@qtyKCXUXvnwCU<`DN^R4Rk?c9^< zfV0gN`=ghGa}xVqGQ|_5VrS5(X0Xi!v?BQ@ zNiROi8AR4xmXq}HKzCIVnEtdU6#*h_8(1v1P?3X?ou1GwThj~AR>;e&koTfe#~lH9 zM`Bg^zQ1s{E4ydo=9lFNKsSQ^3EiU>nttlS?9<@k@hpvJ17398VZke<V zLB0=-OX|i&1TGfce_r=fhn!Sg{r`5JyL5Ui0z|04Abl$shg9;^PQ-qSh zCxdD<<#X2py$JdejXv7x8kpel7wTlQ99Bl^hx#PpCIwNihnD5I_|ln&ZTViIqAbMfP++{comD z&3AFFWOY?|bj$IjObUhuTNNELYE}i zS)NE!|2#*QFJC`{_~(~ze|Yd)8|JJ@WpEtICLuM^8NKPJ z4yrB`4Te5EYgtg`V;8nALsEL=&KZ!y=T`D<;sCB(ya|se@09RdpG(@H$573!~u3d z&NJ+(#iG8ov!FEmk+ycs|f7%39hXy~v@PPl4_0zT=KWiy@NCMfck zi{>`aoP)N%r0SQ0@_3f71DcM@3e^VgLnU3SB@P6L3{} z2w*gWx5=!I9z?A-uEQ?h7+x?+MIroWPF2V$1_IWQB(HCdGk4lL^jnwM&s6mQ z$u1GVD!&V?!vKEwZ3HUqk{G|hzOg8pYp!yfJj<87$!tN#DXT{$TDeJ$MNOcN_ zkEv|d`+$Of@*q1Dpg{5&!uu5vR+O10lh&uGa`2eds$;D)W{S}rDZ0>4My8dZv+-)N z3Q;cGR_d~9kiy~4d`fa`^x@fgZEo&3FU7MHW)^Z^& zBnt^+X#!bgEab^z8ZSrV`OM}@SWI+D3-26OHVl9zEV56mX#R1D+ia_{P=w5Z!vVg< z#C#yQ0qn{aqQzWzu&pdX)R65C`Hx$CkF63HH4i83)}J!sWz{&{2VAm3D_wbmeElj4 zjf72*p9-2T*bn?c_}_A1`h9r&q_|wvD;j$9a=%&>{^vf2#Jdo$Dp256eF9!I3cVCVnD=@Y5fPxV&Aw4l9K*c zMd1M?lQd=8;;eSIlE&GrO42b|Vfa|62xm%!WWf}1J7pr*0hyWoRQyn>x=IGTz|jp6 z2sr6eHhq?FVzr_s?s3+-a5BpII3YVjG}}N7e6nvHtJL3BtBcLuxolvmr1DaLYV~9s zba_IQ?<63Mu@tZ%unw##N3cBTAC-X1%N{yqiiS+}C(RyIg5` z5MxdBfdckMep`hZN-}4w_p%4_sxPBs)lEDkNa;nG8(1%lvd|j6C3i)0-eX!H&Zz;? zXCMPFx`RL}>oE&|KFgq2^v$RgH6R&Kk9oBHW%N#$7L^nei^EPaL&@vH^fZ=|Cp%7y z-{J|d`f3z=JC9zC?Y3^8iUD8X4G(;3ybd#nM)Z2QUDwmKF*Cg{`G-y^w^nDSejdGA}`IlD_1 zVCoe+hSzq;?9Ot&YjNSI5G4jo?$H7nHoDar6K3P#364u}>eQ&nTHeUp;npgt1=V1NjK!!M;@!4>k*Kz6 z#sI34wQyZ^rpGD-Nf(0os!-sGdymjYFEfm7Mz>qBZ$dTmJPETK*^|(3poTeUZX4Ud z;c7GZ7E_4%`RHhoXjo&TGSxvfqSgR`Zq(hDR@1>QV~Re>Qrs(GuN)#Y+zh9SaSK& zB*sQJmxZ1w4}HlJmgPXpVJ6nhj>zw!NvW~vd=8-WmPE(l-LQho%jD8k@C$us2F*(R zFu;v9n}Ed_^-s^z!Hrk44HZoX`7apyK{arxB~+=Hja>&fY_vM)tN&0D1b_e2@Mc~v zU%dV^v`@c$`~B-L6%bP=Y9K?1fe`{2NTkLJyDe#(0O!Vh1^O*0E z1YtI4l3yw70HB4ox=j@-(G*R2ka#I;3d0|1W_Gb`ug>snFOf(M0)&pFp}$4*zLn4JcuD z?C_^ehEyhm`Sx&zi}SF?#egn5#)}tZO%qs%k`p1S+h<`~ zD{m2lOB}A-(Nh7Q-r~l#QmayVVx}Rohh1VcWCurLW7HO%LnM%LItni}kenk3Zb*xw zn4HZ6wsa|B*g)b<0af<;Dd((PFxuSA9>7n_F#yR$*U5H0m{s`-S^=7QU21s`*?dKa zu+W`(qjI*d3=1JL3rP*}men?m1Ju^XAvuyB3b*shu+Wbs8ty>aL88LMB2}m~bI~m( zNB}|K_mCmWLZ_T-6}wWv3k*&dSjEgPMFIfJa+pVBJauLOa2;@HRUIj*R`WxI^Yi#L z62)1}jSe&s?OZ{=MnT%bY|nYXvxDdm&t$WyV((~gG1|J}?KctvB%1&~=Ucgx51+n% zDX+c#`t6T;^Lq&nuipbfs}2U%2zmGahPThuLcVWW@&KW@a#6jW2AUu1ng$gX%YO}| zsr(^3A9(KkS~!>J%p!QZUMRd&)PmU^7*~KXUE@d2vwIEy_)b+pDTBB`8lKG)&^8ZK z!9_K1o{0OkQ`nZ6&12@Vz|_GNV$gq`$7(Ab&5kxHODffG z$^0G57ZmbC6@Wxr*fLEuexPY|^Ee1OH><{nB0gMAkgSCQ)zO?zsAAayL6b|VxWI$}qdYD%Jnodm_Q#KfV;M83LHFa$p&-HX8PHzf~6%6^vtv)|=E^XvbB zumQ5^CIv-p?DYGN0TPtM+U%a04n>dDDxA@trK+4;1~EzabJkKWL*#P-;G}>6#`ktL z_Jz7i)+1X>cw#-;g4;w)KJwe(&{xcmpAaQOv`H<>LLjG4i#!8Y5SQRkZ&>6shyw-z z^gn0}U_r5PoKsb4F3Dhl$xw6Io+gg+O!3pf#iU%b-s$StFcoQc33NGXVb6OetX}ob z9}hxGkmj96Rp#hZvz*4^LMa&J3WHr?93|NUnw$<41HUHH8lgW+w6uC0M#>1*Fv^s( znX2RC#fJ->)D%kXCIna|`hlEB+rQ#mrG^xkSAQx}r)ptnA6%jX#Go2q?m8GrFQ*G= zNU9xPxY^X9KT`&&qrj0jE(!(M06e#|BBKe0>kTQB_kQ zUoS8K#^RlA4i%Ty#l}>6+Y(Fddtp|Y*&gsZ~7PE^>gs-Vr{Nz!^jXT(M@(6lS!#1q3JA7nS0Vvits|0EPCW-l;RZfj_mrV z0Kg^osxka>v;_~tMm2b`QyzO83n(Z5Gm)wSn z3OC#wAl9q%>xCUfc((Rn1iY81&+&fMu=Xg~e7Te^V z_l{vn#PoQAT}9`f1xAi3ZkYw4eOK#%`PlXDmYPsMBvGvg$&-SEa&|tTJ9r5s`C}B^ z;p1f2L{sw%BCoG~|20&HEChp#v$vg{ANQ$SCEwlVQs zmvPJ@^@Nj+RmE~y(uISb4;@iCzb_yT7{*MwXcl|s4>#3QmU9gH9-IYal&R)?HdoR9 zL*qS%i3J_B2jOmeQZHHq9!X?s;OdA_$l*x?hjjqZpjA9KrK*msNfD%IuV;GyphNWn zCcm9EXN$(O+ajSCZ7<`!ujXjL)`*(qq)sa;{KfvGUYpnmR<)ZU<>tZLN8vAz+h4qX z&yRr@`nS70L&J(GQW#m@Y)5&HD96crhm9^9B+v`WT78wfn1KGr>1mAw*U3HFJkVhj zJ>P5feR#@tP-wVX7U*21{dST7%;0SCd>^O4$tkJFiz3az*;5PWp5q4{g7Dhg-=JT? zIiVvm6ae4xjO^eTiB<^}MGRYK@kA2Sy!GWwD4+BOQAjgWL^EQ-Z|2(MDRvz<6{2jXhswl zkI}J^ZBElz?~*f|}jB%z3xH*n1CPJ~D4fnZ_4;Mazk18c}sQQoKv|XB8Oz zQ7a=*x3b-=Z-JivuCB8M(QD|uNN7Ew?_dfYEfCo&A#NXm%@<86ysG)95*gH-Mr z&fg4+B9tUH)nKnfUwwLNU_wx+Y)=<-uol-F%<8D>o|*6AXk7 z_{nLwU?~R21IU+h)1=f}?wWu{%RIAuubPIuW+^EJQ;S|lK!;->nGo}BYlFmnk%hbN zlY`qK0C2!$A$22Z?eJs}i6%qkaUYV$%f@h2xKLq1rwDaWp~{mi4A-f|BH5Ax)FiU? zI$AAh{Sl`nWchK9K6;m~iXG(j!MKJypCZ5V>t}FcZBqKf-v?ggDE8UgFW-Lt?h{Fh zz5wa>m;a6o$v1DmQ*_AdA5ian@%m{FfOmKR)QoZAeF$5Hu_`p6R@Xt_pfEtW62O)z zRwD1`hnS=)Mao_RzAUXiPgqCg;uUFbDU7++v#E5iatd4IGB2l@&Z^#aC{ud*{#n~ke6AsD^QF+A;l!+f$~Lvfkaue`_{qm7F;s+s8k2s%@R;fh*WevF63 z3)#x+te6Q)P+;&HT)MDW-t&yry|iqTqGM;Yix?(WgsuznN(>;aJ+X68C1sNwX%k@_ zTc5HUVBYmQLm#P4sN*WY$xykxCtn0j>)N3>Rmvx9o=DqET{dcJqyl%sX!WEF(4{A{ z1w{xfZ1|RHkqN;?=Fs7wDtj7v!^B`SaYDbb8O zzmmVg=Zf+8=eN(o4?o7trMhVsg~pL6SU81=UAtiJzeblmm2`uR9VyF-0wY-!u91)D z4b51-U2E-rnaH57pd{%E#02?c3OSAl>E{igcbpufo zVi*9mhxybAh+N2M&t&)@BozdrVfBYArn?F`IgJX()DKx=X1E6^R2(X`18k5xFAlYI z4qgXl0fQ`Ofh3CXjoJcYpEif)fbxS;hJ*j*of^F%ixc6nqXJNA2A40nXDF(oBl}eP z^VmvI!~4CG(F|Px3t4ppns&2@MGyMG3=rTDpIJ4Td(Vsq8pF)d>k-v$eN1!jjq(6< zvrSc#NKeoK&eK%)K9UDG_Qd!n%m?e_*0kkn;p}CEl9zfeSr)YD%#~RwB*!|&I?2U( z=|QK$Nj9D##C(kI6~~L=iK{Y}%?vQXlRPU7pn2U-vi#*>CZJ8;@Qq#&^P$U}1x@aZ zXBFW01nZ-mut7^%`XBxkiG!xV1DM2s0x7vB9p5=moQdr|cl z;lJbv1~aLraqmYGt7!e8;*kHQ*DA4Qr@{SY8p4^>K7cLCD0u>D8R!O~Rmb)>#xCgM z-S8#s6=<8Hu7jrE0o@OvN}zFzrsSa#kBFlmixDOPlo``*kqw68C8X0D@{EmP2*<~_ zDBWIMWfxlevc1w%Dr8|wU9PM<6zAgV&N1jk8p1BoZP!F_uG9qcBx?le1Zi^FHazcisM5m3QUY7r6J00J z-04PYq|gp*h&QPPohp2@#%aIl$$LOvdzEXZ8f2)eQ$K8>b&vDD(>XI_ z7r9cCX;rxe;JBWx9Fk3q;lIVDilbGDNkvnjJwyvTjG&R-Ihg?RTD=~YXSCPv^qDy8 z*zA;c=z1zcb9HIvgc;{dk0IFEFvUoHnTQ`s7`Fu<0P93f4pDku4UT3~{eBx&U)(~r zlCXAn$6hJMfa?$El&T|M$-49S)Tw?YyVr^*H`v(>z#zysgvYKXid=MCGVg_apX9)3 z$U+7WK3~$DBrec%xG2L>(!#%b_v6=}hQC5YdHv{+UHPv$&SaADvm@p=Qj|UY z$bIVXk5~T{sQjFtnGc>5kUlj}?U&{T{v4#EEp{pO=yHv_f}bdSf$?^^{dSp2%>*{J1P5hgG5T1)kY zhC-daH6PKzZt<91*R#1C=?cZugNzuNA*)E>9dL~`0ul?rjN5R%Y_7Zaz19}QKx$_By)z)ib`E0hYICjj`!ydz?j3M0%BXA3*jv4=({3=WHX4#GvcSfY?Q zjx7Fk?CG`)5o-Gzk}|6SG107LfiAMpb~~-#J`M~)pT2z`UOzeA!E&+~p#$lIud^+f z;*<{7lZtB^>3fIj!L~bWX_(ZElROiHje}kd4p1+tO~(;fUmPw}84>&78@Rlu1-k&% zNqnrlVF@GXvesGHAv7Vm2dMpgqDv84lumA5gTYn9#BJ8|cp09@))-+qly1=mY@M`V zN=_zR%kfa(g1IwX-12T7YbYC9I0)XAp2kIfRWFa0%<;{)r31y>5f7Vep+z@(q}<*f z^}4MDf;p8V+Q(#agwP7J;ML-hLKu4-28CcBo{ZPASeyuZJxsK( zIzDID_^QH1Ido*VuDGA-eHvvG4a&?ZEt*J;V~Tq9R`?XX9s@In8gvYZ)^TERfmvd{ zk`-$5|FW=IN?yS0w0{bo`K;m$)51d%4b3MXi}W(NW|^=3&8vrW2fCls2?0+Pb)gs`3%JxR#P20du1UJLN32V z93nuzVW{fZ%E7VPueBg4I>^w?vDi_EaW`dD?jd2fG%uRD0E!p8?m*RGo=n}b1@td~ zUl-4aq55IEn{vE*;h&p?PdZKW=;W)~>|GJl zEVbOL8ef?BJB9yKBMOI*eP&oXYXN~)=CNZvJm4e+gj$UyAebI`m7Kh-Qe7MLMt#?Z zvl%QxVks$ZN4xc4L<&ZwqD+?(p^&VbhLH>ry`$IUaZzVfe*&8T&fWJq3 z7?6;WgKZf}uwF3Rr|a^IVuaqy7>9l21aLJI6j z)JYHgS-M9Y)WOL@l8kRUI%F=lHKrx!p!sG+K7ze{k+SKv#4 zW3dwXjI7M3T6zB5l*G4Uox=$U<=CX;KV3iyKm=6)T@`qZ!H%)+L%2 z`7IEb^X;%;Z4SyquxDP6cd1xTYW6x%jZ-_{J?%#UBc>+J*1)w30&@mo0y(sY%jO_ybEL|uogNo4 zBjW7v5~_^PtSCZ&IGunzaBcr(o6nwVfR%xSM$vF=N+IAVC16otap8q*1`h*NwL-BV zhpo}aPIE#g_Jk^cT`>~PBiw2DqdE>Cl-xWj1M4_cn)*}beQ$ee4jaFz*RmG!>--MQ74tU%dhC{z|f%J$eyYje?~a75!ixGHQB0=qghG_l3P5% zxN=7=wk*%OnUa8^eQhvV@F&t-=HiRtL*6jUyJ{G#0{Yh+L$1JdbkBnr@T&IA;Xb=~XQz&a)^W+TuGKD39X}D15 zsBV=iy-WKw9CK(&L34nXM=DXSpikKZD0E6R=ldpwYy%vFLHA~w^P%;mGOCO;N zAqN=4NCy?y674X4+w?k-4CF9dg_FNybZ*FGc`Mx z`z^HTv5pFMTuudmDMs}`)|{{Agk5`Y*4k?}RgG=Z!;?^Dc9f$RZe3LT*i0Qd6&Auz z#3=J;fA%MHvwwR13OtSn1SX`Q%+DJ-G5JgG8#uLHJl(gBUaEJAQpo3cI~ZABG2864 zNFiJ3z>LX(5FZXpDDhAVik@vsy@&S6!% z>hj6kXVv|Jl!upSeVnphch>+Aa2Za^HCQ-l`aT?vvUoOjot@@upb^-bQp09>CcXa~ zAX~<8e(I-#jAEB^5RzHG936~#D(5PY1`fx_mf&zXDDNlaithHD&PrG~bpFci5XW*d zX$^}i>$2iG?pDoI{Cc=Q+t0_nO(FV2BvQYQp zj`tcP0bvx8_k86ab&2#C`;OnF@;CP|9^yvY{3l4H0-7oa+g zx-2pQktAT=G(*2&rj-p!)S0D>*KJVOBMdS5%X}zb!LZ5OQUiJj`QII|>ilZcL8YLV zjfS&CGfUfTD`5lK{wPTSO-#VpJJ=Fp@OK!S7z&JHo>}e~h(Ck_YcY(W zLf-Qox|m~b{@TtnCT^ojsK`AoEvgu=IpnvNr$Q@fyjLT7FiJ%;C18p)N&aQfd=z^i$4)KKkMBU;jDe5BZft65OUqaN6ilMy#7W zaCIU1S@t5yn|s6%xu)dJ9ZG~tP;5=!$%+bGMwFMEyWu;Rng~hh)oa(F~Laxl|EVRm))~kBAgYWrE8Sk-~@vI_if8 z3US%MXo<&HD76FUPOqhI-+|P(S@+zbY$@dv^iW}zRn`ZN&Q#Ro;(kn!D(k!qfgX&0#vE49UptCNC@Ipn26;pFm zG@Mfo+N0X-I_&g}MkCIE$h(|JS#>U6YE(eYqQ*J4zch zw+FPLWgekNA3j_fj>NjKOEdzNDn}c9JvWR+v%!u9%+0OzYH>h-xwW6JJM^yR(^ZM^ z9GK&c@77_dv-Umnko>ddix^E-Mn+?8a2s1c;OKOJ4_8? zX7}1PCR%_8aqt3bt)&51D!N-jEDC5D8aHw$L&vGwg%vrmvMK1nbzH~p0olr1VI4i$^P}suW!Kfbn3Lq9 z-r$q{iiImn`y`Qfv{8pt5?Iw}p^>Z(ZTfmtD^d`F7f<+W7acmsZc(!%PE#QlFku!! zv?^p#^GY5i8``(wvKY>|LS5-=U-I+O+By}i5WS@&B|N&3*0?DpqqC)2)~d5>1$RBF zo8X#y6ysTX=?w~6+ zzNP_oP2D9i11LcGZXjitR$8Jf<%PYyc{oJd;hw%{u%$(s>*P>pjxCqfvFO(;Y%2gyyL>n~Tz`0rJJ?u5kjA z!F=#;VLHgwVArz|jd9_4LmCc@wVcSZZx16=sh)E}e)MXW2()e9rZ-D#P&=zG?6@9% zxh~y_hL?nGh1A?M)0a<9Ml{^YP4THE2!G^uPYp<8o^)eImgPYuSb^?hhvmehM1p`7 z(IdF`sEjWS`WO)MFy!eTDl3X_`1QarJew91lvSMtGC*p`&eG7!`M3klr+5OZ2l^Z2 z9o-Qb5?mu=%5c;hJ>VeAsV~gV84~#DYGFj$qVHq{q6AktZ_8HUA(m@&Dkfm(Aw-c% z%j{K-f$~VR0?wbS5h-|(0D)cz8o1@hVCGzS6n2{dgf3Yp*D`XQ>iDI+dpEm5=?yH* z(ImUz*Oc#QLj|-PlH`dNxX;*f%c)W`1&C0i9SC~|_>Wa{0n}s2?(&fx9XooyX%?DK{n7}wgyZ{LTxUt4nA#p0i z=1{Gc#MHuBR9T+j9yReEnO)0ce)5NjokC_~389#+Q;C>K+4##5VZQ$1$AK6A>g&g^ zpK^Zr$0rfVkDe=#Pu@NYuixbBkKTU&`Uln`{|LLHe*~lPzrX$}$RB@{|9^AZAw2qQ z76Q|zWgjYpdN&yx55s{wtQ6=y2DE%t?Amm-_GE-~MmjV*;U=P%32_+vH9vrD)=mLc zY}EBGL&+`HnH&vg6Enhvv!a$^R2E+cd!a+&cxlIb4bUa^Wx_V`IET@o$rH}#D?AM} zn;w%=SD`)|MLtVWE3;?zQIc#IeMuq)3JobJyv}GhL}=Kw6{I6USMf;8WaT`R_Siu2 z50vUE6>N=9ws`VQa!VD7Y1XCy(}b~hoOD2Kp%4>LH2Z4~Du&oDwaPu%Z8)QpSk#rA z-G?4%j!4jg6dIVrN)b>U_bBA8+L(w1>apK?svxMS1oi4!H-L2_g2WjRD0T)+-lTWxGmQ zMmJQybUP5Aa|XJ(-h*mUda`iFM!#74e}+=2&07HO!q>NGw}Hyc)EpZJIUbZ1o3klw zRlosP%wMaf*shr7Fog@P<6J>Z$bBZh;IldHI%#yuw{kiZZb_o}4Ow^&kZop#b{O6e zX)CUID`wV0_naItUg_;jN^VivuVWoM5_?va}}aWV)4iY{avj($K6ay~>2 z)~3K(EnI{vyG@^#U4^7+H4jzI!-R24Ky0;78oh8(z4*I@cF+wrYyf6B0YQB}p9FH$ z*&JRqSy+pt?XAU8-JA|;>YBkBB znxI5Em+W(39Be3H`Ocdp_LiLOF6#i90c_th6>CbEiYXc}zkvCtpQ_03j{VbSeHn#} z&rH1n^%~j;fFlQz*9~<`so0DfwjMqFp|R2xXPTh!YA7~c{uzs|T__NNu*rbshYoWi zXCqjS50ZfJHLcG9aoS>AxgrpbmP47QgUr8FCEKRyUa!6&hwrpHz%{(?wf}oMZ&x%q z>>bUW*fxtnpVI8u{^{ z6iJE6tEzh9A3)%b+zUBL!SUW!vbs?iR$;jl+%CDg^)VOeNhEd_+-|R*5Z> zT|z&k)cPnC1&cSHvl$5FYu>|(d?A?{q%URQ>!Y_{hu2T+ z`t{4V&-0%lf5@-@ljLi!Ss6zXu@dG~^V|?{ic&^#`%h0$@*uQkW)jZi6J(dctoZlT zR=VwSL`0{S)3``at3l_>{C#h+s=tGUiG zp+a8@x-}Ns7Rn+k-3pK;y8}k;S<^xup%XwX8zeHNnVW5S0rFre4{zGuyebwr<>+u( zQ6}DTcB4dH!jcc(wRPO)vDH<%t&)LE`6ge7d8=sfmYkwHfs+rFz@Eb>Z2OD7({gke z!DPf4PHtuxE6RqlD=bG7*R~o~HZYkE_Y>L}m<0|cq(al-8qsaRt1?rY$k!1)R5L*C zFvhoBt5KYpQ7avHcO7dWbA1Gy7NE+cB)kx|o;{EZ6x@t~U=>+|`zimZO@G4K_mIL( z6#|de7vf_{6(x1V1C^H?SQYe_q|(Hz;M%5Y$I4q6Dv6r$hV{npu0gU*X>u~998#G# z-e6uHZNfwmqouJ>l-4D$L%W?MDeuAK99@+daU761Or-~}P?21m^lSzgwK(RFloxkc zit55TVm2%{og>FvY`R!99mm?}crp7?C`*(A6RH$Xa$Zk<0%#rQ$MB;c{V4ojM-2Mr z^$UI^Rr`oH0ctrgOUptO`&LPUk(Yr{2A%~0<*0z^Y{LWkhdUm#Y8L={Ghu9L z#x!oHA-9sSC1*b@Kmc^}d`7k9?WTkd8n-f7n*@uX+)=fNNIe_*$?%`;_{Zpz;SJUjdTMOSKVt!7wjy zOA<1~)wuCJwdbjhnO&!1HBzNF6eR%akF>qI!M~Q zlQ+qltOgsxt!*C=>_Uf~3+y5<0oB98Zgp>ZfF#3mND8&uA}vGdphR&TcZC~TKN&-`$aliF^rK`6LGPuRW^ z{0RuGy^SxfO^OBtrxucAxABCwPx+pVnxbBVep$W$ui-C_aAoG%zkB`UPsiuKe*Gx$ zf*+s4+?%;Ze*N}!e)Y)^A^Rb~7U65N#g*4T3$H)T*Z=+XSMvXF(e{%6|5|%sIpm?I zD>)DFwU=X}CTCM*M^!=rPk48*996i6~Es{pqbCD^3YKYd7Dh*?T{`INqekkx4 zjvUb?rJq$u;?h9W;d+AcC7IsJ*6gSwEI-S1H1RJ8b9_@_EH97LGO>b_Z_{ySd8Y*- z%vtOr+p{QGNIsl$-`+f+P}_YPe)viLOb7xM5 zLeXVQ1l{zsYR-im(ef?T<1>9zG8Ra`%~s^?C9`vvKegM?!rumw2^AK!wl_F^QrNU}Y!#hm z!3;ePCh4tYMGu|HSkThi1qxlLPYsn2rF=dYj8P++MyWU|vd%S6E}Pn=NUj57xvJf6 zXr`+ngGCuRvfA;!9FjK``vMo2yO8=%zC1%upY+-0J9)Ip^|7ElZOihUy5^zefy&qo zaBTw8!|t@_AZJK=fj``#YEfc%&6NY7_L{7TfC_;8O9@sRjVs_9oP2r-<$!`mZH7+F zZhZ(KfC1$zAiDbA%Fq&0Hluuy12i{JE$9s(w=*BYoKGI&%Q4%;iiB!wLIeIFW&%pO zX+bGZQbNFBQWeFld=-))#uoZ87SqxGQW0yYD%Lz5wXs=n*bnR*g#HOn+B-NUj_Vb*)h5u+6iGTIEHSRxW4{Jw}zp>$RA1PI>Zc}Li zOgt_tNSMwB1KXPiCls>+>QZK5@?#P*fioaqVwF|sw5#jZ5reIcXAH zPX?FPNMQR6KI&Owpr;HpMx2B&A4DLW_mO&T%G<&0FI2{NG<<|XD8Uf*8LWR=SbZSTCaW<69k#N6TPT!VbLf=3ra3RGu&YOyX3{`DA>53}Vi|=N}a22^h zc(STn^bJQBsXo<>;-+JvAmodGCPGQa*a5X#AK>YCJmdpaI^~9jg|Vu}$72uv)DUWB z2I6zLlXZZ;H~@xlzNil{Sf%h0mp7IlQ$^%ZpRNoIon%PBDXjA2dLmSyM_NaV;@$#qR57BR9T$3g2XZlrZV0sgBc zFA_iRkZ$rfQ-Xu669u<26AEf=aO~aRynRXdKrX(%3v77jSHFDyg*w%J8D76Rz5Dcs zzYlNU$w$dwkm!8>_F4WjD5FW7EZh~{;+%Ezjkp*2Bwvx8Gm#8PJQl%T!&P!6b#kl&!1 z?P`o`V|%oQFk!X7Yua=;9;$RsInu?wKxD+%X5)HSpZINX0BF?dO)3uY<$XNG9aI2}HQ z$ucTr)vy|r^O5%3K)Wys-Nx`xB<4Ac0W}A}I{0W`N|~`QPv?qbGNRh6^=D8@MM~XhKkKT>0jP$%;HW zmnNOrHUcy3VXGM}YuP#$q+2=kx3dMD=pgaUez&#^wAR|Xtof4f8uZ=ltiC2x(L|`@ zP7QX{-h--v!GTQ*JUFaSZkvPO-VH^ciOtge))(TagAWo*ccu0c0f=fcVq00v;0t z21p#Bbi_>#uX^k)8_K>?7EM%aj-zr61Bm359}TvHl9?h~Vq57f8O!N^4}V87z^^H( z{Bx;@egm20Z{NOlTN}0O&42&V+aHM5-1XeP+0)oZm5#RZ2Q9S>e9&?K{zSorF$C-l z&}cV#uO?V2pc>0=d$X+)sAY#-UC0N(UIS#Jy^ZqpXl{e)F^_0%?@yMPCewOp3U3=h z#3ss?RcJc?ywaU(mEXv7CIlW=jK^CVEn8pEC*F7+yqh4!ZJQ2NV!$>eF}5!FSpysD z+k7uI;aw8AMtS10CeIW#S%4)vW$l^qW_+=+QVSrJho`&ihZ}IpR?9)Ft2F70X_f@z zggRYf(0SmoJE{2}oda=zlmFF+%SwYlG~h^9LjQ@0(*g_w9X|oyq}F=`OP0rFcMCQ_ zd}@BfKV@|VKIo*Rf!D~gIt5i)K$Dg0CS4bvqAe=@vSt&%Rfl+MOK)=rU0wFJ=b=Ea zg`Md6C|Ge*jGKJCB&10OJ0E3D#TNjZs?m>*OB!MRin+)Weg~i{8@o+Bek#fAID(Nd zBCDNzZwUqmr=`!Rqc~Glv_Tt;2@!tni5WQ%&%iF(%*I(yG_HVL>g<0f$^!jCZ`$KN|yhm>RI7cx_dGtc+*yb5z zE+x%nX1RVlIK3!`XRdy!ujzEUX2)y!*m#n)!bH*iO3~MsfHR|0EyuWIQp#-eW^@$> z)?R8=q`*kmVn&;mZ_}cK`7UlV0q655tHZmjfN+C8FmHwq!wcXJQM$QAat`!3o6BlW zZCG9 z1794(jV9-1gUbk2g05T@kTcDXS~k~{Z(cpFdPF=aKC9nK7j6toVbwovzt#zCsf7PA zHdRm7<|;PtPOVbcz4yP6Kje_4Rupl;%q&n65U|W0I$iJ@OoSD5s%0SWnbN(|%LMnI z!HSl&sb>mVRB~eXr<~4)!>S0_0T^`jhw`8LqHjrxy|hTY<4mGbXZEa}+Qn1ZjL+`e zI!2wy)$8F*3hoq0Etr#y^vuPIcHKerVWi|q>Kk!XQSz=4^N9W*L-F7JUHH2!cl;OO zZ=S~Z-@JWKaASB@0?(xYXX_d7-xq3DTC1?bPCuq*H&68xn%VZ5-6q(JSAK8Un zW+cQY#(K6)fzMVc;&Pl0$Tkjah7y>-$@|PIO;w3WP=V}4+H@*xf87QLJe7!+huTe` zx`R?>+|&<8^%IBv!!1^-n`_Vi!$6DYNw%SJ0H&>#mC!+M4{lg$ctH-|1b!YVe2|c` z>&kW}43-Wz3GSh>fNFO*jMInBVaV!=EGOm=EZx#jrC*2lp>w|!sqA(a%>dI~qSbH^ zxB3R05J>`O-s3#KsQ$l&E);sC3l9sXfTQ!#5ZIzB8nH*E-18lSHS;qBN2R3|>bQq0 z3joHFSONtw%F1ZL>#z!}h05nBnbX!rDT*xyDo@*jU_Ho|zeW`a%&+Ol5Y2D={A{x} zI_L+|uHku6Z(0XVE@M_VgEP+S)K6NX9+*lcuc+JDRIvX&Dn#I76`PctY2X|np*Tzu zu5&lS?7UP*vm_^6?UOGv)C-w@Ctp|?pUp`H!{DbZ#oX2z&Jt{2*Xs$b>o{*vJw6=X zXXwg84UEGK&C6C7^;1qh!RQbMvzc!($HSmUN5fZ7WG+%yss5( z4`)6@!-aX&61EGfy*oQhXwoAgXdo684<9w4id;@q1( zpPQ72ITFHdgvG`>C&(kWruDy$2d)Gd=15Egs9+XVRp%BX4#K}{wH|lQa(BG#5Ij`{ z(r4*=m4T&`VUs~|=)cb>&RQwowgu$}txA_|QYiR}2*6Tu3nM|Laa%MmC}xIi6zeB1I*D@A7H#Gg8L|8f6$QJeeH=7e;SG#7K&0 z6d;(pW&$Kzsa}uh#D;ZzG%oLr69-zdmI}(=I6K@pHg2OHFTtihHt+uhflR+SUi}6W zJ=amj#jnEKN2;Ry_A!|)KY9I(O@#;0%_BF!osyM{o8-WSx#3dpM9U>sM$Wg1@Qcyk)WjXO%pBqsrloqQ-FRv8Z$) zWRV6iv6?rMhI9aF;@HeDL79_LX+pZ)xKA_WaTiF~OVUIGu>{GEv{AFL?x4SWKn#%c zb*&bo=o#q8BNLi;W6;hJyc?nSJl~odv6}Vn)hyW3o?p%J0iL_$AqM)9Dg^Lo!*d>F zS*RQ;{lV^ZRary>tJSemO;#3ORdTH_%NbC1yb}j9-Mati)bA2uhp27+NIo(e;8)&U zInC~|O5|Zy*7H^0F{@`)AK5O8X3Qy?tN{xt4V*tL94SX%LYs=Nc#Eqfl%z$eZ&y`t zyVV&mBA#66^yTcg-l#QOg8>N_`e<#w%eF&dpdQb1=2RpcClc%OoWEqI0P+MJ7%jnq zJU!tD5*)6h1Jr?TsmCKfKI50GEe4>g8MMJ+w^7eupCz1?=hZ9+w+X&srBwVX({7PT zqLhs#FFZ(+eAi?ahX{RawBbn|?YKL#uRHp3FE0?K$Ghg_S76sUv6OF7pQ_3=N->7I zHS*!&lmn#km4~^w-I~LuNynBPVag9{ac-McSqM)Q)?f&8a)WBq9nYUL#Ly zXn4OiE6n()kssl!ny-dKm`Md=)Kk*QH*!J)_?f6_kIccEb(qkd0JpH8?r#E(I$pnd z#z%e3W*H|1W>>9~f;=d|yx_anU*a{$#J$fUl#n^N#3;lY@>_^Wc{;rW8?fZinOkj} z!CoOX~AExJ?J(l@?<=_sxcG znx)Z_4KyICPz|=MkzGCxs)aj|22 zQmB$%N)lF$D3fV@gx0a7Uc<50hfO8FE%>QkW7rw~9OeLLoy*PAnYL~^V73gu6$c+b0;I)3WOW=%@Sin zOq^|i4V>ryI zWaxo`4v5`is8586-l;dn1w@&itvvbF#$luv2v)DbFd{re^CkKk77K>~I>eUAN@#S( z8`y6MQuKw*6Qe^HM@0f%!K74C1dDc3#kQURm)fcQX<2)ugv9~|Dt12{ayO%DO${8a zLYuE`@lg_+rvXPdQbijba5?TR2#y87Wi$H*g-#f4#)1B5UUYUZ3B&9SR0)tK-4C;l zr~?S~E~UT&nJw|MCs!qi8k7Fd58nMahrn-N|L}kR<$uoM&T>l5NuRJ{{~m7a-9Nql zG`!`p1+W@j0!og?93AKbH*mNvL}DnR7dDYn9XM54Rc}3EyM?&BLu8n|Dg|bIflwuK z>d-v0HzYP~vAF@qpkfxRN0HCwODX4VBO^{pUcpglJ%U%w05xShl^j+^)oQ%kO(9Qc zC+7-^mBq+`BcjO&tj6l3nF*k*#uGDO-_ED0l(Z}dAb?bK)!5e<9VrNm2Yp<@k#iaj zz&K&)>FWq>dP1_~%i3kky@&y9K8#_lQ`O4%dcYy*5immgz13%`%g7kRAO+C`Q_zPM zMl-9Aqs1TX*m$UshXFksd8EC{>A}Ka_G#cH59>JZQeK`ukfq=F`9{EgU z)|GE?lwA)Qw!uj+0NUAQeb~-QUXIbOi?&BO8V~b9d6?xmZ|UFNQd}K*TQPsfnzNXAlcY|blBr~Adgv0?g=-Ro z=7Nd9(kwg()Up*-qk8V8k}r4jIC;l z791O(C4Zn07J#;WWe*Z7Ej0oDoLzaHb!Dzz&ggpANYLVI@$P||P0c*OS}lRfT5X!g zZk#p8Fd^Y9S{SibI^C0@gSN@>m>U=Dx}rq&N^)@fhy)3wm zbuPv7fJ}xC677X&8J^2_lu?p9oP#4ZVL^{91LOi?Y0gr~v$uK<7xPM08%1<` zv+%=DplJVHc>VhH*xW7ae&ogXbQs~TU|*5|q1$)WMzeM$yIW&3=M_mIu>b`H-7&yJ z_0e)aBIR4%5C{BOp4EyrJc0797^?j8h-NZOD`1z}E1}=ALAjM(i?bXh`pnZjw%!X> z^O+SY61%pnG2HB36FcHJbjQ>sLg2wzB#`L9NUKX_P0WE0+rU6l%@?my4&{RIaKI8| z!7S&WQ0+ITDI29Ad(SUpWT%pxv6Bx-TP)0~m#SJ-93nE3ijdM9YW9ZZbAVog0(gGq zAj0K-2i>MA-Am__zP!knVFmMeD9LSZ6M8iE5PQY$TZmEaKU%VE@t~k_TvN($pnRj^ zSKLH!DYRBmivlD6n^uh>EJCSDpIs7fepM_kapZ`8hA-Dap45sBL)G1V?9fJrE@E|3 z4XY&Krhq)8g%=J@aE4xG1=nFIfX9T}uRE{8s)Q{Ao!4l?$2E1&ot&Af$ZQ$Ixw#eL z2Gz0MMQqPUQY(4!OszU8@KNfI%A&qN&x+p`WxW0S&ZWFkQ^AR*v4Sgs1TzqU?x|0; zxd}U*3*lu;C2mWn&=-=`w|U?|+9to5k(f$Jerx**lJi_q%+3a0g3{d4-6}>0=^~?{ zW0;C`)?=3r#exe@RuxbgT}>s0hn?n-ijp-TfeSM24QrX_Lr7!5d^j3IT88|$sH!#< zq`M_R)=HIoGHwNibxK}5#S)HxSUOBMb%dj{q{i#3o2rN+p*-eUtMot290<7MoK{TAghu9JLaUWc?pY`u8SQ2Mc~8HP%I=$!Mb z#;8RFFO`rg7*^hQDsdo!AxQ7)5~BGQ1dzfkhw2xA0a7!|+6LMQA{7i9WA$VR zSwNQM1^QhHYStDrnxm;xM4-yor=%zNPY4qQ6`jStqA`mk(r3lpUIXdwB84 z>L6P3;%Zs_xViH^iyrKp6GhGAl{@F2AQiY2-qwWoHCtFJ(=cTF zYsLYSEC(c;a>m8sBC0i}JWMF`#nx>*PzBuH7bxnrbL5Cf)qdpRFSRg^`|iMU$J+7N zrFy(N`FttH`&yf7#V9ReBqutKfZL z!b_yj&IrvWNiAjY#_2iy<}Cau&mZWyYdyttVKs5||@-LsT^g=g-MEMV8-7qOoyA6p|G(m~hp+l5K1)4%C^(&V|ZUi4LFh zF9)DP%#1X@P{z1O3@g2vYp9-PIl|naU_1uM-YHQ12&-C*_3ZXJo7z=({mCX?0ynzA z5^Y(#$#P*I2)*A99}8A#X$$NM!5F=>V2`S-r+$Do<;ikuQ*y_gR?%U0*#>J8wD2!6 zT_&hgC4jM|MC(;A0-3pyn4k-po^j;Bm*vQa9;bZUO3l$AyyBXJb#sZ1e!;@4q>iHt z#YNI9O)T00?JjnZX9ppI3ta6I1h>R7IS}E!b&2qO^7B<<-%y>>0L~FXXz1Y8%Ft5D zxrz-CRSgF|j+Isd%eLio{jL}}P=Y&&W?>|E2F^4&MDC@V(w4iu3FQW)EUaE!imQYK z&l%KlC$ngIwbUt1r$Tl>2NLglI+wxKf6)-SpiaVAMMGxKDbN5o0UIA0-+uA>yFbwm z&=B|bUC6ldhwMGW1OZuZW*s{`5^`XB_6e2)Y3o(#jK0Y!Oo%whk1XCuEZ@oJhh;>G z*n+XB(_}vk^f~UKZ>)R~pV7#P{IE;KPB0N(>L<+lat;uQpv2m)Mr_(zwpWI7MGq-7 zqz!)v$bjYbABM9-Z%U+4sH+B$@)|cHgCP(fJSb>NG~w_kW;midAWEra3t$4-?xezm z_r?oTqymJ%4kMHVcEt2cNNmPW8HM>&rKrHYD-f z!f>oPp~R8rbUs~Eo5D@vmP@Lk{;}>0#t){xT`*99p1{mT-LDm0VcZ}oT!9v^b$)%i zY!Gwc61}8wNZU(xgER$bP{Yt*8&Ks&;Wpq3*=Sm}zXV^FQ}c&gh{Qj48Tc<*z7}oy z#kSf4ezB+Dt6H8K&|t+LR!kVM(_#S5Wl6`x7kkGmB(Vi&y;%b?y*!Z|GimB_bbAU& zW!P2M$(J{}iAo0r?U01C`lY8?oeqNvE8F}AQ4pACh&T4}p_Wezi$we^*3Cd8`1IG| zM?d<}e>%4Fuirj>RtEW+IKi*YxA5KPZ@&vB-1q_Wpi; z9gWX4_-G8HUrb~cGnmA^`W$VE?W*-rDWF?Oci;iop?J*;5xr`2)Q#;{#8U0>zhK-xN)&9Gs z3M2XP@SlAeSBwy}0I8)s*7A4_HHD)~sg*_t#OTC_B>c-UryHQ_oj39h(T5|j^_jP2 ztcu1-Up>6|tV}9``T)53+Kz@X^MU~r*{~9j+-C`6gSEgE!@wzeA77m^!Ta489bYh=3) z$Pi2-yw0rne4Qbk&;_|E`^8Rug|lfwZINQZaLj%yV3jPPK1)2=dH$0UUnPJcOMfJw z$kS;}z9CL3d~9Cqh+gUgH&|wqz5;6x>OqoXt?p%o*|5JmMR7njhC?S`^+CG^kl!BM z1}*NM_wm0H*!!pV;s5U+9AD*^Z~wxx{%23GhPR*RJ9rQM!`nyi{((Hv2PO=&E)lx6fxO&n;&7nZ-=n=7o7ObkuTTKaJLri-Q zQbOPfut@3y#*y_+n#Tk7DJoqkWx7-kS`e7?1|pJe{Bb2oNfn{D<EmAJ)`MF-{2HTbg`@V`8m4l^xsR=8C5&%O=M^z!}u9PF1 zsb$vNXvlMi$}tfkXdI#EN}CKHnBllVs}U|e^z1pSR6TW3Lt!nS7Lz2FH$r?;(up+Qv}xaH-)nNp*Y+<fa&&?AiVkO3xBNI5wDjn~zYX}FH1+b4smq3phq$Yngn(WMiDD3Q%Axa8MeLEE8p4TQybFk=;VV+L4`up=yK zsV!?{L5nxvpecQ&Tb82I4}C>2b;#8#K;f(%vIvcueMhct=~+|_INM;dmS`}%1=SVf z#vCy&hFc>D-6P%NBs}f!JJh^>OCHb1{_5)|0oclqpziQ*`Doo`0o`}YwnJsQeCS!T zxVlC3stu`;ZQmf^sMV1Db40=H*&K3H>O1x2}MGG-A(ewRSglX9&-q|grXo=*IWeyI< zei$)VQmi9az*_Ja1?WDdL)C<@fKof?Ie43A+w|GgiHo@d=$)Cs_>leRia(7a%>hAy zcm*dMSts3Y)B%du#gfsU_|7&7yo_BRvoupfmfj7R2$OA4G~emGk~aZ2;B35M_f45w zso3bSLj{@y&RUmEioX;dyZoUd0I_rdmI?z4N#~(F4&H8lF-f9$#K1}wU~VY+<#8;| zl9edX@X*ehD0YfLAvI0FSjs~_*w7O?Ycz%c44G2%gEzPo^=-YYC-nv;fo;^DJ2wk-QH4Hd&avb z=z2B^tyt&77qAPJ74{O`piA%3O%7Rz7vbbF^EB2Db9IB-Ip*uQn zX&qG;tFtjE;$k_@vXQN_sO4;hsM>+4SW}B1aj?2iele-GF9dlE8<;m%ajb``IgBDo zif2I)g@95}IL4QgdLSzdIjjfTR0VFvtyzFVqs{#EM1+AnF?K=CcO>B=};bfPoy4#xUeaU3h|ByBw5e^`Lm|hIP15AsmqO_37OzK`q zWxXkqIWd{cfn>6hSscvnyZOI#zT@XR9xtn^(=6YOz#RYt!jGTf8z@*)E6m;Q&+eh* zEet0{b+^lpwhGnFKF(@M!*;`UBzpP^1VhWw1F`|<%E)#H_sDAGCA&hSoT#!suORh~ zkevc${>g3Qfw%o;hGRUN1>YMX#KV&4w#Zv~T?aMdA3sLva5tar)8 zl{eGsVBo|SY3I(5r!81ga+=2q3^s}$oHWtwUDgJf*Sf+7q9U{f&J(RV1(Z4RF=cJ} zql5q;O(gr9DairD)Yv5R+XciL(z2Go$TNp+ur6+c7W2+Y2e4JDX2QmP8@yW&`P0$L z7P*PQe?@?;*)BzX7+C5^SR5#&=K(SEVslwmgv$j;4830N^wZDD5obE~49&aOk2&F86UOS)%QbKJ_pj^j) z4*#nJJy=S7b$D*I%5tz1epmiOv0p}Ec3t2}RVRP2hbw^lBHuypo@~N^w`WlIGN4hG^9-DONr-lo5u91U5t_i8aVs&#|K_Ad+Tu5zj1efo8c`2OrF(VLi<4 zlksbA9hCsVu6`;Ml&n@r;$Lr_+7@u909TS7=FPpn&?p7?KgUaCr9j+*nQcK80~(28 z7O~)?ZS9+D8Fj!>2Ri6ONAzu4Rlvqay^`kNTYiXuF#KM%&r!=Xl{}n)4c)!D1zzc@Nn$mRmCWjG+>j*OIYu<#mHOwuUt`ap~PR57ZhdV9|m6R=m~0Z4(p?xm)b zNUR8ZtPaYk4yT*fGf9heR@cqOG^?3o-s32&I=jDlBXzL(5E|uhF)u z1I3b{#dTdy?M)E|Btk1kiQv2jpat1rMw>Gslxk_Jlewjxr3krFjK1v@cbDS+^k_bT zODnrF`XlF!3s364<3s1tHPSsKukP-ps;3skM)NUy z-4Ynl%WG!WA5#@-&l)8Nf)&QBO@&b>`&qS5bG)rOhqa7^o5w`1#PQtWX>3G3o}_%> z9w#sUp}jO!OqpFMOCsa*Nyby*$iWHm(G*?i<7iUNYBIqFGidK{x$2{<(SlrUiII+~ zU~QGp+N(#`4yx1Z&MKr!se!CVeP!Ff0}`FByLc>Q1$-cMV8vEOObkLiOJrB`1&6^T zV?jS(lH{Dn&hEF1no3_l1{^l86qN6F03E3!Dfm3bQxSGPy9BG`g_0N%a4cI>33`OO z;5J8*bGAQqyf~TjC<%-TYVBOYBHqG)U=|X&*UdOhI#89oPp2_0amSE*n(1{f zY2*Z%U1+}gYOQCbb^;d0ekriG<+hW=N)b=PQaA|EkY|Rs1qzJ;?7HNbW?7y3QA?&r z`S~Slujdo|&2&(g0LkNtNQ|K8v@krx5FG{x29QBXBsWe6cwpeJ7Mv8s6dFwLevL$mf8+^m<$K^`B9Tc|)JnQR| zR(lLJkSiJ;h&RB?c0P2wVRR?I%X+d?<&CAzLw9=!$SihLt`ACkUnL1z0LH=clZxe9 zR>dVLk?SJ4lPrIbIap_IkTm9U!>Ft}n3kLURTvb)AuModoT@;;F#Lz)wj-r_)FGaU z-9Qi75OHrdY&)y^UF4g^B1gnB+GA)oit6C7_ehbz=Iku18P(D)AA_kLna#)xai}wF z2PGMHYG(x(UCO;ct}EFF?P-J!xj!$Dx}O#0l6McFZ2RWr%Xc5Xd>&r@lAW$h+z434x_?p}ROXxc0UGT#&KRJ!wR(EL84n37j( zuN-j90RS98H}i^_$0Hgc6$>Z5_qZz2KZfsU+eoFXN}jgPbTY%btEZ0^pcGO@Pq=qw z^UIJ>Tcj8jvAGo=I+ZmLZgl~Qr!9bi;UZ7AQsNTnr;;7(m?_YGOV{9D^AN)y_azI| zX876NOCdVG*>S)?#5VlLup_r)MpjBBh-}EE=VHE6;`Lhc|0{6Ct<~mN_|wF@18F66 z=9~ATJTl7*K()LxDo6zJPDraJR$ZdKGoV-SKE?=;rd;%pKR+meqGXzqz?|V!U5ys= zAkXCb_^O+Pq6if}!4i;F=13jFS8k1U>|m^nB@%nfzK)%gG{{+zoIAKC0;>S;W=(tD zg<{E_af={5Iu4^mh&6?s0D1!eVuvqN1oW=qj#qDGs!_WZeXSBQlUI<&u$HHn&Ae$h z7ps!@9ME^!8R2a38*>NNs#Ez2vXBNg}nb4hzH+wRs>_&^;`3!skRgzir9A zHhE3?qmJEljzs;U*)+0OA7hB_e)BisC;IgVKls7Fk#v0Z`XMF#jKTe@@BZ%Pvv?0qQOPU}(T6ipL{>fZpzVq6eQW zHn!_C%RX2zljf2QdULE zIJuclh8Rx0itEZ6djkN1vGY~>$b#?YGxr6>)lm~EFz^>u>xhS0b=u~{=_GtFt+@pK zT-j;a)|zeinedX%91jd?Jz{AI`o;&TuxHxkRJb?&=0|Xoz1?z5Ds z3Ra1MVIOkIX2W@D!zCZU70<#^wmm~RTT{YeYnZ*A+X<5o$WrA-&^g;V*zvHawK=~P zsP8VD>|EpD>Tr6f-7WZ&=9|-vI~T5#_5vvZ+NsF3=d zTW^(0d^RMGO37@N1ih`123TucClYR6+Vb8{@X?MmO+_tfZ6#0-ijWZUs5P09JOI%w zKO4ZBz!G&k!&!GfyijkpBXm&3IjNsL#h)5X>l^FX*2?5^sS59u)m>7wmQ`5i4V|5` zD%1_qiSv27ET6FbuDt6Fd!dgtu@iNcKvsZ;S>)VShfh^oNavYg3Jj_aReGQ&kg_Y; z-o{=v!r3^B=u)k~OGwG;y?fbW!yATC^o3KqNEDqZ1fXNbKatIC=^?-KZTRkQ5AS{k zE5rwg3Yo2S=WZ@9g}7jt)JRQ~Wlde==N@Q>1n4prFm309RHrLKBdav%0NYEJ{N)(c zUaD!xT1OIi9jrjtOz<&ol2$0nWma$pE{?ccF<7D$8pVAbIBQT<@CYvt>nn-$J0z+}X}BmL;bY{kK9RRgfY==Rk)XiJSb{ z-~y*HGuu2&&hXEmw$|vZBWR@CJ&Wjh^pi&RH%R2eMC|dY)1%YN8 z;9UsK=7o8t%946Rt3jy=BH(BhcLQVs73pgOt!ASg<>4}kOGnJ;uW2q+ry4gfFl82S z<{{(t;t5JQ=&HFaM>PUGNpUUth>-$pZr!>#7YSWL*3ebDA{AU=TEC$I5>;ri8z;rW zbF8n5e}$Q--h8d=H3LU`h|Q+rgE=0VAoGXi?5mgG=E!A2q?vH~Y54DbQ|*4ji;=Z{ z`tm`@FXySkK>4X2BW%8#c73QPg+6wB1Uh;{V;oF75cA?n$9dVO4>y#Dh-QJxaLON@ zg7>gSot@h!|rn0Fxui?WL^8(`hA?U3wF5_?%0@cg0h7Fwa0*AX>_Y=!+P z7{;mKhg*e7w&VD-$^shNqO##-8`eg_k-YccP&f-Ef_jAY*Knh;hK3(*xl=?xGJ?Wp z7>V2-jfE9ju@^q}-V7ZpS-nybTh!4GJ|SN6_m)VeXE-w5>!H<>7khsNb#XDc4_NOu zG3Z-YYsQT_&hjOxTsb%$1)!<@@f#zUY#oykZDhNaSU2Yo)#b+P;d+M;5*Uper+C<8 zCi=kwOfhGPjP5GQO&oeA1eoxlnQP3Au?BVAK5CU@%lOL`_=z38b5Po?PT?f+IS(ql zWZ!~Ju%yM4T+V2d$Ma)?qDfmL_Q_TOV+~LoWgE>;b#A-tg&Nr%hfdqhMko}U!V{!& zC&DJ=zC>~&e_dYENfrI_H`FqL-xhjtdb>hvtJ@i>Xv$)hzNCElQ)nPr zuvwsk04>aTU2;@5-pv+a6X)wSC}|ZYnCpyN2Nl5ayxhyJ|sv~M=MvPh3HV3VkF_?y2D zKgxRY|33WWC;13P?0+h;4Ib71QlkFr@cQd4upyb*%a`&KuYY;{_VCb2S6c6!4|kStmy zj}1(R7VC1flo{2lfhYr?BFTBK@geCEE?&iCNy;PKN_O9NwQMu_2+n=0E4{;fsh5vU zg34V|rOmaz)c;BT`c=in$u^nCo_y4uL43AiouHsKxL$-DZdIYuowFzJ9ex1po2NmF zqFdV*Z)pz~$wZ%lnqN)HGEV^PIiX@W>#B>TWp#wXwkG5jHJmGU97jvEk3&4t+WOc% z3Z&=Q;x@7fqyA)SqK6AI2J*|G7N;T+3jhE@ zyQ7KIL0MaVH*U%Ys@<4JZ%!rj=fla zd_mcJ8i1?JhrMbJ9rlW2a0Fg}^vgfd-Y|ws=!7u)I_vB`A1Bz26aJtW!{DvEC7!o9 zyLbf%)Ip_aIGBuXXEaMXh1Y1DT)ah^Tg>QmKo+L9Q;42v-loR)U9#Iojj-3&)r%mQ z$iD5Av1O}68-TcutSXU@seFz_PLNOg7Kt6?s3?1;QWGUpD;-MklIo3?W>AE-!vQ`Y zjG7B9BpOvtM2a*XdX>ANJ)?dPcI{FdhtiRm#QU9q-mWlk|r?d&sESfKK0e z{xt{;WwRLEeo7yA7n30;#HDtJq`KNV!Ur&6`~VHopl z@&$$^uEhqI*gf}M71~=j;{e*K!w@<(1m{ckxoNW1tJ~QyBwn99Oyu!YhU(ZkVQOO` z>`(j}zW+dpc)ttZ{XHY&*Nli?=kI^^`Wc3zpS}K>ETd0eBoX@!#-e`;uYb-u?|)(0 z`RDvIKYjVeQ0sE|DZ?LHd5uYbJfuc}^R;)ZpbtwKcX)CD(|CqD#O(f$Ev721CS3Bd z+525HfPLDlVlnBS)HMrVKST<~WTd51f#Mvz{C!oJqK$^q-tV{_t789pWug zM`7x@$h9U7DpOk*I6pgH^4K2rvYCqh-rhq*Cug(3iT#D9v}j6X=f)5 zjXN=#4Vd|s%FU1`E26%u6c`mI7zEuX0G2f_Ay81t@xB}K{=8L%E&Sc&0&yR z=tO1MXPAxo;@l$n%nGqc`#})u?9uwmwqjk8Ku`vD54?tg&6xS(vbp+6tOH6R3nBmq zEY^-!dnD5v0cjujOq*fiGgd8{&9$THsih*2OT5WSr)bb^{+K+;VSk$mO2Ni(BQM)C>SV8o8&W!GSF4eor!$(f-5LRrh zN-10!cgb>?+`n)V^SoC#sIqXbMF3R@9T)`UX0dtvC@JovWp}v}Nm4s#4 zTU%xny*TZ;vlpK61@=`^+0b6Z=;_jZ0No7dGB&b+SN4B>|^xFpYd$A3@V+J^41bR;d z8%h!aOk9e)>LYTD)zJ;0Z?z2r!-AR)7`kk*BvmYv-5Yr=rgR7qxarV6z%KzBzyZ*3 zD&1qGqZ_Tsu3kkrAJSWf&dd-XlTZl(4d~P@_7TGWgew)Pmf^+Kyc%{-BQcedZ@s-8 z5(;Tf8Bkxe9U;h1-u&nbOp}xGn;FU}7}&e;jucgriTOwz71B-WgA-Ycjb`Jrgyg7l zZv?baAP5?Z42@DXD0Mozz)kL+ECs{@I#O|@K*AP|TOt<)-7{OaH8bWK4fK#)DG05T zL!EEAZUV;nEw*+dALU9s4%Ob@0MmumXI53$s^E)70bJhA_B-56R|5oqMSL$@BFM6} z@Qb3g-k@@!Z27ADmQAkU^vyAZvRvrF=QshYKK}eY;lN+Leuhc=yHCQ)=Lh)=ABTtJ z8$H`ncMKO#K19xTcd;@_M`)bZapxb}C~nZnUR$qrz}8f`p4wxeTBuwM5>z=jiD*Iz6z?U%urA1|7)eTnx13k&_{xzd z(0E_l3zf)DcU##5#P!HqOWJ9XwXk~sqg&fsX2ce_(b7_XFwjY2EWWpBHBs96EnWB2 zC^Y4~x!=i&DrI=bgp57wXml~)8I;Pu!f3$9}ws9IB@%_C1Dm4ksymahaxeU=| zQ$=KBsg3FZUxDbpK1twfVFicz0}z*bV|Wv&9gga^b7*B($~(A}C!jN8j=xw~Q=ekx zz4M+u>x4iJZBR=dpruZz0%$>yYVkfTAUg{K-*L4hoHYZ(#v_1sE8JJawA{NuZl|P z0~U7;(Lq}U6?uxbNCLARj|WhPfE(tZ z<9b%=t`g3>k-1J6PUBsQ9JwkMsZ^;rA7XjB2pC)mAc5eMR4IZ~a!bPEWDlrAqm$)2 zNZfe1M=zWHH?qG&X~{kHM#-JRMfUms5dPZ6V84C&b9nvw@a~u4g#d_u_u$_^CL<>hH{OvX0p)IinMqK`quW%D0d}b>^mWRz%;7v z0X?jT##(z=7llf`r#dUX^JOmgxZ?vY*vcK>2i9&dx;jJ@)~waLsC61eWFat`11RFb zdF)#LX$h`SB{{iM^DnM@^QNq~n?0B0h!}aZjsol* zV0Xnjy2mJ_TV}9j*WK7op@eo`6TLl*A=;owJ{vgG(=Ov7A&sE+4Os~UUJ-a{xiP5Q zZ`{eoQAecP>h`GYpdqct&SouLt7eM_ohYg*+*Y*q;Jg7%y)%5?wTI%8ma@__a3Y6S zXfRp1)vhbB33o~}%yK(g&~=N<3si(2Now0mQkO;QFUYoyVF+QlEl6JYNZO2hmwfer z3(y9aT9F_#nIu0Aqw*zG`_o0eG2Gw4{0ch^vgxXiR^&h1&)^KulHrR}XhQ?=W#E(rgkPJVfI3*?sYLN?+2Qp3o7EZ-7OU3al zJG=)=-Q@_qG<6Aroy-|@28b>>I1^hMQ0}U&P@%CdRh)efm`na4+5Sy75edx^njWr) z1>8|H9w47ARVD~NorVbBrAVU@`bmERb%W|T+PVhJAaa`>CWZIpW43%Cf@Sfyf9!0= z+GWYCMrc+61ldFDU~ItEIklbkc3S3#;kF#Gi&z{}6HJRcs4*?Y0}I&TxtC2MYtLLy ziq=TXpoO3+G8V6B3s`?^t$oB%|yk zVX1SCt4zbmK=i{A^g+MFkFn4U5%W}}icY2%LxPifH|tFyZ{tiE2Vjn-?JqCjKhy|lTmphlXP|28+t8Sh}+4x>2#!lV*?E|4uFN8XF<9^A8+ zq-qTrD8&!}lFkC9I<{<~mX{!9gSn2?#emo#sdI@Ps1`F+9HIB-P35GHmdX#1WT*)> zzWA3TRZN6Kxkq+c^}x)z*jhY7HoaO53A6LDs&0G>0qHZ(G7V$pxhfv*C6OzD4Y`q2ErvSQ zrXEyiRO)d@Z^*Ml!;+?bvAg-MDL2r#Xf?t8>Omg)p?^!4<8~b1k$p+1$NFLDO=Ei zJDwflVq2C0TSVpmS@JT@@&UKK$_~Kb5CzK70F{`1)$*_ETDDA&L!yqRFJ!G zy?a}&uF=RS8sFiV;^N>2q(lR_dAv@bt3(@hN*qHlgLav!=cxsc%RfPdPGVQJTV%4p zObAbbT<}Mt&HD^d#6hCgQ_W&5PT_V_8jUrxRP7W{M4qF+$8MI2Yg-(fn?Ng?Gujqs zN;qxa>Vv$eim=V8PnhU24Qh*yl1Ia4EHXH7KXqP<6jgv`y6$eRnV$u*cnUig!?eUH zLE;R31oo&<+?bvc)VH_VD5Z7WNh2^UFx+ZEv$@MELl~Rh2~=L;UjF%zfj;5gr!U{U z*w6f7JGk03po1Co zQS!sV_xKfL%b@|xx-PQAE;28z-z;&Wjht9 zA;5JOL%OiJdx?Cq9cM0!@)(!XJl+UbRIiyUCxLPw8}$~ty%uvY4E9+P)DM^!PwGu3 zZ*78OCpr+L6v1vg1}&_p+EaWjLshGjSD9}^QE_&f$Fg$5mj)C*K3?i;MU?C_n4OhJ zSSX{JZtfJ`g|iR7Q-o$3X&x=bC8bo7PZ%xlBaMCPYX(zm_n%_)ay{=h{0`@w4xJSU zu(NJQTN$!$2{c_o5P?FW&OVHBij7(3+u32SGEZ$sk1r_3-_v_GKxYN3mgkcys}Ig& zbLG_&B<>7tQvd=dpTuBIc_w~TOYNl`TT}HI22+N6JE_2?MInqK&_cgqCZG_Rj+U_b z2L{y}Hs_(~{8-vTacKaxH!jGGkw6aN7RlVvL3uFoikNjabfTI{LClx4#l=U6NvcPQ zQ5pz6dcl-gmTRSfc{i2L>69+%e13tUH*PX&iKrK20WIRR8;NIZT$dzfO?Sp#xlxzF zCxdmUXM^KHy&%_G|5QTK*8#kaaqHS^QXT(|?jeIbkm|!7^dMHacl5KY(SkId#zEN~ zu?(4SQWrCJgI+=bR|!W!8TAGFAmy0qSjgqE;LxY{RKwOOXpjNBGRCrOyc7K!vQuZA?-J z+T^LkwcfKP-48Wp7SW}_&k+}Stsblck) zAfMS}i!p}10XVmXc*StNs%`9E?q9u&N{dqh6pT*2Z#lpLB)ta^^8N-0*M?)zIRM#Z z{fGh-J83@cOroGipt_Rh>q2RLT9i9oGu$eWiQj{GGwZ{*#T5yAl8wnaK*0Exua8lR zwB<}jFttFXN|fl36jN*>3R(FgSUQ~D6qRb1n!{yWlt`B&?TShgz`J}3i$3db54Eb_ z-&`hUaBv3FYX}lMr&9-#$R%xyQy&$JsL&v^f+*`GxD-shwJSS!cOPw?aIeeKJe*Et z2zta0hN(HaSh^cpu#{9e&V_yh0b+?t$*Jc_#dxJiT_~I2Qd3d&0Ia4>Dj`Ft2jcg2 zl~VSmj3yw&YqTVs*wx4-oh+u*4@WH25LN98*fRHKiyADVZ15@sDDhyDrFDA)@}Zq4 z*~@L_lJi2-d#I#H=qMAa(@NOgTSNu=Ag*q8JA)olq-07TO%h_mAXU)UhP@qbD3`38 z)yE$7n?0cXdCo5-b2~!k4%(a&Y3R_gpp+eLZwF6rcuMdFS^Ht2jwVjBf`1(T`tZY` zeB$5lT4`T_E%UF+&wLVI|5?%EufGZJK7RS=)!~^R0J5oVG|n>rpYWQy@9>ZFwC~}I zM=5m!t526_0bt!?|G-klqyFrePsSomK%Mk$b6m<&*YNrLWkQypWeA1vH1@U(aLI*{Wi;@Mk-?Vzu!wn>DB;9?um zuox^{w_%aD9hp61Ua(4*rE>#9L#~07%lWFDr7KJDtExy#0eiUCgdzZxZXi=&{tp-A z*yx2yirB6J`kbZ_ug|>ZmY^xzz-Dqp=}axCv(!}F+7&QTZL802&$JlK;>YS1ubXv@0-GDPKa zz{Sq@P)uH0P?SS6%tCPkbb%>@I)q=bAH<-8m!o@%di}Ig7+XBcDR5Xcz>&k4+YdQ#;&;c)BFJFl?FaT^8i*Y z5%~51hCeQ}42&IaK+Z1Jo|7TF;gl6jt)0u(x33@l8)5ZdkQcw=G(t-Bm*3<<{Wlgh z=RVw1BWZuZ+d>J4X`sA&S@uv!h8ziK3k3oaRlb;^81@>5(z;f97v9mi3Osf|j0C^Yc>O#?<1j-->1s3`z> zG$Gx+?+VQ9Xv<@P+<&|}8W`9X>Uzni-a>D=-;gS|odJ2(EeOMVpqCsV(kjivXC8e9 zi|oYrFf)-?QAC*8dYIL46Ms@RxY^=#TA#7QEPn0yh>zf=$2`*%6vd__uzUlPd@hoZ z5Bz4hZU+brTgVump!Ql){6JxiE}*^WVRYTD0hRz9s9-B3+Z&!rJ*@0vX)GWvu8>lc z5U~(0yu!lUj^(j7)i0 zm(MjTY!ONCxTbd(&XJAejlD2P9Su^Gd7jWnsffgr;kh2?X$xc(j8iHGn2;T#t{3J> z1chYD4p#)jY#neA`z0mKbEAPuYdCs?uToQ{bSkdoFdk4%EwC&rrow^Cr&2C1_iV|u zi*Fj66B0>BS{Fh4pXCOa3HH-~D|nYL5>Fc;V<0t^24h8TAc{yx0>oCXiLb>-)!vR-e<*1dUAGeahn%%g8@b$4Tg>170d1*C)gHq)6_LK ztr7cg>@BTQm^q?t-a3^Q5@Zo8(rO->qSyP(9dBBj?5- zk^3!?l`+Gj9z=4JC*?~_*@DI*CN3U{+XECTEFLQI-P)l^CESbYIbxw>qY(+gu4W=u!fTUOS#DT+yql{^)$o`x;K4XEk(AQ=)6 z$o?{Vj4D$u*hftrSEpU$>B*amEpc}nRf}Ic@R1Om7iJlp7}ZF-OFw?4)ev`ePb3adnwh+zl4~u#;^o z5W<0#JAfrE+ncR+0;QN}Ts9AStT8u6nhgNGDH`IlnTofIip-!?;V^dwJvz`xTFy~C zNMMx=ANf*V#u$s4EE$}5Wm&0CUrSU*R`W;zuh&= zlz{%V#SzoO#0bi`;i6`%%xpxS6&|0IxfGI|=mJ%FniRYsmkL1?hO`#b{-45n` zPgS9}L1n_C!DCPZk5$DCGA6gU(yuB+powv7xRWEW^`t6nbqy-S=B7Pcg~{b{W2JD>&@|eWeQJ&)xYM%E^ z6OfkJh<_3-Ef$^;%d3&P)~l)vK1YZ55`fr__n0pLTaNQhE}Qa{mx;D#(*zgQbIHGf zQkl-9WN!=LGG|_N=u`}#jHxszK~6xM2i|kq1$*5WFyBIw-8Dp)5ozt-^fydH8oF$b9+o0VTJ- z$&dc}^^d_s^55*CuCxSX>Xl1_bo-DzS`zr5K6N`us8n>Kb0)RxB?y^(f` zu*VR0Y6X(7Sf2|p5>6<_6`e(nG%D~k9=7n!<#mpaU2H(%@hl5{A%U}2O}0Y^V`nKo zrINRwlDY-re+h_PRDZUlQF_{TFPk_CQBaS{tLD=73e?|Okf^~|Bh_0(1C#X|d;uY* z=$6%Bb6ReL8l*j(w+B4yYI?Yyog{YJFy9S5OK;R|B)FYoAmZ})HdID*f|i*S3S&Wz z96?kx1YGu}hDbMyJ&aMz@i7Mj*u_YxRXu`>&d+iJ`b(-!ey9PpG!Q8Vw7QogjVBmz z9bP6DR%2VIZ04(tKn2=MR+sMRKy7Gd`Cv7ihJy|leV+RCDHC)Jh_i|da8z~(+udQM zc-AyYf>Z5=4SK+Vz>aR*%`0dLljt(i0{stZVpTB(ex>v<| z_u0!Al9&KO^7>JJ1RSN$4Iq1X_xJcM`3L{&_aDJBGtF7LRz+aCQTd%paRnqcFH6mc z-M>}ts)rFcA>k?sl*_)ZbGnt0jjI1H%n4SA>$ct*jYq_c?NDf3IKMdtp*KT*$du)E@FwA zcAl@TScJqWxsRa38qq1iyx0GGh*l?XeUlmR*66n zroK|d+`W2obZvyxl!YB^ngnQOVvvQ6OcaMg*BmLNiwP&<1wgEGs~|Ff?SKWjyV&tr zd&-<%Mz|7UT{_f6+i=7?LD7gAy_W&t=2#E1478YHFAvvh}}H! z+t*L_X~oxJ-@E=Tbv@q$pzS)@e`479@Z}fb2NoJ6CYZ2irqm_KYHLRtNvFh$?5Axn zKXb$T*javg!w|ey0PN|o0XxA2WG-cZ?1NP*A~~y;jf9!0DBsCGRy9kXXucqcPo;f+ z^fKj^QE(g}_E5zIQsYSm&Un}EYc;+t@nIY_kxFX#v@lQ%DpRIp(^-9DEl5Bx3pz!M zpBH-hJSv}r!V|aF1?6Ej!f}*jkXind4yn@^Tox~`5>zDtCT=56K1UwXgvrlZq$Yqt zC?KI8CIy774rpeLlVe(eo6NkO(s@zVfh>(ap77I02@H*@a5GHQS5%}BAKXgMqZDcem?u(O&9A8EXN?pQRC-!Vm$~d$t>4P501W!HHaw5ZeG6BySZW$!) zj5bj`skah%fGCgHM~2Thl!2XLtrp$oLpmn)9U}DnD3R){mOyY>EIXLwX#5jU_J; z!NzzeD~z7ny8OaAx=9D7a3@NIVP&FCydH2vnhNw1?B!EZeUZbQy z79b(IY+azJnII0qwDz`G*#Lj0&XI2$j@NKoYsf z@=Rt?Gme3lr1zkTW~}dy;Z2cXfA~=bjPBfg9@)qq=XEY-5=z%=QaK&9#e@Xz+_L3_-jw~sG$Nsy(l`;Vb%C1i z!(ic{72FD`Ai!S}-6gll!JZGg6~{Y^{P+wX`)kYo5_+SK8j$?Rs+l=AhKTtJrcrCo zs0Fb;&0%4BH-;mne*j{c7`rx%`z@@2QhFGtGbTvRq%s&+&z)k#D1V|-5J=dD$}LW< zYCCc08!3o~r-!V*20x$d1++TS3FZ{4|D2P79&^Biespi`N^MgaX|IDNPjOcU569(G zAuJ)sRvV65$yTfsA>w`}*&fI%?T1G5qk#K(o8;@!SFNh}fcL{G+ky_6$A1hoP`2~C z0m?G@xYH8Tc@Plvrfj@(A3&iq9G6660A|BRh(e!jyh-MS9I27OHz>1Uhcs}P&abQ% zy)ob;7+SF^NwVawmh~LN>KyB4Bru_Yfv+TiH)_3Ma?o+MsyX16eG(p)R^9LJm zN}G`j^dyf!8Ac4eAQADi-=$$&p&~5z}!(C83Sje<et$ThYX3~;hfjUpUn&Mq*2<}B^quU|ifiEMcJ^yQPoQzBJyY|BT#g+7|arG5g1`F^JJH3m-BhX--n?(12BLiw;wWo7`_XC2hO zZ72K%M@8Zb=a`&_JV`1?t3!m@t@rNQOvF;0$d%4%)F^_G-CM%-E5+|S5f}UErTOmq&h*yxhAX%bqqEZ(mdd<%! zseOz!RMiM)IVu{|V#11=ou-4Tfu<5#i+^BEf>;Q;0C}B`J;2H1xYNc`H2HYMB`Em7 z8bhjlbjG0BCMq?|Xj!rOcungv{-V4AcKxe|g>zU(G-I}kxG%N|R=`IoHr3YsSQx5V z`eHZx$v7w-X12~H!T`-TFWL2jr%c!vWmQW2$F9j5@r1FWdRHo-h~N;S?lDmC|^*LomY=4QO2vErjq- z^$3%e;t2n-^K1j?5f{BBU9v%(O%(pqv0}-d776G_MQGA$20m6j_>chg?>(O*^tCKQ zUnJkV$V+W^Wa9;u!%aP!tB3~E(MaKtQ=uqMt0=kVaZoldn$`L7V8E6cTxv*8NX_Y; z_iaX!kG437l(A7I3fKYCZ5U=>#6Gq|Zd`c#3YCOP6XtWZpCUG?wp$PBvMRAV3_{i} z+I0^SsCrrN4~ZgccY?G#H`cygz|3GHqtD88RME-UgN89fN4;1o<48KToxYbvS7 z5NWU#>vP3I3eQ}aKA`M!{(i-}py!y{!o$K4SwgHM_lZlm8<_{HzEojqfhDPn9IO-$ zP)|iS?$BN}C$;jj(GGUW3|eTWo$(yx|FpmfQc$c89ywKR(FdB_CCr{u!F3(DQX5fp znGt^Aw7dadU^pPH zV5o0eibpr9W5yTMAaZ77j2;JQ9ZtFLHDlHQ5%L-ocBu!evC25)G)t;?=-zh43P54tX*k@f9wpUqI;gG6GXXgv#S~0GGAKw_kbwR zHMkwv93G02pd_fI#tp!pS9b9+EIVOanYsiF3==bUNTw`hs9^UwIyeIPW(H7LXH2P& zi`-Xrg2d{T+v-?q1s#TB7SORLAG=CfGU|!hd0>=V5Kf65?ik`Su{&8S3=Di?Adz{6 zc!1_-Yt1N(_G|!;P6ZUlK$o}l&pM+kjr&~@Yk$cfm;DZmOcc#F%NqY-v83IR!Z z5-0gug}XfhQ-`;1pStE95dcj>pp;gqbi?yFE{HPjmE`Hf9U```diCYPkvaWiom1C@Q_wfu;D zV221@7}5;KEcd8qfAb%L1i>5(Io!;%&VNTw9aH7_#p{RRH&%R&2q2wG(tmb3%imevwO%q5>52;mhpp{bXDPm=w?*@QaSbbV-O zX&lxXLVvwV_Y)!U2&xH~PrxmUn`%x{AsVdGMp9ilzyy2pD1;U$k?mJZ8OV+S7s_i< zL`+LX7TLzk>wXN+C%W@DcDJXoYa#oycm*(Z@Gl?8D2E5(gKR!G9vF{)gAH>B_SyPy z?!}N)+Xt7CAvy;5#{2Sf_6cG&(wH-?PkW&SCL+V;Ufk;cr4yqT~|Iu%&ic3Rgli z%X^CYj3I3^bQfiTcSXGnV-NQ5(K2SKs?yf0dK@Bp#x9GRB?6!7sHz9R)m@puRNLYl z!D_=C0R<{cUb%7u&~$d+D*kMhAQhh_jG;WUJpr_q|My^F=d15YuBs}lYTth*KZnrs zQwcpc+u7g!{mbX!M>(PlhLE^Ru9ySKsF7!H_;u4>S0#yz4@B@#*bb2VAh2OOu8Q_o zHHnn~(uXRR*vZyoxjNBK(yO6xInDp(k)AI<4BYbTv55>4UG&q>k6R>4|2 zh2FHoBy5pRTcJxqzI8Fo3_RxCsSwGg8f>vB4Y#~WXm>pWBl7vIK(+Mtfa&C&U4gMn zewV35Qm73EHazx;7=%B)fYo}91*YU;4jqHzY zi>0x=NijEBozyp_;x=$b=dC`gxnbN4SbPq>;VuA?ldE9q((bPuRX&wBXaWK#^U*!I z!WiZRUNTVSu|meQQhXj7H^jJal3BSdytwvSECCh$qEhaYP5@vI$ehz}&7xtA9n9VHeB32(%~s_~q-Duit(2`W0dx zObWj^Ku6I!<&OnsMq4+ntYWa6Q)7OXJs#pViK4vgvxqE=NP(b7rj$p^Uv7|6-R5Ig zAW+*3#vI4yP>nYb*8+IqOkvz@E zJqR}EkwP*OouapNAs$9d)jS>%FjcqKk|UkOSYk01c272LmRES@>9V@q{N#;Sgq3=< zyKTG%8WP&9XOJ)j%)ks!VPak3!(%UWP*e}4VkNI4-u0$cL9fa%7DIfFDV3e%RG5{| zCzf~5r=xN@ZGP1|=@uQ7$sg*~UC@xMQo}5MWX8?(Lp^6Xlza>=#S__qS^T9(`(sG{ z$hC+UK(`3PPDF@G_J-}W&6{Q2N42oJ$$m8wa&@aRmq)5<61|V9y^Id$L;e{c?a;Xw znu<=fH!21sokLU^Ds@Hqs=XN^+p;4ays)3j{h(i=4scjiJk1gm=!sa<`wD(VY2%E}bUDklvQ&Lh znSBcjfoKGsYU`z!qfnfXD^oC-Wr>_1ZplrV590@ouO=vs-SK@K7m2TX1BIF?S~R(dl)LRSG{>-06--| z)H~&X=Jh)&G@H1iiIPt-jO6}n+IpwtW^3thU=1Rw5s0R z5$GnV>@}5vQIl4Hvc|c%<*4~?+MU#D_MTwv)ilgdP*5S6-Uce1NDA1lTS?|6X5JK5 z#OQN|kc}rQfc1GOYFyb1WcXCm!ag>43J(KmS zJ*Dtq4x)LL=tz@5BFec&j$Qvc`&u9QjC09G#(W3{T^S~$-^>qoqe_nx z01lGn1M&iQ@9WgS@j6r$`c^0HI?pKOEOvQ+e1_^Eg-%+f{CT@M_u2Q3uZ=Bxd2{bo zq?6)4-tz7MWdj6>NU>U&8A@QMh_v+~s-v&YZPO)6TH@ie4V7QoTn8E>>)jZtL<0{+r>Y^xU z_;(fxF;Q*nk@ZUpEx!|&Y&)!Id;wreLO`aTM@5V4$)IpUM{I%$wE3*9R_|Oj>^Uj8 zjFvqQINlbLvSg+m@JqA%Y-DMo(8w)^0?SqRK>sZ0y_0gu*}@(r&Pjd+rIn2rHM=jW zY9eH&R!_8mnmTSE{^mzaNieL1bZFu9h}SAH$&{ZKh*wx3l3nx?&xH_}R25}5PidV3 zBTWU(#bEAe9+NT9DA!Rv7Tl0td(3uhJYraSEUpXH&hkTw-6bn%t3ZKb$aIo=jj0bk z)@rFZ;l%NjjjzI(lYtGM4+J<#b{J8RJ(!!RAW5L^w5+A#NQ*X$MXKX5W!d{md2fW_ zn61x;M!6}E{SJ;j-}8|FJkVu+XR7Fm)c^SMQF!_6@PwJR-9b-a0rF*hJT6Fp3CDlH zaGT~G+U%q*ln(w9%;pAy-WPQ9>eN}j4Fel>Zc=ds?Pa4$x@m`ATO>HkLuBap=<>)w#i^zN(YaG>3pK?ya$k+tM;VTWSba*uAwDK=sn;X? zvI&|5mVI@N-x_33^*PU4=Q|llg=8${uf%C{p$-5Noz6to_Y7h6k2 zwH4%YY{Q(T)$Vj4$&$VDu@}M)w#VF<+N&{0YC{S(EQ~Dy#6EjUw;f7BesKc=b}J9H zt^o?T$npU9Y{A<&c{3|1T>{o<`Z_UykaxSNoJ538nx$?Fuzsk;R13yZMF@1z?P;k( zB;9P@j->|C>eeQ9*b;z3@1qK=v(k-Hkx+2q4Ga@4S}Kk$A4}S(Di7U`V>_ur4z<}v zSmfDoSM5~>^uN!o;-D;cZl0SANx^H`q?VcO5Fv*gT>I%^I$jblL7lV+2?e6G%}n%q zwSZ!CypoCt!IE-39YC_A-vES;`j-VdH1BA#jY;n#xK;z^q8A{pz{MK|uX-gI*ebfn z%|y@?ILfEk9~3exx1e>%DVl$lag?ntTP>zBh=AAL^ULql|QL>u$CLlDmNxd&{V5X|g zLLX&`n^Y@)b)4zzAuo(UO0w(D?G<(2t^!dU!9YIdV$n&_=BzunkS5fdkoqeC$4Yjl zQV!lxsCvbCb=@osGp-65l}{2Xb{2R6m}jksrDe>)oHv=D(3h_{sZucbdU%AZ;iPWZ zoATl29n`y&o4JhGkid{bv`y$=c#)m~wMO&$uDK(Ge zQ);zr!!)ha!`?(!9-2b+U}2esV)J)^Y|4KM=u-(}CZ&1x>GjeoH8Dw+74HR5-Up88 zpk{pzi18&#$X)uNjkvY4GMf+Sli{GHCI*6VoJeq)p!7Hchm%iXvjTPsM1Lj2ip7E& z*M`dII`P_>q3BR-g>p;ku1u9c(lO7~_>>iYGX{vfb_o0?DfO-!reb74%MKrCcA?@N z78iPl<6R|0J(!eVVP(qH>1qk|6|cmaXNump%-9Cy$N9-H z-pE95;d19drDFJ<6Cj|sP7f2?L&t_S4HRbBQI)vj{v%S6Y0i)Bo**WzmhD7-va*PR z7WVjHn+mdH43KDAu}oE)psO81EQFpG&DcvqbitJI3{O{*TOb#PM&(1U+r3@glo)e7 zdr3y;`%V5DUjD3)ynOKb+rWbyi!fo>DZQvz!eiXP%#-K4LoTL&NW$YtxQ%i zm<84q8YKHb%cgW}RL|S34`wPD$U<44?!k19V27Dv3smDI2k4U?0!3huALy({Qcj>) zO`oMxTM>x?j|8Wh$mRfTD$^kVPP47I&d0UK_N_M|j$j~Y*O#;J`wHT+P~!5`8clY&1G!w>1s{qJ(HE%YD#}z~<{;HNa<2%7G7>Ci*vb zKqYy`8YEX6Jc@qQAZz@)&GFbV%r%Ou0f z0(fedaSPL|=?I()*y$ND*^cDF$sKiPn1ECP8k=#b*;iZMqRz^P8875RZ8>+#YpJZ@ zxWNpkM{K)TqbJ4e=V@IcAPfTTSxa!_qrNH)$$H%5J-5-Ro|`Cp_GZhlem={zxh=M1l|-#tY5kbi4I27w=da}=*g#CZ152RjP#bRZ$Pcj zyUm4sbq-{)3_?FQ*>8M5S+l(mAi~U8R6hkaV|GTQ!V0yt=*$zi5EP^7J!nOe=b_B` zwkivxmK2Gh5A+l%`AFr39sxW?c_t|=cN>TZn6A~LvM5DHs@Czcee%muc2b+(jc7f% zpcqDdo=`Pzp@ZXEcH_DT?$J4N!T{5XIF88F1mkfShYm4hYoV}Y%HXnn!!vR>my*wn zdKtq^#^10xiMR(J+mgfhuR&?XK++du+jZkO!H z$YyulNcgxWSqA1(HR2iap=@D?1ObIP9?*2jVG%9gOL+Iw@BTiYw+mcOp;=ZZM_ijH zV9Q2whjiDpd=n(!322J4FL--dgXxj;evEHg*A%G1=3p(Q(p-VALy8~J4i2(xh1D8r=7b!#sV{Lhc+6p9foYE3X0+a=( z^B5qcB2j8l)erkPanCrFMv9d+;gOYC+ zHG)aQ!`NkOJ8fN=2y4Yv&zl2DKy8Dj(&j#P$`Z+4!h9~@fHZ*Ab!B!2f_*F=Hwy;( zxp}-b);!*t2RxXbWD6s8w!>g8_@ym~0#ymkC(wWL^6jEvWb00YPvTIDH(}_|N2=Qi z7-5KVzDRBTM^v1F-@Va{jDuljs3`q{IF|F;r#yld0<%SRzGjy}WpkXc1Nk!-qL;ot!T)e%7?$&XM@lJ zQMuy5h|v=!>QqO%CToS}@KV|`viMh7fh$kKN$Is$kk(Xcf_^KAfRs+EgH_8ojF$*L zNa_xt0b8S2XZ2Y-DHgr*X#pK0lF2!Zz=hM?V8ewY7%8pl$~}`FuDvDA2*UXdA3^9F z`TY(MWpX~iRw33(^6s-lp)3t)p&_HP;oh=PE)#z)Uy>ep{MoVmy?o^0&3cAHA zhDdH)3zoQtMjJlh_LSs@dp=50*?g0f@{}>OxTCCd0`h&*(bN4TycG)@>5fQSlaz4^0)MZoC);0D#tZ zSd}9Kc;g_O`i_>Lm&5b60H-)FM+)8bYU1q!wM9us+*C2?FZJvO`3U>Qy!8rl(iV4R zBa#ZhEa%w*>8TDY^9sU1r`>AF!$tzkS;tPY5JncW`N7iI%Y&0cydoNz#C1d~-a@Lf zCRy-e-`F80BUByj2-}Mu{^SRq)%`I1Z~9fL4A`X3#47=Ff*GAnHYB$@=T`@JP)xoW z@^b-(NpCG&Vyt|W%nU;3Xo!*(Cc#i%{ClmQHTDW=F6Ta6SY7J?Bo)XNlcWOv38XkB z7+YkUa$!Qn1WerQf*y|gk1_32yI$yJhxA4N6u5IoTn=*KjG^e7P{IeFR8KY zc0in9elLOLd;o2{MeD|*UJKb@)V-7y?J^cR40Qe1D~ zrpzFep+_reZM(uRNE`lENJ7J*anPUIF;%UEghquAXV@M+n3*WrW$VecMTrO0Pz|1~ zi&RM{Y0fTNi3Ky>W!ToW+7J*VR@nr?GN&)-%D~j>i~V=4fA!r@ z!}lNH%>EB<>yUpBO{;$j*1`JhzxFwpdt|khgHvnT`ygXYdJYlV1^CC7JC2$+n zTZ`0OXj@ZGi>n;yctlI}O%DuS|{-G|JNR^Aycm%P~8XJSW-;08W4E-(t1^i>D zkRGM@12hEYks2p}_^Uba3;>1Ujb!UN;|j+5>I$LxL5Z}L)F$o5nIV8kW2e=n{0bz3 zJB$S06Fj<(5ZD5+Ttd=7`#BwX=2!<3;8GthZm*&X^JLsQsB6S?Mm4?;B&*#;Yh#ikvrJ&#oGL@1VEO*7MbfqOd$)@jybwEq)9ma{IU9_*bQy+)y zyDJ~sM^y-mH6PXdTQ}IgfCnlVAEMdx&odTW8aJ}7l42qrT(yGdu1kiA*Qi? z6WWI{00(41r6SgWv}D^S(6DY6LbM+UQ#(SYBq=16GAVP@FbAEssld?#=c_d48?Djv zq1>T6W&tFF-J^}Z8pB6R%xGF#R20o^6;EsOtenUm)m!7-4ZR;K&u(Bqhtrwtzy)Pk zK3dhW=>|yiIBZwBP*?ue2#i8%$qQT{Mr177#hi}p#Nl_ScxIRVSc*F~a2b#YKvirh z@)AzlOephvelbNKbp|TC(phxtQ!n}1aqxMVT+(`53h!-z=i!XOMfnw-KN0yTbw5XQ zZ#Lz_XY+5ODOsFPw??Qqt2CH2#|EVAiF_n?A= zVE&;_(lFz9v@nj{Tv;v2>xi^;1Fn(Z2$y_tl}yA!%oT0j%`&?yIJ2gm3vE^Mn@>N<)5>O9-Y&qO>nju^ug06CBwWu4W)WYDlgz>z3Pr+ zykE#oA@!Ks)IdB;ThW9uFDjL6K>@@aY87Qw2QqJ(c$2KC+ggJytEo?p0uLy}dqQ19 z*8>WJ79uuftlX1VOtoPJX2=#6zZ8^WbVPx=xsjG@EKf@C&S>|g)eQ#fGdPvA6lhZL zSwnkPx)d#P)qPwSD~>7SUMX*bXvSx7*{iCRc-rWVNJY)6wT#Lgs^oTgq};xvlABtv zFn4Njec32~MvSx$S({l(VuPf{sdRe=Ab$XE7)ix@-vs=3a3=Wh<@50RtHZnhE4+S| zgC2-Q)|k2{mGnQIv;9B|Od}CAH*}9DLM}lOUq@wmoX7F7$$yYUT7bT5dzYL>^Ea!Q zSy;q0&*I|dVz3z+*>5|AD-7dMGkd&Lj?9jmt4IS0hz}?u-CDu{u$vQ#w1TgzAOPU= zDO3Wb3iO}Z`bD!7{67QhWU{*IWRx(7pf^6Va2uH%h=j0evOs{sn?lmcKVEuDlVE6` z59QSd$N?5P3pM{$lPq?~fpZ>JebO50=%7Umd&uhq5(%BxW8lBep><%SW9wB?U zN(5QUFJB>9P}y`@_U|_V^_~hw+T?D|;U9aZZR+ia-Duv9J`a@-aO@m@)Phy@v3!~4 z1JtTbR1(-Cf_|ak9Et*^oJ1*n^0t8hD%tx9vQ3>WV(@VrFB>2<$+eD{I4AjJT|EF( zWfkjMQ)4~jMm_Pkw$Z{KF~gJ_S2f+tkJ7#g_Os>SO@d%4$Nw1kNK(|3G&{;8K-9ar zOfAuWc8MO${KlX)7J-^TZriM{lgq$fUlqGH$GG+z1N@1zu$cKw*g<| zG1>Fx#PJS#;8(NDgV5?yt6>!emSA9zDVn`RLA;O3o3)?`!HtwiNWt9NkW*Jmcpz(t z43R35Ey)$|2zNqlRtXVD+cR_0hz-z!*(3CQS%PGY^H}I>XpaDWZE0o%l$H0jMo-TW)q>C3S`vNHLv`lZ z3^*Pw1tx%wX<4jguH8|SvfeG<9_zZDl#83=AF6@qhi<|!gbQI!8}P5k7LrWup3&LM z=e98zg1oxOc2SLtmtcCJfwaK}6kT?P++IDNgHIIEx$F?z^|aeCb!|pZ58DP68CORK zP`0Fu%pE!803R5%d5fy+vr*3hlbt3KL-u42CgOh1! z9p$q3JZigyB$A*BP<@}a*P@Ld5693O!58@F;@IFBcaq}Vr|l38cIysAXW8^DA61qj z`~rPk7(vssp%1*P9B09Z2cU%%(Y2QU)RaT*vULissN%)5x*2jG9%SW4Uai2xUz6p~ zz-nDB3drfjc*}-(@~YsW01pzM+i`T0L*~m@VF$JP-OHy|&;Bud|AFtH|EqEHSN8SO z{N10w{&RTwIilb<17hcNbqx%J)tUvY%9kErL7MuyrPN{iBEx zWOzgtos+FW0+}i|LNAmN>(Sj*+ZwGUX7LI@4szJ7Y`qb*CXF zHYD$&YwR7;E_ z2aqr#mOX1`p?ohA?vo%J;8>-q_F^K0H;dPqnEA0SNRg6 zIjNo@jONr`*!5WPy0tp`X;E*oZ+PlPc^&AXTMJT|I}G7TrBwkF?hlv;lAi?|pY_np za2+Jn6OQ%}smEVU{0 ze;R=Ai`2l4wmlF=-iCBA+LC9d3dp6E@(j_1GsE6RK8N#r3L;VV3KYeJMz|8o-{jMO zk-P0vHv@C+-S~b6H`0$GnpeRE89fgPXAgy5<-m1@e!qmAqQwWF=hu3)Z zB5i$~vZb_}DI|ECxETRzQ*=y~H%!NZ4V4lxqpgaiIi{%GI zlT-up4*U%)1q&pp7y6!en+YxvFvduSyjaT?1zSctm86a{#m4#PFdw9>gORu8=lCM8G0EWq=E&R$^T2qYlc5T!&B&WvFmd zA}oPP1c9O1X9BZkk;UO^9Nv@fmFHTwUAw54VhkPM;+)bqI(2-QeGJ?cju<8xr^rDR zlFW5Pwfooc%Kx`XyAmCGcP*i>n zXV_)Yc(CAhy%sy~Q_V@^DX!YIPs%KsM@g=_7Va4K6v(wslyXi|By21h(luNq3rncf ziWpSVmJ@(?q!2>Wz=2ngP%5}9*-QQM*AEpGpB(`&b>j13U6J~{0n{S#5a?=0tV#-C zcM*V)s$so30=Q~1_>W7=IEdh~t)mvF^wNoH8k-L*YE8NwyK!cA@Pj@208oTKz5B1P zzm~6mI6UPKsZM@=vL{ADY??~ItYK*(h52FI98<0PDNsl$p*6^GcQSk zQ_KFoGUSgKkF(*Xa~nHOQ-C5u4Ae9Maqs`9>rIxV$F4N7y+6e*N@mrqA$wnxRrQOg z%`OH9;Ew6X;2wyTs@U4dw9}@_w5dumIVPD!CdcGt78&_oI^VhHI~RX;D`|`XJmQZC z2XN0l!#B)6cAc=v{1D+N$z_b#uH1S9lSfM89cku!86Kc#q>DO$O}lv_l~@GCo8D`k z4l*4`y|<#{U~(zpdc7ke)w=@FY$$*d$nzP1|I9B(V~l*fDy>i*PvOrJSBWvvE^s$q zch5dSX~ZM0O7(0AgV<wq#L^HOA)3UpsAF_0~_uhiDHa-q)B5%20k*kxPwq(E-}GP(*CBy{MaKHcQG zM$;*B>zWQN!+grF#gLU@#fmsc#k;tjD83^SY^+^7+tdcEz#hwxG}=rF8mOS~JAn_O zz~YWePzpw${h0dQZfUpj&z*>ddGBd|I|-6krlr zKtny1WVL0&3x>as?k3MavLQ>Y(@qQ?zIb>XTE3)$=hy; zPM5ONfJGKM=frl08K@>Y|6&BJMyq}rwMS8(e-hiCN#5FxNSldI{C2^NzqT`$qToD zyOq5IAV+WUQpmNma8$#CI57_+^nV>nSJXN%O~*9o1IkbycH1`;KZSv0WO$Ot{qmo} z*Z=hPSq@EqeE(tikLO7B1xv-Br&oSO-082r`N#ZyzXU?o*g`Am?1r(Xe4qV*?OM=Y7|@^@`p)DIncvF?&Bn({l(L=nA<~0X&iyJT;ZV3dw}#T zvWj0f6%|5g%ofz>yjmx0;?iBaK9Q=3#DKPF?d|sHkrT4IY#mANCRLO?UBkeL>58ez zj|k&2J8ace_`yQ)!`^ulAEd;!lOo@wmh44W8FGJQ2af>{mTlOP$J=q(4k;QH0U|X* z3ZQ7Whl%<=sUu^@S0Cw&(<5PmF5|UV>#g9P*xJ2{*)y+ueO1lQisumDR;0ase+}0A z^c?*Z?*;1XQXy_r!L~e-TO?0)pgJks%?cV&E@ zT;3&5k*BwD<|AX`z4$ zP;1oKMb#aNglGeBQgQ_wW0ex{Qlr!+j0JV^mH@4?@vGHH%@%8=tuokf_Xj|#Pk^zR zRiPg2F0#JJ`+2D8bBaOeg;L)Jt;!y>l%6ObG}0|2D{8k1l)wBg!Ot?SRm+1c{fl=3 z)LUr2j&%od$g>&30UHgz8Y(rilu^;$() z0#m2CQ}=O~S~>A6SK#jNge^=nMr__8AJ~5YhK34AAgzx?a&3Vn& zQgEU7x1kW*d*!m&x`Lq2;fjK4PHuaFDJRE_x_9LbjDux4r2Lah z$I*2MTMq+M0it^bi6SMAA0)Yf7AgGJR-+1PPui23TD7OQEsx(ISp&U-Lwh9_=+!_5 zKEx+cSum*Ws~tq_HYzflk)LCdBRZBdMMo)t8)I!3=zwbdnq8rcOXJN-L2hm&<*Wrq+bGRWh5Nz-wE zMj*6Xx;A{WbdkrMNfMrZ3ms>DJcNjyA_48Z=K^u8Z4YofRZ`E0kx!IYJHw6@p}=wGDD&vli5u8e=yXb! ze^G}{OkYN-H@K1zte_f`veNb3_4>I#+h0+_dOb!sbLdWV8yU>VfWJ?X8RYH_^-b1{vE%K)- zr&0xHa7S<Wimp*Htao#lfk4xFY|OIcZzN0+h~S2oc3JBRq)?0A{S;<#QF#@zN38XiH7@kVkOI z-h>Vy`lOIt47SD0ZIC}wYyk9IqwFjvb^!!rTDX+YaDU-bq{qCM#~5iUMAH6DEi;kXUjEnc59e_CS@_Qua?ndK z{i?8zr9~Ma@wkBU0+=IKzm~nOZxCSdYcN1zn|puRl&yA`h`F+ z!-!lLxif3Ls_S`btV?<=59{bMy~{2;JPb$+k2EwtURt#Pcg*{Q*mt9^2(SRPLPpH0 zuT_+Ltq>;KX--?VD`3a_Q8$uvOGz<0++@Hk);dfI$5A!RAl+blhy1Uwe zY@3?aF)x5mEp?Omh3NU~M}1cOQIQB}LM5OPv4>xR!8&idwi8*b)tEDs9~rh-TPq^- zBZ{Jgno^JKY=i%w1v7PJOvk_wIQbAIFjPT@i5Xde7OMrMO(F7J;MlCB1a?TW+S)(^ zxME2kRX_lgogp0dO_Ft>=b0576mQ3nS5Zzl`Iv#od{L>bAxEp6tNl5gGr5nx zqCe@c&Cg0jhgZ8}rT}+`3l-Zguv+L(S=4GvaK{weI(nPph#c>LhHkW3CJI2e9c{r= z?`pY?2zBsSTG4nt6Jyq0g>vhfOzC3*Z%4^xA3FxGT`sXPgFS$3mw@HP^V;eJ5lW^c z>B#oyJgOBc>7xo8vk?jUVLJ(g$URSV{0)keR#xsAL8T z>RfGRti7d@gVJf4Fn5+KZp|b$3aFS@mCseJ4H|^1k~%L zL9buMaMH^)9092}2*+Tl6F6vq3n~r!N=t^Ws5-$<>Mk|t7|=7Ith-XNk&IPx6$gc5 zc_j*qOkgv}$0?U?ojGp=J92RiGqo{|o+4|C=yYr~`EjM=vI9gm9pa5~N~CVen;Xjn z-HX!+(kxn;N^HpD5E9~j3{licWg(pe_uGn_vp14^WyRxrM3yE$?G+hC)iFtgMaKYb zar;iWeNzr@$}>Wv{uk#^2m|%sq4Et@8%t&`PnUChdJSZE4%C5oXO*G#Xm*0op*(?M zZEl9eCF5sNeKs~Te?S6gRnxvZ1{~W23ua5~rZKr=wRVv)SUC>3T%kqa=FIY^O2Vm{ zSvobipe+NjK)9GmiYK3t%A=E3Cap4yqeGa91e4V0#2;M2Dx%b=y6{9rN1NH9JLi=u$(Bph13@unE^E)D)*_0snJ55Go=4|;#RS6O>fy4m=?m~ zGMpO!P%-i4Aq81Ek=hLVrbveBC!d7>J%zbX-+%D-x#=)JRTM5aT``snH)xBv(5bQl z`>tj!i}{LWY`cSO!OoVqc&8~1jAelNkRbG;-U9=i=@BIST(O_HE?SPz~&G!y#^4unLc^u|-Q;9l9 zzSl@k}9g=~B~WhdRlt3cnN11IFLH8BJRb(yQuL0kZWUDEaq8g`Z+H@Pqfi zU^MW9xAddrL22S98JAx8zP2LoB`A6+1q%p`LhbD8ilgf@*q{uOIET9JOxKh0C(w^* zLiz$v`hYu)nJ`G)GFxN4c`Cbhk7V&m2)o=^cDAw5P5To}wd>Wv1fv%wh*%DGo|Aaw ztP@;Y{pb{1?-=iC>eFK}s@ykc{%mc@+nBB>mJc?mG!b&19m=YP&~Si~ik)+>eurlY zTHUiLU*V9DaEDkg*?JT)`%+^7FeGRn_ zFB1rms~6kDqBadXC&qt6+V4;8^zZ*ZFX%sqx1anss(bHWeC+M;<@=BLIq<;03TgF^ z=*Z_67!m&6RoVab?YC6kl6Vl)C=?or(^WGH8=1TW6V!Mn_mO_BvwGjWFPEniy)iOF z71&&)IxL5BqDTIdXr3J%uids1!SHYY+6}oWN z8%anKq)wLhJkTt4ZXu{77i>V9O8mkBAH-G;WNkFv1wg>*B8e^P)9NzaAzo>@_J|2Z zpBS7r+rZ34DZmn&TwMmwx+G#2-3B=4A+x2<`dK$U6=3dAszW^DI6KMNw!?y!DqrRP zPsbDp;^$DrW8!#2o3b8BJ-S6nHWxOUA+KvE*{wz^~U|+g;kDLenjI z@}(fR2aC$+1IfmN4PW67%|ba|bqhXx__sjxYVwn*mzcO<=2LIUJ8*LpII@_j?5Erl z>e$q~?kb?RCY`N3Xn^%Vfc^waQw^AjGoOMY+O*VRm%Pdz^Ln0K#kDRC8mwI;iAAiH z5k|G=dTO~M8yLrtlIZa%>2X!DzEVN-RhC}~N!Hjp_jrV&_kysP8$FYvOeZH3YZfEl z8a-gD6NJRNJ1`O+>m==Y)*bW}J5nj)0kt=G8Q#mgmIAxW&QQfV7S)M>^bhu5kpJro ze;59X+eHLBu(ai8Z`nHH{|fJaNf?ISGR!CDiLxFGu&Pr?0oKVvilq1!PdbP_4>tRx z{&1^`O@@KW;$f@YI{b#mN+h`y3txZln|~zA36(x03h{fYg-hj7NKH(mv4A<*!_C;} z%Lnv1#B$lhfDoJfO18J-s%*CxC}zn2}M6p+yg>*c0aY6nE9H)6HD4?IRTLv7`G3$dV$%&2$| zi_If8`uhxq%q)_l%@}9r)$tbVWz5US-wZR!IVIO5iE$$?hy=|1|rpA7QVsI zit@h?gL9}piqtYaFlgzO-u)-wo#O(g$^Xi*4>cr0p;yNgOE!Y)QtfzrH%M0X!A!DH z-&=&xRAtpjVe-Og_Fl?^oh)?oOiruZy}>M-Ks&DR1)KuKoy&;HPpgt{#inNT$v(k* zDbo>-gU32SfS)kDHTsj8U=v)5r6&#>!g?zWnB!}h*e6bdExS|L=?Ws=qU!%iCLI^W zAJ~f$GY`t`sfs7bdqWl(0*+vXovl?>Qm?fPNnu4w)-!kf`crf7`?v7^1+t)2mmkpw zxA45Tz0VAcr>lWi4NP8F7*prTaEedsgr-hS>Yl_J3s#R4%>$c0y)Kn+Zr5d7vxzWf zc#Q4MESlhv6oK`>3CK1QKgg*M33VMxAnI{0vqO1TI8^;zJ=K;upJq>l*!dz zZjz2z+(Ms79Z)$21lhXE^_|4lt9>WD0f0C#?yHO+ODHj1w2bIRCX#(ry;OqV0~nh(?G432_&$KDsk-gor6}Z>2T`H z7;d#^O3O0_6Umh4&(ox2lgvs`-u=KjkSrJAiD;n(ao9Ya!>mCa)>V9%_BARnj2#X~ zft_(xyIeiZf*|%pG`C!;SoyK{OK%hOCI;mh_wiv2n!)}6_`Ta6-O8%2D7n(Yku7M) z!_G0hVtD)mUWgfX#(Yc9~#t}5p>?4MhmfP=%GG9 z>Y04yP5}fx(kn*JVtP8YxXa$8K#g-jqa*RczVv}QaBJl;v!_=AADvc|U1Pma{VjN# zR&Zk|)~hkf3(wVH*1lWyYtD*)E}>dLs2i>sMW1s%fJq0SwH(@`S=Ji8PAm{*qdQ*5 zLK1OOWkH)UZJw`x@&2no358FkHvH7I+AU@ckfX4%!4rUrdWB(MvYdXBru}TYEKBzU z-PkBHp)V|0ssEvk$|fqPVH;HKe)|GQ)$XLu?FSbd^3%+)(6msE_v{^tl0a3boVub4 zFs}0qz!V?_2sL+BYZ$=Of=l(O`3S9Z<(S^}UY|^A*L#r7iGgGRz`a&cQHa+1Xcfo; z=73RZl$09aG3kjNgX_ac>5)Yd*0x7s*eu13&e1TUbw5cY8+!vsctf&xGoH|;h65LB z#(Ib6vW^NVbg%#+U(=Ae#KygK_EZm2O%%7wfIg%|s$G4WQdl`;Us)9ykSv9*(Cq83 zK+b1#Cqx~|C7G0AQ@7shUGXaxWS|z34r{5mmI~^19P-C?P#<_uV^csue?A?Js)LxR zAZYV5MN^dyvSOq#b)&A9QVDJ7*};k>q)L0^4mN0zb^xSToi?kaN`e7wntt&SxPng5 z?pw)bvNE?u)N4BXG;q|kd}I`S)i@5KvZL80_S&X*1(s-tsY=ToooWHJVkPqGhK)q@-&TzIvvDwH zVihSDP&;0cpkZphpOUj-qVAE>`f}P*R44!10@k{gGbzm`9WEhbr$R|tsR0mqkf@OC zKiLhA4Rrg{VFe>cbTl1D8W*YWR~C)mX3TuS827`sPibKaT>JNx1M{Bx-LJA;UzC~T z74uX39;^z%k5xqps)B6$OOR)X0MGy&xTNr}%1z!8oEmkP>Q5ah;e1Y)zD0)#TS~*8hcY{8sNokCjczBO&;4MS8)pVX6sN(BFyL-+~BcZP>YVmq&!8maYl zqjW4ugw_ZKTdSeno}X@1%|T|Rumr^{z%z^XVaPGe-pf1c!Nx)ph;f#zKtoh6QNv(! zF#Aj+FV6?A0Q$ty&0sM6U=SHxwBj0j+~sv~flc`tA1*c8lCZBVfv;nXupWt~E*>J3 zd9HJ;#C-uj8f+Ge81PI}WFy-*n)b3v0Yl(Yna>?#2?={gZlDkt42 zfv>Le3q;AmZ;=DCWcItYPz3i@cLza@=m>^{uLKRIaZWT@Y~g=Mr$2lDd3gWpN#r+t z^M9nZ{Oa8HS18h3P4ogG5&7lNtw|T@G3oTtMB&tBruJF~MHX7umo0UsZM|Z=9x`*b zf~=Kmx`3>!Fxs-GA|<-ID1v-V&!l;+wYO4L=46g@R^A0IJRM?1FHcK}WKjafAb&8k zhQJZqtPTV&(bh@X-cG%z1Zo0o$eirlqh@6M4ycE?`p5Lj8dEZaS4&Bgj9j4e#kk8> znT~X@d>Qt8-nW6bI+^7RbpuknizLPQL`+HSAX(Qh7;_};fSkbe`c;)VmK9uGZ9t7} zTOQtmLw*NE;z4?N>nF->r3hlXL)f1d_ju+iceZ<#`)ETE{~hN&VCiJIyE%q5Yh@y)dTOvH9P8xLxdWvN;9zKj($-)^xvq|4V-L7jIt~ zn*)v>kg~M*bEwBjIt=mkC+_vm?gkjM*Ng& z69AJ(mkz6>?E}xt^mQe_SEzUZ+&7JIc&uOcuy9bY!Ryk8ftwD`jV#g)GfYDp@6bR7 zp3F6QHtl|FO0q8Dz1b%GWgoK@UhVvvR2M;1tI3{sP%ulD=b1KxUKE~4#T?$_9hDE| zqM=oS45Kb1$C;~6@x09fw}q495%Lq}cxz3Op|ya2u`C

brXZX@VYhc!=SFxwhp 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 z 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

B0o?DtF!VT!YjrDC^S2?RV?P>**rUM?tSk)et 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 literal 0 HcmV?d00001 diff --git a/projects/glide/models/glide_tokenizer/encoder.json.gz b/projects/glide/models/glide_tokenizer/encoder.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..87a7a6214a68f61a84bb126f623d0fd7fabcefa1 GIT binary patch literal 348346 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 z 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 z�BA-Hk@&2(n} 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

FxrnkVRt22(cfC=S{ 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

e}Y^mS>6?@Yd|G}l|f)XOKolt>}1kE$Yq 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' for v in vocab] + for merge in merges: + vocab.append(''.join(merge)) + vocab.extend(['<|startoftext|>', '<|endoftext|>']) + self.encoder = dict(zip(vocab, range(len(vocab)))) + self.decoder = {v: k for k, v in self.encoder.items()} + self.bpe_ranks = dict(zip(merges, range(len(merges)))) + self.cache = { + '<|startoftext|>': '<|startoftext|>', + '<|endoftext|>': '<|endoftext|>' + } + self.pat = re.compile( + r"""<\|startoftext\|>|<\|endoftext\|>|'s|'t|'re|'ve|'m|'ll|'d|[\p + {L}]+|[\p{N}]|[^\s\p{L}\p{N}]+""", + re.IGNORECASE, + ) + + @property + def start_token(self): + return self.encoder['<|startoftext|>'] + + @property + def end_token(self): + return self.encoder['<|endoftext|>'] + + def padded_tokens_and_len(self, tokens: List[int], + text_ctx: int) -> Tuple[List[int], int]: + tokens = [self.start_token] + tokens[:text_ctx - 2] + [self.end_token] + text_len = len(tokens) + padding = text_ctx - len(tokens) + padded_tokens = tokens + [0] * padding + return padded_tokens, text_len + + def bpe(self, token): + if token in self.cache: + return self.cache[token] + word = tuple(token[:-1]) + (token[-1] + '', ) + pairs = get_pairs(word) + + if not pairs: + return token + '' + + while True: + bigram = min( + pairs, key=lambda pair: self.bpe_ranks.get(pair, float('inf'))) + if bigram not in self.bpe_ranks: + break + first, second = bigram + new_word = [] + i = 0 + while i < len(word): + try: + j = word.index(first, i) + new_word.extend(word[i:j]) + i = j + except: # noqa: E722 + new_word.extend(word[i:]) + break + + if word[i] == first and i < len(word) - 1 and word[ + i + 1] == second: + new_word.append(first + second) + i += 2 + else: + new_word.append(word[i]) + i += 1 + new_word = tuple(new_word) + word = new_word + if len(word) == 1: + break + else: + pairs = get_pairs(word) + word = ' '.join(word) + self.cache[token] = word + return word + + def encode(self, text): + bpe_tokens = [] + text = whitespace_clean(basic_clean(text)).lower() + for token in re.findall(self.pat, text): + token = ''.join(self.byte_encoder[b] + for b in token.encode('utf-8')) + bpe_tokens.extend(self.encoder[bpe_token] + for bpe_token in self.bpe(token).split(' ')) + return bpe_tokens + + def decode(self, tokens): + text = ''.join([self.decoder[token] for token in tokens]) + text = ( + bytearray([self.byte_decoder[c] for c in text + ]).decode('utf-8', + errors='replace').replace('', ' ')) + return text diff --git a/projects/glide/models/glide_tokenizer/vocab.bpe.gz b/projects/glide/models/glide_tokenizer/vocab.bpe.gz new file mode 100644 index 0000000000000000000000000000000000000000..14c1476f23a25754dd1ddffd1ee8b0e92ee4271e GIT binary patch literal 213544 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

2vVQg6~eYg4zNO0UrPJRg*5bobw;^nvD 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

1`cg9LV@GV6lzj^nytugl z%pfqv&x7!XEk6@a_f1k5|6*W|p7=@Tel9_{uzRb?j%6lP<(uNHt49=#H{(4$Ud<$- zb%TNt&jvayxeICe=y2C#4Kk2Uo^LQ)z?{HhqLUXWr>pHdv#dTBEZ(b8iq0k;okY-l zg}wwL0*nYOsyWV|#BTeP`-d{fg^!Y!nPAN+$8y}IuXTGwO9oYBtT);XRyfADC0lh? zNFJnP`kGiW-$Sk?Lf1M@#r7-*JUYPivTTPv4aa!L71thIaYC5vB94A&isXE(t+5%i{CK?BgD)}88#!MiNOdTi^TX`ouZ zVPic(qFaQ#GD#a0JFGb>C?6{Alh%XiT4z*p$xCF&gNQUpw@$1^Tke~Y#XB97+>>~U$qVXdkn3EDO0bf=1oV8BMW3P3x3>%TS>pdK zar`$tSI#bo6yER$-Aigko6NlrMvlceWtMEQeR4Fk;KobT=FtXNdR1ma>t=5|Cmgta=x&D$uHh6_Jz>n6A#%4~^rQnd zUP_%pJZde>7^q10CeNeQ65$O;q8guCDu|x;JXIC8@?|{f)ETTlo}%{EGj{CbyT4#8 zcAj&1BFkM!1SW_^(gSbb&g#UF?cn0+8ivglO1^w_Wt$}-qB{FmVA#jDe?*hf-!~)SX zrgpFlZKj5*B}8BSECAW^``YSk+aI%4&K}7fW(AH%bhQO?UYY@)QyGuNy9$jurcq7m zV!ecrPS0DrN|h7lVe;VeI?&5zz#%E+NG6mc1F5bcp(8*MDA^LGI346Wgu%7_bW#v! zGpdw?W$pVq+k}tdF!hp^>Bg%Gj1q~7a;M*G@R)FG?FVKdLoC4r!WkWmiG82^A!Jh( zDVa7!*RZbOfDFCjfZoz*VS7Xb7shuQa9SX<8)7f>G+B|`PHntl_Pt;7EB>-?fC3Ht zB7GenNPY@PfSd}A5Hpt;7#udZQt3k#b~Le(QXFSxO~tr1g>68i;n8mgIdP>~uc7Ud zk({|BCV3K&%q-fQ7S#Y}^yH^aPAh(*Kbjw~0 zm`jelSJDl*-$_rC7O?JYL!iK5gDJQw%i7Z=WEndD!LMh{kCm=tU~Y#@q|aL#XnAsR zgER*xE!PZ24VA3}Zm!C)PnP+;eXEZ99fnoXS`EbzU0)Mv9^kQ|N{XGflQ6P!kw%Ew zT)X4>MH#nJDBe)@V_e;|u}U#!8wd^DHRBUdisEu%#JrE=h})FzLjmVEcHbZv-0HCl zB0O=BXWkq|X3nXzyOZ9k8yd%Ih8|b`5&-az5_i#)Y$>F657pd9!6&t4N((#L030oS zMDKv4iT#+YwI+5t5E#53$3R)_9d|^#W9d&otyy|($4KKJmh1_;>MsST)+I=}xmsm4 ze1E+ZgPr&Q8v%Xns~7S7kl~8m<|b)<685IxeoJq0i)j$QDv@4sH1JYgqxa%B0)?

>yu{IvE{bco4pBiAF5i*KfoiKf65QzqZLb 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 NCL + + outputs = dict(xf_proj=xf_proj, xf_out=xf_out) + + if self.cache_text_emb: + self.cache = dict( + tokens=tokens, + xf_proj=xf_proj.detach(), + xf_out=xf_out.detach() if xf_out is not None else None, + ) + + return outputs + + def del_cache(self): + self.cache = None + + def forward(self, x, timesteps, tokens=None, mask=None): + hs = [] + if not torch.is_tensor(timesteps): + timesteps = torch.tensor([timesteps], + dtype=torch.long, + device=x.device) + elif torch.is_tensor(timesteps) and len(timesteps.shape) == 0: + timesteps = timesteps[None].to(x.device) + + # TODO not sure + if timesteps.shape[0] != x.shape[0]: + timesteps = timesteps.repeat(x.shape[0]) + emb = self.time_embedding(timesteps) + if self.xf_width: + text_outputs = self.get_text_emb(tokens, mask) + xf_proj, xf_out = text_outputs['xf_proj'], text_outputs['xf_out'] + emb = emb + xf_proj.to(emb) + else: + xf_out = None + h = x.type(self.dtype) + for module in self.in_blocks: + h = module(h, emb, xf_out) + hs.append(h) + h = self.mid_blocks(h, emb, xf_out) + for module in self.out_blocks: + h = torch.cat([h, hs.pop()], dim=1) + h = module(h, emb, xf_out) + h = h.type(x.dtype) + h = self.out(h) + return h From 58f0334cae63055a45bd9e150a4d98ab289d2038 Mon Sep 17 00:00:00 2001 From: rangoliu Date: Tue, 3 Jan 2023 14:09:56 +0800 Subject: [PATCH 42/44] [release] update changelog (#1567) * release push. * update changelog. * update readme and readme_cn. * resolve review comments --- README.md | 10 ++++++---- README_zh-CN.md | 10 ++++++---- docs/en/changelog.md | 47 ++++++++++++++++++++++++++++++++++++++++++++ mmedit/version.py | 2 +- 4 files changed, 60 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 816acc4b20..94b9ca2e71 100644 --- a/README.md +++ b/README.md @@ -106,14 +106,16 @@ hope MMEditing could provide better experience. ### 🌟 Preview of 1.x version -A brand new version of [**MMEditing v1.0.0rc4**](https://github.com/open-mmlab/mmediting/releases/tag/v1.0.0rc4) was released in 05/12/2022: +A brand new version of [**MMEditing v1.0.0rc5**](https://github.com/open-mmlab/mmediting/releases/tag/v1.0.0rc5) was released in 03/01/2023: -- Support Text2Image Task! [Disco-Diffusion](configs/disco_diffusion/README.md) -- Support 3D-aware Generation Task! [EG3D](configs/eg3d/README.md) +- Support well-known text-to-image method [Stable Diffusion](configs/stable_diffusion/README.md)! +- Support an efficient image restoration algorithm [Restormer](configs/restormer/README.md)! +- Support a new text-to-image algorithm [GLIDE](projects/glide/configs/README.md)! +- Support swin based image restoration algorithm [SwinIR](configs/swinir/README.md)! +- [Projects](projects/README.md) is opened for community to add projects to MMEditing. - Support all the tasks, models, metrics, and losses in [MMGeneration](https://github.com/open-mmlab/mmgeneration) 😍. - Unifies interfaces of all components based on [MMEngine](https://github.com/open-mmlab/mmengine). - Support patch-based and slider-based image and video comparison viewer. -- Support image colorization. Find more new features in [1.x branch](https://github.com/open-mmlab/mmediting/tree/1.x). Issues and PRs are welcome! diff --git a/README_zh-CN.md b/README_zh-CN.md index 03e7bca01d..6b44cf8c0e 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -105,14 +105,16 @@ MMEditing 缜密地设计新的框架并将其精心实现,希望能够为您 ### 🌟 1.x 预览版本 -全新的 [**MMEditing v1.0.0rc4**](https://github.com/open-mmlab/mmediting/releases/tag/v1.0.0rc4) 已经在 05/12/2022 发布: +全新的 [**MMEditing v1.0.0rc5**](https://github.com/open-mmlab/mmediting/releases/tag/v1.0.0rc4) 已经在 03/01/2022 发布: -- 支持了图文生成任务! [Disco-Diffusion](configs/disco_diffusion/README.md) -- 支持了3D级图像生成任务! [EG3D](configs/eg3d/README.md) +- 支持了著名的文本生成图像方法 [stable diffusion](configs/stable_diffusion/README.md)! +- 支持了一个高效的图像复原算法 [Restormer](configs/restormer/README.md)! +- 支持了一个新的文本到图像生成算法 [GLIDE](projects/glide/configs/README.md)! +- 支持了基于swin的图像复原算法 [SwinIR](configs/swinir/README.md)! +- 开启了[projects](projects/README.md)以便社区用户添加新的项目到MMEditing. - 支持[MMGeneration](https://github.com/open-mmlab/mmgeneration)中的全量任务、模型、优化函数和评价指标 😍。 - 基于[MMEngine](https://github.com/open-mmlab/mmengine)统一了各组件接口。 - 支持基于图像子块以及滑动条的图像和视频比较可视化工具。 -- 支持图像上色任务。 在[1.x 分支](https://github.com/open-mmlab/mmediting/tree/1.x)中发现更多特性!欢迎提 Issues 和 PRs! diff --git a/docs/en/changelog.md b/docs/en/changelog.md index a48d8d67a1..cd60b0fac5 100644 --- a/docs/en/changelog.md +++ b/docs/en/changelog.md @@ -1,5 +1,52 @@ # Changelog +## v1.0.0rc5 (03/01/2023) + +**Highlights** +We are excited to announce the release of MMEditing 1.0.0rc4. This release supports 49+ models, 180+ configs and 177+ checkpoints in MMGeneration and MMEditing. We highlight the following new features + +- Support Restormer +- Support GLIDE +- Support SwinIR +- Support Stable Diffusion + +**New Features & Improvements** + +- Disco notebook.(#1507) +- Revise test requirements and CI.(#1514) +- Recursive generate summary and docstring.(#1517) +- Enable projects.(#1526) +- Support mscoco dataset.(#1520) +- Improve Chinese documents.(#1532) +- Type hints.(#1481) +- Update download link.(#1554) +- Update deployment guide.(#1551) + +**Bug Fixes** + +- Fix documentation link checker.(#1522) +- Fix ssim first channel bug.(#1515) +- Fix restormer ut.(#1550) +- Fix extract_gt_data of realesrgan.(#1542) +- Fix model index.(#1559) +- Fix config path in disco-diffusion.(#1553) +- Fix text2image inferencer.(#1523) + +**Contributors** +A total of 16 developers contributed to this release. +Thanks @plyfager, @LeoXing1996, @Z-Fran, @zengyh1900, @VongolaWu, @liuwenran, @AlexZou14, @lvhan028, @xiaomile, @ldr426, @austin273, @whu-lee, @willaty, @curiosity654, @Zdafeng, @Taited + +**New Contributors** + +- @xiaomile made their first contribution in https://github.com/open-mmlab/mmediting/pull/1481 +- @ldr426 made their first contribution in https://github.com/open-mmlab/mmediting/pull/1542 +- @austin273 made their first contribution in https://github.com/open-mmlab/mmediting/pull/1553 +- @whu-lee made their first contribution in https://github.com/open-mmlab/mmediting/pull/1539 +- @willaty made their first contribution in https://github.com/open-mmlab/mmediting/pull/1541 +- @curiosity654 made their first contribution in https://github.com/open-mmlab/mmediting/pull/1556 +- @Zdafeng made their first contribution in https://github.com/open-mmlab/mmediting/pull/1476 +- @Taited made their first contribution in https://github.com/open-mmlab/mmediting/pull/1534 + ## v1.0.0rc4 (05/12/2022) **Highlights** diff --git a/mmedit/version.py b/mmedit/version.py index 962d0e4efe..3712b40685 100644 --- a/mmedit/version.py +++ b/mmedit/version.py @@ -1,6 +1,6 @@ # Copyright (c) Open-MMLab. All rights reserved. -__version__ = '1.0.0rc4' +__version__ = '1.0.0rc5' def parse_version_info(version_str): From d9369cb5c96e9e56b6a41c5ee708a7845a37a715 Mon Sep 17 00:00:00 2001 From: rangoliu Date: Wed, 4 Jan 2023 14:11:12 +0800 Subject: [PATCH 43/44] [Fix] fix v1.0.0rc5 ci error (#1574) * fix test attention. * revert change. * move to change * fix video restoration ut * restrict opencv version. * fix circleci opencv * revert change in runtime.txt * skip stylegan1 for python3.7 * close stylegan2 ut for python3.7 * fix ddpm stable diffusion ci error. * fix attention --- .circleci/test.yml | 2 ++ .../test_inferencers/test_inference_functions.py | 3 +++ .../test_video_restoration_inferencer.py | 11 +++++++++++ .../test_editors/test_ddpm/test_attention.py | 4 ++-- .../test_editors/test_ddpm/test_ddpm_scheduler.py | 2 +- .../test_stable_diffusion/test_stable_diffusion.py | 3 +++ .../test_editors/test_stylegan1/test_stylegan1.py | 4 ++++ .../test_editors/test_stylegan2/test_stylegan2.py | 4 ++++ 8 files changed, 30 insertions(+), 3 deletions(-) diff --git a/.circleci/test.yml b/.circleci/test.yml index e2c22719cd..2cd5a7a5f8 100644 --- a/.circleci/test.yml +++ b/.circleci/test.yml @@ -59,6 +59,7 @@ jobs: - run: name: Install mmediting dependencies command: | + pip install 'opencv-python!=4.7.0.68' pip install git+https://github.com/open-mmlab/mmengine.git@main pip install -U openmim mim install 'mmcv >= 2.0.0rc1' @@ -102,6 +103,7 @@ jobs: - run: name: Install mmedit dependencies command: | + docker exec mmedit pip install 'opencv-python!=4.7.0.68' docker exec mmedit pip install -e /mmengine docker exec mmedit pip install -U openmim docker exec mmedit mim install 'mmcv >= 2.0.0rc1' diff --git a/tests/test_apis/test_inferencers/test_inference_functions.py b/tests/test_apis/test_inferencers/test_inference_functions.py index 9eed091a74..77bd685b3a 100644 --- a/tests/test_apis/test_inferencers/test_inference_functions.py +++ b/tests/test_apis/test_inferencers/test_inference_functions.py @@ -1,6 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. import os.path as osp import platform +import sys import unittest import pytest @@ -215,6 +216,8 @@ def test_restoration_face_inference(): @pytest.mark.skipif( 'win' in platform.system().lower() and 'cu' in torch.__version__, reason='skip on windows-cuda due to limited RAM.') +@pytest.mark.skipif( + sys.version_info < (3, 7), reason='skip because python version is old.') def test_restoration_inference(): if torch.cuda.is_available(): device = torch.device('cuda', 0) diff --git a/tests/test_apis/test_inferencers/test_video_restoration_inferencer.py b/tests/test_apis/test_inferencers/test_video_restoration_inferencer.py index 09be036fb4..3cf61486af 100644 --- a/tests/test_apis/test_inferencers/test_video_restoration_inferencer.py +++ b/tests/test_apis/test_inferencers/test_video_restoration_inferencer.py @@ -1,5 +1,8 @@ # Copyright (c) OpenMMLab. All rights reserved. import os.path as osp +import sys + +import pytest from mmedit.apis.inferencers.video_restoration_inferencer import \ VideoRestorationInferencer @@ -8,6 +11,8 @@ register_all_modules() +@pytest.mark.skipif( + sys.version_info < (3, 7), reason='skip because python version is old.') def test_video_restoration_inferencer(): cfg = osp.join( osp.dirname(__file__), '..', '..', '..', 'configs', 'basicvsr', @@ -27,6 +32,8 @@ def test_video_restoration_inferencer(): assert inference_result is None +@pytest.mark.skipif( + sys.version_info < (3, 7), reason='skip because python version is old.') def test_video_restoration_inferencer_input_dir(): cfg = osp.join( osp.dirname(__file__), '..', '..', '..', 'configs', 'basicvsr', @@ -47,6 +54,8 @@ def test_video_restoration_inferencer_input_dir(): assert inference_result is None +@pytest.mark.skipif( + sys.version_info < (3, 7), reason='skip because python version is old.') def test_video_restoration_inferencer_window_size(): cfg = osp.join( osp.dirname(__file__), '..', '..', '..', 'configs', 'basicvsr', @@ -69,6 +78,8 @@ def test_video_restoration_inferencer_window_size(): assert inference_result is None +@pytest.mark.skipif( + sys.version_info < (3, 7), reason='skip because python version is old.') def test_video_restoration_inferencer_max_seq_len(): cfg = osp.join( osp.dirname(__file__), '..', '..', '..', 'configs', 'basicvsr', diff --git a/tests/test_models/test_editors/test_ddpm/test_attention.py b/tests/test_models/test_editors/test_ddpm/test_attention.py index c0b68d0d4f..7aae5e85ec 100644 --- a/tests/test_models/test_editors/test_ddpm/test_attention.py +++ b/tests/test_models/test_editors/test_ddpm/test_attention.py @@ -24,12 +24,12 @@ def test_crossattention(): def test_Transformer2DModel_init(): with pytest.raises(Exception): - Transformer2DModel(in_channels=3, num_vector_embeds=3) + Transformer2DModel(in_channels=32, num_vector_embeds=4) with pytest.raises(Exception): Transformer2DModel() - Transformer2DModel(in_channels=3, use_linear_projection=True) + Transformer2DModel(in_channels=32, use_linear_projection=True) def test_FeedForward(): diff --git a/tests/test_models/test_editors/test_ddpm/test_ddpm_scheduler.py b/tests/test_models/test_editors/test_ddpm/test_ddpm_scheduler.py index 23df9718a5..fe4c33126b 100644 --- a/tests/test_models/test_editors/test_ddpm/test_ddpm_scheduler.py +++ b/tests/test_models/test_editors/test_ddpm/test_ddpm_scheduler.py @@ -15,7 +15,7 @@ def test_ddpm(): ddpm.set_timesteps(100) - predicted_variance = torch.tensor(1) + predicted_variance = torch.tensor(1.0) ddpm._get_variance(t=0, predicted_variance=predicted_variance) ddpm._get_variance(t=1, variance_type='fixed_large') ddpm._get_variance(t=1, variance_type='fixed_large_log') diff --git a/tests/test_models/test_editors/test_stable_diffusion/test_stable_diffusion.py b/tests/test_models/test_editors/test_stable_diffusion/test_stable_diffusion.py index f84f58a7ee..fb2fe3352d 100644 --- a/tests/test_models/test_editors/test_stable_diffusion/test_stable_diffusion.py +++ b/tests/test_models/test_editors/test_stable_diffusion/test_stable_diffusion.py @@ -1,5 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. import platform +import sys import pytest import torch @@ -101,6 +102,8 @@ def __call__(self, x, attention_mask): @pytest.mark.skipif( 'win' in platform.system().lower(), reason='skip on windows due to limited RAM.') +@pytest.mark.skipif( + sys.version_info < (3, 8), reason='skip because python version is old.') def test_stable_diffusion(): StableDiffuser = MODELS.build(Config(model)) StableDiffuser.tokenizer = dummy_tokenizer() diff --git a/tests/test_models/test_editors/test_stylegan1/test_stylegan1.py b/tests/test_models/test_editors/test_stylegan1/test_stylegan1.py index cac2273712..963f2c7eb4 100644 --- a/tests/test_models/test_editors/test_stylegan1/test_stylegan1.py +++ b/tests/test_models/test_editors/test_stylegan1/test_stylegan1.py @@ -1,5 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. import platform +import sys from unittest import TestCase import numpy as np @@ -35,6 +36,9 @@ class TestStyleGAN1(TestCase): @pytest.mark.skipif( 'win' in platform.system().lower() and 'cu' in torch.__version__, reason='skip on windows-cuda due to limited RAM.') + @pytest.mark.skipif( + sys.version_info < (3, 8), + reason='skip because python version is old.') def test_stylegan_cpu(self): message_hub = MessageHub.get_instance('test-s1') message_hub.update_info('iter', 0) diff --git a/tests/test_models/test_editors/test_stylegan2/test_stylegan2.py b/tests/test_models/test_editors/test_stylegan2/test_stylegan2.py index c28542e4a4..7d49699e04 100644 --- a/tests/test_models/test_editors/test_stylegan2/test_stylegan2.py +++ b/tests/test_models/test_editors/test_stylegan2/test_stylegan2.py @@ -1,5 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. import platform +import sys from unittest import TestCase import pytest @@ -39,6 +40,9 @@ def setup_class(cls): @pytest.mark.skipif( 'win' in platform.system().lower() and 'cu' in torch.__version__, reason='skip on windows-cuda due to limited RAM.') + @pytest.mark.skipif( + sys.version_info < (3, 8), + reason='skip because python version is old.') def test_stylegan2_cpu(self): accu_iter = 1 message_hub = MessageHub.get_instance('test-s2') From 740757f6f18b7433acc2a965d3aa121ae4da6638 Mon Sep 17 00:00:00 2001 From: rangoliu Date: Wed, 4 Jan 2023 16:16:39 +0800 Subject: [PATCH 44/44] [release] add new model to model zoo (#1571) * [fix] fix ci error * update test. * changelog date * add new model to model zoo * Update test_inference_functions.py --- README.md | 10 +++++++--- README_zh-CN.md | 10 +++++++--- docs/en/changelog.md | 4 ++-- .../test_inferencers/test_inference_functions.py | 4 ++-- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 94b9ca2e71..10b3f77c40 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ hope MMEditing could provide better experience. ### 🌟 Preview of 1.x version -A brand new version of [**MMEditing v1.0.0rc5**](https://github.com/open-mmlab/mmediting/releases/tag/v1.0.0rc5) was released in 03/01/2023: +A brand new version of [**MMEditing v1.0.0rc5**](https://github.com/open-mmlab/mmediting/releases/tag/v1.0.0rc5) was released in 04/01/2023: - Support well-known text-to-image method [Stable Diffusion](configs/stable_diffusion/README.md)! - Support an efficient image restoration algorithm [Restormer](configs/restormer/README.md)! @@ -272,7 +272,9 @@ Supported algorithms:

Text2Image +- ✅ [GLIDE](projects/glide/configs/README.md) (NeurIPS'2021) - ✅ [Disco-Diffusion](configs/disco_diffusion/README.md) +- ✅ [Stable-Diffusion](configs/stable_diffusion/README.md)
@@ -280,7 +282,7 @@ Supported algorithms: 3D-aware Generation -- ✅ [EG3D](configs/eg3d/README.md) +- ✅ [EG3D](configs/eg3d/README.md) (CVPR'2022) @@ -288,7 +290,9 @@ Supported algorithms: Image Restoration -- ✅ [NAFNet](configs/nafnet/README.md) +- ✅ [SwinIR](configs/swinir/README.md) (ICCVW'2021) +- ✅ [NAFNet](configs/nafnet/README.md) (ECCV'2022) +- ✅ [Restormer](configs/restormer/README.md) (CVPR'2022) diff --git a/README_zh-CN.md b/README_zh-CN.md index 6b44cf8c0e..f0f32e7693 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -105,7 +105,7 @@ MMEditing 缜密地设计新的框架并将其精心实现,希望能够为您 ### 🌟 1.x 预览版本 -全新的 [**MMEditing v1.0.0rc5**](https://github.com/open-mmlab/mmediting/releases/tag/v1.0.0rc4) 已经在 03/01/2022 发布: +全新的 [**MMEditing v1.0.0rc5**](https://github.com/open-mmlab/mmediting/releases/tag/v1.0.0rc5) 已经在 04/01/2023 发布: - 支持了著名的文本生成图像方法 [stable diffusion](configs/stable_diffusion/README.md)! - 支持了一个高效的图像复原算法 [Restormer](configs/restormer/README.md)! @@ -270,7 +270,9 @@ pip3 install -e .
Text2Image +- ✅ [GLIDE](projects/glide/configs/README.md) (NeurIPS'2021) - ✅ [Disco-Diffusion](configs/disco_diffusion/README.md) +- ✅ [Stable-Diffusion](configs/stable_diffusion/README.md)
@@ -278,7 +280,7 @@ pip3 install -e . 3D-aware Generation -- ✅ [EG3D](configs/eg3d/README.md) +- ✅ [EG3D](configs/eg3d/README.md) (CVPR'2022) @@ -286,7 +288,9 @@ pip3 install -e . Image Restoration -- ✅ [NAFNet](configs/nafnet/README.md) +- ✅ [SwinIR](configs/swinir/README.md) (ICCVW'2021) +- ✅ [NAFNet](configs/nafnet/README.md) (ECCV'2022) +- ✅ [Restormer](configs/restormer/README.md) (CVPR'2022) diff --git a/docs/en/changelog.md b/docs/en/changelog.md index cd60b0fac5..84f38a932f 100644 --- a/docs/en/changelog.md +++ b/docs/en/changelog.md @@ -1,9 +1,9 @@ # Changelog -## v1.0.0rc5 (03/01/2023) +## v1.0.0rc5 (04/01/2023) **Highlights** -We are excited to announce the release of MMEditing 1.0.0rc4. This release supports 49+ models, 180+ configs and 177+ checkpoints in MMGeneration and MMEditing. We highlight the following new features +We are excited to announce the release of MMEditing 1.0.0rc5. This release supports 49+ models, 180+ configs and 177+ checkpoints in MMGeneration and MMEditing. We highlight the following new features - Support Restormer - Support GLIDE diff --git a/tests/test_apis/test_inferencers/test_inference_functions.py b/tests/test_apis/test_inferencers/test_inference_functions.py index 77bd685b3a..21a0157456 100644 --- a/tests/test_apis/test_inferencers/test_inference_functions.py +++ b/tests/test_apis/test_inferencers/test_inference_functions.py @@ -216,8 +216,6 @@ def test_restoration_face_inference(): @pytest.mark.skipif( 'win' in platform.system().lower() and 'cu' in torch.__version__, reason='skip on windows-cuda due to limited RAM.') -@pytest.mark.skipif( - sys.version_info < (3, 7), reason='skip because python version is old.') def test_restoration_inference(): if torch.cuda.is_available(): device = torch.device('cuda', 0) @@ -236,6 +234,8 @@ def test_restoration_inference(): assert output.detach().cpu().numpy().shape == (3, 480, 500) +@pytest.mark.skipif( + sys.version_info < (3, 7), reason='skip because python version is old.') def test_restoration_video_inference(): if torch.cuda.is_available(): device = torch.device('cuda', 0)

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%0A|F7fvQOLDQFPf3 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